@anyshift/backstage-plugin-anyshift 0.1.0-beta.22 → 0.1.0-beta.23

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 (47) hide show
  1. package/dist/api/AnyshiftApi.esm.js +56 -5
  2. package/dist/api/AnyshiftApi.esm.js.map +1 -1
  3. package/dist/components/ask/AskAnyshiftCard.esm.js +342 -0
  4. package/dist/components/ask/AskAnyshiftCard.esm.js.map +1 -0
  5. package/dist/components/ask/askPresenters.esm.js +1203 -0
  6. package/dist/components/ask/askPresenters.esm.js.map +1 -0
  7. package/dist/components/ask/askScope.esm.js +25 -0
  8. package/dist/components/ask/askScope.esm.js.map +1 -0
  9. package/dist/components/ask/askSuggestions.esm.js +41 -0
  10. package/dist/components/ask/askSuggestions.esm.js.map +1 -0
  11. package/dist/components/cloud/CloudImpactSection.esm.js +54 -0
  12. package/dist/components/cloud/CloudImpactSection.esm.js.map +1 -0
  13. package/dist/components/cloud/CloudRelationshipSections.esm.js +43 -0
  14. package/dist/components/cloud/CloudRelationshipSections.esm.js.map +1 -0
  15. package/dist/components/cloud/CloudResourceContent.esm.js +444 -45
  16. package/dist/components/cloud/CloudResourceContent.esm.js.map +1 -1
  17. package/dist/components/entity/AnyshiftEntityContent.esm.js +119 -23
  18. package/dist/components/entity/AnyshiftEntityContent.esm.js.map +1 -1
  19. package/dist/components/entity/ArchitectureOperationDetails.esm.js +107 -0
  20. package/dist/components/entity/ArchitectureOperationDetails.esm.js.map +1 -0
  21. package/dist/components/entity/BriefSections.esm.js +24 -4
  22. package/dist/components/entity/BriefSections.esm.js.map +1 -1
  23. package/dist/components/entity/DatadogLiveSignal.esm.js +85 -23
  24. package/dist/components/entity/DatadogLiveSignal.esm.js.map +1 -1
  25. package/dist/components/entity/MermaidArchitecture.esm.js +202 -43
  26. package/dist/components/entity/MermaidArchitecture.esm.js.map +1 -1
  27. package/dist/components/entity/SectionPresenters.esm.js +145 -82
  28. package/dist/components/entity/SectionPresenters.esm.js.map +1 -1
  29. package/dist/components/entity/architectureDiagram.esm.js +48 -15
  30. package/dist/components/entity/architectureDiagram.esm.js.map +1 -1
  31. package/dist/components/entity/architectureGraph.esm.js +145 -0
  32. package/dist/components/entity/architectureGraph.esm.js.map +1 -0
  33. package/dist/components/entity/entityIdentity.esm.js +40 -0
  34. package/dist/components/entity/entityIdentity.esm.js.map +1 -0
  35. package/dist/components/entity/relatedCatalogEntities.esm.js +60 -0
  36. package/dist/components/entity/relatedCatalogEntities.esm.js.map +1 -0
  37. package/dist/components/explorer/AnyshiftExplorerPage.esm.js +154 -19
  38. package/dist/components/explorer/AnyshiftExplorerPage.esm.js.map +1 -1
  39. package/dist/components/explorer/DatadogOperationsRadar.esm.js +92 -31
  40. package/dist/components/explorer/DatadogOperationsRadar.esm.js.map +1 -1
  41. package/dist/index.d.ts +26 -6
  42. package/dist/index.esm.js +1 -1
  43. package/dist/package.json.esm.js +3 -2
  44. package/dist/package.json.esm.js.map +1 -1
  45. package/dist/plugin.esm.js +6 -2
  46. package/dist/plugin.esm.js.map +1 -1
  47. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"AnyshiftExplorerPage.esm.js","sources":["../../../src/components/explorer/AnyshiftExplorerPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Button, Grid, TextField, Typography } from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION,\n anyshiftCatalogSyncPermission,\n anyshiftQueryPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n DatadogSignals,\n EstateInsights,\n QueryResult,\n} from '../../api/types';\nimport {\n ImpactPresenter,\n TimelinePresenter,\n} from '../entity/SectionPresenters';\nimport { DatadogOperationsRadar } from './DatadogOperationsRadar';\n\nconst DEFAULT_QUERY =\n 'SELECT * FROM resources WHERE type = deployment LIMIT 10';\nconst CATALOG_SYNC_STATUS_ENTITY = 'anyshift-catalog-sync';\n\nexport function isDeterministicSelect(value: string): boolean {\n const sql = value.trim();\n return (\n /^SELECT\\b/i.test(sql) &&\n sql.length <= 4_096 &&\n !sql.includes(';') &&\n !sql.includes('--') &&\n !sql.includes('/*')\n );\n}\n\nexport function matchesCatalogEntity(entity: Entity, value: string): boolean {\n const query = value.trim().toLocaleLowerCase();\n if (!query) return true;\n const searchable = [\n entity.metadata.name,\n entity.metadata.title,\n entity.metadata.description,\n entity.metadata.annotations?.['anyshift.io/target'],\n typeof entity.spec?.owner === 'string' ? entity.spec.owner : undefined,\n ];\n return searchable.some(item => item?.toLocaleLowerCase().includes(query));\n}\n\nexport function summarizeCatalogSync(entities: Entity[]) {\n const components = entities.filter(\n entity => entity.kind.toLowerCase() === 'component',\n );\n const configured = components.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const excluded = components.filter(\n entity =>\n entity.metadata.annotations?.[\n 'anyshift.io/catalog-sync'\n ]?.toLowerCase() === 'excluded',\n );\n return {\n components: components.length,\n configured: configured.length,\n excluded: excluded.length,\n unclassified: Math.max(\n 0,\n components.length - configured.length - excluded.length,\n ),\n observed: configured.filter(\n entity => entity.metadata.annotations?.['anyshift.io/observed-service'],\n ).length,\n managedResources: entities.filter(\n entity =>\n entity.kind.toLowerCase() === 'resource' &&\n entity.metadata.name !== CATALOG_SYNC_STATUS_ENTITY &&\n entity.metadata.annotations?.['anyshift.io/managed-by'] ===\n 'catalog-provider',\n ).length,\n };\n}\n\nexport function catalogSyncStatus(entities: Entity[]) {\n const entity = entities.find(\n candidate =>\n candidate.kind.toLowerCase() === 'resource' &&\n candidate.metadata.name === CATALOG_SYNC_STATUS_ENTITY,\n );\n const annotations = entity?.metadata.annotations ?? {};\n return {\n status: annotations[ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION] ?? 'waiting',\n trigger: annotations[ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION],\n finishedAt: annotations[ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION],\n error: annotations[ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION],\n };\n}\n\nexport const EstateInsightsGrid = ({\n insights,\n}: {\n insights: EstateInsights;\n}) => (\n <>\n {insights.sections.map(item => (\n <Grid item xs={12} md={6} key={item.id}>\n <InfoCard title={item.title}>\n {item.section.state === 'error' ? (\n <Typography color=\"error\">{item.section.message}</Typography>\n ) : item.section.state === 'empty' ||\n item.section.state === 'unsupported' ||\n item.section.data === undefined ? (\n <Typography color=\"textSecondary\">\n {item.section.message || 'No insight evidence is available.'}\n </Typography>\n ) : item.id === 'recent-change' ? (\n <TimelinePresenter\n data={item.section.data}\n fallbackLabel=\"Deployment\"\n />\n ) : (\n <ImpactPresenter data={item.section.data} />\n )}\n </InfoCard>\n </Grid>\n ))}\n </>\n);\n\nexport const AnyshiftExplorerPage = () => {\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApi(catalogApiRef);\n const queryPermission = usePermission({\n permission: anyshiftQueryPermission,\n });\n const catalogSyncPermission = usePermission({\n permission: anyshiftCatalogSyncPermission,\n });\n const [queryEnabled, setQueryEnabled] = useState(false);\n const [insights, setInsights] = useState<EstateInsights>();\n const [insightError, setInsightError] = useState<string>();\n const [datadogSignals, setDatadogSignals] = useState<DatadogSignals>();\n const [datadogError, setDatadogError] = useState<string>();\n const [refreshingDatadog, setRefreshingDatadog] = useState(false);\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [catalogError, setCatalogError] = useState<string>();\n const [catalogQuery, setCatalogQuery] = useState('');\n const [sql, setSql] = useState(DEFAULT_QUERY);\n const [queryResult, setQueryResult] = useState<QueryResult>();\n const [queryError, setQueryError] = useState<string>();\n const [requestingSync, setRequestingSync] = useState(false);\n const [syncRequestMessage, setSyncRequestMessage] = useState<string>();\n const [syncRequestError, setSyncRequestError] = useState<string>();\n\n useEffect(() => {\n api\n .capabilities()\n .then(capabilities => setQueryEnabled(capabilities.queryEnabled))\n .catch(() => setQueryEnabled(false));\n }, [api]);\n\n useEffect(() => {\n api\n .datadogSignals()\n .then(setDatadogSignals)\n .catch(error => {\n setDatadogError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n useEffect(() => {\n api\n .insights()\n .then(setInsights)\n .catch(error => {\n setInsightError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n useEffect(() => {\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n })\n .then(response => setCatalogEntities(response.items))\n .catch(error => {\n setCatalogError(error instanceof Error ? error.message : String(error));\n });\n }, [catalogApi]);\n\n const anyshiftEntities = catalogEntities.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const syncSummary = summarizeCatalogSync(catalogEntities);\n const syncStatus = catalogSyncStatus(catalogEntities);\n const matchingEntities = anyshiftEntities\n .filter(entity => matchesCatalogEntity(entity, catalogQuery))\n .slice(0, 12);\n\n const runQuery = async () => {\n if (!isDeterministicSelect(sql)) {\n setQueryError('Enter one deterministic SELECT query.');\n return;\n }\n setQueryError(undefined);\n try {\n setQueryResult(await api.query(sql.trim()));\n } catch (error) {\n setQueryError(error instanceof Error ? error.message : String(error));\n }\n };\n\n const refreshDatadog = async () => {\n setRefreshingDatadog(true);\n setDatadogError(undefined);\n try {\n setDatadogSignals(await api.datadogSignals({ refresh: true }));\n } catch (error) {\n setDatadogError(error instanceof Error ? error.message : String(error));\n } finally {\n setRefreshingDatadog(false);\n }\n };\n\n const requestCatalogSync = async () => {\n setRequestingSync(true);\n setSyncRequestError(undefined);\n setSyncRequestMessage(undefined);\n try {\n const accepted = await api.reconcileCatalog();\n setSyncRequestMessage(\n `Reconciliation accepted ${formatTimestamp(accepted.acceptedAt)}.`,\n );\n } catch (error) {\n setSyncRequestError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n setRequestingSync(false);\n }\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Anyshift\"\n subtitle=\"Live infrastructure context for your software catalog\"\n />\n <Content>\n {datadogSignals ? (\n <DatadogOperationsRadar\n signals={datadogSignals}\n catalogEntities={anyshiftEntities}\n onRefresh={refreshDatadog}\n refreshing={refreshingDatadog}\n error={datadogError}\n />\n ) : datadogError ? (\n <Typography color=\"error\">{datadogError}</Typography>\n ) : (\n <Progress />\n )}\n <ContentHeader title=\"Catalog synchronization\" />\n <InfoCard subheader=\"GitHub ownership stays authoritative; Anyshift adds observed infrastructure context\">\n <Grid container spacing={2}>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.configured}</Typography>\n <Typography color=\"textSecondary\">Configured</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.excluded}</Typography>\n <Typography color=\"textSecondary\">Excluded</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.unclassified}</Typography>\n <Typography color=\"textSecondary\">Unclassified</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.observed}</Typography>\n <Typography color=\"textSecondary\">Active matches</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">\n {syncSummary.managedResources}\n </Typography>\n <Typography color=\"textSecondary\">Managed resources</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography>\n Last reconciliation: <strong>{syncStatus.status}</strong>\n {syncStatus.finishedAt\n ? ` · ${formatTimestamp(syncStatus.finishedAt)}`\n : ''}\n {syncStatus.trigger ? ` · ${syncStatus.trigger}` : ''}\n </Typography>\n {syncStatus.error && (\n <Typography color=\"error\">\n Last failure: {syncStatus.error}\n </Typography>\n )}\n {catalogSyncPermission.allowed && (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n disabled={requestingSync}\n onClick={requestCatalogSync}\n style={{ marginTop: 12 }}\n >\n {requestingSync ? 'Requesting…' : 'Reconcile now'}\n </Button>\n )}\n {syncRequestMessage && (\n <Typography color=\"textSecondary\">\n {syncRequestMessage}\n </Typography>\n )}\n {syncRequestError && (\n <Typography color=\"error\">{syncRequestError}</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n <ContentHeader title=\"Find a service\" />\n <InfoCard subheader=\"Anyshift-annotated Components and Resources in the Backstage catalog\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Search services and resources\"\n value={catalogQuery}\n onChange={event => setCatalogQuery(event.target.value)}\n />\n {catalogError && (\n <Typography color=\"error\">{catalogError}</Typography>\n )}\n {!catalogError && matchingEntities.length === 0 ? (\n <Typography color=\"textSecondary\" style={{ marginTop: 12 }}>\n No matching Anyshift catalog entities.\n </Typography>\n ) : (\n <ul>\n {matchingEntities.map(entity => (\n <li\n key={`${entity.kind}:${\n entity.metadata.namespace ?? 'default'\n }/${entity.metadata.name}`}\n >\n <EntityRefLink entityRef={entity} />\n {entity.metadata.description\n ? ` - ${entity.metadata.description}`\n : null}\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n <ContentHeader title=\"Estate insights\" />\n {insightError && <Typography color=\"error\">{insightError}</Typography>}\n {!insights && !insightError ? <Progress /> : null}\n <Grid container spacing={3}>\n {insights && <EstateInsightsGrid insights={insights} />}\n {queryEnabled && queryPermission.allowed && (\n <Grid item xs={12}>\n <InfoCard\n title=\"Advanced query\"\n subheader=\"Deterministic Graph API SELECT queries only\"\n >\n <TextField\n fullWidth\n multiline\n minRows={2}\n variant=\"outlined\"\n value={sql}\n onChange={event => setSql(event.target.value)}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={runQuery}\n style={{ marginTop: 12 }}\n >\n Run query\n </Button>\n {queryError && (\n <Typography color=\"error\">{queryError}</Typography>\n )}\n {queryResult && (\n <pre style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>\n {JSON.stringify(queryResult, null, 2)}\n </pre>\n )}\n </InfoCard>\n </Grid>\n )}\n </Grid>\n </Content>\n </Page>\n );\n};\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnyshiftExplorerPage.esm.js","sources":["../../../src/components/explorer/AnyshiftExplorerPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n Grid,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION,\n anyshiftCatalogSyncPermission,\n anyshiftQueryPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n AnyshiftCapabilities,\n DatadogSignals,\n EvidenceCoverage,\n EstateInsights,\n QueryResult,\n} from '../../api/types';\nimport { AskAnyshiftCard } from '../ask/AskAnyshiftCard';\nimport {\n ImpactPresenter,\n TimelinePresenter,\n} from '../entity/SectionPresenters';\nimport { DatadogOperationsRadar } from './DatadogOperationsRadar';\n\nconst DEFAULT_QUERY =\n 'SELECT * FROM resources WHERE type = deployment LIMIT 10';\nconst CATALOG_SYNC_STATUS_ENTITY = 'anyshift-catalog-sync';\n\nexport function isDeterministicSelect(value: string): boolean {\n const sql = value.trim();\n return (\n /^SELECT\\b/i.test(sql) &&\n sql.length <= 4_096 &&\n !sql.includes(';') &&\n !sql.includes('--') &&\n !sql.includes('/*')\n );\n}\n\nexport function matchesCatalogEntity(entity: Entity, value: string): boolean {\n const query = value.trim().toLocaleLowerCase();\n if (!query) return true;\n const searchable = [\n entity.metadata.name,\n entity.metadata.title,\n entity.metadata.description,\n entity.metadata.annotations?.['anyshift.io/target'],\n typeof entity.spec?.owner === 'string' ? entity.spec.owner : undefined,\n ];\n return searchable.some(item => item?.toLocaleLowerCase().includes(query));\n}\n\nexport function summarizeCatalogSync(entities: Entity[]) {\n const components = entities.filter(\n entity => entity.kind.toLowerCase() === 'component',\n );\n const configured = components.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const excluded = components.filter(\n entity =>\n entity.metadata.annotations?.[\n 'anyshift.io/catalog-sync'\n ]?.toLowerCase() === 'excluded',\n );\n return {\n components: components.length,\n configured: configured.length,\n excluded: excluded.length,\n unclassified: Math.max(\n 0,\n components.length - configured.length - excluded.length,\n ),\n observed: configured.filter(\n entity => entity.metadata.annotations?.['anyshift.io/observed-service'],\n ).length,\n managedResources: entities.filter(\n entity =>\n entity.kind.toLowerCase() === 'resource' &&\n entity.metadata.name !== CATALOG_SYNC_STATUS_ENTITY &&\n entity.metadata.annotations?.['anyshift.io/managed-by'] ===\n 'catalog-provider',\n ).length,\n };\n}\n\nexport function catalogSyncStatus(entities: Entity[]) {\n const entity = entities.find(\n candidate =>\n candidate.kind.toLowerCase() === 'resource' &&\n candidate.metadata.name === CATALOG_SYNC_STATUS_ENTITY,\n );\n const annotations = entity?.metadata.annotations ?? {};\n return {\n status: annotations[ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION] ?? 'waiting',\n trigger: annotations[ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION],\n finishedAt: annotations[ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION],\n error: annotations[ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION],\n };\n}\n\nexport const EstateInsightsGrid = ({\n insights,\n onRetryCoverage,\n refreshingCoverage = false,\n}: {\n insights: EstateInsights;\n onRetryCoverage?: () => void;\n refreshingCoverage?: boolean;\n}) => {\n const coverage = insights.coverage ?? {\n state: 'unsupported' as const,\n message: 'Evidence coverage is not available from this backend version.',\n };\n return (\n <>\n <Grid item xs={12}>\n <InfoCard\n title=\"Evidence coverage\"\n subheader=\"Observed graph sources and observability blind spots\"\n >\n {coverage.state === 'data' && coverage.data ? (\n <>\n <EvidenceCoveragePresenter data={coverage.data} />\n {coverage.retryable && onRetryCoverage && (\n <Box mt={2}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={onRetryCoverage}\n disabled={refreshingCoverage}\n >\n {refreshingCoverage\n ? 'Retrying…'\n : 'Retry evidence coverage'}\n </Button>\n </Box>\n )}\n </>\n ) : (\n <>\n <Typography\n color={coverage.state === 'error' ? 'error' : 'textSecondary'}\n >\n {coverage.message || 'No coverage evidence is available.'}\n </Typography>\n {coverage.retryable && onRetryCoverage && (\n <Box mt={2}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={onRetryCoverage}\n disabled={refreshingCoverage}\n >\n {refreshingCoverage\n ? 'Retrying…'\n : 'Retry evidence coverage'}\n </Button>\n </Box>\n )}\n </>\n )}\n </InfoCard>\n </Grid>\n {insights.sections.map(item => (\n <Grid item xs={12} md={6} key={item.id}>\n <InfoCard title={item.title}>\n {item.section.state === 'error' ? (\n <Typography color=\"error\">{item.section.message}</Typography>\n ) : item.section.state === 'empty' ||\n item.section.state === 'unsupported' ||\n item.section.data === undefined ? (\n <Typography color=\"textSecondary\">\n {item.section.message || 'No insight evidence is available.'}\n </Typography>\n ) : item.id === 'recent-change' ? (\n <TimelinePresenter\n data={item.section.data}\n fallbackLabel=\"Deployment\"\n />\n ) : (\n <ImpactPresenter data={item.section.data} />\n )}\n </InfoCard>\n </Grid>\n ))}\n </>\n );\n};\n\nexport const EvidenceCoveragePresenter = ({\n data,\n}: {\n data: EvidenceCoverage;\n}) => {\n const metrics = [\n [data.graph.nodes, 'Graph nodes'],\n [data.graph.relationships, 'Relationships'],\n [data.graph.bridges, 'Cross-source bridges'],\n [data.graph.events, 'Runtime events'],\n ] as const;\n const refreshedAt = Date.parse(data.refreshedAt);\n const stale =\n Number.isFinite(refreshedAt) && Date.now() - refreshedAt > 15 * 60 * 1000;\n\n return (\n <>\n <Box\n display=\"flex\"\n flexWrap=\"wrap\"\n alignItems=\"center\"\n gridGap={8}\n mb={2}\n >\n <Typography variant=\"h5\">\n {data.connectedSources === null\n ? `Unknown of ${data.expectedSources} sources`\n : `${data.connectedSources} of ${data.expectedSources} sources`}\n </Typography>\n <Chip\n size=\"small\"\n color={stale ? 'secondary' : 'primary'}\n label={stale ? 'Stale evidence' : 'Fresh evidence'}\n />\n </Box>\n <Grid container spacing={2}>\n {metrics.map(([value, label]) => (\n <Grid item xs={6} md={3} key={label}>\n <Typography variant=\"h6\">\n {value === null ? 'N/A' : value.toLocaleString()}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {label}\n </Typography>\n </Grid>\n ))}\n </Grid>\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Missing source evidence\n </Typography>\n {data.missingSources.length > 0 ? (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={6}>\n {data.missingSources.map(source => (\n <Chip\n key={source}\n size=\"small\"\n variant=\"outlined\"\n label={source}\n />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n None reported by the Graph API.\n </Typography>\n )}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Observability blind spots\n </Typography>\n <Typography variant=\"body2\">\n {data.blindSpots.workloadCount === null\n ? 'Workload coverage unavailable'\n : `${data.blindSpots.workloadCount} workloads`}\n </Typography>\n {data.blindSpots.workloads.map(workload => (\n <Box key={`${workload.namespace}/${workload.name}`}>\n <Typography variant=\"body2\">{workload.name}</Typography>\n {workload.namespace && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {workload.namespace}\n </Typography>\n )}\n </Box>\n ))}\n </Grid>\n </Grid>\n <Box mt={2}>\n {data.warnings.map(warning => (\n <Typography key={warning} variant=\"caption\" color=\"textSecondary\">\n {warning}\n </Typography>\n ))}\n </Box>\n </>\n );\n};\n\nexport const AnyshiftExplorerPage = () => {\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApi(catalogApiRef);\n const queryPermission = usePermission({\n permission: anyshiftQueryPermission,\n });\n const catalogSyncPermission = usePermission({\n permission: anyshiftCatalogSyncPermission,\n });\n const [capabilities, setCapabilities] = useState<AnyshiftCapabilities>({\n askEnabled: false,\n queryEnabled: false,\n });\n const [insights, setInsights] = useState<EstateInsights>();\n const [insightError, setInsightError] = useState<string>();\n const [refreshingInsights, setRefreshingInsights] = useState(false);\n const [datadogSignals, setDatadogSignals] = useState<DatadogSignals>();\n const [datadogError, setDatadogError] = useState<string>();\n const [refreshingDatadog, setRefreshingDatadog] = useState(false);\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [catalogError, setCatalogError] = useState<string>();\n const [catalogQuery, setCatalogQuery] = useState('');\n const [sql, setSql] = useState(DEFAULT_QUERY);\n const [queryResult, setQueryResult] = useState<QueryResult>();\n const [queryError, setQueryError] = useState<string>();\n const [requestingSync, setRequestingSync] = useState(false);\n const [syncRequestMessage, setSyncRequestMessage] = useState<string>();\n const [syncRequestError, setSyncRequestError] = useState<string>();\n\n useEffect(() => {\n api\n .capabilities()\n .then(setCapabilities)\n .catch(() => setCapabilities({ askEnabled: false, queryEnabled: false }));\n }, [api]);\n\n useEffect(() => {\n api\n .datadogSignals()\n .then(setDatadogSignals)\n .catch(error => {\n setDatadogError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n const loadInsights = useCallback(\n async (refresh = false) => {\n if (refresh) setRefreshingInsights(true);\n setInsightError(undefined);\n try {\n setInsights(await api.insights({ refresh }));\n } catch (error) {\n setInsightError(error instanceof Error ? error.message : String(error));\n } finally {\n if (refresh) setRefreshingInsights(false);\n }\n },\n [api],\n );\n\n useEffect(() => {\n void loadInsights();\n }, [loadInsights]);\n\n useEffect(() => {\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n })\n .then(response => setCatalogEntities(response.items))\n .catch(error => {\n setCatalogError(error instanceof Error ? error.message : String(error));\n });\n }, [catalogApi]);\n\n const anyshiftEntities = catalogEntities.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const syncSummary = summarizeCatalogSync(catalogEntities);\n const syncStatus = catalogSyncStatus(catalogEntities);\n const matchingEntities = anyshiftEntities\n .filter(entity => matchesCatalogEntity(entity, catalogQuery))\n .slice(0, 12);\n\n const runQuery = async () => {\n if (!isDeterministicSelect(sql)) {\n setQueryError('Enter one deterministic SELECT query.');\n return;\n }\n setQueryError(undefined);\n try {\n setQueryResult(await api.query(sql.trim()));\n } catch (error) {\n setQueryError(error instanceof Error ? error.message : String(error));\n }\n };\n\n const refreshDatadog = async () => {\n setRefreshingDatadog(true);\n setDatadogError(undefined);\n try {\n setDatadogSignals(await api.datadogSignals({ refresh: true }));\n } catch (error) {\n setDatadogError(error instanceof Error ? error.message : String(error));\n } finally {\n setRefreshingDatadog(false);\n }\n };\n\n const requestCatalogSync = async () => {\n setRequestingSync(true);\n setSyncRequestError(undefined);\n setSyncRequestMessage(undefined);\n try {\n const accepted = await api.reconcileCatalog();\n setSyncRequestMessage(\n `Reconciliation accepted ${formatTimestamp(accepted.acceptedAt)}.`,\n );\n } catch (error) {\n setSyncRequestError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n setRequestingSync(false);\n }\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Anyshift\"\n subtitle=\"Live infrastructure context for your software catalog\"\n />\n <Content>\n {datadogSignals ? (\n <DatadogOperationsRadar\n signals={datadogSignals}\n catalogEntities={anyshiftEntities}\n onRefresh={refreshDatadog}\n refreshing={refreshingDatadog}\n error={datadogError}\n />\n ) : datadogError ? (\n <Typography color=\"error\">{datadogError}</Typography>\n ) : (\n <Progress />\n )}\n <ContentHeader title=\"Catalog synchronization\" />\n <InfoCard subheader=\"GitHub ownership stays authoritative; Anyshift adds observed infrastructure context\">\n <Grid container spacing={2}>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.configured}</Typography>\n <Typography color=\"textSecondary\">Configured</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.excluded}</Typography>\n <Typography color=\"textSecondary\">Excluded</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.unclassified}</Typography>\n <Typography color=\"textSecondary\">Unclassified</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.observed}</Typography>\n <Typography color=\"textSecondary\">Active matches</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">\n {syncSummary.managedResources}\n </Typography>\n <Typography color=\"textSecondary\">Managed resources</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography>\n Last reconciliation: <strong>{syncStatus.status}</strong>\n {syncStatus.finishedAt\n ? ` · ${formatTimestamp(syncStatus.finishedAt)}`\n : ''}\n {syncStatus.trigger ? ` · ${syncStatus.trigger}` : ''}\n </Typography>\n {syncStatus.error && (\n <Typography color=\"error\">\n Last failure: {syncStatus.error}\n </Typography>\n )}\n {catalogSyncPermission.allowed && (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n disabled={requestingSync}\n onClick={requestCatalogSync}\n style={{ marginTop: 12 }}\n >\n {requestingSync ? 'Requesting…' : 'Reconcile now'}\n </Button>\n )}\n {syncRequestMessage && (\n <Typography color=\"textSecondary\">\n {syncRequestMessage}\n </Typography>\n )}\n {syncRequestError && (\n <Typography color=\"error\">{syncRequestError}</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n <ContentHeader title=\"Find a service\" />\n <InfoCard subheader=\"Anyshift-annotated Components and Resources in the Backstage catalog\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Search services and resources\"\n value={catalogQuery}\n onChange={event => setCatalogQuery(event.target.value)}\n />\n {catalogError && (\n <Typography color=\"error\">{catalogError}</Typography>\n )}\n {!catalogError && matchingEntities.length === 0 ? (\n <Typography color=\"textSecondary\" style={{ marginTop: 12 }}>\n No matching Anyshift catalog entities.\n </Typography>\n ) : (\n <ul>\n {matchingEntities.map(entity => (\n <li\n key={`${entity.kind}:${\n entity.metadata.namespace ?? 'default'\n }/${entity.metadata.name}`}\n >\n <EntityRefLink entityRef={entity} />\n {entity.metadata.description\n ? ` - ${entity.metadata.description}`\n : null}\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n <ContentHeader title=\"Estate insights\" />\n {insightError && <Typography color=\"error\">{insightError}</Typography>}\n {!insights && !insightError ? <Progress /> : null}\n <Grid container spacing={3}>\n {insights && (\n <EstateInsightsGrid\n insights={insights}\n onRetryCoverage={() => void loadInsights(true)}\n refreshingCoverage={refreshingInsights}\n />\n )}\n {capabilities.askEnabled && (\n <Grid item xs={12}>\n <AskAnyshiftCard context=\"estate\" />\n </Grid>\n )}\n {capabilities.queryEnabled && queryPermission.allowed && (\n <Grid item xs={12}>\n <InfoCard\n title=\"Advanced query\"\n subheader=\"Deterministic Graph API SELECT queries only\"\n >\n <TextField\n fullWidth\n multiline\n minRows={2}\n variant=\"outlined\"\n value={sql}\n onChange={event => setSql(event.target.value)}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={runQuery}\n style={{ marginTop: 12 }}\n >\n Run query\n </Button>\n {queryError && (\n <Typography color=\"error\">{queryError}</Typography>\n )}\n {queryResult && (\n <pre style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>\n {JSON.stringify(queryResult, null, 2)}\n </pre>\n )}\n </InfoCard>\n </Grid>\n )}\n </Grid>\n </Content>\n </Page>\n );\n};\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
@@ -27,14 +27,12 @@ function resolveSignalEntity(entities, signal) {
27
27
  }
28
28
  function globalDatadogViewFrom(signals, entities) {
29
29
  const uniqueActive = /* @__PURE__ */ new Map();
30
- for (const row of signals.active.firing ?? []) {
31
- const key = [
32
- row.monitor,
33
- row.state,
34
- row.service,
35
- row.workload,
36
- row.namespace
37
- ].filter(Boolean).join("|").toLocaleLowerCase();
30
+ const activeItems = signals.active.items ?? [];
31
+ const activeProviders = signals.active.providers ?? [];
32
+ const activeWarnings = signals.active.warnings ?? [];
33
+ for (const item of activeItems) {
34
+ const row = activeSignalRow(item);
35
+ const key = row.id;
38
36
  if (!uniqueActive.has(key)) {
39
37
  uniqueActive.set(key, {
40
38
  ...row,
@@ -57,15 +55,38 @@ function globalDatadogViewFrom(signals, entities) {
57
55
  };
58
56
  });
59
57
  return {
60
- activeTotal: signals.active.total,
61
- byState: signals.active.byState ?? [],
58
+ activeTotal: activeItems.length,
59
+ activeHasMore: signals.active.page?.hasMore === true,
60
+ byState: activeStateCounts(activeItems),
62
61
  activeRows,
63
62
  noiseCounts: signals.noise.counts,
64
63
  noiseRows,
65
64
  activeError: signals.active.state === "error" ? signals.active.message : void 0,
66
- noiseError: signals.noise.state === "error" ? signals.noise.message : void 0
65
+ noiseError: signals.noise.state === "error" ? signals.noise.message : void 0,
66
+ activePartial: signals.active.partial === true || activeProviders.some((provider) => provider.status !== "available") || activeWarnings.length > 0,
67
+ activeProviders,
68
+ activeWarnings
67
69
  };
68
70
  }
71
+ function activeSignalRow(item) {
72
+ return {
73
+ id: item.id,
74
+ title: item.title,
75
+ provider: item.provider,
76
+ severity: item.severity,
77
+ providerStatus: item.providerStatus,
78
+ service: item.service?.name ?? null,
79
+ workload: item.service?.name ?? null,
80
+ namespace: item.service?.namespace ?? null
81
+ };
82
+ }
83
+ function activeStateCounts(items) {
84
+ const counts = /* @__PURE__ */ new Map();
85
+ for (const item of items) {
86
+ counts.set(item.providerStatus, (counts.get(item.providerStatus) ?? 0) + 1);
87
+ }
88
+ return [...counts].map(([state, count]) => ({ state, count }));
89
+ }
69
90
  const useStyles = makeStyles((theme) => ({
70
91
  eyebrow: {
71
92
  color: COLORS.datadog,
@@ -128,7 +149,7 @@ const DatadogOperationsRadar = ({
128
149
  action: /* @__PURE__ */ jsx(
129
150
  Button,
130
151
  {
131
- "aria-label": "Refresh Datadog signals",
152
+ "aria-label": "Refresh operational signals",
132
153
  onClick: onRefresh,
133
154
  disabled: refreshing,
134
155
  size: "small",
@@ -136,7 +157,7 @@ const DatadogOperationsRadar = ({
136
157
  }
137
158
  ),
138
159
  children: [
139
- /* @__PURE__ */ jsx(Typography, { variant: "overline", className: classes.eyebrow, children: "Datadog \xB7 live graph signal" }),
160
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", className: classes.eyebrow, children: "Operational alerts \xB7 live graph signal" }),
140
161
  /* @__PURE__ */ jsx(Box, { mt: 1, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
141
162
  /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsx(
142
163
  SignalLane,
@@ -158,16 +179,7 @@ const DatadogOperationsRadar = ({
158
179
  ) })
159
180
  ] }) }),
160
181
  error && /* @__PURE__ */ jsx(Typography, { color: "error", component: "p", children: error }),
161
- signals.state === "partial" && /* @__PURE__ */ jsx(
162
- Typography,
163
- {
164
- variant: "caption",
165
- color: "textSecondary",
166
- component: "p",
167
- className: classes.partial,
168
- children: "Some Datadog evidence is temporarily unavailable."
169
- }
170
- ),
182
+ (signals.state === "partial" || view.activePartial) && /* @__PURE__ */ jsx(AlertCoverage, { view, classes }),
171
183
  /* @__PURE__ */ jsx(EvidenceDisclosure, { data: signals })
172
184
  ]
173
185
  }
@@ -189,37 +201,86 @@ const ActiveLane = ({
189
201
  if (view.activeError) {
190
202
  return /* @__PURE__ */ jsx(Typography, { color: "error", children: view.activeError });
191
203
  }
204
+ const activeTotal = view.activeTotal ?? 0;
192
205
  return /* @__PURE__ */ jsxs(Fragment, { children: [
193
206
  /* @__PURE__ */ jsxs(Box, { mt: 1, children: [
194
207
  /* @__PURE__ */ jsxs(Typography, { variant: "h4", className: classes.headline, children: [
195
- formatNumber(view.activeTotal ?? 0),
196
- " active monitors"
208
+ view.activeHasMore ? "At least " : "",
209
+ formatNumber(activeTotal),
210
+ " active",
211
+ " ",
212
+ activeTotal === 1 ? "alert" : "alerts"
197
213
  ] }),
198
214
  /* @__PURE__ */ jsx(Box, { className: classes.metrics, children: view.byState.map((item) => /* @__PURE__ */ jsx(
199
215
  Chip,
200
216
  {
201
217
  size: "small",
202
218
  variant: "outlined",
203
- label: `${formatNumber(item.count)} ${item.state}`
219
+ label: `${formatNumber(item.count)} ${item.state}${view.activeHasMore ? " (loaded page)" : ""}`
204
220
  },
205
221
  item.state
206
- )) })
222
+ )) }),
223
+ view.activeHasMore && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: "Provider state counts reflect the loaded page only." })
207
224
  ] }),
208
225
  /* @__PURE__ */ jsx(
209
226
  SignalRows,
210
227
  {
211
228
  rows: view.activeRows.map((row) => ({
212
- key: [row.monitor, row.state, row.workload].join("|"),
213
- title: row.monitor,
214
- detail: [row.state, row.workload || row.service].filter(Boolean).join(" \xB7 "),
229
+ key: row.id,
230
+ title: row.title,
231
+ detail: [
232
+ row.provider,
233
+ row.severity,
234
+ row.providerStatus,
235
+ row.workload || row.service
236
+ ].filter(Boolean).join(" \xB7 "),
215
237
  entity: row.entity
216
238
  })),
217
- empty: "No active Datadog monitors.",
239
+ empty: "No active alerts.",
218
240
  classes
219
241
  }
220
242
  )
221
243
  ] });
222
244
  };
245
+ const AlertCoverage = ({
246
+ view,
247
+ classes
248
+ }) => /* @__PURE__ */ jsxs(Box, { className: classes.partial, children: [
249
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", component: "p", children: "Some operational alert evidence is temporarily unavailable." }),
250
+ view.activeProviders.filter((provider) => provider.status !== "available").map((provider) => /* @__PURE__ */ jsxs(
251
+ Typography,
252
+ {
253
+ variant: "caption",
254
+ color: "textSecondary",
255
+ component: "p",
256
+ children: [
257
+ "Alert coverage: ",
258
+ readableProvider(provider.provider),
259
+ " ",
260
+ provider.status,
261
+ "."
262
+ ]
263
+ },
264
+ provider.provider
265
+ )),
266
+ view.activeWarnings.map((warning) => /* @__PURE__ */ jsxs(
267
+ Typography,
268
+ {
269
+ variant: "caption",
270
+ color: "textSecondary",
271
+ component: "p",
272
+ children: [
273
+ "Alert warning: ",
274
+ warning.message,
275
+ warning.message.endsWith(".") ? "" : "."
276
+ ]
277
+ },
278
+ `${warning.provider ?? "alert"}:${warning.code}`
279
+ ))
280
+ ] });
281
+ function readableProvider(provider) {
282
+ return provider.charAt(0).toUpperCase() + provider.slice(1);
283
+ }
223
284
  const NoiseLane = ({
224
285
  view,
225
286
  classes
@@ -1 +1 @@
1
- {"version":3,"file":"DatadogOperationsRadar.esm.js","sources":["../../../src/components/explorer/DatadogOperationsRadar.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n Divider,\n Grid,\n Typography,\n makeStyles,\n} from '@material-ui/core';\nimport { InfoCard } from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport type { DatadogSignals, DatadogSignalWorkload } from '../../api/types';\nimport { EvidenceDisclosure } from '../entity/EvidenceDisclosure';\n\nconst COLORS = {\n datadog: '#632ca6',\n firing: '#d63230',\n noisy: '#d97706',\n quiet: '#238636',\n unavailable: '#6b7280',\n};\n\ninterface ActiveSignalRow {\n monitor: string;\n state: string;\n service: string | null;\n workload: string | null;\n namespace: string | null;\n entity?: Entity;\n}\n\ninterface NoiseSignalRow {\n name: string;\n fires: number;\n recovers: number;\n pctSelfResolved: number;\n noiseKind: 'flapping' | 'stuck';\n services: string[];\n workloads: DatadogSignalWorkload[];\n entity?: Entity;\n}\n\nexport interface GlobalDatadogView {\n activeTotal?: number;\n byState: Array<{ state: string; count: number }>;\n activeRows: ActiveSignalRow[];\n noiseCounts?: { flapping: number; stuck: number; totalFires: number };\n noiseRows: NoiseSignalRow[];\n activeError?: string;\n noiseError?: string;\n}\n\nexport function resolveSignalEntity(\n entities: Entity[],\n signal: {\n workload?: string | null;\n namespace?: string | null;\n service?: string | null;\n },\n): Entity | undefined {\n for (const target of [signal.workload, signal.service]) {\n if (!target) continue;\n const matches = entities.filter(entity => {\n const annotated = entity.metadata.annotations?.['anyshift.io/target'];\n const nameMatches =\n annotated === target || entity.metadata.name === target;\n const namespace = entity.metadata.namespace ?? 'default';\n return (\n nameMatches && (!signal.namespace || namespace === signal.namespace)\n );\n });\n if (matches.length === 1) return matches[0];\n const components = matches.filter(entity => entity.kind === 'Component');\n if (components.length === 1) return components[0];\n }\n return undefined;\n}\n\nexport function globalDatadogViewFrom(\n signals: DatadogSignals,\n entities: Entity[],\n): GlobalDatadogView {\n const uniqueActive = new Map<string, ActiveSignalRow>();\n for (const row of signals.active.firing ?? []) {\n const key = [\n row.monitor,\n row.state,\n row.service,\n row.workload,\n row.namespace,\n ]\n .filter(Boolean)\n .join('|')\n .toLocaleLowerCase();\n if (!uniqueActive.has(key)) {\n uniqueActive.set(key, {\n ...row,\n entity: resolveSignalEntity(entities, row),\n });\n }\n }\n\n const activeRows = [...uniqueActive.values()]\n .sort(\n (left, right) =>\n Number(Boolean(right.entity)) - Number(Boolean(left.entity)),\n )\n .slice(0, 5);\n const noiseRows = (signals.noise.monitors ?? []).slice(0, 5).map(row => {\n const workload = row.workloads[0];\n return {\n ...row,\n entity: resolveSignalEntity(entities, {\n workload: workload?.name,\n namespace: workload?.namespace,\n service: row.services[0],\n }),\n };\n });\n\n return {\n activeTotal: signals.active.total,\n byState: signals.active.byState ?? [],\n activeRows,\n noiseCounts: signals.noise.counts,\n noiseRows,\n activeError:\n signals.active.state === 'error' ? signals.active.message : undefined,\n noiseError:\n signals.noise.state === 'error' ? signals.noise.message : undefined,\n };\n}\n\nconst useStyles = makeStyles(theme => ({\n eyebrow: {\n color: COLORS.datadog,\n fontWeight: 700,\n letterSpacing: '0.12em',\n },\n lane: {\n height: '100%',\n borderLeft: '4px solid',\n padding: theme.spacing(0.5, 0, 0.5, 2),\n },\n laneTitle: {\n fontWeight: 700,\n letterSpacing: '-0.02em',\n },\n headline: {\n fontWeight: 700,\n fontVariantNumeric: 'tabular-nums',\n },\n metrics: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n metric: {\n padding: theme.spacing(0.75, 1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n fontVariantNumeric: 'tabular-nums',\n },\n row: {\n padding: theme.spacing(1.25, 0),\n },\n rowTitle: {\n fontWeight: 600,\n overflowWrap: 'anywhere',\n },\n partial: {\n marginTop: theme.spacing(2),\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.action.hover,\n },\n}));\n\nexport const DatadogOperationsRadar = ({\n signals,\n catalogEntities,\n onRefresh,\n refreshing = false,\n error,\n}: {\n signals: DatadogSignals;\n catalogEntities: Entity[];\n onRefresh: () => void;\n refreshing?: boolean;\n error?: string;\n}) => {\n const classes = useStyles();\n const view = globalDatadogViewFrom(signals, catalogEntities);\n\n return (\n <InfoCard\n title=\"Operational pulse\"\n subheader=\"What is burning now and what keeps paging teams\"\n action={\n <Button\n aria-label=\"Refresh Datadog signals\"\n onClick={onRefresh}\n disabled={refreshing}\n size=\"small\"\n >\n {refreshing ? 'Refreshing…' : 'Refresh'}\n </Button>\n }\n >\n <Typography variant=\"overline\" className={classes.eyebrow}>\n Datadog · live graph signal\n </Typography>\n <Box mt={1}>\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"On fire now\"\n color={view.activeError ? COLORS.unavailable : COLORS.firing}\n classes={classes}\n >\n <ActiveLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"Paging noise · 7 days\"\n color={view.noiseError ? COLORS.unavailable : COLORS.noisy}\n classes={classes}\n >\n <NoiseLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n </Grid>\n </Box>\n {error && (\n <Typography color=\"error\" component=\"p\">\n {error}\n </Typography>\n )}\n {signals.state === 'partial' && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n component=\"p\"\n className={classes.partial}\n >\n Some Datadog evidence is temporarily unavailable.\n </Typography>\n )}\n <EvidenceDisclosure data={signals} />\n </InfoCard>\n );\n};\n\nconst SignalLane = ({\n title,\n color,\n classes,\n children,\n}: {\n title: string;\n color: string;\n classes: ReturnType<typeof useStyles>;\n children: React.ReactNode;\n}) => (\n <Box className={classes.lane} style={{ borderLeftColor: color }}>\n <Typography variant=\"h5\" className={classes.laneTitle}>\n {title}\n </Typography>\n {children}\n </Box>\n);\n\nconst ActiveLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.activeError) {\n return <Typography color=\"error\">{view.activeError}</Typography>;\n }\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {formatNumber(view.activeTotal ?? 0)} active monitors\n </Typography>\n <Box className={classes.metrics}>\n {view.byState.map(item => (\n <Chip\n key={item.state}\n size=\"small\"\n variant=\"outlined\"\n label={`${formatNumber(item.count)} ${item.state}`}\n />\n ))}\n </Box>\n </Box>\n <SignalRows\n rows={view.activeRows.map(row => ({\n key: [row.monitor, row.state, row.workload].join('|'),\n title: row.monitor,\n detail: [row.state, row.workload || row.service]\n .filter(Boolean)\n .join(' · '),\n entity: row.entity,\n }))}\n empty=\"No active Datadog monitors.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst NoiseLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.noiseError) {\n return <Typography color=\"error\">{view.noiseError}</Typography>;\n }\n const counts = view.noiseCounts ?? {\n totalFires: 0,\n flapping: 0,\n stuck: 0,\n };\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {formatNumber(counts.totalFires)} fires\n </Typography>\n <Box className={classes.metrics}>\n <Box className={classes.metric}>{counts.flapping} flapping</Box>\n <Box className={classes.metric}>{counts.stuck} stuck</Box>\n </Box>\n </Box>\n <SignalRows\n rows={view.noiseRows.map((row, index) => ({\n key: `${index}:${row.name}`,\n title: row.name,\n detail: `${formatNumber(row.fires)} fires · ${formatNumber(\n row.recovers,\n )} recovers · ${row.noiseKind}`,\n entity: row.entity,\n }))}\n empty=\"No paging noise in this window.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst SignalRows = ({\n rows,\n empty,\n classes,\n}: {\n rows: Array<{ key: string; title: string; detail: string; entity?: Entity }>;\n empty: string;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (rows.length === 0) {\n return (\n <Box mt={2}>\n <Typography color=\"textSecondary\">{empty}</Typography>\n </Box>\n );\n }\n return (\n <Box mt={2}>\n <Divider />\n {rows.map(row => (\n <Box key={row.key}>\n <Box className={classes.row}>\n <Typography variant=\"subtitle2\" className={classes.rowTitle}>\n {row.title}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\" component=\"p\">\n {row.detail}\n </Typography>\n <Typography variant=\"caption\" component=\"p\">\n {row.entity ? (\n <EntityRefLink entityRef={row.entity} />\n ) : (\n 'Not mapped to a catalog service'\n )}\n </Typography>\n </Box>\n <Divider />\n </Box>\n ))}\n </Box>\n );\n};\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat('en-US').format(value);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DatadogOperationsRadar.esm.js","sources":["../../../src/components/explorer/DatadogOperationsRadar.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n Divider,\n Grid,\n Typography,\n makeStyles,\n} from '@material-ui/core';\nimport { InfoCard } from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport type {\n DatadogSignalAlert,\n DatadogSignals,\n DatadogSignalWorkload,\n} from '../../api/types';\nimport { EvidenceDisclosure } from '../entity/EvidenceDisclosure';\n\nconst COLORS = {\n datadog: '#632ca6',\n firing: '#d63230',\n noisy: '#d97706',\n quiet: '#238636',\n unavailable: '#6b7280',\n};\n\ninterface ActiveSignalRow {\n id: string;\n title: string;\n provider: string;\n severity: string;\n providerStatus: string;\n service: string | null;\n workload: string | null;\n namespace: string | null;\n entity?: Entity;\n}\n\ninterface NoiseSignalRow {\n name: string;\n fires: number;\n recovers: number;\n pctSelfResolved: number;\n noiseKind: 'flapping' | 'stuck';\n services: string[];\n workloads: DatadogSignalWorkload[];\n entity?: Entity;\n}\n\nexport interface GlobalDatadogView {\n activeTotal?: number;\n activeHasMore: boolean;\n byState: Array<{ state: string; count: number }>;\n activeRows: ActiveSignalRow[];\n noiseCounts?: { flapping: number; stuck: number; totalFires: number };\n noiseRows: NoiseSignalRow[];\n activeError?: string;\n noiseError?: string;\n activePartial: boolean;\n activeProviders: NonNullable<DatadogSignals['active']['providers']>;\n activeWarnings: NonNullable<DatadogSignals['active']['warnings']>;\n}\n\nexport function resolveSignalEntity(\n entities: Entity[],\n signal: {\n workload?: string | null;\n namespace?: string | null;\n service?: string | null;\n },\n): Entity | undefined {\n for (const target of [signal.workload, signal.service]) {\n if (!target) continue;\n const matches = entities.filter(entity => {\n const annotated = entity.metadata.annotations?.['anyshift.io/target'];\n const nameMatches =\n annotated === target || entity.metadata.name === target;\n const namespace = entity.metadata.namespace ?? 'default';\n return (\n nameMatches && (!signal.namespace || namespace === signal.namespace)\n );\n });\n if (matches.length === 1) return matches[0];\n const components = matches.filter(entity => entity.kind === 'Component');\n if (components.length === 1) return components[0];\n }\n return undefined;\n}\n\nexport function globalDatadogViewFrom(\n signals: DatadogSignals,\n entities: Entity[],\n): GlobalDatadogView {\n const uniqueActive = new Map<string, ActiveSignalRow>();\n const activeItems = signals.active.items ?? [];\n const activeProviders = signals.active.providers ?? [];\n const activeWarnings = signals.active.warnings ?? [];\n for (const item of activeItems) {\n const row = activeSignalRow(item);\n const key = row.id;\n if (!uniqueActive.has(key)) {\n uniqueActive.set(key, {\n ...row,\n entity: resolveSignalEntity(entities, row),\n });\n }\n }\n\n const activeRows = [...uniqueActive.values()]\n .sort(\n (left, right) =>\n Number(Boolean(right.entity)) - Number(Boolean(left.entity)),\n )\n .slice(0, 5);\n const noiseRows = (signals.noise.monitors ?? []).slice(0, 5).map(row => {\n const workload = row.workloads[0];\n return {\n ...row,\n entity: resolveSignalEntity(entities, {\n workload: workload?.name,\n namespace: workload?.namespace,\n service: row.services[0],\n }),\n };\n });\n\n return {\n activeTotal: activeItems.length,\n activeHasMore: signals.active.page?.hasMore === true,\n byState: activeStateCounts(activeItems),\n activeRows,\n noiseCounts: signals.noise.counts,\n noiseRows,\n activeError:\n signals.active.state === 'error' ? signals.active.message : undefined,\n noiseError:\n signals.noise.state === 'error' ? signals.noise.message : undefined,\n activePartial:\n signals.active.partial === true ||\n activeProviders.some(provider => provider.status !== 'available') ||\n activeWarnings.length > 0,\n activeProviders,\n activeWarnings,\n };\n}\n\nfunction activeSignalRow(item: DatadogSignalAlert): ActiveSignalRow {\n return {\n id: item.id,\n title: item.title,\n provider: item.provider,\n severity: item.severity,\n providerStatus: item.providerStatus,\n service: item.service?.name ?? null,\n workload: item.service?.name ?? null,\n namespace: item.service?.namespace ?? null,\n };\n}\n\nfunction activeStateCounts(\n items: DatadogSignalAlert[],\n): Array<{ state: string; count: number }> {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.providerStatus, (counts.get(item.providerStatus) ?? 0) + 1);\n }\n return [...counts].map(([state, count]) => ({ state, count }));\n}\n\nconst useStyles = makeStyles(theme => ({\n eyebrow: {\n color: COLORS.datadog,\n fontWeight: 700,\n letterSpacing: '0.12em',\n },\n lane: {\n height: '100%',\n borderLeft: '4px solid',\n padding: theme.spacing(0.5, 0, 0.5, 2),\n },\n laneTitle: {\n fontWeight: 700,\n letterSpacing: '-0.02em',\n },\n headline: {\n fontWeight: 700,\n fontVariantNumeric: 'tabular-nums',\n },\n metrics: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n metric: {\n padding: theme.spacing(0.75, 1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n fontVariantNumeric: 'tabular-nums',\n },\n row: {\n padding: theme.spacing(1.25, 0),\n },\n rowTitle: {\n fontWeight: 600,\n overflowWrap: 'anywhere',\n },\n partial: {\n marginTop: theme.spacing(2),\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.action.hover,\n },\n}));\n\nexport const DatadogOperationsRadar = ({\n signals,\n catalogEntities,\n onRefresh,\n refreshing = false,\n error,\n}: {\n signals: DatadogSignals;\n catalogEntities: Entity[];\n onRefresh: () => void;\n refreshing?: boolean;\n error?: string;\n}) => {\n const classes = useStyles();\n const view = globalDatadogViewFrom(signals, catalogEntities);\n\n return (\n <InfoCard\n title=\"Operational pulse\"\n subheader=\"What is burning now and what keeps paging teams\"\n action={\n <Button\n aria-label=\"Refresh operational signals\"\n onClick={onRefresh}\n disabled={refreshing}\n size=\"small\"\n >\n {refreshing ? 'Refreshing…' : 'Refresh'}\n </Button>\n }\n >\n <Typography variant=\"overline\" className={classes.eyebrow}>\n Operational alerts · live graph signal\n </Typography>\n <Box mt={1}>\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"On fire now\"\n color={view.activeError ? COLORS.unavailable : COLORS.firing}\n classes={classes}\n >\n <ActiveLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"Paging noise · 7 days\"\n color={view.noiseError ? COLORS.unavailable : COLORS.noisy}\n classes={classes}\n >\n <NoiseLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n </Grid>\n </Box>\n {error && (\n <Typography color=\"error\" component=\"p\">\n {error}\n </Typography>\n )}\n {(signals.state === 'partial' || view.activePartial) && (\n <AlertCoverage view={view} classes={classes} />\n )}\n <EvidenceDisclosure data={signals} />\n </InfoCard>\n );\n};\n\nconst SignalLane = ({\n title,\n color,\n classes,\n children,\n}: {\n title: string;\n color: string;\n classes: ReturnType<typeof useStyles>;\n children: React.ReactNode;\n}) => (\n <Box className={classes.lane} style={{ borderLeftColor: color }}>\n <Typography variant=\"h5\" className={classes.laneTitle}>\n {title}\n </Typography>\n {children}\n </Box>\n);\n\nconst ActiveLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.activeError) {\n return <Typography color=\"error\">{view.activeError}</Typography>;\n }\n const activeTotal = view.activeTotal ?? 0;\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {view.activeHasMore ? 'At least ' : ''}\n {formatNumber(activeTotal)} active{' '}\n {activeTotal === 1 ? 'alert' : 'alerts'}\n </Typography>\n <Box className={classes.metrics}>\n {view.byState.map(item => (\n <Chip\n key={item.state}\n size=\"small\"\n variant=\"outlined\"\n label={`${formatNumber(item.count)} ${item.state}${\n view.activeHasMore ? ' (loaded page)' : ''\n }`}\n />\n ))}\n </Box>\n {view.activeHasMore && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Provider state counts reflect the loaded page only.\n </Typography>\n )}\n </Box>\n <SignalRows\n rows={view.activeRows.map(row => ({\n key: row.id,\n title: row.title,\n detail: [\n row.provider,\n row.severity,\n row.providerStatus,\n row.workload || row.service,\n ]\n .filter(Boolean)\n .join(' · '),\n entity: row.entity,\n }))}\n empty=\"No active alerts.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst AlertCoverage = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.partial}>\n <Typography variant=\"caption\" color=\"textSecondary\" component=\"p\">\n Some operational alert evidence is temporarily unavailable.\n </Typography>\n {view.activeProviders\n .filter(provider => provider.status !== 'available')\n .map(provider => (\n <Typography\n key={provider.provider}\n variant=\"caption\"\n color=\"textSecondary\"\n component=\"p\"\n >\n Alert coverage: {readableProvider(provider.provider)}{' '}\n {provider.status}.\n </Typography>\n ))}\n {view.activeWarnings.map(warning => (\n <Typography\n key={`${warning.provider ?? 'alert'}:${warning.code}`}\n variant=\"caption\"\n color=\"textSecondary\"\n component=\"p\"\n >\n Alert warning: {warning.message}\n {warning.message.endsWith('.') ? '' : '.'}\n </Typography>\n ))}\n </Box>\n);\n\nfunction readableProvider(provider: string): string {\n return provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nconst NoiseLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.noiseError) {\n return <Typography color=\"error\">{view.noiseError}</Typography>;\n }\n const counts = view.noiseCounts ?? {\n totalFires: 0,\n flapping: 0,\n stuck: 0,\n };\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {formatNumber(counts.totalFires)} fires\n </Typography>\n <Box className={classes.metrics}>\n <Box className={classes.metric}>{counts.flapping} flapping</Box>\n <Box className={classes.metric}>{counts.stuck} stuck</Box>\n </Box>\n </Box>\n <SignalRows\n rows={view.noiseRows.map((row, index) => ({\n key: `${index}:${row.name}`,\n title: row.name,\n detail: `${formatNumber(row.fires)} fires · ${formatNumber(\n row.recovers,\n )} recovers · ${row.noiseKind}`,\n entity: row.entity,\n }))}\n empty=\"No paging noise in this window.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst SignalRows = ({\n rows,\n empty,\n classes,\n}: {\n rows: Array<{ key: string; title: string; detail: string; entity?: Entity }>;\n empty: string;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (rows.length === 0) {\n return (\n <Box mt={2}>\n <Typography color=\"textSecondary\">{empty}</Typography>\n </Box>\n );\n }\n return (\n <Box mt={2}>\n <Divider />\n {rows.map(row => (\n <Box key={row.key}>\n <Box className={classes.row}>\n <Typography variant=\"subtitle2\" className={classes.rowTitle}>\n {row.title}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\" component=\"p\">\n {row.detail}\n </Typography>\n <Typography variant=\"caption\" component=\"p\">\n {row.entity ? (\n <EntityRefLink entityRef={row.entity} />\n ) : (\n 'Not mapped to a catalog service'\n )}\n </Typography>\n </Box>\n <Divider />\n </Box>\n ))}\n </Box>\n );\n};\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat('en-US').format(value);\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,18 +1,28 @@
1
1
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
2
- import { FrontendPlugin } from '@backstage/frontend-plugin-api';
3
- import { AnyshiftCapabilities, ServiceBrief, BriefSectionName, BriefSectionResponse, EstateInsights, DatadogSignals, CatalogSummary, QueryResult, CatalogSyncReport } from '@anyshift/backstage-plugin-anyshift-common';
4
- export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
2
+ import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api';
3
+ import { AskAnyshiftRequest, AskAnyshiftResponse, AnyshiftCapabilities, ServiceBrief, BriefSectionName, BriefSectionResponse, EstateInsights, DatadogSignals, CloudResourceBrief, CatalogSummary, QueryResult, CatalogSyncReport } from '@anyshift/backstage-plugin-anyshift-common';
4
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION, ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, CloudEventEvidenceItem, CloudEventsEvidence, CloudResourceBrief, EntityImpact, EstateInsights, EvidenceCoverage, GITHUB_PROJECT_SLUG_ANNOTATION, IacDriftEvidence, IacEvidence, ImpactResult, QueryResult, ServiceBrief, WhyNowAssessment, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
5
5
 
6
- declare const anyshiftPlugin: FrontendPlugin;
6
+ declare const rootRouteRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
7
+ declare const cloudRouteRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
8
+
9
+ declare const anyshiftPlugin: OverridableFrontendPlugin<{
10
+ root: typeof rootRouteRef;
11
+ cloud: typeof cloudRouteRef;
12
+ }>;
7
13
 
8
14
  interface AnyshiftApi {
15
+ ask(request: AskAnyshiftRequest): Promise<AskAnyshiftResponse>;
9
16
  capabilities(): Promise<AnyshiftCapabilities>;
10
17
  brief(kind: string, target: string, options?: BriefRequestOptions): Promise<ServiceBrief>;
11
18
  briefSection(kind: string, target: string, section: BriefSectionName, options?: BriefRequestOptions): Promise<BriefSectionResponse>;
12
- insights(): Promise<EstateInsights>;
19
+ insights(options?: {
20
+ refresh?: boolean;
21
+ }): Promise<EstateInsights>;
13
22
  datadogSignals(options?: {
14
23
  refresh?: boolean;
15
24
  }): Promise<DatadogSignals>;
25
+ cloudResourceBrief(resource: string, options?: CloudResourceBriefRequestOptions): Promise<CloudResourceBrief>;
16
26
  inventory(type: string, options?: {
17
27
  limit?: number;
18
28
  offset?: number;
@@ -23,6 +33,16 @@ interface AnyshiftApi {
23
33
  interface BriefRequestOptions {
24
34
  namespace?: string;
25
35
  refresh?: boolean;
36
+ configurationEndpoints?: string;
37
+ configurationDependencies?: string;
38
+ configurationTarget?: string;
39
+ }
40
+ interface CloudResourceBriefRequestOptions {
41
+ fallbackResource?: string;
42
+ since?: string;
43
+ cursor?: string;
44
+ diff?: boolean;
45
+ refresh?: boolean;
26
46
  }
27
47
  interface CatalogSyncAccepted {
28
48
  accepted: true;
@@ -34,4 +54,4 @@ declare const anyshiftApiRef: _backstage_frontend_plugin_api.ApiRef<AnyshiftApi>
34
54
  };
35
55
 
36
56
  export { anyshiftApiRef, anyshiftPlugin, anyshiftPlugin as default };
37
- export type { AnyshiftApi };
57
+ export type { AnyshiftApi, CloudResourceBriefRequestOptions };
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { anyshiftPlugin, anyshiftPlugin as default } from './plugin.esm.js';
2
2
  export { anyshiftApiRef } from './api/AnyshiftApi.esm.js';
3
- export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
3
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION, ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
4
4
  //# sourceMappingURL=index.esm.js.map
@@ -1,5 +1,5 @@
1
1
  var name = "@anyshift/backstage-plugin-anyshift";
2
- var version = "0.1.0-beta.22";
2
+ var version = "0.1.0-beta.23";
3
3
  var description = "Read-only Anyshift infrastructure context for Backstage";
4
4
  var main = "src/index.ts";
5
5
  var types = "src/index.ts";
@@ -67,7 +67,8 @@ var devDependencies = {
67
67
  "@testing-library/jest-dom": "^6.0.0",
68
68
  "@testing-library/react": "^14.0.0",
69
69
  "@testing-library/user-event": "^14.0.0",
70
- msw: "^1.0.0"
70
+ msw: "^1.0.0",
71
+ swr: "^2.0.0"
71
72
  };
72
73
  var files = [
73
74
  "dist"
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,7 +3,8 @@ import DeviceHubIcon from '@material-ui/icons/DeviceHub';
3
3
  import CloudQueueIcon from '@material-ui/icons/CloudQueue';
4
4
  import { ApiBlueprint, fetchApiRef, discoveryApiRef, PageBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
5
5
  import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
6
- import { anyshiftViewPermission, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, isAnyshiftResourceKind, ANYSHIFT_MANAGED_BY_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
6
+ import { anyshiftViewPermission, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, isAnyshiftResourceKind, ANYSHIFT_MANAGED_BY_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
7
+ import { isCloudResourceEntity, cloudResourceIdentity } from './components/entity/entityIdentity.esm.js';
7
8
  import { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary.esm.js';
8
9
  import { AnyshiftClient, anyshiftApiRef } from './api/AnyshiftApi.esm.js';
9
10
  import { rootRouteRef, cloudRouteRef } from './routes.esm.js';
@@ -57,6 +58,9 @@ const cloudEntityContent = EntityContentBlueprint.make({
57
58
  }
58
59
  });
59
60
  function isAnyshiftEntityContentAvailable(entity) {
61
+ if (isCloudResourceEntity(entity)) {
62
+ return Boolean(cloudResourceIdentity(entity));
63
+ }
60
64
  const annotations = entity.metadata.annotations ?? {};
61
65
  const hasTarget = Boolean(
62
66
  annotations[ANYSHIFT_TARGET_ANNOTATION] || annotations[GITHUB_PROJECT_SLUG_ANNOTATION]
@@ -67,7 +71,7 @@ function isAnyshiftEntityContentAvailable(entity) {
67
71
  return annotations[ANYSHIFT_MANAGED_BY_ANNOTATION] !== "catalog-provider";
68
72
  }
69
73
  function isCloudResourceContentAvailable(entity) {
70
- return entity.kind.toLocaleLowerCase("en-US") === "resource" && Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]);
74
+ return isCloudResourceEntity(entity) && Boolean(cloudResourceIdentity(entity));
71
75
  }
72
76
  const anyshiftPlugin = createFrontendPlugin({
73
77
  pluginId: "anyshift",