@anyshift/backstage-plugin-anyshift 0.1.0-beta.20 → 0.1.0-beta.21
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.
- package/LICENSE +1 -0
- package/README.md +3 -11
- package/dist/api/AnyshiftApi.esm.js +5 -56
- package/dist/api/AnyshiftApi.esm.js.map +1 -1
- package/dist/components/cloud/CloudResourceContent.esm.js +45 -444
- package/dist/components/cloud/CloudResourceContent.esm.js.map +1 -1
- package/dist/components/entity/AnyshiftEntityContent.esm.js +23 -128
- package/dist/components/entity/AnyshiftEntityContent.esm.js.map +1 -1
- package/dist/components/entity/BriefSections.esm.js +4 -24
- package/dist/components/entity/BriefSections.esm.js.map +1 -1
- package/dist/components/entity/DatadogLiveSignal.esm.js +23 -85
- package/dist/components/entity/DatadogLiveSignal.esm.js.map +1 -1
- package/dist/components/entity/MermaidArchitecture.esm.js +43 -202
- package/dist/components/entity/MermaidArchitecture.esm.js.map +1 -1
- package/dist/components/entity/SectionPresenters.esm.js +82 -145
- package/dist/components/entity/SectionPresenters.esm.js.map +1 -1
- package/dist/components/entity/architectureDiagram.esm.js +15 -48
- package/dist/components/entity/architectureDiagram.esm.js.map +1 -1
- package/dist/components/explorer/AnyshiftExplorerPage.esm.js +19 -154
- package/dist/components/explorer/AnyshiftExplorerPage.esm.js.map +1 -1
- package/dist/components/explorer/DatadogOperationsRadar.esm.js +31 -92
- package/dist/components/explorer/DatadogOperationsRadar.esm.js.map +1 -1
- package/dist/index.d.ts +4 -18
- package/dist/index.esm.js +1 -1
- package/dist/package.json.esm.js +13 -13
- package/dist/plugin.esm.js +2 -6
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +15 -15
- package/CHANGELOG.md +0 -87
- package/dist/components/ask/AskAnyshiftCard.esm.js +0 -348
- package/dist/components/ask/AskAnyshiftCard.esm.js.map +0 -1
- package/dist/components/ask/askPresenters.esm.js +0 -1203
- package/dist/components/ask/askPresenters.esm.js.map +0 -1
- package/dist/components/ask/askScope.esm.js +0 -27
- package/dist/components/ask/askScope.esm.js.map +0 -1
- package/dist/components/ask/askSuggestions.esm.js +0 -41
- package/dist/components/ask/askSuggestions.esm.js.map +0 -1
- package/dist/components/cloud/CloudImpactSection.esm.js +0 -54
- package/dist/components/cloud/CloudImpactSection.esm.js.map +0 -1
- package/dist/components/cloud/CloudRelationshipSections.esm.js +0 -43
- package/dist/components/cloud/CloudRelationshipSections.esm.js.map +0 -1
- package/dist/components/entity/ArchitectureOperationDetails.esm.js +0 -107
- package/dist/components/entity/ArchitectureOperationDetails.esm.js.map +0 -1
- package/dist/components/entity/architectureGraph.esm.js +0 -145
- package/dist/components/entity/architectureGraph.esm.js.map +0 -1
- package/dist/components/entity/entityIdentity.esm.js +0 -40
- package/dist/components/entity/entityIdentity.esm.js.map +0 -1
- package/dist/components/entity/relatedCatalogEntities.esm.js +0 -60
- package/dist/components/entity/relatedCatalogEntities.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architectureDiagram.esm.js","sources":["../../../src/components/entity/architectureDiagram.ts"],"sourcesContent":["import {\n architectureEdgeKey,\n mergeOperationSources,\n uniqueOperationCount,\n type ArchitectureEdge,\n type ArchitectureGraph,\n type ArchitectureNode,\n type ArchitectureOperationSource,\n} from './architectureGraph';\n\nexport type {\n ArchitectureEdge,\n ArchitectureGraph,\n ArchitectureNode,\n ArchitectureOperationSource,\n} from './architectureGraph';\n\nexport interface ArchitectureDiagramRelationship {\n id: string;\n diagramIndex: number;\n label: string;\n fromLabel: string;\n toLabel: string;\n type: string;\n operationCount: number;\n operationSources: ArchitectureOperationSource[];\n}\n\nexport interface ArchitectureDiagramDefinition {\n source: string;\n relationships: ArchitectureDiagramRelationship[];\n fallbackRelationships: string[];\n}\n\ninterface CompactGraph {\n nodes: ArchitectureNode[];\n edges: ArchitectureEdge[];\n}\n\nconst RUNTIME_INSTANCE_TYPES = new Set(['K8S_REPLICASET', 'K8S_POD']);\nconst MAX_DIRECT_DEPENDENCIES = 5;\n\nexport function buildArchitectureDiagram(\n graph: ArchitectureGraph,\n options: { view?: 'context' | 'runtime' } = {},\n): ArchitectureDiagramDefinition {\n const base = compactArchitectureGraph(graph);\n const viewed = options.view === 'context' ? serviceContextGraph(base) : base;\n const compact = summarizeDirectDependencies(viewed);\n const nodeIds = new Map(\n compact.nodes.map((node, index) => [node.id, `n${index}`]),\n );\n const names = new Map(\n compact.nodes.map(node => [node.id, readableNodeLabel(node)]),\n );\n const lines = ['flowchart LR'];\n const relationships: ArchitectureDiagramRelationship[] = [];\n\n compact.nodes.forEach(node => {\n const id = nodeIds.get(node.id)!;\n const label = mermaidNodeLabel(node);\n if (node.type === 'DATADOG_DATASTORE') {\n lines.push(` ${id}[(\"${label}\")]`);\n } else if (\n node.type === 'DATADOG_EXTERNAL' ||\n node.type === 'DATADOG_DESTINATION'\n ) {\n lines.push(` ${id}([\"${label}\"])`);\n } else {\n lines.push(` ${id}[\"${label}\"]`);\n }\n });\n\n compact.edges.forEach(edge => {\n const from = nodeIds.get(edge.from);\n const to = nodeIds.get(edge.to);\n const fromLabel = names.get(edge.from);\n const toLabel = names.get(edge.to);\n if (!from || !to || !fromLabel || !toLabel) return;\n\n const operationCount = edge.synthetic\n ? 0\n : uniqueOperationCount(edge.operationSources);\n const edgeLabel =\n operationCount > 0\n ? `${edge.type} · HTTP · ${operationCount}`\n : edge.type;\n lines.push(` ${from} -->|${sanitize(edgeLabel)}| ${to}`);\n relationships.push({\n id: architectureEdgeKey(edge),\n diagramIndex: relationships.length,\n label: `${fromLabel} → ${readableRelationship(edge.type)} → ${toLabel}`,\n fromLabel,\n toLabel,\n type: edge.type,\n operationCount,\n operationSources: operationCount > 0 ? edge.operationSources ?? [] : [],\n });\n });\n\n lines.push(\n ' classDef service fill:#e8f0fe,stroke:#1967d2,color:#174ea6',\n ' classDef runtime fill:#e6f4ea,stroke:#188038,color:#137333',\n ' classDef dependency fill:#fef7e0,stroke:#f9ab00,color:#7a4f01',\n );\n compact.nodes.forEach(node => {\n const id = nodeIds.get(node.id)!;\n lines.push(` class ${id} ${className(node)}`);\n });\n\n return {\n source: lines.join('\\n'),\n relationships,\n fallbackRelationships: relationships.map(item => item.label),\n };\n}\n\nfunction serviceContextGraph(graph: CompactGraph): CompactGraph {\n const nodes = graph.nodes.filter(node => node.type !== 'K8S_CONTAINER');\n const visible = new Set(nodes.map(node => node.id));\n return {\n nodes,\n edges: graph.edges.filter(\n edge => visible.has(edge.from) && visible.has(edge.to),\n ),\n };\n}\n\nfunction compactArchitectureGraph(graph: ArchitectureGraph): CompactGraph {\n const nodeById = new Map(graph.nodes.map(node => [node.id, node]));\n const visibleNodes = graph.nodes\n .filter(node => !isRuntimeInstance(node))\n .map(normalizeNode);\n const canonicalNodes = new Map<string, ArchitectureNode>();\n const canonicalId = new Map<string, string>();\n\n visibleNodes.forEach(node => {\n const key = semanticNodeKey(node);\n const existing = canonicalNodes.get(key);\n if (existing) {\n canonicalId.set(node.id, existing.id);\n } else {\n canonicalNodes.set(key, node);\n canonicalId.set(node.id, node.id);\n }\n });\n\n const outgoing = new Map<string, ArchitectureEdge[]>();\n graph.edges.forEach(edge => {\n const list = outgoing.get(edge.from) ?? [];\n list.push(edge);\n outgoing.set(edge.from, list);\n });\n\n const compactEdges = new Map<string, ArchitectureEdge>();\n visibleNodes.forEach(source => {\n const sourceId = canonicalId.get(source.id)!;\n walkToVisibleTargets(source.id, outgoing, nodeById).forEach(target => {\n const targetId = canonicalId.get(target.node.id);\n if (!targetId || sourceId === targetId) return;\n const type = target.collapsed ? 'RUNS' : target.edgeType;\n const key = `${sourceId}|${type}|${targetId}`;\n const existing = compactEdges.get(key);\n const synthetic = existing?.synthetic || target.synthetic;\n const operationSources = synthetic\n ? []\n : mergeOperationSources(\n existing?.operationSources,\n target.collapsed ? undefined : target.operationSources,\n );\n compactEdges.set(key, {\n from: sourceId,\n to: targetId,\n type,\n ...(synthetic ? { synthetic: true } : {}),\n ...(operationSources.length > 0 ? { operationSources } : {}),\n });\n });\n });\n\n return {\n nodes: [...canonicalNodes.values()],\n edges: [...compactEdges.values()],\n };\n}\n\nfunction summarizeDirectDependencies(graph: CompactGraph): CompactGraph {\n const root = graph.edges.find(edge => edge.type === 'RESOLVES_TO')?.from;\n if (!root) return graph;\n\n const nodes = new Map(graph.nodes.map(node => [node.id, node]));\n const groups = new Map<string, ArchitectureEdge[]>();\n const groupedEdges = new Set<ArchitectureEdge>();\n\n graph.edges.forEach(edge => {\n if (edge.type === 'RESOLVES_TO') return;\n let neighborId: string | undefined;\n if (edge.from === root) neighborId = edge.to;\n if (edge.to === root) neighborId = edge.from;\n if (!neighborId) return;\n const neighbor = nodes.get(neighborId);\n if (!neighbor || neighbor.type?.startsWith('K8S_')) return;\n const direction = edge.from === root ? 'out' : 'in';\n const key = `${direction}|${edge.type}|${neighbor.type ?? ''}`;\n const group = groups.get(key) ?? [];\n group.push(edge);\n groups.set(key, group);\n groupedEdges.add(edge);\n });\n\n const edges = graph.edges.filter(edge => !groupedEdges.has(edge));\n const aggregateNodes: ArchitectureNode[] = [];\n groups.forEach((group, key) => {\n if (group.length <= MAX_DIRECT_DEPENDENCIES) {\n edges.push(...group);\n return;\n }\n\n const visible = group.slice(0, MAX_DIRECT_DEPENDENCIES - 1);\n const hidden = group.slice(MAX_DIRECT_DEPENDENCIES - 1);\n const sample = group[0];\n const direction = sample.from === root ? 'out' : 'in';\n const neighbor = nodes.get(direction === 'out' ? sample.to : sample.from)!;\n const aggregateId = `aggregate-${key.replace(/[^A-Za-z0-9]/g, '-')}`;\n aggregateNodes.push({\n id: aggregateId,\n name: `${hidden.length} more ${pluralType(neighbor.type)}`,\n type: neighbor.type,\n });\n edges.push(...visible);\n edges.push(\n direction === 'out'\n ? { from: root, to: aggregateId, type: sample.type, synthetic: true }\n : { from: aggregateId, to: root, type: sample.type, synthetic: true },\n );\n });\n\n const referenced = new Set(edges.flatMap(edge => [edge.from, edge.to]));\n return {\n nodes: [\n ...graph.nodes.filter(node => referenced.has(node.id)),\n ...aggregateNodes,\n ],\n edges,\n };\n}\n\nfunction walkToVisibleTargets(\n start: string,\n outgoing: Map<string, ArchitectureEdge[]>,\n nodeById: Map<string, ArchitectureNode>,\n): Array<{\n node: ArchitectureNode;\n edgeType: string;\n collapsed: boolean;\n operationSources?: ArchitectureOperationSource[];\n synthetic?: boolean;\n}> {\n const targets: Array<{\n node: ArchitectureNode;\n edgeType: string;\n collapsed: boolean;\n operationSources?: ArchitectureOperationSource[];\n synthetic?: boolean;\n }> = [];\n const queue = (outgoing.get(start) ?? []).map(edge => ({\n id: edge.to,\n edgeType: edge.type,\n collapsed: false,\n operationSources: edge.operationSources,\n synthetic: edge.synthetic,\n }));\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const node = nodeById.get(current.id);\n if (!node) continue;\n if (!isRuntimeInstance(node)) {\n targets.push({ node, ...current });\n continue;\n }\n\n const visitKey = `${current.id}|${current.collapsed}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n (outgoing.get(current.id) ?? []).forEach(edge => {\n queue.push({\n id: edge.to,\n edgeType: edge.type,\n collapsed: true,\n operationSources: undefined,\n synthetic: undefined,\n });\n });\n }\n\n return targets;\n}\n\nfunction isRuntimeInstance(node: ArchitectureNode): boolean {\n return RUNTIME_INSTANCE_TYPES.has(node.type ?? '');\n}\n\nfunction normalizeNode(node: ArchitectureNode): ArchitectureNode {\n if (node.type !== 'K8S_CONTAINER') return node;\n const slash = node.name.lastIndexOf('/');\n return {\n ...node,\n name: slash >= 0 ? node.name.slice(slash + 1) : node.name,\n image: node.image ? imageRepository(node.image) : node.image,\n };\n}\n\nfunction imageRepository(image: string): string {\n const withoutDigest = image.split('@', 1)[0];\n const slash = withoutDigest.lastIndexOf('/');\n const tag = withoutDigest.lastIndexOf(':');\n const repository = tag > slash ? withoutDigest.slice(0, tag) : withoutDigest;\n return repository.slice(repository.lastIndexOf('/') + 1);\n}\n\nfunction semanticNodeKey(node: ArchitectureNode): string {\n return [\n node.type ?? '',\n node.namespace ?? '',\n node.name,\n node.image ?? '',\n ].join('|');\n}\n\nfunction readableNodeLabel(node: ArchitectureNode): string {\n const type = shortType(node.type);\n const typed = type ? `${node.name} [${type}]` : node.name;\n return node.type?.startsWith('K8S_') && node.namespace\n ? `${typed} (${node.namespace})`\n : typed;\n}\n\nfunction mermaidNodeLabel(node: ArchitectureNode): string {\n const parts = [sanitize(node.name)];\n const type = shortType(node.type);\n if (type) parts.push(`[${type}]`);\n if (node.type?.startsWith('K8S_') && node.namespace) {\n parts.push(`namespace: ${sanitize(node.namespace)}`);\n }\n if (node.image) parts.push(sanitize(node.image));\n return parts.join('<br/>');\n}\n\nfunction shortType(type?: string | null): string {\n return (type ?? '').replace(/^K8S_|^DATADOG_/, '');\n}\n\nfunction pluralType(type?: string | null): string {\n return `${shortType(type).toLocaleLowerCase()}s`;\n}\n\nfunction readableRelationship(type: string): string {\n return type.toLocaleLowerCase().replace(/_/g, ' ');\n}\n\nfunction sanitize(value: string): string {\n return value\n .replace(/\"/g, \"'\")\n .replace(/[<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction className(node: ArchitectureNode): string {\n if (node.type?.startsWith('K8S_')) return 'runtime';\n if (node.type === 'DATADOG_SERVICE') return 'service';\n return 'dependency';\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"architectureDiagram.esm.js","sources":["../../../src/components/entity/architectureDiagram.ts"],"sourcesContent":["export interface ArchitectureNode {\n id: string;\n name: string;\n type?: string | null;\n namespace?: string | null;\n image?: string | null;\n}\n\nexport interface ArchitectureEdge {\n from: string;\n to: string;\n type: string;\n}\n\nexport interface ArchitectureGraph {\n nodes: ArchitectureNode[];\n edges: ArchitectureEdge[];\n}\n\nexport interface ArchitectureDiagramDefinition {\n source: string;\n fallbackRelationships: string[];\n}\n\ninterface CompactGraph {\n nodes: ArchitectureNode[];\n edges: ArchitectureEdge[];\n}\n\nconst RUNTIME_INSTANCE_TYPES = new Set(['K8S_REPLICASET', 'K8S_POD']);\nconst MAX_DIRECT_DEPENDENCIES = 5;\n\nexport function buildArchitectureDiagram(\n graph: ArchitectureGraph,\n options: { view?: 'context' | 'runtime' } = {},\n): ArchitectureDiagramDefinition {\n const base = compactArchitectureGraph(graph);\n const viewed = options.view === 'context' ? serviceContextGraph(base) : base;\n const compact = summarizeDirectDependencies(viewed);\n const nodeIds = new Map(\n compact.nodes.map((node, index) => [node.id, `n${index}`]),\n );\n const names = new Map(\n compact.nodes.map(node => [node.id, readableNodeLabel(node)]),\n );\n const lines = ['flowchart LR'];\n\n compact.nodes.forEach(node => {\n const id = nodeIds.get(node.id)!;\n const label = mermaidNodeLabel(node);\n if (node.type === 'DATADOG_DATASTORE') {\n lines.push(` ${id}[(\"${label}\")]`);\n } else if (\n node.type === 'DATADOG_EXTERNAL' ||\n node.type === 'DATADOG_DESTINATION'\n ) {\n lines.push(` ${id}([\"${label}\"])`);\n } else {\n lines.push(` ${id}[\"${label}\"]`);\n }\n });\n\n compact.edges.forEach(edge => {\n const from = nodeIds.get(edge.from);\n const to = nodeIds.get(edge.to);\n if (from && to) {\n lines.push(` ${from} -->|${sanitize(edge.type)}| ${to}`);\n }\n });\n\n lines.push(\n ' classDef service fill:#e8f0fe,stroke:#1967d2,color:#174ea6',\n ' classDef runtime fill:#e6f4ea,stroke:#188038,color:#137333',\n ' classDef dependency fill:#fef7e0,stroke:#f9ab00,color:#7a4f01',\n );\n compact.nodes.forEach(node => {\n const id = nodeIds.get(node.id)!;\n lines.push(` class ${id} ${className(node)}`);\n });\n\n return {\n source: lines.join('\\n'),\n fallbackRelationships: compact.edges.flatMap(edge => {\n const from = names.get(edge.from);\n const to = names.get(edge.to);\n return from && to\n ? [`${from} → ${readableRelationship(edge.type)} → ${to}`]\n : [];\n }),\n };\n}\n\nfunction serviceContextGraph(graph: CompactGraph): CompactGraph {\n const nodes = graph.nodes.filter(node => node.type !== 'K8S_CONTAINER');\n const visible = new Set(nodes.map(node => node.id));\n return {\n nodes,\n edges: graph.edges.filter(\n edge => visible.has(edge.from) && visible.has(edge.to),\n ),\n };\n}\n\nfunction compactArchitectureGraph(graph: ArchitectureGraph): CompactGraph {\n const nodeById = new Map(graph.nodes.map(node => [node.id, node]));\n const visibleNodes = graph.nodes\n .filter(node => !isRuntimeInstance(node))\n .map(normalizeNode);\n const canonicalNodes = new Map<string, ArchitectureNode>();\n const canonicalId = new Map<string, string>();\n\n visibleNodes.forEach(node => {\n const key = semanticNodeKey(node);\n const existing = canonicalNodes.get(key);\n if (existing) {\n canonicalId.set(node.id, existing.id);\n } else {\n canonicalNodes.set(key, node);\n canonicalId.set(node.id, node.id);\n }\n });\n\n const outgoing = new Map<string, ArchitectureEdge[]>();\n graph.edges.forEach(edge => {\n const list = outgoing.get(edge.from) ?? [];\n list.push(edge);\n outgoing.set(edge.from, list);\n });\n\n const compactEdges = new Map<string, ArchitectureEdge>();\n visibleNodes.forEach(source => {\n const sourceId = canonicalId.get(source.id)!;\n walkToVisibleTargets(source.id, outgoing, nodeById).forEach(target => {\n const targetId = canonicalId.get(target.node.id);\n if (!targetId || sourceId === targetId) return;\n const type = target.collapsed ? 'RUNS' : target.edgeType;\n const key = `${sourceId}|${type}|${targetId}`;\n compactEdges.set(key, { from: sourceId, to: targetId, type });\n });\n });\n\n return {\n nodes: [...canonicalNodes.values()],\n edges: [...compactEdges.values()],\n };\n}\n\nfunction summarizeDirectDependencies(graph: CompactGraph): CompactGraph {\n const root = graph.edges.find(edge => edge.type === 'RESOLVES_TO')?.from;\n if (!root) return graph;\n\n const nodes = new Map(graph.nodes.map(node => [node.id, node]));\n const groups = new Map<string, ArchitectureEdge[]>();\n const groupedEdges = new Set<ArchitectureEdge>();\n\n graph.edges.forEach(edge => {\n if (edge.type === 'RESOLVES_TO') return;\n let neighborId: string | undefined;\n if (edge.from === root) neighborId = edge.to;\n if (edge.to === root) neighborId = edge.from;\n if (!neighborId) return;\n const neighbor = nodes.get(neighborId);\n if (!neighbor || neighbor.type?.startsWith('K8S_')) return;\n const direction = edge.from === root ? 'out' : 'in';\n const key = `${direction}|${edge.type}|${neighbor.type ?? ''}`;\n const group = groups.get(key) ?? [];\n group.push(edge);\n groups.set(key, group);\n groupedEdges.add(edge);\n });\n\n const edges = graph.edges.filter(edge => !groupedEdges.has(edge));\n const aggregateNodes: ArchitectureNode[] = [];\n groups.forEach((group, key) => {\n if (group.length <= MAX_DIRECT_DEPENDENCIES) {\n edges.push(...group);\n return;\n }\n\n const visible = group.slice(0, MAX_DIRECT_DEPENDENCIES - 1);\n const hidden = group.slice(MAX_DIRECT_DEPENDENCIES - 1);\n const sample = group[0];\n const direction = sample.from === root ? 'out' : 'in';\n const neighbor = nodes.get(direction === 'out' ? sample.to : sample.from)!;\n const aggregateId = `aggregate-${key.replace(/[^A-Za-z0-9]/g, '-')}`;\n aggregateNodes.push({\n id: aggregateId,\n name: `${hidden.length} more ${pluralType(neighbor.type)}`,\n type: neighbor.type,\n });\n edges.push(...visible);\n edges.push(\n direction === 'out'\n ? { from: root, to: aggregateId, type: sample.type }\n : { from: aggregateId, to: root, type: sample.type },\n );\n });\n\n const referenced = new Set(edges.flatMap(edge => [edge.from, edge.to]));\n return {\n nodes: [\n ...graph.nodes.filter(node => referenced.has(node.id)),\n ...aggregateNodes,\n ],\n edges,\n };\n}\n\nfunction walkToVisibleTargets(\n start: string,\n outgoing: Map<string, ArchitectureEdge[]>,\n nodeById: Map<string, ArchitectureNode>,\n): Array<{\n node: ArchitectureNode;\n edgeType: string;\n collapsed: boolean;\n}> {\n const targets: Array<{\n node: ArchitectureNode;\n edgeType: string;\n collapsed: boolean;\n }> = [];\n const queue = (outgoing.get(start) ?? []).map(edge => ({\n id: edge.to,\n edgeType: edge.type,\n collapsed: false,\n }));\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const visitKey = `${current.id}|${current.collapsed}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n const node = nodeById.get(current.id);\n if (!node) continue;\n if (!isRuntimeInstance(node)) {\n targets.push({ node, ...current });\n continue;\n }\n\n (outgoing.get(current.id) ?? []).forEach(edge => {\n queue.push({ id: edge.to, edgeType: edge.type, collapsed: true });\n });\n }\n\n return targets;\n}\n\nfunction isRuntimeInstance(node: ArchitectureNode): boolean {\n return RUNTIME_INSTANCE_TYPES.has(node.type ?? '');\n}\n\nfunction normalizeNode(node: ArchitectureNode): ArchitectureNode {\n if (node.type !== 'K8S_CONTAINER') return node;\n const slash = node.name.lastIndexOf('/');\n return {\n ...node,\n name: slash >= 0 ? node.name.slice(slash + 1) : node.name,\n image: node.image ? imageRepository(node.image) : node.image,\n };\n}\n\nfunction imageRepository(image: string): string {\n const withoutDigest = image.split('@', 1)[0];\n const slash = withoutDigest.lastIndexOf('/');\n const tag = withoutDigest.lastIndexOf(':');\n const repository = tag > slash ? withoutDigest.slice(0, tag) : withoutDigest;\n return repository.slice(repository.lastIndexOf('/') + 1);\n}\n\nfunction semanticNodeKey(node: ArchitectureNode): string {\n return [\n node.type ?? '',\n node.namespace ?? '',\n node.name,\n node.image ?? '',\n ].join('|');\n}\n\nfunction readableNodeLabel(node: ArchitectureNode): string {\n const type = shortType(node.type);\n const typed = type ? `${node.name} [${type}]` : node.name;\n return node.type?.startsWith('K8S_') && node.namespace\n ? `${typed} (${node.namespace})`\n : typed;\n}\n\nfunction mermaidNodeLabel(node: ArchitectureNode): string {\n const parts = [sanitize(node.name)];\n const type = shortType(node.type);\n if (type) parts.push(`[${type}]`);\n if (node.type?.startsWith('K8S_') && node.namespace) {\n parts.push(`namespace: ${sanitize(node.namespace)}`);\n }\n if (node.image) parts.push(sanitize(node.image));\n return parts.join('<br/>');\n}\n\nfunction shortType(type?: string | null): string {\n return (type ?? '').replace(/^K8S_|^DATADOG_/, '');\n}\n\nfunction pluralType(type?: string | null): string {\n return `${shortType(type).toLocaleLowerCase()}s`;\n}\n\nfunction readableRelationship(type: string): string {\n return type.toLocaleLowerCase().replace(/_/g, ' ');\n}\n\nfunction sanitize(value: string): string {\n return value\n .replace(/\"/g, \"'\")\n .replace(/[<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction className(node: ArchitectureNode): string {\n if (node.type?.startsWith('K8S_')) return 'runtime';\n if (node.type === 'DATADOG_SERVICE') return 'service';\n return 'dependency';\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, useEffect
|
|
3
|
-
import { Typography, Grid, Button, TextField
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Typography, Grid, Button, TextField } from '@material-ui/core';
|
|
4
4
|
import { Page, Header, Content, Progress, ContentHeader, InfoCard } from '@backstage/core-components';
|
|
5
5
|
import { useApi } from '@backstage/frontend-plugin-api';
|
|
6
6
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
7
7
|
import { anyshiftQueryPermission, anyshiftCatalogSyncPermission, ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION, ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION, ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION, ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
|
|
8
8
|
import { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';
|
|
9
9
|
import { anyshiftApiRef } from '../../api/AnyshiftApi.esm.js';
|
|
10
|
-
import { AskAnyshiftCard } from '../ask/AskAnyshiftCard.esm.js';
|
|
11
10
|
import { TimelinePresenter, ImpactPresenter } from '../entity/SectionPresenters.esm.js';
|
|
12
11
|
import { DatadogOperationsRadar } from './DatadogOperationsRadar.esm.js';
|
|
13
12
|
|
|
@@ -68,124 +67,14 @@ function catalogSyncStatus(entities) {
|
|
|
68
67
|
};
|
|
69
68
|
}
|
|
70
69
|
const EstateInsightsGrid = ({
|
|
71
|
-
insights
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
80
|
-
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
81
|
-
InfoCard,
|
|
82
|
-
{
|
|
83
|
-
title: "Evidence coverage",
|
|
84
|
-
subheader: "Observed graph sources and observability blind spots",
|
|
85
|
-
children: coverage.state === "data" && coverage.data ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
86
|
-
/* @__PURE__ */ jsx(EvidenceCoveragePresenter, { data: coverage.data }),
|
|
87
|
-
coverage.retryable && onRetryCoverage && /* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
|
|
88
|
-
Button,
|
|
89
|
-
{
|
|
90
|
-
variant: "outlined",
|
|
91
|
-
size: "small",
|
|
92
|
-
onClick: onRetryCoverage,
|
|
93
|
-
disabled: refreshingCoverage,
|
|
94
|
-
children: refreshingCoverage ? "Retrying\u2026" : "Retry evidence coverage"
|
|
95
|
-
}
|
|
96
|
-
) })
|
|
97
|
-
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
|
-
/* @__PURE__ */ jsx(
|
|
99
|
-
Typography,
|
|
100
|
-
{
|
|
101
|
-
color: coverage.state === "error" ? "error" : "textSecondary",
|
|
102
|
-
children: coverage.message || "No coverage evidence is available."
|
|
103
|
-
}
|
|
104
|
-
),
|
|
105
|
-
coverage.retryable && onRetryCoverage && /* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
|
|
106
|
-
Button,
|
|
107
|
-
{
|
|
108
|
-
variant: "outlined",
|
|
109
|
-
size: "small",
|
|
110
|
-
onClick: onRetryCoverage,
|
|
111
|
-
disabled: refreshingCoverage,
|
|
112
|
-
children: refreshingCoverage ? "Retrying\u2026" : "Retry evidence coverage"
|
|
113
|
-
}
|
|
114
|
-
) })
|
|
115
|
-
] })
|
|
116
|
-
}
|
|
117
|
-
) }),
|
|
118
|
-
insights.sections.map((item) => /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsx(InfoCard, { title: item.title, children: item.section.state === "error" ? /* @__PURE__ */ jsx(Typography, { color: "error", children: item.section.message }) : item.section.state === "empty" || item.section.state === "unsupported" || item.section.data === void 0 ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: item.section.message || "No insight evidence is available." }) : item.id === "recent-change" ? /* @__PURE__ */ jsx(
|
|
119
|
-
TimelinePresenter,
|
|
120
|
-
{
|
|
121
|
-
data: item.section.data,
|
|
122
|
-
fallbackLabel: "Deployment"
|
|
123
|
-
}
|
|
124
|
-
) : /* @__PURE__ */ jsx(ImpactPresenter, { data: item.section.data }) }) }, item.id))
|
|
125
|
-
] });
|
|
126
|
-
};
|
|
127
|
-
const EvidenceCoveragePresenter = ({
|
|
128
|
-
data
|
|
129
|
-
}) => {
|
|
130
|
-
const metrics = [
|
|
131
|
-
[data.graph.nodes, "Graph nodes"],
|
|
132
|
-
[data.graph.relationships, "Relationships"],
|
|
133
|
-
[data.graph.bridges, "Cross-source bridges"],
|
|
134
|
-
[data.graph.events, "Runtime events"]
|
|
135
|
-
];
|
|
136
|
-
const refreshedAt = Date.parse(data.refreshedAt);
|
|
137
|
-
const stale = Number.isFinite(refreshedAt) && Date.now() - refreshedAt > 15 * 60 * 1e3;
|
|
138
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
139
|
-
/* @__PURE__ */ jsxs(
|
|
140
|
-
Box,
|
|
141
|
-
{
|
|
142
|
-
display: "flex",
|
|
143
|
-
flexWrap: "wrap",
|
|
144
|
-
alignItems: "center",
|
|
145
|
-
gridGap: 8,
|
|
146
|
-
mb: 2,
|
|
147
|
-
children: [
|
|
148
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h5", children: data.connectedSources === null ? `Unknown of ${data.expectedSources} sources` : `${data.connectedSources} of ${data.expectedSources} sources` }),
|
|
149
|
-
/* @__PURE__ */ jsx(
|
|
150
|
-
Chip,
|
|
151
|
-
{
|
|
152
|
-
size: "small",
|
|
153
|
-
color: stale ? "secondary" : "primary",
|
|
154
|
-
label: stale ? "Stale evidence" : "Fresh evidence"
|
|
155
|
-
}
|
|
156
|
-
)
|
|
157
|
-
]
|
|
158
|
-
}
|
|
159
|
-
),
|
|
160
|
-
/* @__PURE__ */ jsx(Grid, { container: true, spacing: 2, children: metrics.map(([value, label]) => /* @__PURE__ */ jsxs(Grid, { item: true, xs: 6, md: 3, children: [
|
|
161
|
-
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: value === null ? "N/A" : value.toLocaleString() }),
|
|
162
|
-
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: label })
|
|
163
|
-
] }, label)) }),
|
|
164
|
-
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
165
|
-
/* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, md: 6, children: [
|
|
166
|
-
/* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: "Missing source evidence" }),
|
|
167
|
-
data.missingSources.length > 0 ? /* @__PURE__ */ jsx(Box, { display: "flex", flexWrap: "wrap", gridGap: 6, children: data.missingSources.map((source) => /* @__PURE__ */ jsx(
|
|
168
|
-
Chip,
|
|
169
|
-
{
|
|
170
|
-
size: "small",
|
|
171
|
-
variant: "outlined",
|
|
172
|
-
label: source
|
|
173
|
-
},
|
|
174
|
-
source
|
|
175
|
-
)) }) : /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "None reported by the Graph API." })
|
|
176
|
-
] }),
|
|
177
|
-
/* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, md: 6, children: [
|
|
178
|
-
/* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: "Observability blind spots" }),
|
|
179
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: data.blindSpots.workloadCount === null ? "Workload coverage unavailable" : `${data.blindSpots.workloadCount} workloads` }),
|
|
180
|
-
data.blindSpots.workloads.map((workload) => /* @__PURE__ */ jsxs(Box, { children: [
|
|
181
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: workload.name }),
|
|
182
|
-
workload.namespace && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: workload.namespace })
|
|
183
|
-
] }, `${workload.namespace}/${workload.name}`))
|
|
184
|
-
] })
|
|
185
|
-
] }),
|
|
186
|
-
/* @__PURE__ */ jsx(Box, { mt: 2, children: data.warnings.map((warning) => /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: warning }, warning)) })
|
|
187
|
-
] });
|
|
188
|
-
};
|
|
70
|
+
insights
|
|
71
|
+
}) => /* @__PURE__ */ jsx(Fragment, { children: insights.sections.map((item) => /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsx(InfoCard, { title: item.title, children: item.section.state === "error" ? /* @__PURE__ */ jsx(Typography, { color: "error", children: item.section.message }) : item.section.state === "empty" || item.section.state === "unsupported" || item.section.data === void 0 ? /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: item.section.message || "No insight evidence is available." }) : item.id === "recent-change" ? /* @__PURE__ */ jsx(
|
|
72
|
+
TimelinePresenter,
|
|
73
|
+
{
|
|
74
|
+
data: item.section.data,
|
|
75
|
+
fallbackLabel: "Deployment"
|
|
76
|
+
}
|
|
77
|
+
) : /* @__PURE__ */ jsx(ImpactPresenter, { data: item.section.data }) }) }, item.id)) });
|
|
189
78
|
const AnyshiftExplorerPage = () => {
|
|
190
79
|
const api = useApi(anyshiftApiRef);
|
|
191
80
|
const catalogApi = useApi(catalogApiRef);
|
|
@@ -195,13 +84,9 @@ const AnyshiftExplorerPage = () => {
|
|
|
195
84
|
const catalogSyncPermission = usePermission({
|
|
196
85
|
permission: anyshiftCatalogSyncPermission
|
|
197
86
|
});
|
|
198
|
-
const [
|
|
199
|
-
askEnabled: false,
|
|
200
|
-
queryEnabled: false
|
|
201
|
-
});
|
|
87
|
+
const [queryEnabled, setQueryEnabled] = useState(false);
|
|
202
88
|
const [insights, setInsights] = useState();
|
|
203
89
|
const [insightError, setInsightError] = useState();
|
|
204
|
-
const [refreshingInsights, setRefreshingInsights] = useState(false);
|
|
205
90
|
const [datadogSignals, setDatadogSignals] = useState();
|
|
206
91
|
const [datadogError, setDatadogError] = useState();
|
|
207
92
|
const [refreshingDatadog, setRefreshingDatadog] = useState(false);
|
|
@@ -215,30 +100,18 @@ const AnyshiftExplorerPage = () => {
|
|
|
215
100
|
const [syncRequestMessage, setSyncRequestMessage] = useState();
|
|
216
101
|
const [syncRequestError, setSyncRequestError] = useState();
|
|
217
102
|
useEffect(() => {
|
|
218
|
-
api.capabilities().then(
|
|
103
|
+
api.capabilities().then((capabilities) => setQueryEnabled(capabilities.queryEnabled)).catch(() => setQueryEnabled(false));
|
|
219
104
|
}, [api]);
|
|
220
105
|
useEffect(() => {
|
|
221
106
|
api.datadogSignals().then(setDatadogSignals).catch((error) => {
|
|
222
107
|
setDatadogError(error instanceof Error ? error.message : String(error));
|
|
223
108
|
});
|
|
224
109
|
}, [api]);
|
|
225
|
-
const loadInsights = useCallback(
|
|
226
|
-
async (refresh = false) => {
|
|
227
|
-
if (refresh) setRefreshingInsights(true);
|
|
228
|
-
setInsightError(void 0);
|
|
229
|
-
try {
|
|
230
|
-
setInsights(await api.insights({ refresh }));
|
|
231
|
-
} catch (error) {
|
|
232
|
-
setInsightError(error instanceof Error ? error.message : String(error));
|
|
233
|
-
} finally {
|
|
234
|
-
if (refresh) setRefreshingInsights(false);
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
[api]
|
|
238
|
-
);
|
|
239
110
|
useEffect(() => {
|
|
240
|
-
|
|
241
|
-
|
|
111
|
+
api.insights().then(setInsights).catch((error) => {
|
|
112
|
+
setInsightError(error instanceof Error ? error.message : String(error));
|
|
113
|
+
});
|
|
114
|
+
}, [api]);
|
|
242
115
|
useEffect(() => {
|
|
243
116
|
catalogApi.getEntities({
|
|
244
117
|
filter: [{ kind: "Component" }, { kind: "Resource" }]
|
|
@@ -387,16 +260,8 @@ const AnyshiftExplorerPage = () => {
|
|
|
387
260
|
insightError && /* @__PURE__ */ jsx(Typography, { color: "error", children: insightError }),
|
|
388
261
|
!insights && !insightError ? /* @__PURE__ */ jsx(Progress, {}) : null,
|
|
389
262
|
/* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
390
|
-
insights && /* @__PURE__ */ jsx(
|
|
391
|
-
|
|
392
|
-
{
|
|
393
|
-
insights,
|
|
394
|
-
onRetryCoverage: () => void loadInsights(true),
|
|
395
|
-
refreshingCoverage: refreshingInsights
|
|
396
|
-
}
|
|
397
|
-
),
|
|
398
|
-
capabilities.askEnabled && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(AskAnyshiftCard, { context: "estate" }) }),
|
|
399
|
-
capabilities.queryEnabled && queryPermission.allowed && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(
|
|
263
|
+
insights && /* @__PURE__ */ jsx(EstateInsightsGrid, { insights }),
|
|
264
|
+
queryEnabled && queryPermission.allowed && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(
|
|
400
265
|
InfoCard,
|
|
401
266
|
{
|
|
402
267
|
title: "Advanced query",
|
|
@@ -437,5 +302,5 @@ function formatTimestamp(value) {
|
|
|
437
302
|
return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();
|
|
438
303
|
}
|
|
439
304
|
|
|
440
|
-
export { AnyshiftExplorerPage, EstateInsightsGrid,
|
|
305
|
+
export { AnyshiftExplorerPage, EstateInsightsGrid, catalogSyncStatus, isDeterministicSelect, matchesCatalogEntity, summarizeCatalogSync };
|
|
441
306
|
//# sourceMappingURL=AnyshiftExplorerPage.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnyshiftExplorerPage.esm.js","sources":["../../../src/components/explorer/AnyshiftExplorerPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport {\n Box,\n Button,\n Chip,\n Grid,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION,\n anyshiftCatalogSyncPermission,\n anyshiftQueryPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n AnyshiftCapabilities,\n DatadogSignals,\n EvidenceCoverage,\n EstateInsights,\n QueryResult,\n} from '../../api/types';\nimport { AskAnyshiftCard } from '../ask/AskAnyshiftCard';\nimport {\n ImpactPresenter,\n TimelinePresenter,\n} from '../entity/SectionPresenters';\nimport { DatadogOperationsRadar } from './DatadogOperationsRadar';\n\nconst DEFAULT_QUERY =\n 'SELECT * FROM resources WHERE type = deployment LIMIT 10';\nconst CATALOG_SYNC_STATUS_ENTITY = 'anyshift-catalog-sync';\n\nexport function isDeterministicSelect(value: string): boolean {\n const sql = value.trim();\n return (\n /^SELECT\\b/i.test(sql) &&\n sql.length <= 4_096 &&\n !sql.includes(';') &&\n !sql.includes('--') &&\n !sql.includes('/*')\n );\n}\n\nexport function matchesCatalogEntity(entity: Entity, value: string): boolean {\n const query = value.trim().toLocaleLowerCase();\n if (!query) return true;\n const searchable = [\n entity.metadata.name,\n entity.metadata.title,\n entity.metadata.description,\n entity.metadata.annotations?.['anyshift.io/target'],\n typeof entity.spec?.owner === 'string' ? entity.spec.owner : undefined,\n ];\n return searchable.some(item => item?.toLocaleLowerCase().includes(query));\n}\n\nexport function summarizeCatalogSync(entities: Entity[]) {\n const components = entities.filter(\n entity => entity.kind.toLowerCase() === 'component',\n );\n const configured = components.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const excluded = components.filter(\n entity =>\n entity.metadata.annotations?.[\n 'anyshift.io/catalog-sync'\n ]?.toLowerCase() === 'excluded',\n );\n return {\n components: components.length,\n configured: configured.length,\n excluded: excluded.length,\n unclassified: Math.max(\n 0,\n components.length - configured.length - excluded.length,\n ),\n observed: configured.filter(\n entity => entity.metadata.annotations?.['anyshift.io/observed-service'],\n ).length,\n managedResources: entities.filter(\n entity =>\n entity.kind.toLowerCase() === 'resource' &&\n entity.metadata.name !== CATALOG_SYNC_STATUS_ENTITY &&\n entity.metadata.annotations?.['anyshift.io/managed-by'] ===\n 'catalog-provider',\n ).length,\n };\n}\n\nexport function catalogSyncStatus(entities: Entity[]) {\n const entity = entities.find(\n candidate =>\n candidate.kind.toLowerCase() === 'resource' &&\n candidate.metadata.name === CATALOG_SYNC_STATUS_ENTITY,\n );\n const annotations = entity?.metadata.annotations ?? {};\n return {\n status: annotations[ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION] ?? 'waiting',\n trigger: annotations[ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION],\n finishedAt: annotations[ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION],\n error: annotations[ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION],\n };\n}\n\nexport const EstateInsightsGrid = ({\n insights,\n onRetryCoverage,\n refreshingCoverage = false,\n}: {\n insights: EstateInsights;\n onRetryCoverage?: () => void;\n refreshingCoverage?: boolean;\n}) => {\n const coverage = insights.coverage ?? {\n state: 'unsupported' as const,\n message: 'Evidence coverage is not available from this backend version.',\n };\n return (\n <>\n <Grid item xs={12}>\n <InfoCard\n title=\"Evidence coverage\"\n subheader=\"Observed graph sources and observability blind spots\"\n >\n {coverage.state === 'data' && coverage.data ? (\n <>\n <EvidenceCoveragePresenter data={coverage.data} />\n {coverage.retryable && onRetryCoverage && (\n <Box mt={2}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={onRetryCoverage}\n disabled={refreshingCoverage}\n >\n {refreshingCoverage\n ? 'Retrying…'\n : 'Retry evidence coverage'}\n </Button>\n </Box>\n )}\n </>\n ) : (\n <>\n <Typography\n color={coverage.state === 'error' ? 'error' : 'textSecondary'}\n >\n {coverage.message || 'No coverage evidence is available.'}\n </Typography>\n {coverage.retryable && onRetryCoverage && (\n <Box mt={2}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n onClick={onRetryCoverage}\n disabled={refreshingCoverage}\n >\n {refreshingCoverage\n ? 'Retrying…'\n : 'Retry evidence coverage'}\n </Button>\n </Box>\n )}\n </>\n )}\n </InfoCard>\n </Grid>\n {insights.sections.map(item => (\n <Grid item xs={12} md={6} key={item.id}>\n <InfoCard title={item.title}>\n {item.section.state === 'error' ? (\n <Typography color=\"error\">{item.section.message}</Typography>\n ) : item.section.state === 'empty' ||\n item.section.state === 'unsupported' ||\n item.section.data === undefined ? (\n <Typography color=\"textSecondary\">\n {item.section.message || 'No insight evidence is available.'}\n </Typography>\n ) : item.id === 'recent-change' ? (\n <TimelinePresenter\n data={item.section.data}\n fallbackLabel=\"Deployment\"\n />\n ) : (\n <ImpactPresenter data={item.section.data} />\n )}\n </InfoCard>\n </Grid>\n ))}\n </>\n );\n};\n\nexport const EvidenceCoveragePresenter = ({\n data,\n}: {\n data: EvidenceCoverage;\n}) => {\n const metrics = [\n [data.graph.nodes, 'Graph nodes'],\n [data.graph.relationships, 'Relationships'],\n [data.graph.bridges, 'Cross-source bridges'],\n [data.graph.events, 'Runtime events'],\n ] as const;\n const refreshedAt = Date.parse(data.refreshedAt);\n const stale =\n Number.isFinite(refreshedAt) && Date.now() - refreshedAt > 15 * 60 * 1000;\n\n return (\n <>\n <Box\n display=\"flex\"\n flexWrap=\"wrap\"\n alignItems=\"center\"\n gridGap={8}\n mb={2}\n >\n <Typography variant=\"h5\">\n {data.connectedSources === null\n ? `Unknown of ${data.expectedSources} sources`\n : `${data.connectedSources} of ${data.expectedSources} sources`}\n </Typography>\n <Chip\n size=\"small\"\n color={stale ? 'secondary' : 'primary'}\n label={stale ? 'Stale evidence' : 'Fresh evidence'}\n />\n </Box>\n <Grid container spacing={2}>\n {metrics.map(([value, label]) => (\n <Grid item xs={6} md={3} key={label}>\n <Typography variant=\"h6\">\n {value === null ? 'N/A' : value.toLocaleString()}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {label}\n </Typography>\n </Grid>\n ))}\n </Grid>\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Missing source evidence\n </Typography>\n {data.missingSources.length > 0 ? (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={6}>\n {data.missingSources.map(source => (\n <Chip\n key={source}\n size=\"small\"\n variant=\"outlined\"\n label={source}\n />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n None reported by the Graph API.\n </Typography>\n )}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Observability blind spots\n </Typography>\n <Typography variant=\"body2\">\n {data.blindSpots.workloadCount === null\n ? 'Workload coverage unavailable'\n : `${data.blindSpots.workloadCount} workloads`}\n </Typography>\n {data.blindSpots.workloads.map(workload => (\n <Box key={`${workload.namespace}/${workload.name}`}>\n <Typography variant=\"body2\">{workload.name}</Typography>\n {workload.namespace && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {workload.namespace}\n </Typography>\n )}\n </Box>\n ))}\n </Grid>\n </Grid>\n <Box mt={2}>\n {data.warnings.map(warning => (\n <Typography key={warning} variant=\"caption\" color=\"textSecondary\">\n {warning}\n </Typography>\n ))}\n </Box>\n </>\n );\n};\n\nexport const AnyshiftExplorerPage = () => {\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApi(catalogApiRef);\n const queryPermission = usePermission({\n permission: anyshiftQueryPermission,\n });\n const catalogSyncPermission = usePermission({\n permission: anyshiftCatalogSyncPermission,\n });\n const [capabilities, setCapabilities] = useState<AnyshiftCapabilities>({\n askEnabled: false,\n queryEnabled: false,\n });\n const [insights, setInsights] = useState<EstateInsights>();\n const [insightError, setInsightError] = useState<string>();\n const [refreshingInsights, setRefreshingInsights] = useState(false);\n const [datadogSignals, setDatadogSignals] = useState<DatadogSignals>();\n const [datadogError, setDatadogError] = useState<string>();\n const [refreshingDatadog, setRefreshingDatadog] = useState(false);\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [catalogError, setCatalogError] = useState<string>();\n const [catalogQuery, setCatalogQuery] = useState('');\n const [sql, setSql] = useState(DEFAULT_QUERY);\n const [queryResult, setQueryResult] = useState<QueryResult>();\n const [queryError, setQueryError] = useState<string>();\n const [requestingSync, setRequestingSync] = useState(false);\n const [syncRequestMessage, setSyncRequestMessage] = useState<string>();\n const [syncRequestError, setSyncRequestError] = useState<string>();\n\n useEffect(() => {\n api\n .capabilities()\n .then(setCapabilities)\n .catch(() => setCapabilities({ askEnabled: false, queryEnabled: false }));\n }, [api]);\n\n useEffect(() => {\n api\n .datadogSignals()\n .then(setDatadogSignals)\n .catch(error => {\n setDatadogError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n const loadInsights = useCallback(\n async (refresh = false) => {\n if (refresh) setRefreshingInsights(true);\n setInsightError(undefined);\n try {\n setInsights(await api.insights({ refresh }));\n } catch (error) {\n setInsightError(error instanceof Error ? error.message : String(error));\n } finally {\n if (refresh) setRefreshingInsights(false);\n }\n },\n [api],\n );\n\n useEffect(() => {\n void loadInsights();\n }, [loadInsights]);\n\n useEffect(() => {\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n })\n .then(response => setCatalogEntities(response.items))\n .catch(error => {\n setCatalogError(error instanceof Error ? error.message : String(error));\n });\n }, [catalogApi]);\n\n const anyshiftEntities = catalogEntities.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const syncSummary = summarizeCatalogSync(catalogEntities);\n const syncStatus = catalogSyncStatus(catalogEntities);\n const matchingEntities = anyshiftEntities\n .filter(entity => matchesCatalogEntity(entity, catalogQuery))\n .slice(0, 12);\n\n const runQuery = async () => {\n if (!isDeterministicSelect(sql)) {\n setQueryError('Enter one deterministic SELECT query.');\n return;\n }\n setQueryError(undefined);\n try {\n setQueryResult(await api.query(sql.trim()));\n } catch (error) {\n setQueryError(error instanceof Error ? error.message : String(error));\n }\n };\n\n const refreshDatadog = async () => {\n setRefreshingDatadog(true);\n setDatadogError(undefined);\n try {\n setDatadogSignals(await api.datadogSignals({ refresh: true }));\n } catch (error) {\n setDatadogError(error instanceof Error ? error.message : String(error));\n } finally {\n setRefreshingDatadog(false);\n }\n };\n\n const requestCatalogSync = async () => {\n setRequestingSync(true);\n setSyncRequestError(undefined);\n setSyncRequestMessage(undefined);\n try {\n const accepted = await api.reconcileCatalog();\n setSyncRequestMessage(\n `Reconciliation accepted ${formatTimestamp(accepted.acceptedAt)}.`,\n );\n } catch (error) {\n setSyncRequestError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n setRequestingSync(false);\n }\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Anyshift\"\n subtitle=\"Live infrastructure context for your software catalog\"\n />\n <Content>\n {datadogSignals ? (\n <DatadogOperationsRadar\n signals={datadogSignals}\n catalogEntities={anyshiftEntities}\n onRefresh={refreshDatadog}\n refreshing={refreshingDatadog}\n error={datadogError}\n />\n ) : datadogError ? (\n <Typography color=\"error\">{datadogError}</Typography>\n ) : (\n <Progress />\n )}\n <ContentHeader title=\"Catalog synchronization\" />\n <InfoCard subheader=\"GitHub ownership stays authoritative; Anyshift adds observed infrastructure context\">\n <Grid container spacing={2}>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.configured}</Typography>\n <Typography color=\"textSecondary\">Configured</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.excluded}</Typography>\n <Typography color=\"textSecondary\">Excluded</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.unclassified}</Typography>\n <Typography color=\"textSecondary\">Unclassified</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.observed}</Typography>\n <Typography color=\"textSecondary\">Active matches</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">\n {syncSummary.managedResources}\n </Typography>\n <Typography color=\"textSecondary\">Managed resources</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography>\n Last reconciliation: <strong>{syncStatus.status}</strong>\n {syncStatus.finishedAt\n ? ` · ${formatTimestamp(syncStatus.finishedAt)}`\n : ''}\n {syncStatus.trigger ? ` · ${syncStatus.trigger}` : ''}\n </Typography>\n {syncStatus.error && (\n <Typography color=\"error\">\n Last failure: {syncStatus.error}\n </Typography>\n )}\n {catalogSyncPermission.allowed && (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n disabled={requestingSync}\n onClick={requestCatalogSync}\n style={{ marginTop: 12 }}\n >\n {requestingSync ? 'Requesting…' : 'Reconcile now'}\n </Button>\n )}\n {syncRequestMessage && (\n <Typography color=\"textSecondary\">\n {syncRequestMessage}\n </Typography>\n )}\n {syncRequestError && (\n <Typography color=\"error\">{syncRequestError}</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n <ContentHeader title=\"Find a service\" />\n <InfoCard subheader=\"Anyshift-annotated Components and Resources in the Backstage catalog\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Search services and resources\"\n value={catalogQuery}\n onChange={event => setCatalogQuery(event.target.value)}\n />\n {catalogError && (\n <Typography color=\"error\">{catalogError}</Typography>\n )}\n {!catalogError && matchingEntities.length === 0 ? (\n <Typography color=\"textSecondary\" style={{ marginTop: 12 }}>\n No matching Anyshift catalog entities.\n </Typography>\n ) : (\n <ul>\n {matchingEntities.map(entity => (\n <li\n key={`${entity.kind}:${\n entity.metadata.namespace ?? 'default'\n }/${entity.metadata.name}`}\n >\n <EntityRefLink entityRef={entity} />\n {entity.metadata.description\n ? ` - ${entity.metadata.description}`\n : null}\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n <ContentHeader title=\"Estate insights\" />\n {insightError && <Typography color=\"error\">{insightError}</Typography>}\n {!insights && !insightError ? <Progress /> : null}\n <Grid container spacing={3}>\n {insights && (\n <EstateInsightsGrid\n insights={insights}\n onRetryCoverage={() => void loadInsights(true)}\n refreshingCoverage={refreshingInsights}\n />\n )}\n {capabilities.askEnabled && (\n <Grid item xs={12}>\n <AskAnyshiftCard context=\"estate\" />\n </Grid>\n )}\n {capabilities.queryEnabled && queryPermission.allowed && (\n <Grid item xs={12}>\n <InfoCard\n title=\"Advanced query\"\n subheader=\"Deterministic Graph API SELECT queries only\"\n >\n <TextField\n fullWidth\n multiline\n minRows={2}\n variant=\"outlined\"\n value={sql}\n onChange={event => setSql(event.target.value)}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={runQuery}\n style={{ marginTop: 12 }}\n >\n Run query\n </Button>\n {queryError && (\n <Typography color=\"error\">{queryError}</Typography>\n )}\n {queryResult && (\n <pre style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>\n {JSON.stringify(queryResult, null, 2)}\n </pre>\n )}\n </InfoCard>\n </Grid>\n )}\n </Grid>\n </Content>\n </Page>\n );\n};\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnyshiftExplorerPage.esm.js","sources":["../../../src/components/explorer/AnyshiftExplorerPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Button, Grid, TextField, Typography } from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n InfoCard,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION,\n ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION,\n anyshiftCatalogSyncPermission,\n anyshiftQueryPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport type { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\nimport type {\n DatadogSignals,\n EstateInsights,\n QueryResult,\n} from '../../api/types';\nimport {\n ImpactPresenter,\n TimelinePresenter,\n} from '../entity/SectionPresenters';\nimport { DatadogOperationsRadar } from './DatadogOperationsRadar';\n\nconst DEFAULT_QUERY =\n 'SELECT * FROM resources WHERE type = deployment LIMIT 10';\nconst CATALOG_SYNC_STATUS_ENTITY = 'anyshift-catalog-sync';\n\nexport function isDeterministicSelect(value: string): boolean {\n const sql = value.trim();\n return (\n /^SELECT\\b/i.test(sql) &&\n sql.length <= 4_096 &&\n !sql.includes(';') &&\n !sql.includes('--') &&\n !sql.includes('/*')\n );\n}\n\nexport function matchesCatalogEntity(entity: Entity, value: string): boolean {\n const query = value.trim().toLocaleLowerCase();\n if (!query) return true;\n const searchable = [\n entity.metadata.name,\n entity.metadata.title,\n entity.metadata.description,\n entity.metadata.annotations?.['anyshift.io/target'],\n typeof entity.spec?.owner === 'string' ? entity.spec.owner : undefined,\n ];\n return searchable.some(item => item?.toLocaleLowerCase().includes(query));\n}\n\nexport function summarizeCatalogSync(entities: Entity[]) {\n const components = entities.filter(\n entity => entity.kind.toLowerCase() === 'component',\n );\n const configured = components.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const excluded = components.filter(\n entity =>\n entity.metadata.annotations?.[\n 'anyshift.io/catalog-sync'\n ]?.toLowerCase() === 'excluded',\n );\n return {\n components: components.length,\n configured: configured.length,\n excluded: excluded.length,\n unclassified: Math.max(\n 0,\n components.length - configured.length - excluded.length,\n ),\n observed: configured.filter(\n entity => entity.metadata.annotations?.['anyshift.io/observed-service'],\n ).length,\n managedResources: entities.filter(\n entity =>\n entity.kind.toLowerCase() === 'resource' &&\n entity.metadata.name !== CATALOG_SYNC_STATUS_ENTITY &&\n entity.metadata.annotations?.['anyshift.io/managed-by'] ===\n 'catalog-provider',\n ).length,\n };\n}\n\nexport function catalogSyncStatus(entities: Entity[]) {\n const entity = entities.find(\n candidate =>\n candidate.kind.toLowerCase() === 'resource' &&\n candidate.metadata.name === CATALOG_SYNC_STATUS_ENTITY,\n );\n const annotations = entity?.metadata.annotations ?? {};\n return {\n status: annotations[ANYSHIFT_CATALOG_SYNC_STATUS_ANNOTATION] ?? 'waiting',\n trigger: annotations[ANYSHIFT_CATALOG_SYNC_TRIGGER_ANNOTATION],\n finishedAt: annotations[ANYSHIFT_CATALOG_SYNC_FINISHED_AT_ANNOTATION],\n error: annotations[ANYSHIFT_CATALOG_SYNC_ERROR_ANNOTATION],\n };\n}\n\nexport const EstateInsightsGrid = ({\n insights,\n}: {\n insights: EstateInsights;\n}) => (\n <>\n {insights.sections.map(item => (\n <Grid item xs={12} md={6} key={item.id}>\n <InfoCard title={item.title}>\n {item.section.state === 'error' ? (\n <Typography color=\"error\">{item.section.message}</Typography>\n ) : item.section.state === 'empty' ||\n item.section.state === 'unsupported' ||\n item.section.data === undefined ? (\n <Typography color=\"textSecondary\">\n {item.section.message || 'No insight evidence is available.'}\n </Typography>\n ) : item.id === 'recent-change' ? (\n <TimelinePresenter\n data={item.section.data}\n fallbackLabel=\"Deployment\"\n />\n ) : (\n <ImpactPresenter data={item.section.data} />\n )}\n </InfoCard>\n </Grid>\n ))}\n </>\n);\n\nexport const AnyshiftExplorerPage = () => {\n const api = useApi(anyshiftApiRef);\n const catalogApi = useApi(catalogApiRef);\n const queryPermission = usePermission({\n permission: anyshiftQueryPermission,\n });\n const catalogSyncPermission = usePermission({\n permission: anyshiftCatalogSyncPermission,\n });\n const [queryEnabled, setQueryEnabled] = useState(false);\n const [insights, setInsights] = useState<EstateInsights>();\n const [insightError, setInsightError] = useState<string>();\n const [datadogSignals, setDatadogSignals] = useState<DatadogSignals>();\n const [datadogError, setDatadogError] = useState<string>();\n const [refreshingDatadog, setRefreshingDatadog] = useState(false);\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [catalogError, setCatalogError] = useState<string>();\n const [catalogQuery, setCatalogQuery] = useState('');\n const [sql, setSql] = useState(DEFAULT_QUERY);\n const [queryResult, setQueryResult] = useState<QueryResult>();\n const [queryError, setQueryError] = useState<string>();\n const [requestingSync, setRequestingSync] = useState(false);\n const [syncRequestMessage, setSyncRequestMessage] = useState<string>();\n const [syncRequestError, setSyncRequestError] = useState<string>();\n\n useEffect(() => {\n api\n .capabilities()\n .then(capabilities => setQueryEnabled(capabilities.queryEnabled))\n .catch(() => setQueryEnabled(false));\n }, [api]);\n\n useEffect(() => {\n api\n .datadogSignals()\n .then(setDatadogSignals)\n .catch(error => {\n setDatadogError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n useEffect(() => {\n api\n .insights()\n .then(setInsights)\n .catch(error => {\n setInsightError(error instanceof Error ? error.message : String(error));\n });\n }, [api]);\n\n useEffect(() => {\n catalogApi\n .getEntities({\n filter: [{ kind: 'Component' }, { kind: 'Resource' }],\n })\n .then(response => setCatalogEntities(response.items))\n .catch(error => {\n setCatalogError(error instanceof Error ? error.message : String(error));\n });\n }, [catalogApi]);\n\n const anyshiftEntities = catalogEntities.filter(\n entity => entity.metadata.annotations?.['anyshift.io/target'],\n );\n const syncSummary = summarizeCatalogSync(catalogEntities);\n const syncStatus = catalogSyncStatus(catalogEntities);\n const matchingEntities = anyshiftEntities\n .filter(entity => matchesCatalogEntity(entity, catalogQuery))\n .slice(0, 12);\n\n const runQuery = async () => {\n if (!isDeterministicSelect(sql)) {\n setQueryError('Enter one deterministic SELECT query.');\n return;\n }\n setQueryError(undefined);\n try {\n setQueryResult(await api.query(sql.trim()));\n } catch (error) {\n setQueryError(error instanceof Error ? error.message : String(error));\n }\n };\n\n const refreshDatadog = async () => {\n setRefreshingDatadog(true);\n setDatadogError(undefined);\n try {\n setDatadogSignals(await api.datadogSignals({ refresh: true }));\n } catch (error) {\n setDatadogError(error instanceof Error ? error.message : String(error));\n } finally {\n setRefreshingDatadog(false);\n }\n };\n\n const requestCatalogSync = async () => {\n setRequestingSync(true);\n setSyncRequestError(undefined);\n setSyncRequestMessage(undefined);\n try {\n const accepted = await api.reconcileCatalog();\n setSyncRequestMessage(\n `Reconciliation accepted ${formatTimestamp(accepted.acceptedAt)}.`,\n );\n } catch (error) {\n setSyncRequestError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n setRequestingSync(false);\n }\n };\n\n return (\n <Page themeId=\"tool\">\n <Header\n title=\"Anyshift\"\n subtitle=\"Live infrastructure context for your software catalog\"\n />\n <Content>\n {datadogSignals ? (\n <DatadogOperationsRadar\n signals={datadogSignals}\n catalogEntities={anyshiftEntities}\n onRefresh={refreshDatadog}\n refreshing={refreshingDatadog}\n error={datadogError}\n />\n ) : datadogError ? (\n <Typography color=\"error\">{datadogError}</Typography>\n ) : (\n <Progress />\n )}\n <ContentHeader title=\"Catalog synchronization\" />\n <InfoCard subheader=\"GitHub ownership stays authoritative; Anyshift adds observed infrastructure context\">\n <Grid container spacing={2}>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.configured}</Typography>\n <Typography color=\"textSecondary\">Configured</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.excluded}</Typography>\n <Typography color=\"textSecondary\">Excluded</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.unclassified}</Typography>\n <Typography color=\"textSecondary\">Unclassified</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">{syncSummary.observed}</Typography>\n <Typography color=\"textSecondary\">Active matches</Typography>\n </Grid>\n <Grid item xs={6} md={2}>\n <Typography variant=\"h5\">\n {syncSummary.managedResources}\n </Typography>\n <Typography color=\"textSecondary\">Managed resources</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography>\n Last reconciliation: <strong>{syncStatus.status}</strong>\n {syncStatus.finishedAt\n ? ` · ${formatTimestamp(syncStatus.finishedAt)}`\n : ''}\n {syncStatus.trigger ? ` · ${syncStatus.trigger}` : ''}\n </Typography>\n {syncStatus.error && (\n <Typography color=\"error\">\n Last failure: {syncStatus.error}\n </Typography>\n )}\n {catalogSyncPermission.allowed && (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n disabled={requestingSync}\n onClick={requestCatalogSync}\n style={{ marginTop: 12 }}\n >\n {requestingSync ? 'Requesting…' : 'Reconcile now'}\n </Button>\n )}\n {syncRequestMessage && (\n <Typography color=\"textSecondary\">\n {syncRequestMessage}\n </Typography>\n )}\n {syncRequestError && (\n <Typography color=\"error\">{syncRequestError}</Typography>\n )}\n </Grid>\n </Grid>\n </InfoCard>\n <ContentHeader title=\"Find a service\" />\n <InfoCard subheader=\"Anyshift-annotated Components and Resources in the Backstage catalog\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Search services and resources\"\n value={catalogQuery}\n onChange={event => setCatalogQuery(event.target.value)}\n />\n {catalogError && (\n <Typography color=\"error\">{catalogError}</Typography>\n )}\n {!catalogError && matchingEntities.length === 0 ? (\n <Typography color=\"textSecondary\" style={{ marginTop: 12 }}>\n No matching Anyshift catalog entities.\n </Typography>\n ) : (\n <ul>\n {matchingEntities.map(entity => (\n <li\n key={`${entity.kind}:${\n entity.metadata.namespace ?? 'default'\n }/${entity.metadata.name}`}\n >\n <EntityRefLink entityRef={entity} />\n {entity.metadata.description\n ? ` - ${entity.metadata.description}`\n : null}\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n <ContentHeader title=\"Estate insights\" />\n {insightError && <Typography color=\"error\">{insightError}</Typography>}\n {!insights && !insightError ? <Progress /> : null}\n <Grid container spacing={3}>\n {insights && <EstateInsightsGrid insights={insights} />}\n {queryEnabled && queryPermission.allowed && (\n <Grid item xs={12}>\n <InfoCard\n title=\"Advanced query\"\n subheader=\"Deterministic Graph API SELECT queries only\"\n >\n <TextField\n fullWidth\n multiline\n minRows={2}\n variant=\"outlined\"\n value={sql}\n onChange={event => setSql(event.target.value)}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={runQuery}\n style={{ marginTop: 12 }}\n >\n Run query\n </Button>\n {queryError && (\n <Typography color=\"error\">{queryError}</Typography>\n )}\n {queryResult && (\n <pre style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>\n {JSON.stringify(queryResult, null, 2)}\n </pre>\n )}\n </InfoCard>\n </Grid>\n )}\n </Grid>\n </Content>\n </Page>\n );\n};\n\nfunction formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? value : new Date(parsed).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
|