@anyshift/backstage-plugin-anyshift 0.1.0-beta.10 → 0.1.0-beta.11

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.
@@ -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 { AskResult } 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\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 | { kind: 'ranking'; rows: RankingRow[] }\n | { kind: 'candidates'; candidates: ResolveCandidate[] }\n | { kind: 'summary'; counts: SummaryMetric[]; timestamps: EvidenceTime[] };\n\nexport interface AskResultPresenterProps {\n result: AskResult;\n effectiveQuestion: string;\n answeredAt: string;\n onQuestion?: (question: string) => void;\n}\n\nexport function presentAskResult(result: AskResult): 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 evidence = result.alerts;\n const rows: RankingRow[] = evidence\n ? evidence.firing.length > 0\n ? evidence.firing.slice(0, MAX_ROWS).map(item => ({\n label: item.monitor,\n value: 1,\n detail: [item.state, item.service, item.workload]\n .filter(Boolean)\n .join(' · '),\n }))\n : evidence.byState.slice(0, MAX_ROWS).map(item => ({\n label: item.state,\n value: item.count,\n }))\n : [];\n return { kind: 'ranking', rows };\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\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 <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,24 @@
1
+ import { stringifyEntityRef } from '@backstage/catalog-model';
2
+ import { entityTarget } from '../entity/AnyshiftEntityContent.esm.js';
3
+
4
+ const MAX_TARGET_CODE_POINTS = 200;
5
+ function askScopeForEntity(entity) {
6
+ const target = entityTarget(entity);
7
+ if (!isValidTarget(target)) return void 0;
8
+ return {
9
+ entityRef: stringifyEntityRef(entity),
10
+ target
11
+ };
12
+ }
13
+ function isValidTarget(target) {
14
+ return Boolean(target.trim()) && Array.from(target).length <= MAX_TARGET_CODE_POINTS && !hasControlCharacter(target);
15
+ }
16
+ function hasControlCharacter(value) {
17
+ return Array.from(value).some((character) => {
18
+ const codePoint = character.codePointAt(0);
19
+ return codePoint !== void 0 && (codePoint <= 31 || codePoint >= 127 && codePoint <= 159);
20
+ });
21
+ }
22
+
23
+ export { askScopeForEntity };
24
+ //# 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 type { AskScope } from '../../api/types';\nimport { entityTarget } from '../entity/AnyshiftEntityContent';\n\nconst MAX_TARGET_CODE_POINTS = 200;\n\nexport function askScopeForEntity(entity: Entity): AskScope | undefined {\n const target = entityTarget(entity);\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":";;;AAIA,MAAM,sBAAA,GAAyB,GAAA;AAExB,SAAS,kBAAkB,MAAA,EAAsC;AACtE,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,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;;;;"}
@@ -6,6 +6,8 @@ import { useApi } from '@backstage/frontend-plugin-api';
6
6
  import { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION, ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION, ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
7
7
  import { useEntity } from '@backstage/plugin-catalog-react';
8
8
  import { anyshiftApiRef } from '../../api/AnyshiftApi.esm.js';
9
+ import { AskAnyshiftCard } from '../ask/AskAnyshiftCard.esm.js';
10
+ import { askScopeForEntity } from '../ask/askScope.esm.js';
9
11
  import { OverviewSection, WhyNowSection, DatadogSignalSection, ArchitectureSection, DependencySection, BriefRail, TimelineSection } from './BriefSections.esm.js';
10
12
 
11
13
  const AnyshiftEntityContent = () => {
@@ -19,6 +21,10 @@ const AnyshiftEntityContent = () => {
19
21
  const configurationDependencies = annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];
20
22
  const configurationTarget = annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION];
21
23
  const [brief, setBrief] = useState();
24
+ const [capabilities, setCapabilities] = useState({
25
+ askEnabled: false,
26
+ queryEnabled: false
27
+ });
22
28
  const [error, setError] = useState();
23
29
  const [refreshingAll, setRefreshingAll] = useState(false);
24
30
  const [refreshing, setRefreshing] = useState(
@@ -103,6 +109,15 @@ const AnyshiftEntityContent = () => {
103
109
  active.current = false;
104
110
  };
105
111
  }, [load]);
112
+ useEffect(() => {
113
+ api.capabilities().then((next) => {
114
+ if (active.current) setCapabilities(next);
115
+ }).catch(() => {
116
+ if (active.current) {
117
+ setCapabilities({ askEnabled: false, queryEnabled: false });
118
+ }
119
+ });
120
+ }, [api]);
106
121
  if (error && !brief) return /* @__PURE__ */ jsx(Typography, { color: "error", children: error });
