@anyshift/backstage-plugin-anyshift 0.1.0-beta.2 → 0.1.0-beta.20

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 (52) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +14 -1
  3. package/dist/api/AnyshiftApi.esm.js +61 -7
  4. package/dist/api/AnyshiftApi.esm.js.map +1 -1
  5. package/dist/components/ask/AskAnyshiftCard.esm.js +348 -0
  6. package/dist/components/ask/AskAnyshiftCard.esm.js.map +1 -0
  7. package/dist/components/ask/askPresenters.esm.js +1203 -0
  8. package/dist/components/ask/askPresenters.esm.js.map +1 -0
  9. package/dist/components/ask/askScope.esm.js +27 -0
  10. package/dist/components/ask/askScope.esm.js.map +1 -0
  11. package/dist/components/ask/askSuggestions.esm.js +41 -0
  12. package/dist/components/ask/askSuggestions.esm.js.map +1 -0
  13. package/dist/components/cloud/CloudImpactSection.esm.js +54 -0
  14. package/dist/components/cloud/CloudImpactSection.esm.js.map +1 -0
  15. package/dist/components/cloud/CloudPage.esm.js +104 -0
  16. package/dist/components/cloud/CloudPage.esm.js.map +1 -0
  17. package/dist/components/cloud/CloudRelationshipSections.esm.js +43 -0
  18. package/dist/components/cloud/CloudRelationshipSections.esm.js.map +1 -0
  19. package/dist/components/cloud/CloudResourceContent.esm.js +495 -0
  20. package/dist/components/cloud/CloudResourceContent.esm.js.map +1 -0
  21. package/dist/components/entity/AnyshiftEntityContent.esm.js +128 -23
  22. package/dist/components/entity/AnyshiftEntityContent.esm.js.map +1 -1
  23. package/dist/components/entity/ArchitectureOperationDetails.esm.js +107 -0
  24. package/dist/components/entity/ArchitectureOperationDetails.esm.js.map +1 -0
  25. package/dist/components/entity/BriefSections.esm.js +24 -4
  26. package/dist/components/entity/BriefSections.esm.js.map +1 -1
  27. package/dist/components/entity/DatadogLiveSignal.esm.js +85 -23
  28. package/dist/components/entity/DatadogLiveSignal.esm.js.map +1 -1
  29. package/dist/components/entity/MermaidArchitecture.esm.js +202 -43
  30. package/dist/components/entity/MermaidArchitecture.esm.js.map +1 -1
  31. package/dist/components/entity/SectionPresenters.esm.js +145 -82
  32. package/dist/components/entity/SectionPresenters.esm.js.map +1 -1
  33. package/dist/components/entity/architectureDiagram.esm.js +48 -15
  34. package/dist/components/entity/architectureDiagram.esm.js.map +1 -1
  35. package/dist/components/entity/architectureGraph.esm.js +145 -0
  36. package/dist/components/entity/architectureGraph.esm.js.map +1 -0
  37. package/dist/components/entity/entityIdentity.esm.js +40 -0
  38. package/dist/components/entity/entityIdentity.esm.js.map +1 -0
  39. package/dist/components/entity/relatedCatalogEntities.esm.js +60 -0
  40. package/dist/components/entity/relatedCatalogEntities.esm.js.map +1 -0
  41. package/dist/components/explorer/AnyshiftExplorerPage.esm.js +222 -21
  42. package/dist/components/explorer/AnyshiftExplorerPage.esm.js.map +1 -1
  43. package/dist/components/explorer/DatadogOperationsRadar.esm.js +92 -31
  44. package/dist/components/explorer/DatadogOperationsRadar.esm.js.map +1 -1
  45. package/dist/index.d.ts +26 -102
  46. package/dist/index.esm.js +1 -1
  47. package/dist/package.json.esm.js +10 -10
  48. package/dist/plugin.esm.js +51 -8
  49. package/dist/plugin.esm.js.map +1 -1
  50. package/dist/routes.esm.js +2 -1
  51. package/dist/routes.esm.js.map +1 -1
  52. package/package.json +11 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askPresenters.esm.js","sources":["../../../src/components/ask/askPresenters.tsx"],"sourcesContent":["import {\n Box,\n Chip,\n Grid,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@material-ui/core';\nimport type { ReactNode } from 'react';\nimport type {\n AskResult,\n BackstageAskResult,\n NormalizedAlertsAskResult,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport {\n ImpactPresenter,\n TimelinePresenter,\n} from '../entity/SectionPresenters';\nimport { ArchitectureDiagram } from '../entity/MermaidArchitecture';\n\nconst MAX_ROWS = 10;\nconst MAX_GRAPH_NODES = 30;\nconst MAX_GRAPH_EDGES = 50;\nconst MAX_GRAPH_EDGE_SCAN = 200;\nconst MAX_DETAIL_ITEMS = 3;\n\ntype GraphNodes = NonNullable<AskResult['nodes']>;\ntype GraphEdges = NonNullable<AskResult['edges']>;\ntype AskResultFor<I extends AskResult['intent']> = Extract<\n AskResult,\n { intent: I }\n>;\ntype ResolveResult = Extract<AskResult, { intent: 'resolve' }>['resolve'];\n\nexport type ResolveCandidate = NonNullable<ResolveResult>['candidates'][number];\n\nexport interface TimelineItem {\n id: string;\n type: string;\n timestamp?: string | null;\n target?: string | null;\n namespace?: string | null;\n summary?: string | null;\n}\n\nexport interface EvidenceRow {\n label: string;\n value?: string | number;\n detail?: string | null;\n timestamp?: string | null;\n}\n\nexport interface ImpactSummaryMetric {\n label: string;\n total: number;\n}\n\nexport interface ResourceRow {\n name: string;\n namespace?: string | null;\n type?: string | null;\n detail?: string | null;\n timestamp?: string | null;\n}\n\nexport interface CoverageRow {\n name: string;\n namespace?: string | null;\n status: 'covered' | 'gap' | 'unknown';\n detail?: string | null;\n timestamp?: string | null;\n}\n\nexport interface RankingRow {\n label: string;\n value: number;\n detail?: string | null;\n timestamp?: string | null;\n}\n\nexport interface SummaryMetric {\n label: string;\n value: string | number;\n}\n\nexport interface EvidenceTime {\n label: string;\n timestamp?: string | null;\n}\n\ninterface AlertEvidencePresentation {\n partial: boolean;\n coverage: string[];\n warnings: string[];\n}\n\nexport type AskPresentation =\n | { kind: 'graph'; nodes: GraphNodes; edges: GraphEdges }\n | { kind: 'timeline'; items: TimelineItem[] }\n | { kind: 'impact'; rows: EvidenceRow[]; summary?: ImpactSummaryMetric }\n | { kind: 'inventory'; rows: ResourceRow[]; total?: number }\n | { kind: 'coverage'; rows: CoverageRow[] }\n | {\n kind: 'ranking';\n rows: RankingRow[];\n alertEvidence?: AlertEvidencePresentation;\n }\n | { kind: 'candidates'; candidates: ResolveCandidate[] }\n | { kind: 'summary'; counts: SummaryMetric[]; timestamps: EvidenceTime[] };\n\nexport interface AskResultPresenterProps {\n result: BackstageAskResult;\n effectiveQuestion: string;\n answeredAt: string;\n onQuestion?: (question: string) => void;\n}\n\nexport function presentAskResult(result: BackstageAskResult): AskPresentation {\n switch (result.intent) {\n case 'connections':\n case 'topology':\n return graphPresentation(result.nodes, result.edges, {\n nodes: [],\n edges: [],\n });\n case 'blast':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromBlast(result),\n );\n case 'spof':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromSpof(result),\n );\n case 'path':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromPath(result),\n );\n case 'cascade':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromCascade(result),\n );\n case 'servicetree':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromServiceTree(result),\n );\n case 'calls':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromCalls(result),\n );\n case 'flow':\n return graphPresentation(\n result.nodes,\n result.edges,\n graphFromFlow(result),\n );\n\n case 'events':\n return {\n kind: 'timeline',\n items: timelineFromEvents(result.events?.recent ?? []),\n };\n case 'deployments':\n return {\n kind: 'timeline',\n items: (result.deployments?.recent ?? [])\n .slice(0, MAX_ROWS)\n .map((item, index) => ({\n id: `${item.ts}-${index}`,\n type: 'Deployment',\n timestamp: item.ts,\n target: item.target,\n namespace: item.namespace,\n summary: deploymentSummary(item.images),\n })),\n };\n case 'cloudevents':\n return {\n kind: 'timeline',\n items: (result.cloudEvents?.items ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n id: item.id,\n type: item.type,\n timestamp: item.timestamp,\n target: item.target.name ?? item.target.id,\n summary: item.summary,\n })),\n };\n case 'deliveryevents':\n return {\n kind: 'timeline',\n items: (result.deliveryEvents?.items ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n id: item.id,\n type: item.type,\n timestamp: item.timestamp,\n target: item.target.name ?? item.target.id,\n summary: item.summary,\n })),\n };\n case 'audit':\n return {\n kind: 'timeline',\n items: timelineFromEvents(result.audit?.recent ?? []),\n };\n case 'nodes':\n return {\n kind: 'timeline',\n items: timelineFromEvents(result.nodeEvents?.recent ?? []),\n };\n\n case 'impact':\n return {\n kind: 'impact',\n summary: result.impact\n ? { label: 'Affected resources', total: result.impact.total }\n : undefined,\n rows: (result.impact?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n label: item.name ?? item.id ?? item.hashedID,\n value: `${item.pathCount} ${item.pathCount === 1 ? 'path' : 'paths'}`,\n detail: [\n item.kind ? readableLabel(item.kind) : undefined,\n `depth ${item.depth}`,\n ]\n .filter(Boolean)\n .join(' · '),\n })),\n };\n case 'alertimpact': {\n const evidence = result.alertImpact;\n const rows: EvidenceRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.monitors, item => ({\n label: item.name,\n value: 'Monitor',\n detail: item.service,\n }));\n appendMapped(rows, evidence.slos, item => ({\n label: item.name,\n value: 'SLO',\n detail: item.service,\n }));\n }\n return {\n kind: 'impact',\n summary: evidence\n ? {\n label: 'Affected resources',\n total: evidence.workloads + evidence.services,\n }\n : undefined,\n rows,\n };\n }\n case 'deployimpact': {\n const evidence = result.deployImpact;\n const rows = evidence\n ? evidence.recent.length > 0\n ? evidence.recent\n .slice(0, MAX_ROWS)\n .map(item => eventEvidenceRow(item))\n : evidence.ranking.slice(0, MAX_ROWS).map(item => ({\n label: item.deployed,\n value: `${item.fallout} correlated failures`,\n detail: `${item.rollouts} rollouts`,\n }))\n : [];\n return { kind: 'impact', rows };\n }\n case 'incident': {\n const evidence = result.incident;\n const events = evidence\n ? evidence.rootCauses.length > 0\n ? evidence.rootCauses\n : evidence.chain\n : [];\n return {\n kind: 'impact',\n rows: events.slice(0, MAX_ROWS).map(item => eventEvidenceRow(item)),\n };\n }\n case 'failures':\n return {\n kind: 'impact',\n rows: (result.failures?.recent ?? [])\n .slice(0, MAX_ROWS)\n .map(item => eventEvidenceRow(item)),\n };\n case 'commoncause': {\n const evidence = result.commonCause;\n const rows: EvidenceRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.byNode, item => causeRow(item, 'Node'));\n appendMapped(rows, evidence.byWorkload, item =>\n causeRow(item, 'Workload'),\n );\n appendMapped(rows, evidence.byDatastore, item =>\n causeRow(item, 'Datastore'),\n );\n appendMapped(rows, evidence.byExternal, item =>\n causeRow(item, 'External'),\n );\n }\n return { kind: 'impact', rows };\n }\n case 'alertcause':\n return {\n kind: 'impact',\n rows: (result.alertCause?.changes ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n label: item.target ?? result.alertCause?.workload ?? 'Change',\n value: item.type,\n detail: item.summary,\n timestamp: item.ts,\n })),\n };\n\n case 'inventory': {\n const evidence = result.inventory;\n return {\n kind: 'inventory',\n total: evidence?.total,\n rows: (evidence?.sample ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n namespace: item.namespace,\n type: evidence?.type,\n detail: item.resourceId ?? item.externalId,\n })),\n };\n }\n case 'cloudresources': {\n const evidence = result.cloudResources;\n return {\n kind: 'inventory',\n total: evidence?.counts.total,\n rows: (evidence?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name ?? item.id ?? item.hashedID,\n namespace: item.region ?? item.scope,\n type: item.kind ?? `${item.provider} resource`,\n detail: `${readableLabel(item.freshness)} · ${readableLabel(\n item.provenance.status,\n )}`,\n timestamp: item.observedAt,\n })),\n };\n }\n case 'storage': {\n const evidence = result.storage;\n const rows: ResourceRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.claims, item => ({\n name: item.pvc,\n namespace: item.pvcNamespace,\n type: 'Persistent volume claim',\n detail: item.storageClass,\n }));\n appendMapped(rows, evidence.orphanPvs, item => ({\n name: item.name,\n type: 'Orphan persistent volume',\n detail: item.storageClass,\n }));\n appendMapped(rows, evidence.unclaimedPvcs, item => ({\n name: item.name,\n namespace: item.namespace,\n type: 'Unclaimed persistent volume claim',\n detail: item.storageClass,\n }));\n appendMapped(rows, evidence.classes, item => ({\n name: item.name,\n type: 'Storage class',\n detail: `${item.pvs} PVs · ${item.pvcs} PVCs`,\n }));\n }\n return {\n kind: 'inventory',\n total: evidence\n ? evidence.claims.length +\n evidence.orphanPvs.length +\n evidence.unclaimedPvcs.length +\n evidence.classes.length\n : 0,\n rows,\n };\n }\n case 'image': {\n const evidence = result.image;\n const rows: ResourceRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.ranking, item => ({\n name: item.image,\n type: 'Container image',\n detail: `${item.containers} containers · ${item.pods} pods`,\n }));\n appendMapped(rows, evidence.byImage?.workloads ?? [], item => ({\n name: item.name,\n namespace: item.namespace,\n type: item.kind ?? 'Workload',\n }));\n appendMapped(rows, evidence.workload?.containers ?? [], item => ({\n name: item.image,\n type: item.isInit ? 'Init container' : 'Container',\n detail: item.name,\n }));\n appendMapped(rows, evidence.hygiene?.items ?? [], item => ({\n name: item.workload,\n namespace: item.namespace,\n type: evidence.hygiene?.kind,\n detail: item.image,\n }));\n }\n return {\n kind: 'inventory',\n total: evidence\n ? evidence.ranking.length +\n (evidence.byImage?.workloads.length ?? 0) +\n (evidence.workload?.containers.length ?? 0) +\n (evidence.hygiene?.items.length ?? 0)\n : 0,\n rows,\n };\n }\n case 'datastore': {\n const evidence = result.dataStore;\n const rows = evidence?.target\n ? [\n {\n name: evidence.target.name,\n type: 'Datastore',\n detail: `${evidence.target.services} services`,\n },\n ]\n : (evidence?.ranking ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n type: 'Datastore',\n detail: `${item.services} services`,\n }));\n return {\n kind: 'inventory',\n total: evidence?.target ? 1 : evidence?.ranking.length ?? 0,\n rows,\n };\n }\n case 'monitor': {\n const evidence = result.monitor;\n const rows: ResourceRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.monitors, name => ({\n name,\n type: 'Monitor',\n }));\n appendMapped(rows, evidence.slos, name => ({ name, type: 'SLO' }));\n appendMapped(rows, evidence.workloads, item => ({\n name: item.name,\n namespace: item.namespace,\n type: item.type ?? 'Workload',\n }));\n }\n return {\n kind: 'inventory',\n total: evidence\n ? evidence.monitors.length +\n evidence.slos.length +\n evidence.workloads.length\n : 0,\n rows,\n };\n }\n case 'slo': {\n const evidence = result.slo;\n const rows = evidence?.target\n ? [\n {\n name: evidence.target.name,\n type: 'SLO',\n detail: evidence.target.status,\n },\n ]\n : (evidence?.ranking ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n type: 'SLO',\n detail: item.status,\n }));\n return {\n kind: 'inventory',\n total: evidence?.target ? 1 : evidence?.ranking.length ?? 0,\n rows,\n };\n }\n\n case 'coverage':\n return {\n kind: 'coverage',\n rows: (result.coverage?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'gap',\n detail: item.kind,\n })),\n };\n case 'graphcoverage':\n return {\n kind: 'coverage',\n rows: (result.graphCoverage?.sources ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n name: readableLabel(item.source),\n status: item.status === 'observed' ? 'covered' : 'gap',\n detail: `${item.nodes} nodes · ${item.relationships} relationships · ${item.events} events`,\n })),\n };\n case 'orphans':\n return {\n kind: 'coverage',\n rows: (result.orphans?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'gap',\n detail: result.orphans?.kind,\n })),\n };\n case 'netpol': {\n const evidence = result.netpol;\n const rows: CoverageRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.uncovered, item => ({\n name: item.namespace,\n status: 'gap' as const,\n detail: `${item.pods} pods`,\n }));\n appendMapped(rows, evidence.policies, item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'covered' as const,\n detail: boundedJoinedList(item.policyTypes),\n }));\n appendMapped(rows, evidence.reachers, item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'unknown' as const,\n detail: item.type,\n }));\n }\n return { kind: 'coverage', rows };\n }\n case 'pdb':\n return {\n kind: 'coverage',\n rows: (result.pdb?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'gap',\n detail: item.kind,\n })),\n };\n case 'gitops': {\n const evidence = result.gitops;\n const rows: CoverageRow[] = [];\n if (evidence) {\n appendMapped(rows, evidence.drift, item => ({\n name: item.name,\n status:\n item.syncStatus === 'Synced'\n ? 'covered'\n : item.syncStatus\n ? 'gap'\n : ('unknown' as CoverageRow['status']),\n detail: item.syncStatus ?? item.healthStatus,\n }));\n appendMapped(rows, evidence.unmanaged, item => ({\n name: item.name,\n namespace: item.namespace,\n status: 'gap' as const,\n detail: item.kind,\n }));\n if (evidence.owner) {\n appendMapped(rows, [evidence.owner], owner => ({\n name: owner.workload,\n namespace: owner.namespace,\n status: (owner.application\n ? 'covered'\n : 'unknown') as CoverageRow['status'],\n detail: owner.application,\n }));\n }\n }\n return { kind: 'coverage', rows };\n }\n case 'iac':\n return {\n kind: 'coverage',\n rows: (result.iac?.resources ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.terraform.address,\n status:\n item.status === 'managed'\n ? 'covered'\n : item.status === 'ambiguous' || item.status === 'stale'\n ? 'unknown'\n : 'gap',\n detail: readableLabel(item.status),\n timestamp:\n item.directClouds[0]?.observedAt ??\n item.clouds[0]?.observedAt ??\n null,\n })),\n };\n case 'iacdrift':\n return {\n kind: 'coverage',\n rows: (result.iacDrift?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n name: item.terraform.address,\n status:\n item.status === 'in_sync'\n ? 'covered'\n : item.status === 'drifted'\n ? 'gap'\n : 'unknown',\n detail: readableLabel(item.reason),\n timestamp: item.cloud?.observedAt,\n })),\n };\n\n case 'hotspots':\n return {\n kind: 'ranking',\n rows: (result.hotspots?.ranking ?? []).slice(0, MAX_ROWS).map(item => ({\n label: item.key,\n value: item.total,\n detail: item.namespace,\n })),\n };\n case 'scaling': {\n const evidence = result.scaling;\n const rows: RankingRow[] = evidence?.target\n ? evidence.target.hpas.slice(0, MAX_ROWS).map(item => ({\n label: item.name,\n value: item.maxReplicas ?? item.minReplicas ?? 0,\n detail: item.namespace,\n }))\n : (evidence?.items ?? []).slice(0, MAX_ROWS).map(item => ({\n label: item.name,\n value: item.maxReplicas ?? item.replicas ?? 0,\n detail: item.namespace,\n }));\n return { kind: 'ranking', rows };\n }\n case 'priority': {\n const evidence = result.priority;\n const rows: RankingRow[] = [];\n if (evidence?.kind === 'nopriority') {\n appendMapped(rows, evidence.nopriority, item => ({\n label: item.name,\n value: item.pods,\n detail: item.namespace,\n }));\n } else if (evidence) {\n appendMapped(rows, evidence.ladder, item => ({\n label: item.name,\n value: item.value,\n detail: `${item.pods} pods`,\n }));\n appendMapped(rows, evidence.classes, item => ({\n label: item.name,\n value: item.value,\n detail: `${item.pods} pods`,\n }));\n }\n return { kind: 'ranking', rows };\n }\n case 'alertnoise':\n return {\n kind: 'ranking',\n rows: (result.alertNoise?.monitors ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n label: item.name,\n value: item.fires,\n detail: `${readableLabel(item.noiseKind)} · ${\n item.recovers\n } recoveries`,\n })),\n };\n case 'alerts': {\n const rows: RankingRow[] = isNormalizedAlertsAskResult(result)\n ? result.alerts.items\n .filter(item => item.status === 'firing')\n .slice(0, MAX_ROWS)\n .map(item => ({\n label: item.title,\n value: 1,\n detail: [\n readableLabel(item.provider),\n readableLabel(item.severity),\n item.providerStatus,\n item.service?.name,\n ]\n .filter(Boolean)\n .join(' · '),\n timestamp: item.observedAt ?? item.updatedAt,\n }))\n : [];\n return {\n kind: 'ranking',\n rows,\n ...(isNormalizedAlertsAskResult(result)\n ? { alertEvidence: alertEvidencePresentation(result) }\n : {}),\n };\n }\n\n case 'resolve': {\n const candidates = result.resolve?.candidates ?? [];\n return candidates.length > 1\n ? {\n kind: 'candidates',\n candidates: candidates.slice(0, MAX_ROWS),\n }\n : summaryPresentation([\n { label: 'Candidates', value: candidates.length },\n ]);\n }\n case 'externaldep': {\n const evidence = result.externalDep;\n return summaryPresentation([\n { label: 'Ranked dependencies', value: evidence?.ranking.length ?? 0 },\n { label: 'Affected services', value: evidence?.target?.services ?? 0 },\n ]);\n }\n case 'provenance': {\n const evidence = result.provenance;\n return summaryPresentation([\n { label: 'Provenance paths', value: evidence?.total ?? 0 },\n { label: 'Releases', value: evidence?.items.length ?? 0 },\n ]);\n }\n case 'ownership': {\n const evidence = result.ownership;\n return summaryPresentation([\n { label: 'Owners', value: evidence?.total ?? 0 },\n {\n label: 'People',\n value:\n evidence?.items.reduce(\n (total, item) => total + item.people.length,\n 0,\n ) ?? 0,\n },\n ]);\n }\n case 'access': {\n const evidence = result.access;\n return summaryPresentation([\n {\n label: 'Service accounts',\n value: evidence?.serviceAccounts.length ?? 0,\n },\n { label: 'Roles', value: evidence?.roles.length ?? 0 },\n { label: 'Subjects', value: evidence?.subjects.length ?? 0 },\n {\n label: 'Privileged subjects',\n value: evidence?.privileged.length ?? 0,\n },\n ]);\n }\n case 'exposure': {\n const evidence = result.exposure;\n return summaryPresentation([\n { label: 'Services', value: evidence?.services.length ?? 0 },\n { label: 'Ingresses', value: evidence?.ingresses.length ?? 0 },\n ]);\n }\n case 'tenancy': {\n const evidence = result.tenancy;\n return summaryPresentation([\n { label: 'Nodes', value: evidence?.nodes.length ?? 0 },\n { label: 'Own pods', value: evidence?.ownPods ?? 0 },\n { label: 'Neighbors', value: evidence?.neighbors.length ?? 0 },\n ]);\n }\n case 'sharedconfig': {\n const evidence = result.sharedConfig;\n return summaryPresentation([\n { label: 'Config maps', value: evidence?.configmaps.length ?? 0 },\n { label: 'Own pods', value: evidence?.ownPods ?? 0 },\n { label: 'Sibling workloads', value: evidence?.siblings.length ?? 0 },\n ]);\n }\n case 'alertrules': {\n const evidence = result.alertRules;\n return summaryPresentation([\n { label: 'Coverage gaps', value: evidence?.coverage.length ?? 0 },\n { label: 'Rules', value: evidence?.inventory.length ?? 0 },\n { label: 'Target rules', value: evidence?.target?.rules.length ?? 0 },\n ]);\n }\n default:\n return assertNever(result);\n }\n}\n\nfunction isNormalizedAlertsAskResult(\n result: BackstageAskResult,\n): result is NormalizedAlertsAskResult {\n return (\n result.intent === 'alerts' &&\n result.alerts !== null &&\n result.alerts !== undefined &&\n 'items' in result.alerts &&\n Array.isArray(result.alerts.items)\n );\n}\n\nfunction alertEvidencePresentation(\n result: NormalizedAlertsAskResult,\n): AlertEvidencePresentation {\n const coverage = result.alerts.providers.flatMap(provider =>\n provider.status === 'available'\n ? []\n : [\n `${readableLabel(provider.provider)} alert coverage is ${\n provider.status\n }.`,\n ],\n );\n const warnings = result.alerts.warnings.map(warning => warning.message);\n return {\n partial: result.alerts.partial,\n coverage,\n warnings,\n };\n}\n\nexport const AskResultPresenter = ({\n result,\n effectiveQuestion,\n answeredAt,\n onQuestion,\n}: AskResultPresenterProps) => {\n const presentation = presentAskResult(result);\n const timestamps = evidenceTimes(presentation);\n\n return (\n <Box aria-label=\"Anyshift answer\">\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Chip\n size=\"small\"\n color=\"primary\"\n label={`Intent · ${INTENT_LABELS[result.intent]}`}\n />\n <Typography variant=\"caption\" color=\"textSecondary\" title={answeredAt}>\n Answered just now\n {typeof result.elapsedMs === 'number'\n ? ` · Graph API ${result.elapsedMs} ms`\n : ''}\n </Typography>\n </Box>\n\n <Box mt={2} mb={2}>\n <Typography variant=\"body1\">{result.summary}</Typography>\n </Box>\n\n <Presentation presentation={presentation} onQuestion={onQuestion} />\n\n <Disclosure title=\"How this was interpreted\">\n <Typography variant=\"body2\">{effectiveQuestion}</Typography>\n </Disclosure>\n\n <Disclosure title=\"Supporting evidence and timestamps\">\n <Box component=\"dl\" m={0}>\n {timestamps.map((item, index) => (\n <Box\n key={`${item.label}-${index}`}\n display=\"flex\"\n justifyContent=\"space-between\"\n gridGap={16}\n py={0.5}\n >\n <Typography component=\"dt\" variant=\"body2\">\n {item.label}\n </Typography>\n <Typography\n component=\"dd\"\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ margin: 0 }}\n >\n <EvidenceTimestamp timestamp={item.timestamp} />\n </Typography>\n </Box>\n ))}\n </Box>\n </Disclosure>\n </Box>\n );\n};\n\nconst Presentation = ({\n presentation,\n onQuestion,\n}: {\n presentation: AskPresentation;\n onQuestion?: (question: string) => void;\n}) => {\n switch (presentation.kind) {\n case 'graph':\n return (\n <EvidenceSection title=\"Dependency evidence\">\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8} mb={1}>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={`${presentation.nodes.length} nodes`}\n />\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={`${presentation.edges.length} ${\n presentation.edges.length === 1 ? 'relation' : 'relations'\n }`}\n />\n </Box>\n {presentation.nodes.length > 0 ? (\n <ArchitectureDiagram\n graph={{\n nodes: presentation.nodes,\n edges: presentation.edges,\n }}\n view=\"context\"\n />\n ) : (\n <EmptyEvidence />\n )}\n </EvidenceSection>\n );\n case 'timeline':\n return (\n <EvidenceSection title=\"Change timeline\">\n {presentation.items.length > 0 ? (\n <TimelinePresenter\n data={{\n recent: presentation.items.map(item => ({\n id: item.id,\n ts: item.timestamp,\n type: item.type,\n target: item.target,\n namespace: item.namespace,\n summary: item.summary,\n })),\n }}\n showEvidence={false}\n />\n ) : (\n <EmptyEvidence />\n )}\n </EvidenceSection>\n );\n case 'impact':\n return (\n <EvidenceSection title=\"Impact evidence\">\n {presentation.rows.length > 0 ? (\n <>\n <ImpactPresenter\n data={{\n affected: presentation.rows.map(row => ({ name: row.label })),\n }}\n showEvidence={false}\n summaryMetric={presentation.summary ?? false}\n />\n <EvidenceDetails rows={presentation.rows} />\n </>\n ) : (\n <EmptyEvidence />\n )}\n </EvidenceSection>\n );\n case 'inventory':\n return (\n <EvidenceSection title=\"Resources\">\n {typeof presentation.total === 'number' && (\n <Typography variant=\"subtitle2\">\n {presentation.total} total\n </Typography>\n )}\n <ResourceTable rows={presentation.rows} />\n </EvidenceSection>\n );\n case 'coverage':\n return (\n <EvidenceSection title=\"Coverage evidence\">\n <CoverageTable rows={presentation.rows} />\n </EvidenceSection>\n );\n case 'ranking':\n return (\n <EvidenceSection title=\"Ranking\">\n {presentation.alertEvidence && (\n <Box mb={1}>\n {presentation.alertEvidence.partial && (\n <Typography variant=\"body2\" color=\"error\">\n Alert coverage is partial.\n </Typography>\n )}\n {presentation.alertEvidence.coverage.map(message => (\n <Typography key={message} variant=\"body2\" color=\"textSecondary\">\n {message}\n </Typography>\n ))}\n {presentation.alertEvidence.warnings.map(message => (\n <Typography key={message} variant=\"body2\" color=\"textSecondary\">\n {message}\n </Typography>\n ))}\n </Box>\n )}\n <RankingTable rows={presentation.rows} />\n </EvidenceSection>\n );\n case 'candidates':\n return (\n <EvidenceSection title=\"Choose a resource\">\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8}>\n {presentation.candidates.map(candidate => {\n const question = questionForCandidate(candidate);\n return (\n <button\n key={candidate.id}\n type=\"button\"\n onClick={() => onQuestion?.(question)}\n style={{\n border: '1px solid currentColor',\n borderRadius: 16,\n background: 'transparent',\n cursor: 'pointer',\n padding: '4px 12px',\n }}\n >\n {candidateLabel(candidate)}\n </button>\n );\n })}\n </Box>\n </EvidenceSection>\n );\n case 'summary':\n return (\n <EvidenceSection title=\"Known counts\">\n {presentation.counts.length > 0 ? (\n <Grid container spacing={2}>\n {presentation.counts.map(metric => (\n <Grid item xs={6} sm={4} key={metric.label}>\n <Typography variant=\"h6\">{metric.value}</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {metric.label}\n </Typography>\n </Grid>\n ))}\n </Grid>\n ) : (\n <EmptyEvidence />\n )}\n </EvidenceSection>\n );\n default:\n return assertNever(presentation);\n }\n};\n\nconst EvidenceSection = ({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) => (\n <Box mb={2}>\n <Typography component=\"h3\" variant=\"subtitle1\" gutterBottom>\n {title}\n </Typography>\n {children}\n </Box>\n);\n\nconst Disclosure = ({\n title,\n children,\n}: {\n title: string;\n children: ReactNode;\n}) => (\n <details style={{ marginTop: 12 }}>\n <summary style={{ cursor: 'pointer', fontWeight: 500 }}>{title}</summary>\n <Box mt={1}>{children}</Box>\n </details>\n);\n\nconst EvidenceDetails = ({ rows }: { rows: EvidenceRow[] }) => (\n <Box component=\"ul\" m={0} mt={1} pl={2}>\n {rows.map((row, index) => (\n <li key={`${row.label}-${index}`}>\n <Typography variant=\"body2\">\n {row.label}\n {row.value !== undefined ? ` · ${row.value}` : ''}\n {row.detail ? ` · ${row.detail}` : ''}\n </Typography>\n </li>\n ))}\n </Box>\n);\n\nconst ResourceTable = ({ rows }: { rows: ResourceRow[] }) =>\n rows.length > 0 ? (\n <Table size=\"small\" aria-label=\"Ask resources\">\n <TableHead>\n <TableRow>\n <TableCell>Name</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Namespace / region</TableCell>\n <TableCell>Detail</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow key={`${row.name}-${index}`}>\n <TableCell>{row.name}</TableCell>\n <TableCell>{row.type || 'Unknown'}</TableCell>\n <TableCell>{row.namespace || 'Unknown'}</TableCell>\n <TableCell>{row.detail || 'Unknown'}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <EmptyEvidence />\n );\n\nconst CoverageTable = ({ rows }: { rows: CoverageRow[] }) =>\n rows.length > 0 ? (\n <Table size=\"small\" aria-label=\"Ask coverage evidence\">\n <TableHead>\n <TableRow>\n <TableCell>Resource</TableCell>\n <TableCell>Status</TableCell>\n <TableCell>Evidence</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow key={`${row.name}-${index}`}>\n <TableCell>\n {row.name}\n {row.namespace ? ` · ${row.namespace}` : ''}\n </TableCell>\n <TableCell>{readableLabel(row.status)}</TableCell>\n <TableCell>{row.detail || 'Unknown'}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <EmptyEvidence />\n );\n\nconst RankingTable = ({ rows }: { rows: RankingRow[] }) =>\n rows.length > 0 ? (\n <Table size=\"small\" aria-label=\"Ask ranking\">\n <TableHead>\n <TableRow>\n <TableCell>Resource</TableCell>\n <TableCell align=\"right\">Count</TableCell>\n <TableCell>Detail</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow key={`${row.label}-${index}`}>\n <TableCell>{row.label}</TableCell>\n <TableCell align=\"right\">{row.value}</TableCell>\n <TableCell>{row.detail || 'Unknown'}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : (\n <EmptyEvidence />\n );\n\nconst EmptyEvidence = () => (\n <Typography variant=\"body2\" color=\"textSecondary\">\n The connected graph does not currently contain enough typed evidence.\n </Typography>\n);\n\nconst EvidenceTimestamp = ({ timestamp }: { timestamp?: string | null }) => {\n if (!timestamp) return <>Unknown</>;\n const parsed = Date.parse(timestamp);\n return Number.isNaN(parsed) ? (\n <>Unknown</>\n ) : (\n <time dateTime={timestamp}>{new Date(parsed).toLocaleString()}</time>\n );\n};\n\nfunction graphPresentation(\n nodes: AskResult['nodes'],\n edges: AskResult['edges'],\n fallback: { nodes: GraphNodes; edges: GraphEdges },\n): AskPresentation {\n const selectedNodes = (nodes?.length ? nodes : fallback.nodes).slice(\n 0,\n MAX_GRAPH_NODES,\n );\n const visibleIds = new Set(selectedNodes.map(node => node.id));\n const edgeSource = nodes?.length ? edges ?? [] : fallback.edges;\n const selectedEdges: GraphEdges = [];\n for (\n let index = 0;\n index < edgeSource.length &&\n index < MAX_GRAPH_EDGE_SCAN &&\n selectedEdges.length < MAX_GRAPH_EDGES;\n index += 1\n ) {\n const edge = edgeSource[index];\n if (visibleIds.has(edge.from) && visibleIds.has(edge.to)) {\n selectedEdges.push(edge);\n }\n }\n return { kind: 'graph', nodes: selectedNodes, edges: selectedEdges };\n}\n\nfunction graphFromBlast(result: AskResultFor<'blast'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const root = result.resolved\n ? graphNode(\n result.resolved.name,\n result.resolved.type ?? 'resource',\n null,\n result.resolved.hashedID,\n )\n : undefined;\n const dependencies: GraphNodes = [];\n if (result.blastRadius) {\n appendMapped(dependencies, result.blastRadius.workloads, item =>\n graphNode(item.name, 'workload', item.namespace),\n );\n appendMapped(dependencies, result.blastRadius.services, item =>\n graphNode(item.name, 'service', item.namespace),\n );\n }\n return {\n nodes: root ? [root, ...dependencies] : dependencies,\n edges: root\n ? dependencies.map(item => graphEdge(root.id, item.id, 'AFFECTS'))\n : [],\n };\n}\n\nfunction graphFromSpof(result: AskResultFor<'spof'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n return {\n nodes: (result.spof?.items ?? [])\n .slice(0, MAX_ROWS)\n .map(item =>\n graphNode(item.name, result.spof?.kind ?? 'resource', item.namespace),\n ),\n edges: [],\n };\n}\n\nfunction graphFromPath(result: AskResultFor<'path'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const nodes = (result.path?.chain ?? [])\n .slice(0, MAX_ROWS)\n .map(item => graphNode(item.name, item.type ?? 'resource', item.namespace));\n return {\n nodes,\n edges: nodes\n .slice(1)\n .map((node, index) =>\n graphEdge(\n nodes[index].id,\n node.id,\n result.path?.rels[index] ?? 'DEPENDS_ON',\n ),\n ),\n };\n}\n\nfunction graphFromCascade(result: AskResultFor<'cascade'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const rootValue = result.cascade?.root;\n const root = rootValue?.target\n ? graphNode(\n rootValue.target,\n rootValue.kind ?? 'event target',\n rootValue.namespace,\n )\n : undefined;\n const steps = (result.cascade?.steps ?? [])\n .slice(0, MAX_ROWS)\n .map(item => graphNode(item.resource, 'affected resource', item.namespace));\n return {\n nodes: root ? [root, ...steps] : steps,\n edges: root\n ? steps.map(item => graphEdge(root.id, item.id, 'PROPAGATED_TO'))\n : [],\n };\n}\n\nfunction graphFromServiceTree(result: AskResultFor<'servicetree'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const target = result.serviceTree?.target;\n if (!target) {\n return {\n nodes: (result.serviceTree?.ranking ?? [])\n .slice(0, MAX_ROWS)\n .map(item => ({\n ...graphNode(item.name, 'service footprint', null),\n image: `${item.footprint} resources · ${item.serviceCount} services · ${item.leafCount} leaves`,\n })),\n edges: [],\n };\n }\n const root = graphNode(target.name, 'service', null);\n const dependencies: GraphNodes = [];\n appendMapped(dependencies, target.services, name =>\n graphNode(name, 'service', null),\n );\n appendMapped(dependencies, target.datastores, name =>\n graphNode(name, 'datastore', null),\n );\n appendMapped(dependencies, target.externals, name =>\n graphNode(name, 'external', null),\n );\n return {\n nodes: [root, ...dependencies],\n edges: dependencies.map(item => graphEdge(root.id, item.id, 'DEPENDS_ON')),\n };\n}\n\nfunction graphFromCalls(result: AskResultFor<'calls'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const target = result.calls?.target;\n if (!target) {\n return {\n nodes: (result.calls?.ranking ?? [])\n .slice(0, MAX_ROWS)\n .map(item => graphNode(item.name, 'service', null)),\n edges: [],\n };\n }\n const root = graphNode(target.name, 'service', null);\n const callers = target.callers\n .slice(0, MAX_ROWS)\n .map(name => graphNode(name, 'service', null));\n const callees = target.callees\n .slice(0, Math.max(0, MAX_ROWS - callers.length))\n .map(name => graphNode(name, 'service', null));\n return {\n nodes: [root, ...callers, ...callees],\n edges: [\n ...callers.map(item => graphEdge(item.id, root.id, 'CALLS')),\n ...callees.map(item => graphEdge(root.id, item.id, 'CALLS')),\n ],\n };\n}\n\nfunction graphFromFlow(result: AskResultFor<'flow'>): {\n nodes: GraphNodes;\n edges: GraphEdges;\n} {\n const target = result.flow?.target;\n if (!target) {\n return {\n nodes: (result.flow?.ranking ?? [])\n .slice(0, MAX_ROWS)\n .map(item => graphNode(item.name, 'stream', null)),\n edges: [],\n };\n }\n const root = graphNode(target.name, 'stream', null);\n const producers = target.producers\n .slice(0, MAX_ROWS)\n .map(name => graphNode(name, 'service', null));\n const consumers = target.consumers\n .slice(0, Math.max(0, MAX_ROWS - producers.length))\n .map(name => graphNode(name, 'service', null));\n return {\n nodes: [root, ...producers, ...consumers],\n edges: [\n ...producers.map(item => graphEdge(item.id, root.id, 'PRODUCES')),\n ...consumers.map(item => graphEdge(root.id, item.id, 'CONSUMED_BY')),\n ],\n };\n}\n\nfunction graphNode(\n name: string,\n type: string,\n namespace: string | null,\n id = `${type}:${namespace ?? '_'}:${name}`,\n): GraphNodes[number] {\n return { id, anyshiftID: null, name, type, namespace };\n}\n\nfunction graphEdge(from: string, to: string, type: string): GraphEdges[number] {\n return {\n from,\n to,\n type,\n direction: 'downstream',\n semantic: 'dependency',\n impact: true,\n };\n}\n\nfunction timelineFromEvents(\n events: Array<{\n ts: string;\n type: string;\n summary: string | null;\n target: string | null;\n namespace: string | null;\n }>,\n): TimelineItem[] {\n return events.slice(0, MAX_ROWS).map((item, index) => ({\n id: `${item.ts}-${item.type}-${index}`,\n type: item.type,\n timestamp: item.ts,\n target: item.target,\n namespace: item.namespace,\n summary: item.summary,\n }));\n}\n\nfunction deploymentSummary(\n images: Array<{ from: string | null; to: string | null }>,\n): string | undefined {\n const visibleImages = images.slice(0, MAX_DETAIL_ITEMS);\n const changes = visibleImages.flatMap(image => {\n if (image.from && image.to) return [`${image.from} → ${image.to}`];\n if (image.to) return [`Deployed ${image.to}`];\n return [];\n });\n if (changes.length === 0) return undefined;\n const remaining = images.length - visibleImages.length;\n const suffix =\n remaining > 0\n ? ` · ${remaining} more image ${remaining === 1 ? 'change' : 'changes'}`\n : '';\n return `${changes.join(', ')}${suffix}`;\n}\n\nfunction eventEvidenceRow(item: {\n ts: string;\n type: string;\n summary: string | null;\n target: string | null;\n namespace: string | null;\n}): EvidenceRow {\n return {\n label: item.target ?? readableLabel(item.type),\n value: readableLabel(item.type),\n detail: item.summary ?? item.namespace,\n timestamp: item.ts,\n };\n}\n\nfunction causeRow(\n item: { name: string; namespace: string | null; affected: number },\n kind: string,\n): EvidenceRow {\n return {\n label: item.name,\n value: `${item.affected} affected`,\n detail: item.namespace ? `${kind} · ${item.namespace}` : kind,\n };\n}\n\nfunction appendMapped<T, U>(\n target: U[],\n source: readonly T[],\n mapper: (item: T) => U,\n limit = MAX_ROWS,\n): void {\n const remaining = Math.max(0, limit - target.length);\n if (remaining === 0) return;\n target.push(...source.slice(0, remaining).map(mapper));\n}\n\nfunction boundedJoinedList(items: readonly string[]): string {\n const visible = items.slice(0, MAX_DETAIL_ITEMS);\n const remaining = items.length - visible.length;\n return `${visible.join(', ')}${remaining > 0 ? `, +${remaining} more` : ''}`;\n}\n\nfunction summaryPresentation(counts: SummaryMetric[]): AskPresentation {\n return { kind: 'summary', counts, timestamps: [] };\n}\n\nfunction evidenceTimes(presentation: AskPresentation): EvidenceTime[] {\n let timestamps: EvidenceTime[];\n switch (presentation.kind) {\n case 'graph':\n timestamps = [{ label: 'Graph evidence', timestamp: null }];\n break;\n case 'timeline':\n timestamps = presentation.items.map(item => ({\n label: item.target ?? item.type,\n timestamp: item.timestamp,\n }));\n break;\n case 'impact':\n timestamps = presentation.rows.map(row => ({\n label: row.label,\n timestamp: row.timestamp,\n }));\n break;\n case 'inventory':\n timestamps = presentation.rows.map(row => ({\n label: row.name,\n timestamp: row.timestamp,\n }));\n break;\n case 'coverage':\n timestamps = presentation.rows.map(row => ({\n label: row.name,\n timestamp: row.timestamp,\n }));\n break;\n case 'ranking':\n timestamps = presentation.rows.map(row => ({\n label: row.label,\n timestamp: row.timestamp,\n }));\n break;\n case 'candidates':\n timestamps = [{ label: 'Resolution evidence', timestamp: null }];\n break;\n case 'summary':\n timestamps = presentation.timestamps;\n break;\n default:\n return assertNever(presentation);\n }\n return timestamps.length > 0\n ? timestamps.slice(0, MAX_ROWS)\n : [{ label: 'Evidence timestamp', timestamp: null }];\n}\n\nfunction candidateLabel(candidate: ResolveCandidate): string {\n return [\n candidate.name,\n candidate.type ? readableLabel(candidate.type) : 'type unknown',\n candidate.namespace ?? 'namespace unknown',\n ].join(' · ');\n}\n\nfunction questionForCandidate(candidate: ResolveCandidate): string {\n const type = candidate.type?.trim().toLocaleLowerCase();\n const typedName = type ? `${type} ${candidate.name}` : candidate.name;\n const namespace = candidate.namespace\n ? ` in namespace ${candidate.namespace}`\n : '';\n return `What depends on ${typedName}${namespace}?`;\n}\n\nfunction readableLabel(value: string): string {\n const normalized = value.replace(/[_-]+/g, ' ');\n return normalized.charAt(0).toLocaleUpperCase() + normalized.slice(1);\n}\n\nfunction assertNever(value: never): never {\n throw new Error(\n `Unsupported Ask presentation discriminant: ${String(value)}`,\n );\n}\n\nconst INTENT_LABELS: Record<AskResult['intent'], string> = {\n resolve: 'Resolve',\n connections: 'Connections',\n inventory: 'Inventory',\n events: 'Events',\n cloudevents: 'Cloud events',\n cloudresources: 'Cloud resources',\n deliveryevents: 'Delivery events',\n provenance: 'Provenance',\n ownership: 'Ownership',\n graphcoverage: 'Graph coverage',\n hotspots: 'Hotspots',\n incident: 'Incident',\n failures: 'Failures',\n deployments: 'Deployments',\n audit: 'Audit',\n nodes: 'Node events',\n deployimpact: 'Deployment impact',\n commoncause: 'Common cause',\n blast: 'Blast radius',\n impact: 'Impact',\n spof: 'Single points of failure',\n path: 'Dependency path',\n cascade: 'Cascade',\n alertimpact: 'Alert impact',\n monitor: 'Monitor',\n datastore: 'Datastore',\n flow: 'Flow',\n externaldep: 'External dependency',\n alerts: 'Alerts',\n alertnoise: 'Alert noise',\n calls: 'Service calls',\n servicetree: 'Service tree',\n alertcause: 'Alert cause',\n access: 'Access',\n exposure: 'Exposure',\n orphans: 'Orphans',\n coverage: 'Coverage',\n slo: 'SLO',\n tenancy: 'Tenancy',\n sharedconfig: 'Shared configuration',\n alertrules: 'Alert rules',\n gitops: 'GitOps',\n image: 'Images',\n netpol: 'Network policy',\n storage: 'Storage',\n pdb: 'Pod disruption budget',\n scaling: 'Scaling',\n topology: 'Topology',\n priority: 'Priority',\n iac: 'Infrastructure as code',\n iacdrift: 'Infrastructure drift',\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { stringifyEntityRef } from '@backstage/catalog-model';
2
+ import { ANYSHIFT_RESOURCE_ID_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
3
+ import { isCloudResourceEntity, cloudResourceAskTarget, entityTarget } from '../entity/entityIdentity.esm.js';
4
+
5
+ const MAX_TARGET_CODE_POINTS = 200;
6
+ function askScopeForEntity(entity) {
7
+ const exactResourceId = entity.metadata.annotations?.[ANYSHIFT_RESOURCE_ID_ANNOTATION]?.trim();
8
+ const target = isCloudResourceEntity(entity) ? cloudResourceAskTarget(entity) : exactResourceId || entityTarget(entity);
9
+ if (!target) return void 0;
10
+ if (!isValidTarget(target)) return void 0;
11
+ return {
12
+ entityRef: stringifyEntityRef(entity),
13
+ target
14
+ };
15
+ }
16
+ function isValidTarget(target) {
17
+ return Boolean(target.trim()) && Array.from(target).length <= MAX_TARGET_CODE_POINTS && !hasControlCharacter(target);
18
+ }
19
+ function hasControlCharacter(value) {
20
+ return Array.from(value).some((character) => {
21
+ const codePoint = character.codePointAt(0);
22
+ return codePoint !== void 0 && (codePoint <= 31 || codePoint >= 127 && codePoint <= 159);
23
+ });
24
+ }
25
+
26
+ export { askScopeForEntity };
27
+ //# sourceMappingURL=askScope.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askScope.esm.js","sources":["../../../src/components/ask/askScope.ts"],"sourcesContent":["import { stringifyEntityRef, type Entity } from '@backstage/catalog-model';\nimport { ANYSHIFT_RESOURCE_ID_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';\nimport type { AskScope } from '../../api/types';\nimport {\n cloudResourceAskTarget,\n entityTarget,\n isCloudResourceEntity,\n} from '../entity/entityIdentity';\n\nconst MAX_TARGET_CODE_POINTS = 200;\n\nexport function askScopeForEntity(entity: Entity): AskScope | undefined {\n const exactResourceId =\n entity.metadata.annotations?.[ANYSHIFT_RESOURCE_ID_ANNOTATION]?.trim();\n const target = isCloudResourceEntity(entity)\n ? cloudResourceAskTarget(entity)\n : exactResourceId || entityTarget(entity);\n if (!target) return undefined;\n if (!isValidTarget(target)) return undefined;\n\n return {\n entityRef: stringifyEntityRef(entity),\n target,\n };\n}\n\nfunction isValidTarget(target: string): boolean {\n return (\n Boolean(target.trim()) &&\n Array.from(target).length <= MAX_TARGET_CODE_POINTS &&\n !hasControlCharacter(target)\n );\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return Array.from(value).some(character => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))\n );\n });\n}\n"],"names":[],"mappings":";;;;AASA,MAAM,sBAAA,GAAyB,GAAA;AAExB,SAAS,kBAAkB,MAAA,EAAsC;AACtE,EAAA,MAAM,kBACJ,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,+BAA+B,GAAG,IAAA,EAAK;AACvE,EAAA,MAAM,MAAA,GAAS,sBAAsB,MAAM,CAAA,GACvC,uBAAuB,MAAM,CAAA,GAC7B,eAAA,IAAmB,YAAA,CAAa,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG,OAAO,MAAA;AAEnC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,mBAAmB,MAAM,CAAA;AAAA,IACpC;AAAA,GACF;AACF;AAEA,SAAS,cAAc,MAAA,EAAyB;AAC9C,EAAA,OACE,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,CAAA,IACrB,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,IAAU,sBAAA,IAC7B,CAAC,oBAAoB,MAAM,CAAA;AAE/B;AAEA,SAAS,oBAAoB,KAAA,EAAwB;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,KAAK,CAAA,SAAA,KAAa;AACzC,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA;AACzC,IAAA,OACE,cAAc,MAAA,KACb,SAAA,IAAa,EAAA,IAAS,SAAA,IAAa,OAAQ,SAAA,IAAa,GAAA,CAAA;AAAA,EAE7D,CAAC,CAAA;AACH;;;;"}
@@ -0,0 +1,41 @@
1
+ const estateSuggestions = [
2
+ "Which services are on fire?",
3
+ "Where are our evidence gaps?",
4
+ "What changed in the last 24 hours?"
5
+ ];
6
+ const scopedSuggestions = [
7
+ "What is the blast radius?",
8
+ "What depends on this service?",
9
+ "What changed recently?"
10
+ ];
11
+ const followUpsByIntent = {
12
+ topology: {
13
+ estate: [estateSuggestions[0], estateSuggestions[1]],
14
+ scoped: [scopedSuggestions[1], scopedSuggestions[2]]
15
+ },
16
+ impact: {
17
+ estate: [estateSuggestions[0], estateSuggestions[2]],
18
+ scoped: [scopedSuggestions[0], scopedSuggestions[1]]
19
+ },
20
+ events: {
21
+ estate: [estateSuggestions[2], estateSuggestions[1]],
22
+ scoped: [scopedSuggestions[2], scopedSuggestions[0]]
23
+ },
24
+ deployments: {
25
+ estate: [estateSuggestions[2], estateSuggestions[0]],
26
+ scoped: [scopedSuggestions[2], scopedSuggestions[0]]
27
+ },
28
+ alerts: {
29
+ estate: [estateSuggestions[0], estateSuggestions[2]],
30
+ scoped: [scopedSuggestions[0], scopedSuggestions[2]]
31
+ }
32
+ };
33
+ function followUpsForIntent(intent, scoped) {
34
+ const scope = scoped ? "scoped" : "estate";
35
+ return [
36
+ ...followUpsByIntent[intent ?? ""]?.[scope] ?? (scoped ? [scopedSuggestions[0], scopedSuggestions[2]] : [estateSuggestions[0], estateSuggestions[1]])
37
+ ];
38
+ }
39
+
40
+ export { estateSuggestions, followUpsForIntent, scopedSuggestions };
41
+ //# sourceMappingURL=askSuggestions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askSuggestions.esm.js","sources":["../../../src/components/ask/askSuggestions.ts"],"sourcesContent":["export const estateSuggestions = [\n 'Which services are on fire?',\n 'Where are our evidence gaps?',\n 'What changed in the last 24 hours?',\n] as const;\n\nexport const scopedSuggestions = [\n 'What is the blast radius?',\n 'What depends on this service?',\n 'What changed recently?',\n] as const;\n\nconst followUpsByIntent: Record<\n string,\n { estate: string[]; scoped: string[] }\n> = {\n topology: {\n estate: [estateSuggestions[0], estateSuggestions[1]],\n scoped: [scopedSuggestions[1], scopedSuggestions[2]],\n },\n impact: {\n estate: [estateSuggestions[0], estateSuggestions[2]],\n scoped: [scopedSuggestions[0], scopedSuggestions[1]],\n },\n events: {\n estate: [estateSuggestions[2], estateSuggestions[1]],\n scoped: [scopedSuggestions[2], scopedSuggestions[0]],\n },\n deployments: {\n estate: [estateSuggestions[2], estateSuggestions[0]],\n scoped: [scopedSuggestions[2], scopedSuggestions[0]],\n },\n alerts: {\n estate: [estateSuggestions[0], estateSuggestions[2]],\n scoped: [scopedSuggestions[0], scopedSuggestions[2]],\n },\n};\n\nexport function followUpsForIntent(\n intent: string | undefined,\n scoped: boolean,\n): string[] {\n const scope = scoped ? 'scoped' : 'estate';\n return [\n ...(followUpsByIntent[intent ?? '']?.[scope] ??\n (scoped\n ? [scopedSuggestions[0], scopedSuggestions[2]]\n : [estateSuggestions[0], estateSuggestions[1]])),\n ];\n}\n"],"names":[],"mappings":"AAAO,MAAM,iBAAA,GAAoB;AAAA,EAC/B,6BAAA;AAAA,EACA,8BAAA;AAAA,EACA;AACF;AAEO,MAAM,iBAAA,GAAoB;AAAA,EAC/B,2BAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF;AAEA,MAAM,iBAAA,GAGF;AAAA,EACF,QAAA,EAAU;AAAA,IACR,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IACnD,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC;AAAA,GACrD;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IACnD,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC;AAAA,GACrD;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IACnD,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC;AAAA,GACrD;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IACnD,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC;AAAA,GACrD;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IACnD,QAAQ,CAAC,iBAAA,CAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC;AAAA;AAEvD,CAAA;AAEO,SAAS,kBAAA,CACd,QACA,MAAA,EACU;AACV,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,GAAW,QAAA;AAClC,EAAA,OAAO;AAAA,IACL,GAAI,kBAAkB,MAAA,IAAU,EAAE,IAAI,KAAK,CAAA,KACxC,MAAA,GACG,CAAC,iBAAA,CAAkB,CAAC,GAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA,GAC3C,CAAC,kBAAkB,CAAC,CAAA,EAAG,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,GACnD;AACF;;;;"}
@@ -0,0 +1,54 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { InfoCard } from '@backstage/core-components';
3
+ import { Alert } from '@material-ui/lab';
4
+ import { Button, Typography } from '@material-ui/core';
5
+
6
+ const BOUNDARY_CAVEAT = "Potential reachability through reviewed graph edges; not proof of outage or causality.";
7
+ const CloudImpactSection = ({
8
+ section,
9
+ onRetry
10
+ }) => /* @__PURE__ */ jsx(InfoCard, { title: "Potential impact", children: section.state === "error" ? /* @__PURE__ */ jsxs(Alert, { severity: "error", children: [
11
+ section.message,
12
+ section.retryable && onRetry && /* @__PURE__ */ jsx(Button, { size: "small", onClick: onRetry, children: "Retry" })
13
+ ] }) : section.state === "unsupported" ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: section.message }) : section.state === "empty" ? /* @__PURE__ */ jsxs(Fragment, { children: [
14
+ /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: section.message || "No potential impact was observed through the reviewed edge set." }),
15
+ /* @__PURE__ */ jsx(BoundaryCaveat, {})
16
+ ] }) : /* @__PURE__ */ jsx(ImpactEvidence, { impact: section.data }) });
17
+ const ImpactEvidence = ({ impact }) => {
18
+ if (!impact) return null;
19
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
20
+ /* @__PURE__ */ jsxs(Typography, { children: [
21
+ /* @__PURE__ */ jsx("strong", { children: impact.total }),
22
+ " potentially impacted resource",
23
+ impact.total === 1 ? "" : "s"
24
+ ] }),
25
+ /* @__PURE__ */ jsxs(Typography, { color: "textSecondary", children: [
26
+ "Evidence ",
27
+ impact.evidence.status,
28
+ " \xB7 maximum depth",
29
+ " ",
30
+ impact.filter.maxDepth
31
+ ] }),
32
+ impact.total === 0 ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: "No potential impact was observed through the reviewed edge set." }) : impact.items.map((item) => /* @__PURE__ */ jsxs("div", { style: { marginTop: 16 }, children: [
33
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", children: item.name || item.id || item.hashedID }),
34
+ /* @__PURE__ */ jsxs(Typography, { color: "textSecondary", children: [
35
+ item.kind || "Unknown kind",
36
+ " \xB7 depth ",
37
+ item.depth,
38
+ item.id ? ` \xB7 ${item.id}` : ""
39
+ ] }),
40
+ /* @__PURE__ */ jsx(Typography, { color: "textSecondary", variant: "caption", children: formatPath(item.path) })
41
+ ] }, item.hashedID)),
42
+ /* @__PURE__ */ jsx(BoundaryCaveat, {})
43
+ ] });
44
+ };
45
+ const BoundaryCaveat = () => /* @__PURE__ */ jsx(Typography, { color: "textSecondary", variant: "caption", display: "block", children: BOUNDARY_CAVEAT });
46
+ function formatPath(path) {
47
+ if (path.length === 0) return "No reviewed path details were returned.";
48
+ return path.map(
49
+ (step) => step.relationshipDirection === "reverse" ? `${step.from} \u2190${step.type}\u2014 ${step.to}` : `${step.from} \u2014${step.type}\u2192 ${step.to}`
50
+ ).join(" \xB7 ");
51
+ }
52
+
53
+ export { CloudImpactSection };
54
+ //# sourceMappingURL=CloudImpactSection.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudImpactSection.esm.js","sources":["../../../src/components/cloud/CloudImpactSection.tsx"],"sourcesContent":["import { InfoCard } from '@backstage/core-components';\nimport { Alert } from '@material-ui/lab';\nimport { Button, Typography } from '@material-ui/core';\nimport type { BriefSection, ImpactResult } from '../../api/types';\n\nconst BOUNDARY_CAVEAT =\n 'Potential reachability through reviewed graph edges; not proof of outage or causality.';\n\nexport const CloudImpactSection = ({\n section,\n onRetry,\n}: {\n section: BriefSection<ImpactResult>;\n onRetry?: () => void;\n}) => (\n <InfoCard title=\"Potential impact\">\n {section.state === 'error' ? (\n <Alert severity=\"error\">\n {section.message}\n {section.retryable && onRetry && (\n <Button size=\"small\" onClick={onRetry}>\n Retry\n </Button>\n )}\n </Alert>\n ) : section.state === 'unsupported' ? (\n <Typography color=\"textSecondary\">{section.message}</Typography>\n ) : section.state === 'empty' ? (\n <>\n <Typography color=\"textSecondary\">\n {section.message ||\n 'No potential impact was observed through the reviewed edge set.'}\n </Typography>\n <BoundaryCaveat />\n </>\n ) : (\n <ImpactEvidence impact={section.data} />\n )}\n </InfoCard>\n);\n\nconst ImpactEvidence = ({ impact }: { impact?: ImpactResult }) => {\n if (!impact) return null;\n return (\n <>\n <Typography>\n <strong>{impact.total}</strong> potentially impacted resource\n {impact.total === 1 ? '' : 's'}\n </Typography>\n <Typography color=\"textSecondary\">\n Evidence {impact.evidence.status} · maximum depth{' '}\n {impact.filter.maxDepth}\n </Typography>\n {impact.total === 0 ? (\n <Typography color=\"textSecondary\">\n No potential impact was observed through the reviewed edge set.\n </Typography>\n ) : (\n impact.items.map(item => (\n <div key={item.hashedID} style={{ marginTop: 16 }}>\n <Typography variant=\"subtitle1\">\n {item.name || item.id || item.hashedID}\n </Typography>\n <Typography color=\"textSecondary\">\n {item.kind || 'Unknown kind'} · depth {item.depth}\n {item.id ? ` · ${item.id}` : ''}\n </Typography>\n <Typography color=\"textSecondary\" variant=\"caption\">\n {formatPath(item.path)}\n </Typography>\n </div>\n ))\n )}\n <BoundaryCaveat />\n </>\n );\n};\n\nconst BoundaryCaveat = () => (\n <Typography color=\"textSecondary\" variant=\"caption\" display=\"block\">\n {BOUNDARY_CAVEAT}\n </Typography>\n);\n\nfunction formatPath(path: ImpactResult['items'][number]['path']): string {\n if (path.length === 0) return 'No reviewed path details were returned.';\n return path\n .map(step =>\n step.relationshipDirection === 'reverse'\n ? `${step.from} ←${step.type}— ${step.to}`\n : `${step.from} —${step.type}→ ${step.to}`,\n )\n .join(' · ');\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { Typography, Grid } from '@material-ui/core';
4
+ import { Page, Header, Content, ContentHeader, Progress, InfoCard, Table } from '@backstage/core-components';
5
+ import { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
6
+ import { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';
7
+ import { useApi } from '@backstage/frontend-plugin-api';
8
+
9
+ function isCloudResource(entity) {
10
+ return entity.kind.toLocaleLowerCase("en-US") === "resource" && Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]);
11
+ }
12
+ function cloudResourceRows(entities) {
13
+ return entities.filter(isCloudResource).map((entity) => {
14
+ const annotations = entity.metadata.annotations ?? {};
15
+ return {
16
+ entity,
17
+ name: entity.metadata.title || entity.metadata.name,
18
+ provider: annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]?.toUpperCase() || "Unknown",
19
+ resourceType: annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] || String(entity.spec?.type || "resource"),
20
+ region: annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || "Global",
21
+ account: annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION] || "Not available",
22
+ owner: typeof entity.spec?.owner === "string" ? entity.spec.owner : "Not assigned"
23
+ };
24
+ }).sort((a, b) => a.name.localeCompare(b.name));
25
+ }
26
+ const columns = [
27
+ {
28
+ title: "Resource",
29
+ field: "name",
30
+ render: (row) => /* @__PURE__ */ jsx(EntityRefLink, { entityRef: row.entity, title: row.name })
31
+ },
32
+ { title: "Type", field: "resourceType" },
33
+ { title: "Provider", field: "provider" },
34
+ { title: "Region", field: "region" },
35
+ { title: "Account", field: "account" },
36
+ { title: "Owner", field: "owner" }
37
+ ];
38
+ const CloudPage = () => {
39
+ const catalogApi = useApi(catalogApiRef);
40
+ const [entities, setEntities] = useState();
41
+ const [error, setError] = useState();
42
+ useEffect(() => {
43
+ catalogApi.getEntities({ filter: { kind: "Resource" } }).then((response) => setEntities(response.items)).catch(
44
+ (cause) => setError(cause instanceof Error ? cause.message : String(cause))
45
+ );
46
+ }, [catalogApi]);
47
+ const rows = useMemo(() => cloudResourceRows(entities ?? []), [entities]);
48
+ const summary = useMemo(
49
+ () => ({
50
+ resources: rows.length,
51
+ types: new Set(rows.map((row) => row.resourceType)).size,
52
+ accounts: new Set(
53
+ rows.map((row) => row.account).filter((account) => account !== "Not available")
54
+ ).size,
55
+ regions: new Set(
56
+ rows.map((row) => row.region).filter((region) => region !== "Global")
57
+ ).size
58
+ }),
59
+ [rows]
60
+ );
61
+ return /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
62
+ /* @__PURE__ */ jsx(
63
+ Header,
64
+ {
65
+ title: "Cloud",
66
+ subtitle: "Read-only cloud inventory synchronized through Anyshift"
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsxs(Content, { children: [
70
+ /* @__PURE__ */ jsx(ContentHeader, { title: "Cloud inventory" }),
71
+ error ? /* @__PURE__ */ jsx(Typography, { color: "error", children: error }) : !entities ? /* @__PURE__ */ jsx(Progress, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
72
+ /* @__PURE__ */ jsx(InfoCard, { children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
73
+ /* @__PURE__ */ jsx(Summary, { label: "Resources", value: summary.resources }),
74
+ /* @__PURE__ */ jsx(Summary, { label: "Types", value: summary.types }),
75
+ /* @__PURE__ */ jsx(Summary, { label: "Accounts", value: summary.accounts }),
76
+ /* @__PURE__ */ jsx(Summary, { label: "Regions", value: summary.regions })
77
+ ] }) }),
78
+ /* @__PURE__ */ jsx(
79
+ Table,
80
+ {
81
+ title: "Cloud resources",
82
+ columns,
83
+ data: rows,
84
+ options: {
85
+ filtering: true,
86
+ paging: true,
87
+ pageSize: 20,
88
+ pageSizeOptions: [20, 50, 100],
89
+ search: true
90
+ },
91
+ emptyContent: /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: "No cloud resources have been synchronized yet." })
92
+ }
93
+ )
94
+ ] })
95
+ ] })
96
+ ] });
97
+ };
98
+ const Summary = ({ label, value }) => /* @__PURE__ */ jsxs(Grid, { item: true, xs: 6, md: 3, children: [
99
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: value }),
100
+ /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: label })
101
+ ] });
102
+
103
+ export { CloudPage, cloudResourceRows, isCloudResource };
104
+ //# sourceMappingURL=CloudPage.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudPage.esm.js","sources":["../../../src/components/cloud/CloudPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n Table,\n type TableColumn,\n} from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_CLOUD_REGION_ANNOTATION,\n ANYSHIFT_RESOURCE_TYPE_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/frontend-plugin-api';\n\nexport interface CloudResourceRow {\n entity: Entity;\n name: string;\n provider: string;\n resourceType: string;\n region: string;\n account: string;\n owner: string;\n}\n\nexport function isCloudResource(entity: Entity): boolean {\n return (\n entity.kind.toLocaleLowerCase('en-US') === 'resource' &&\n Boolean(entity.metadata.annotations?.[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION])\n );\n}\n\nexport function cloudResourceRows(entities: Entity[]): CloudResourceRow[] {\n return entities\n .filter(isCloudResource)\n .map(entity => {\n const annotations = entity.metadata.annotations ?? {};\n return {\n entity,\n name: entity.metadata.title || entity.metadata.name,\n provider:\n annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]?.toUpperCase() ||\n 'Unknown',\n resourceType:\n annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] ||\n String(entity.spec?.type || 'resource'),\n region: annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || 'Global',\n account:\n annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION] || 'Not available',\n owner:\n typeof entity.spec?.owner === 'string'\n ? entity.spec.owner\n : 'Not assigned',\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nconst columns: TableColumn<CloudResourceRow>[] = [\n {\n title: 'Resource',\n field: 'name',\n render: row => <EntityRefLink entityRef={row.entity} title={row.name} />,\n },\n { title: 'Type', field: 'resourceType' },\n { title: 'Provider', field: 'provider' },\n { title: 'Region', field: 'region' },\n { title: 'Account', field: 'account' },\n { title: 'Owner', field: 'owner' },\n];\n\nexport const CloudPage = () => {\n const catalogApi = useApi(catalogApiRef);\n const [entities, setEntities] = useState<Entity[]>();\n const [error, setError] = useState<string>();\n\n useEffect(() => {\n catalogApi\n .getEntities({ filter: { kind: 'Resource' } })\n .then(response => setEntities(response.items))\n .catch(cause =>\n setError(cause instanceof Error ? cause.message : String(cause)),\n );\n }, [catalogApi]);\n\n const rows = useMemo(() => cloudResourceRows(entities ?? []), [entities]);\n const summary = useMemo(\n () => ({\n resources: rows.length,\n types: new Set(rows.map(row => row.resourceType)).size,\n accounts: new Set(\n rows\n .map(row => row.account)\n .filter(account => account !== 'Not available'),\n ).size,\n regions: new Set(\n rows.map(row => row.region).filter(region => region !== 'Global'),\n ).size,\n }),\n [rows],\n );\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Cloud\"\n subtitle=\"Read-only cloud inventory synchronized through Anyshift\"\n />\n <Content>\n <ContentHeader title=\"Cloud inventory\" />\n {error ? (\n <Typography color=\"error\">{error}</Typography>\n ) : !entities ? (\n <Progress />\n ) : (\n <>\n <InfoCard>\n <Grid container spacing={2}>\n <Summary label=\"Resources\" value={summary.resources} />\n <Summary label=\"Types\" value={summary.types} />\n <Summary label=\"Accounts\" value={summary.accounts} />\n <Summary label=\"Regions\" value={summary.regions} />\n </Grid>\n </InfoCard>\n <Table\n title=\"Cloud resources\"\n columns={columns}\n data={rows}\n options={{\n filtering: true,\n paging: true,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n search: true,\n }}\n emptyContent={\n <Typography color=\"textSecondary\">\n No cloud resources have been synchronized yet.\n </Typography>\n }\n />\n </>\n )}\n </Content>\n </Page>\n );\n};\n\nconst Summary = ({ label, value }: { label: string; value: number }) => (\n <Grid item xs={6} md={3}>\n <Typography variant=\"h5\">{value}</Typography>\n <Typography color=\"textSecondary\">{label}</Typography>\n </Grid>\n);\n"],"names":[],"mappings":";;;;;;;;AAgCO,SAAS,gBAAgB,MAAA,EAAyB;AACvD,EAAA,OACE,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,KAAM,UAAA,IAC3C,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,kCAAkC,CAAC,CAAA;AAE7E;AAEO,SAAS,kBAAkB,QAAA,EAAwC;AACxE,EAAA,OAAO,QAAA,CACJ,MAAA,CAAO,eAAe,CAAA,CACtB,IAAI,CAAA,MAAA,KAAU;AACb,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,OAAO,QAAA,CAAS,IAAA;AAAA,MAC/C,QAAA,EACE,WAAA,CAAY,kCAAkC,CAAA,EAAG,aAAY,IAC7D,SAAA;AAAA,MACF,YAAA,EACE,YAAY,iCAAiC,CAAA,IAC7C,OAAO,MAAA,CAAO,IAAA,EAAM,QAAQ,UAAU,CAAA;AAAA,MACxC,MAAA,EAAQ,WAAA,CAAY,gCAAgC,CAAA,IAAK,QAAA;AAAA,MACzD,OAAA,EACE,WAAA,CAAY,iCAAiC,CAAA,IAAK,eAAA;AAAA,MACpD,KAAA,EACE,OAAO,MAAA,CAAO,IAAA,EAAM,UAAU,QAAA,GAC1B,MAAA,CAAO,KAAK,KAAA,GACZ;AAAA,KACR;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAChD;AAEA,MAAM,OAAA,GAA2C;AAAA,EAC/C;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,yBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,WAAW,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM;AAAA,GACxE;AAAA,EACA,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,EACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC3B,CAAA;AAEO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAmB;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAiB;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CACG,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAE,MAAM,UAAA,EAAW,EAAG,CAAA,CAC5C,KAAK,CAAA,QAAA,KAAY,WAAA,CAAY,QAAA,CAAS,KAAK,CAAC,CAAA,CAC5C,KAAA;AAAA,MAAM,CAAA,KAAA,KACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC;AAAA,KACjE;AAAA,EACJ,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAM,iBAAA,CAAkB,QAAA,IAAY,EAAE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,KAAA,EAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,CAAC,CAAA,CAAE,IAAA;AAAA,MAClD,UAAU,IAAI,GAAA;AAAA,QACZ,IAAA,CACG,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,OAAO,CAAA,CACtB,MAAA,CAAO,CAAA,OAAA,KAAW,OAAA,KAAY,eAAe;AAAA,OAClD,CAAE,IAAA;AAAA,MACF,SAAS,IAAI,GAAA;AAAA,QACX,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,KAAW,QAAQ;AAAA,OAClE,CAAE;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAS;AAAA;AAAA,KACX;AAAA,yBACC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAM,iBAAA,EAAkB,CAAA;AAAA,MACtC,KAAA,mBACC,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM,CAAA,GAC/B,CAAC,QAAA,mBACH,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA,mBAEV,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,WAAA,EAAY,KAAA,EAAO,QAAQ,SAAA,EAAW,CAAA;AAAA,8BACpD,OAAA,EAAA,EAAQ,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO,CAAA;AAAA,8BAC5C,OAAA,EAAA,EAAQ,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,QAAQ,QAAA,EAAU,CAAA;AAAA,8BAClD,OAAA,EAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,KAAA,EAAO,QAAQ,OAAA,EAAS;AAAA,SAAA,EACnD,CAAA,EACF,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iBAAA;AAAA,YACN,OAAA;AAAA,YACA,IAAA,EAAM,IAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,SAAA,EAAW,IAAA;AAAA,cACX,MAAA,EAAQ,IAAA;AAAA,cACR,QAAA,EAAU,EAAA;AAAA,cACV,eAAA,EAAiB,CAAC,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,cAC7B,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,YAAA,kBACE,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,gDAAA,EAElC;AAAA;AAAA;AAEJ,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,MAAM,OAAA,GAAU,CAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBAC9B,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EACpB,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kBAChC,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,eAAA,EAAiB,QAAA,EAAA,KAAA,EAAM;AAAA,CAAA,EAC3C,CAAA;;;;"}
@@ -0,0 +1,43 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { InfoCard } from '@backstage/core-components';
3
+ import { EntityRefLink } from '@backstage/plugin-catalog-react';
4
+ import { Typography } from '@material-ui/core';
5
+
6
+ function relationshipsFor(entity, type) {
7
+ const seen = /* @__PURE__ */ new Set();
8
+ return (entity.relations ?? []).filter((relation) => relation.type === type).filter((relation) => {
9
+ if (seen.has(relation.targetRef)) return false;
10
+ seen.add(relation.targetRef);
11
+ return true;
12
+ }).sort((left, right) => left.targetRef.localeCompare(right.targetRef));
13
+ }
14
+ const RelationshipSection = ({
15
+ entity,
16
+ type,
17
+ title,
18
+ empty
19
+ }) => {
20
+ const relationships = relationshipsFor(entity, type);
21
+ return /* @__PURE__ */ jsx(InfoCard, { title, children: relationships.length === 0 ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: empty }) : /* @__PURE__ */ jsx("ul", { children: relationships.map((relation) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(EntityRefLink, { entityRef: relation.targetRef }) }, relation.targetRef)) }) });
22
+ };
23
+ const CloudDependenciesSection = ({ entity }) => /* @__PURE__ */ jsx(
24
+ RelationshipSection,
25
+ {
26
+ entity,
27
+ type: "dependsOn",
28
+ title: "Dependencies",
29
+ empty: "No dependencies are recorded in the current catalog evidence."
30
+ }
31
+ );
32
+ const CloudDependentsSection = ({ entity }) => /* @__PURE__ */ jsx(
33
+ RelationshipSection,
34
+ {
35
+ entity,
36
+ type: "dependencyOf",
37
+ title: "Dependents",
38
+ empty: "No dependents are recorded in the current catalog evidence."
39
+ }
40
+ );
41
+
42
+ export { CloudDependenciesSection, CloudDependentsSection };
43
+ //# sourceMappingURL=CloudRelationshipSections.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudRelationshipSections.esm.js","sources":["../../../src/components/cloud/CloudRelationshipSections.tsx"],"sourcesContent":["import { InfoCard } from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { Typography } from '@material-ui/core';\n\ntype RelationshipType = 'dependsOn' | 'dependencyOf';\ntype Relation = NonNullable<Entity['relations']>[number];\n\nfunction relationshipsFor(entity: Entity, type: RelationshipType): Relation[] {\n const seen = new Set<string>();\n return (entity.relations ?? [])\n .filter(relation => relation.type === type)\n .filter(relation => {\n if (seen.has(relation.targetRef)) return false;\n seen.add(relation.targetRef);\n return true;\n })\n .sort((left, right) => left.targetRef.localeCompare(right.targetRef));\n}\n\nconst RelationshipSection = ({\n entity,\n type,\n title,\n empty,\n}: {\n entity: Entity;\n type: RelationshipType;\n title: string;\n empty: string;\n}) => {\n const relationships = relationshipsFor(entity, type);\n return (\n <InfoCard title={title}>\n {relationships.length === 0 ? (\n <Typography color=\"textSecondary\">{empty}</Typography>\n ) : (\n <ul>\n {relationships.map(relation => (\n <li key={relation.targetRef}>\n <EntityRefLink entityRef={relation.targetRef} />\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n );\n};\n\nexport const CloudDependenciesSection = ({ entity }: { entity: Entity }) => (\n <RelationshipSection\n entity={entity}\n type=\"dependsOn\"\n title=\"Dependencies\"\n empty=\"No dependencies are recorded in the current catalog evidence.\"\n />\n);\n\nexport const CloudDependentsSection = ({ entity }: { entity: Entity }) => (\n <RelationshipSection\n entity={entity}\n type=\"dependencyOf\"\n title=\"Dependents\"\n empty=\"No dependents are recorded in the current catalog evidence.\"\n />\n);\n"],"names":[],"mappings":";;;;;AAQA,SAAS,gBAAA,CAAiB,QAAgB,IAAA,EAAoC;AAC5E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,IAAa,EAAC,EAC1B,MAAA,CAAO,CAAA,QAAA,KAAY,QAAA,CAAS,IAAA,KAAS,IAAI,CAAA,CACzC,MAAA,CAAO,CAAA,QAAA,KAAY;AAClB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,SAAS,GAAG,OAAO,KAAA;AACzC,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,SAAS,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA;AACxE;AAEA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAKM;AACJ,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AACnD,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EACP,QAAA,EAAA,aAAA,CAAc,MAAA,KAAW,CAAA,mBACxB,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,eAAA,EAAiB,QAAA,EAAA,KAAA,EAAM,CAAA,mBAEzC,GAAA,CAAC,IAAA,EAAA,EACE,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAA,QAAA,qBACjB,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,QAAA,CAAS,SAAA,EAAW,CAAA,EAAA,EADvC,QAAA,CAAS,SAElB,CACD,GACH,CAAA,EAEJ,CAAA;AAEJ,CAAA;AAEO,MAAM,wBAAA,GAA2B,CAAC,EAAE,MAAA,EAAO,qBAChD,GAAA;AAAA,EAAC,mBAAA;AAAA,EAAA;AAAA,IACC,MAAA;AAAA,IACA,IAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAM;AAAA;AACR;AAGK,MAAM,sBAAA,GAAyB,CAAC,EAAE,MAAA,EAAO,qBAC9C,GAAA;AAAA,EAAC,mBAAA;AAAA,EAAA;AAAA,IACC,MAAA;AAAA,IACA,IAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAM;AAAA;AACR;;;;"}