107
122
  if (!brief) return /* @__PURE__ */ jsx(Progress, {});
108
123
  return /* @__PURE__ */ jsx(
@@ -113,7 +128,9 @@ const AnyshiftEntityContent = () => {
113
128
  refreshing,
114
129
  onRefresh: () => void load(true),
115
130
  refreshingAll,
116
- refreshError: error
131
+ refreshError: error,
132
+ askEnabled: capabilities.askEnabled,
133
+ askScope: askScopeForEntity(entity)
117
134
  }
118
135
  );
119
136
  };
@@ -132,7 +149,9 @@ const ServiceBriefView = ({
132
149
  onRefresh = () => {
133
150
  },
134
151
  refreshingAll = false,
135
- refreshError
152
+ refreshError,
153
+ askEnabled = false,
154
+ askScope
136
155
  }) => /* @__PURE__ */ jsxs(Fragment, { children: [
137
156
  /* @__PURE__ */ jsxs(
138
157
  Box,
@@ -205,6 +224,7 @@ const ServiceBriefView = ({
205
224
  refreshing: refreshing.has("whyNow")
206
225
  }
207
226
  ) }),
227
+ askEnabled && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(AskAnyshiftCard, { context: "entity", scope: askScope }) }),
208
228
  /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
209
229
  DatadogSignalSection,
210
230
  {
@@ -1 +1 @@
1
- {"version":3,"file":"AnyshiftEntityContent.esm.js","sources":["../../../src/components/entity/AnyshiftEntityContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport {\n ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION,\n ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION,\n ANYSHIFT_KIND_ANNOTATION,\n ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_TARGET_ANNOTATION,\n GITHUB_PROJECT_SLUG_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type { BriefSectionName, ServiceBrief } from '../../api/types';\nimport {\n ArchitectureSection,\n BriefRail,\n DatadogSignalSection,\n DependencySection,\n OverviewSection,\n TimelineSection,\n WhyNowSection,\n} from './BriefSections';\n\nexport const AnyshiftEntityContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const annotations = entity.metadata.annotations ?? {};\n const target = entityTarget(entity);\n const kind = annotations[ANYSHIFT_KIND_ANNOTATION] || 'workload';\n const namespace = entity.metadata.namespace;\n const configurationEndpoints =\n annotations[ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION];\n const configurationDependencies =\n annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];\n const configurationTarget =\n annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION];\n const [brief, setBrief] = useState<ServiceBrief>();\n const [error, setError] = useState<string>();\n const [refreshingAll, setRefreshingAll] = useState(false);\n const [refreshing, setRefreshing] = useState<Set<BriefSectionName>>(\n new Set(),\n );\n const active = useRef(true);\n\n const load = useCallback(\n async (refresh = false) => {\n setError(undefined);\n if (refresh) setRefreshingAll(true);\n try {\n const next = await api.brief(kind, target, {\n namespace,\n refresh,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) setBrief(next);\n } catch (cause) {\n if (active.current)\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (active.current) setRefreshingAll(false);\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n const retrySection = useCallback(\n async (section: BriefSectionName) => {\n setRefreshing(current => new Set(current).add(section));\n try {\n const response = await api.briefSection(kind, target, section, {\n namespace,\n refresh: true,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) {\n setBrief(current =>\n current\n ? {\n ...current,\n [section]: response.value,\n refreshedAt: response.refreshedAt,\n ...(response.observedService\n ? { observedService: response.observedService }\n : {}),\n }\n : current,\n );\n }\n } finally {\n if (active.current) {\n setRefreshing(current => {\n const next = new Set(current);\n next.delete(section);\n return next;\n });\n }\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n useEffect(() => {\n active.current = true;\n void load();\n return () => {\n active.current = false;\n };\n }, [load]);\n\n if (error && !brief) return <Typography color=\"error\">{error}</Typography>;\n if (!brief) return <Progress />;\n return (\n <ServiceBriefView\n brief={brief}\n onRetry={retrySection}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n refreshingAll={refreshingAll}\n refreshError={error}\n />\n );\n};\n\nexport function entityTarget(entity: Entity): string {\n const annotations = entity.metadata.annotations ?? {};\n const explicit = annotations[ANYSHIFT_TARGET_ANNOTATION]?.trim();\n if (explicit) return explicit;\n\n const slug = annotations[GITHUB_PROJECT_SLUG_ANNOTATION]?.trim();\n const repository = slug?.split('/').filter(Boolean).at(-1);\n return repository || entity.metadata.name;\n}\n\nexport const ServiceBriefView = ({\n brief,\n onRetry,\n refreshing = new Set(),\n onRefresh = () => {},\n refreshingAll = false,\n refreshError,\n}: {\n brief: ServiceBrief;\n onRetry: (section: BriefSectionName) => void;\n refreshing?: ReadonlySet<BriefSectionName>;\n onRefresh?: () => void;\n refreshingAll?: boolean;\n refreshError?: string;\n}) => (\n <>\n <Box\n mb={3}\n px={2.5}\n py={2}\n borderLeft={4}\n borderColor=\"primary.main\"\n bgcolor=\"background.paper\"\n >\n <Box display=\"flex\" justifyContent=\"space-between\" gridGap={16}>\n <Box>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Anyshift evidence trace\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Chip size=\"small\" label={`Workload · ${brief.target}`} />\n <Typography aria-hidden=\"true\" color=\"primary\">\n →\n </Typography>\n <Chip\n size=\"small\"\n color=\"primary\"\n label={`Observed service · ${\n brief.observedService || 'Not resolved'\n }`}\n />\n </Box>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Runtime namespace: {brief.namespace || 'Not set'} · Refreshed{' '}\n {formatTimestamp(brief.refreshedAt)}\n </Typography>\n </Box>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshingAll}\n startIcon={refreshingAll ? <CircularProgress size={14} /> : undefined}\n >\n {refreshingAll ? 'Refreshing…' : 'Refresh brief'}\n </Button>\n </Box>\n {refreshError && (\n <Typography color=\"error\" variant=\"caption\">\n Refresh failed: {refreshError}. Existing evidence is still shown.\n </Typography>\n )}\n </Box>\n\n <Grid container spacing={3} alignItems=\"stretch\">\n <Grid item xs={12}>\n <OverviewSection\n section={brief.overview}\n onRetry={onRetry}\n refreshing={refreshing.has('overview')}\n />\n </Grid>\n <Grid item xs={12}>\n <WhyNowSection\n section={brief.whyNow}\n onRetry={onRetry}\n refreshing={refreshing.has('whyNow')}\n />\n </Grid>\n <Grid item xs={12}>\n <DatadogSignalSection\n section={brief.observability}\n onRetry={onRetry}\n refreshing={refreshing.has('observability')}\n />\n </Grid>\n <Grid item xs={12}>\n <ArchitectureSection\n section={brief.architecture}\n onRetry={onRetry}\n refreshing={refreshing.has('architecture')}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <DependencySection\n section={brief.topology}\n onRetry={onRetry}\n refreshing={refreshing.has('topology')}\n />\n </Grid>\n <Grid item xs={12} md={4}>\n <BriefRail brief={brief} onRetry={onRetry} refreshing={refreshing} />\n </Grid>\n <Grid item xs={12}>\n <TimelineSection\n section={brief.timeline}\n onRetry={onRetry}\n refreshing={refreshing.has('timeline')}\n />\n </Grid>\n </Grid>\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":"AnyshiftEntityContent.esm.js","sources":["../../../src/components/entity/AnyshiftEntityContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport {\n ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION,\n ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION,\n ANYSHIFT_KIND_ANNOTATION,\n ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_TARGET_ANNOTATION,\n GITHUB_PROJECT_SLUG_ANNOTATION,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n AnyshiftCapabilities,\n AskScope,\n BriefSectionName,\n ServiceBrief,\n} from '../../api/types';\nimport { AskAnyshiftCard } from '../ask/AskAnyshiftCard';\nimport { askScopeForEntity } from '../ask/askScope';\nimport {\n ArchitectureSection,\n BriefRail,\n DatadogSignalSection,\n DependencySection,\n OverviewSection,\n TimelineSection,\n WhyNowSection,\n} from './BriefSections';\n\nexport const AnyshiftEntityContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const annotations = entity.metadata.annotations ?? {};\n const target = entityTarget(entity);\n const kind = annotations[ANYSHIFT_KIND_ANNOTATION] || 'workload';\n const namespace = entity.metadata.namespace;\n const configurationEndpoints =\n annotations[ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION];\n const configurationDependencies =\n annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];\n const configurationTarget =\n annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION];\n const [brief, setBrief] = useState<ServiceBrief>();\n const [capabilities, setCapabilities] = useState<AnyshiftCapabilities>({\n askEnabled: false,\n queryEnabled: false,\n });\n const [error, setError] = useState<string>();\n const [refreshingAll, setRefreshingAll] = useState(false);\n const [refreshing, setRefreshing] = useState<Set<BriefSectionName>>(\n new Set(),\n );\n const active = useRef(true);\n\n const load = useCallback(\n async (refresh = false) => {\n setError(undefined);\n if (refresh) setRefreshingAll(true);\n try {\n const next = await api.brief(kind, target, {\n namespace,\n refresh,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) setBrief(next);\n } catch (cause) {\n if (active.current)\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n if (active.current) setRefreshingAll(false);\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n const retrySection = useCallback(\n async (section: BriefSectionName) => {\n setRefreshing(current => new Set(current).add(section));\n try {\n const response = await api.briefSection(kind, target, section, {\n namespace,\n refresh: true,\n configurationEndpoints,\n configurationDependencies,\n configurationTarget,\n });\n if (active.current) {\n setBrief(current =>\n current\n ? {\n ...current,\n [section]: response.value,\n refreshedAt: response.refreshedAt,\n ...(response.observedService\n ? { observedService: response.observedService }\n : {}),\n }\n : current,\n );\n }\n } finally {\n if (active.current) {\n setRefreshing(current => {\n const next = new Set(current);\n next.delete(section);\n return next;\n });\n }\n }\n },\n [\n api,\n configurationDependencies,\n configurationEndpoints,\n configurationTarget,\n kind,\n namespace,\n target,\n ],\n );\n\n useEffect(() => {\n active.current = true;\n void load();\n return () => {\n active.current = false;\n };\n }, [load]);\n\n useEffect(() => {\n api\n .capabilities()\n .then(next => {\n if (active.current) setCapabilities(next);\n })\n .catch(() => {\n if (active.current) {\n setCapabilities({ askEnabled: false, queryEnabled: false });\n }\n });\n }, [api]);\n\n if (error && !brief) return <Typography color=\"error\">{error}</Typography>;\n if (!brief) return <Progress />;\n return (\n <ServiceBriefView\n brief={brief}\n onRetry={retrySection}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n refreshingAll={refreshingAll}\n refreshError={error}\n askEnabled={capabilities.askEnabled}\n askScope={askScopeForEntity(entity)}\n />\n );\n};\n\nexport function entityTarget(entity: Entity): string {\n const annotations = entity.metadata.annotations ?? {};\n const explicit = annotations[ANYSHIFT_TARGET_ANNOTATION]?.trim();\n if (explicit) return explicit;\n\n const slug = annotations[GITHUB_PROJECT_SLUG_ANNOTATION]?.trim();\n const repository = slug?.split('/').filter(Boolean).at(-1);\n return repository || entity.metadata.name;\n}\n\nexport const ServiceBriefView = ({\n brief,\n onRetry,\n refreshing = new Set(),\n onRefresh = () => {},\n refreshingAll = false,\n refreshError,\n askEnabled = false,\n askScope,\n}: {\n brief: ServiceBrief;\n onRetry: (section: BriefSectionName) => void;\n refreshing?: ReadonlySet<BriefSectionName>;\n onRefresh?: () => void;\n refreshingAll?: boolean;\n refreshError?: string;\n askEnabled?: boolean;\n askScope?: AskScope;\n}) => (\n <>\n <Box\n mb={3}\n px={2.5}\n py={2}\n borderLeft={4}\n borderColor=\"primary.main\"\n bgcolor=\"background.paper\"\n >\n <Box display=\"flex\" justifyContent=\"space-between\" gridGap={16}>\n <Box>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Anyshift evidence trace\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Chip size=\"small\" label={`Workload · ${brief.target}`} />\n <Typography aria-hidden=\"true\" color=\"primary\">\n →\n </Typography>\n <Chip\n size=\"small\"\n color=\"primary\"\n label={`Observed service · ${\n brief.observedService || 'Not resolved'\n }`}\n />\n </Box>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Runtime namespace: {brief.namespace || 'Not set'} · Refreshed{' '}\n {formatTimestamp(brief.refreshedAt)}\n </Typography>\n </Box>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshingAll}\n startIcon={refreshingAll ? <CircularProgress size={14} /> : undefined}\n >\n {refreshingAll ? 'Refreshing…' : 'Refresh brief'}\n </Button>\n </Box>\n {refreshError && (\n <Typography color=\"error\" variant=\"caption\">\n Refresh failed: {refreshError}. Existing evidence is still shown.\n </Typography>\n )}\n </Box>\n\n <Grid container spacing={3} alignItems=\"stretch\">\n <Grid item xs={12}>\n <OverviewSection\n section={brief.overview}\n onRetry={onRetry}\n refreshing={refreshing.has('overview')}\n />\n </Grid>\n <Grid item xs={12}>\n <WhyNowSection\n section={brief.whyNow}\n onRetry={onRetry}\n refreshing={refreshing.has('whyNow')}\n />\n </Grid>\n {askEnabled && (\n <Grid item xs={12}>\n <AskAnyshiftCard context=\"entity\" scope={askScope} />\n </Grid>\n )}\n <Grid item xs={12}>\n <DatadogSignalSection\n section={brief.observability}\n onRetry={onRetry}\n refreshing={refreshing.has('observability')}\n />\n </Grid>\n <Grid item xs={12}>\n <ArchitectureSection\n section={brief.architecture}\n onRetry={onRetry}\n refreshing={refreshing.has('architecture')}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <DependencySection\n section={brief.topology}\n onRetry={onRetry}\n refreshing={refreshing.has('topology')}\n />\n </Grid>\n <Grid item xs={12} md={4}>\n <BriefRail brief={brief} onRetry={onRetry} refreshing={refreshing} />\n </Grid>\n <Grid item xs={12}>\n <TimelineSection\n section={brief.timeline}\n onRetry={onRetry}\n refreshing={refreshing.has('timeline')}\n />\n </Grid>\n </Grid>\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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"}
@@ -198,19 +198,25 @@ const AffectedFootprintPresenter = ({
198
198
  ] }),
199
199
  /* @__PURE__ */ jsx(Warnings, { warnings: data.warnings })
200
200
  ] });
201
- const ImpactPresenter = ({ data }) => {
201
+ const ImpactPresenter = ({
202
+ data,
203
+ showEvidence = true,
204
+ summaryMetric
205
+ }) => {
202
206
  const affected = namedRecords(data);
203
207
  const total = numberFrom(data, ["total", "count", "affectedCount"]);
204
208
  const status = statusFrom(data);
209
+ const defaultTotal = total ?? (affected.length > 0 ? affected.length : void 0);
210
+ const visibleSummary = summaryMetric === false ? void 0 : summaryMetric ?? (defaultTotal !== void 0 ? { label: "Affected resources", total: defaultTotal } : void 0);
205
211
  return /* @__PURE__ */ jsxs(Fragment, { children: [
206
- (total !== void 0 || affected.length > 0) && /* @__PURE__ */ jsxs(Box, { mb: 2, children: [
207
- /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: "Affected resources" }),
208
- /* @__PURE__ */ jsx(Typography, { variant: "h5", children: total ?? affected.length })
212
+ visibleSummary && /* @__PURE__ */ jsxs(Box, { mb: 2, children: [
213
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: visibleSummary.label }),
214
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: visibleSummary.total })
209
215
  ] }),
210
216
  status && /* @__PURE__ */ jsx(StatusChip, { status }),
211
217
  /* @__PURE__ */ jsx(GenericFacts, { data, omit: ["total", "count", "affectedCount"] }),
212
218
  /* @__PURE__ */ jsx(NamedResources, { names: affected }),
213
- /* @__PURE__ */ jsx(EvidenceDisclosure, { data })
219
+ showEvidence && /* @__PURE__ */ jsx(EvidenceDisclosure, { data })
214
220
  ] });
215
221
  };
216
222
  const LatestChangePresenter = ({ data }) => {
@@ -237,7 +243,8 @@ const SafeguardsPresenter = ({ data }) => /* @__PURE__ */ jsxs(Fragment, { child
237
243
  ] });
238
244
  const TimelinePresenter = ({
239
245
  data,
240
- fallbackLabel = "Change recorded"
246
+ fallbackLabel = "Change recorded",
247
+ showEvidence = true
241
248
  }) => {
242
249
  const records = recordsFrom(data).slice(0, 10);
243
250
  if (records.length === 0) return /* @__PURE__ */ jsx(PresenterFallback, { data });
@@ -249,7 +256,7 @@ const TimelinePresenter = ({
249
256
  event.summary && /* @__PURE__ */ jsx(Typography, { variant: "body2", children: event.summary })
250
257
  ] }, eventKey(record, index));
251
258
  }) }),
252
- /* @__PURE__ */ jsx(EvidenceDisclosure, { data })
259
+ showEvidence && /* @__PURE__ */ jsx(EvidenceDisclosure, { data })
253
260
  ] });
254
261
  };
255
262
  const ArchitecturePresenter = ({ data }) => {