@anyshift/backstage-plugin-anyshift 0.1.0-beta.7 → 0.1.0-beta.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0-beta.9
4
+
5
+ - Render configured callers and dependencies separately from observed APM traffic.
6
+ - Resolve ECS configuration evidence through a dedicated runtime identity annotation.
7
+
8
+ ## 0.1.0-beta.8
9
+
10
+ - Render cloud evidence timestamps with bracketed time-zone identifiers without
11
+ displaying `Invalid Date`.
12
+ - Preserve unrecognized timestamp evidence as its original value instead of
13
+ inventing a time.
14
+
3
15
  ## 0.1.0-beta.7
4
16
 
5
17
  - Load normalized cloud changes, Terraform provenance, and drift evidence on cloud Resource pages.
@@ -83,6 +83,12 @@ function briefQuery(options) {
83
83
  const params = new URLSearchParams();
84
84
  if (options.namespace) params.set("namespace", options.namespace);
85
85
  if (options.refresh) params.set("refresh", "1");
86
+ if (options.configurationEndpoints)
87
+ params.set("configurationEndpoints", options.configurationEndpoints);
88
+ if (options.configurationDependencies)
89
+ params.set("configurationDependencies", options.configurationDependencies);
90
+ if (options.configurationTarget)
91
+ params.set("configurationTarget", options.configurationTarget);
86
92
  const query = params.toString();
87
93
  return query ? `?${query}` : "";
88
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AnyshiftApi.esm.js","sources":["../../src/api/AnyshiftApi.ts"],"sourcesContent":["import {\n createApiRef,\n type DiscoveryApi,\n type FetchApi,\n} from '@backstage/frontend-plugin-api';\nimport type {\n BriefSectionName,\n BriefSectionResponse,\n AnyshiftCapabilities,\n CatalogSummary,\n CatalogSyncReport,\n CloudResourceBrief,\n DatadogSignals,\n EstateInsights,\n QueryResult,\n ServiceBrief,\n} from './types';\n\nexport interface AnyshiftApi {\n capabilities(): Promise<AnyshiftCapabilities>;\n brief(\n kind: string,\n target: string,\n options?: BriefRequestOptions,\n ): Promise<ServiceBrief>;\n briefSection(\n kind: string,\n target: string,\n section: BriefSectionName,\n options?: BriefRequestOptions,\n ): Promise<BriefSectionResponse>;\n insights(): Promise<EstateInsights>;\n datadogSignals(options?: { refresh?: boolean }): Promise<DatadogSignals>;\n cloudResourceBrief(\n resource: string,\n options?: CloudResourceBriefRequestOptions,\n ): Promise<CloudResourceBrief>;\n inventory(\n type: string,\n options?: { limit?: number; offset?: number },\n ): Promise<CatalogSummary>;\n query(sql: string): Promise<QueryResult>;\n reconcileCatalog(): Promise<CatalogSyncAccepted>;\n}\n\nexport interface BriefRequestOptions {\n namespace?: string;\n refresh?: boolean;\n}\n\nexport interface CloudResourceBriefRequestOptions {\n since?: string;\n cursor?: string;\n diff?: boolean;\n refresh?: boolean;\n}\n\nexport interface CatalogSyncAccepted {\n accepted: true;\n acceptedAt: string;\n previous?: CatalogSyncReport;\n}\n\nexport const anyshiftApiRef = createApiRef<AnyshiftApi>({\n id: 'plugin.anyshift.service',\n});\n\nexport class AnyshiftClient implements AnyshiftApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async capabilities(): Promise<AnyshiftCapabilities> {\n return this.get('/capabilities');\n }\n\n async brief(\n kind: string,\n target: string,\n options: BriefRequestOptions = {},\n ): Promise<ServiceBrief> {\n return this.get(\n `/brief/${encodeURIComponent(kind)}/${encodeURIComponent(\n target,\n )}${briefQuery(options)}`,\n );\n }\n\n async briefSection(\n kind: string,\n target: string,\n section: BriefSectionName,\n options: BriefRequestOptions = {},\n ): Promise<BriefSectionResponse> {\n return this.get(\n `/brief/${encodeURIComponent(kind)}/${encodeURIComponent(\n target,\n )}/sections/${encodeURIComponent(section)}${briefQuery(options)}`,\n );\n }\n\n async insights(): Promise<EstateInsights> {\n return this.get('/insights');\n }\n\n async datadogSignals(\n options: { refresh?: boolean } = {},\n ): Promise<DatadogSignals> {\n return this.get(`/signals/datadog${options.refresh ? '?refresh=1' : ''}`);\n }\n\n async cloudResourceBrief(\n resource: string,\n options: CloudResourceBriefRequestOptions = {},\n ): Promise<CloudResourceBrief> {\n const params = new URLSearchParams({ resource });\n if (options.since) params.set('since', options.since);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.diff !== undefined) params.set('diff', String(options.diff));\n if (options.refresh) params.set('refresh', '1');\n return this.get(`/cloud/resources/brief?${params}`);\n }\n\n async inventory(\n type: string,\n options: { limit?: number; offset?: number } = {},\n ): Promise<CatalogSummary> {\n const params = new URLSearchParams({ type });\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.offset !== undefined)\n params.set('offset', String(options.offset));\n return this.get(`/inventory?${params}`);\n }\n\n async query(sql: string): Promise<QueryResult> {\n return this.request('/query', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sql }),\n });\n }\n\n async reconcileCatalog(): Promise<CatalogSyncAccepted> {\n return this.request('/anyshift/reconcile', { method: 'POST' }, 'catalog');\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request(path, { method: 'GET' });\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n pluginId = 'anyshift',\n ): Promise<T> {\n const baseUrl = await this.discoveryApi.getBaseUrl(pluginId);\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`, init);\n const text = await response.text();\n let payload: any;\n try {\n payload = text ? JSON.parse(text) : {};\n } catch {\n payload = {};\n }\n if (!response.ok) {\n throw new Error(\n payload?.error?.message ||\n `Anyshift request failed (${response.status})`,\n );\n }\n return payload as T;\n }\n}\n\nfunction briefQuery(options: BriefRequestOptions): string {\n const params = new URLSearchParams();\n if (options.namespace) params.set('namespace', options.namespace);\n if (options.refresh) params.set('refresh', '1');\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n"],"names":[],"mappings":";;AA+DO,MAAM,iBAAiB,YAAA,CAA0B;AAAA,EACtD,EAAA,EAAI;AACN,CAAC;AAEM,MAAM,cAAA,CAAsC;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAA,EAA6D;AACvE,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,YAAA,GAA8C;AAClD,IAAA,OAAO,IAAA,CAAK,IAAI,eAAe,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,GAA+B,EAAC,EACT;AACvB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,QACpC;AAAA,OACD,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CACJ,IAAA,EACA,QACA,OAAA,EACA,OAAA,GAA+B,EAAC,EACD;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,QACpC;AAAA,OACD,aAAa,kBAAA,CAAmB,OAAO,CAAC,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,KACjE;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,cAAA,CACJ,OAAA,GAAiC,EAAC,EACT;AACzB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAQ,OAAA,GAAU,YAAA,GAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,kBAAA,CACJ,QAAA,EACA,OAAA,GAA4C,EAAC,EAChB;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,UAAU,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AACvE,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,WAAW,GAAG,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,OAAA,GAA+C,EAAC,EACvB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC1E,IAAA,IAAI,QAAQ,MAAA,KAAW,MAAA;AACrB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAmC;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAAA,MAC5B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAA,GAAiD;AACrD,IAAA,OAAO,KAAK,OAAA,CAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,MAAA,IAAU,SAAS,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAc,IAAO,IAAA,EAA0B;AAC7C,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,OAAA,CACZ,IAAA,EACA,IAAA,EACA,WAAW,UAAA,EACC;AACZ,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA;AACpE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,EAAC;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,OAAA,EAAS,KAAA,EAAO,OAAA,IACd,CAAA,yBAAA,EAA4B,SAAS,MAAM,CAAA,CAAA;AAAA,OAC/C;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAAA,EAAsC;AACxD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChE,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,WAAW,GAAG,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,EAAA,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"AnyshiftApi.esm.js","sources":["../../src/api/AnyshiftApi.ts"],"sourcesContent":["import {\n createApiRef,\n type DiscoveryApi,\n type FetchApi,\n} from '@backstage/frontend-plugin-api';\nimport type {\n BriefSectionName,\n BriefSectionResponse,\n AnyshiftCapabilities,\n CatalogSummary,\n CatalogSyncReport,\n CloudResourceBrief,\n DatadogSignals,\n EstateInsights,\n QueryResult,\n ServiceBrief,\n} from './types';\n\nexport interface AnyshiftApi {\n capabilities(): Promise<AnyshiftCapabilities>;\n brief(\n kind: string,\n target: string,\n options?: BriefRequestOptions,\n ): Promise<ServiceBrief>;\n briefSection(\n kind: string,\n target: string,\n section: BriefSectionName,\n options?: BriefRequestOptions,\n ): Promise<BriefSectionResponse>;\n insights(): Promise<EstateInsights>;\n datadogSignals(options?: { refresh?: boolean }): Promise<DatadogSignals>;\n cloudResourceBrief(\n resource: string,\n options?: CloudResourceBriefRequestOptions,\n ): Promise<CloudResourceBrief>;\n inventory(\n type: string,\n options?: { limit?: number; offset?: number },\n ): Promise<CatalogSummary>;\n query(sql: string): Promise<QueryResult>;\n reconcileCatalog(): Promise<CatalogSyncAccepted>;\n}\n\nexport interface BriefRequestOptions {\n namespace?: string;\n refresh?: boolean;\n configurationEndpoints?: string;\n configurationDependencies?: string;\n configurationTarget?: string;\n}\n\nexport interface CloudResourceBriefRequestOptions {\n since?: string;\n cursor?: string;\n diff?: boolean;\n refresh?: boolean;\n}\n\nexport interface CatalogSyncAccepted {\n accepted: true;\n acceptedAt: string;\n previous?: CatalogSyncReport;\n}\n\nexport const anyshiftApiRef = createApiRef<AnyshiftApi>({\n id: 'plugin.anyshift.service',\n});\n\nexport class AnyshiftClient implements AnyshiftApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async capabilities(): Promise<AnyshiftCapabilities> {\n return this.get('/capabilities');\n }\n\n async brief(\n kind: string,\n target: string,\n options: BriefRequestOptions = {},\n ): Promise<ServiceBrief> {\n return this.get(\n `/brief/${encodeURIComponent(kind)}/${encodeURIComponent(\n target,\n )}${briefQuery(options)}`,\n );\n }\n\n async briefSection(\n kind: string,\n target: string,\n section: BriefSectionName,\n options: BriefRequestOptions = {},\n ): Promise<BriefSectionResponse> {\n return this.get(\n `/brief/${encodeURIComponent(kind)}/${encodeURIComponent(\n target,\n )}/sections/${encodeURIComponent(section)}${briefQuery(options)}`,\n );\n }\n\n async insights(): Promise<EstateInsights> {\n return this.get('/insights');\n }\n\n async datadogSignals(\n options: { refresh?: boolean } = {},\n ): Promise<DatadogSignals> {\n return this.get(`/signals/datadog${options.refresh ? '?refresh=1' : ''}`);\n }\n\n async cloudResourceBrief(\n resource: string,\n options: CloudResourceBriefRequestOptions = {},\n ): Promise<CloudResourceBrief> {\n const params = new URLSearchParams({ resource });\n if (options.since) params.set('since', options.since);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.diff !== undefined) params.set('diff', String(options.diff));\n if (options.refresh) params.set('refresh', '1');\n return this.get(`/cloud/resources/brief?${params}`);\n }\n\n async inventory(\n type: string,\n options: { limit?: number; offset?: number } = {},\n ): Promise<CatalogSummary> {\n const params = new URLSearchParams({ type });\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.offset !== undefined)\n params.set('offset', String(options.offset));\n return this.get(`/inventory?${params}`);\n }\n\n async query(sql: string): Promise<QueryResult> {\n return this.request('/query', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ sql }),\n });\n }\n\n async reconcileCatalog(): Promise<CatalogSyncAccepted> {\n return this.request('/anyshift/reconcile', { method: 'POST' }, 'catalog');\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request(path, { method: 'GET' });\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n pluginId = 'anyshift',\n ): Promise<T> {\n const baseUrl = await this.discoveryApi.getBaseUrl(pluginId);\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`, init);\n const text = await response.text();\n let payload: any;\n try {\n payload = text ? JSON.parse(text) : {};\n } catch {\n payload = {};\n }\n if (!response.ok) {\n throw new Error(\n payload?.error?.message ||\n `Anyshift request failed (${response.status})`,\n );\n }\n return payload as T;\n }\n}\n\nfunction briefQuery(options: BriefRequestOptions): string {\n const params = new URLSearchParams();\n if (options.namespace) params.set('namespace', options.namespace);\n if (options.refresh) params.set('refresh', '1');\n if (options.configurationEndpoints)\n params.set('configurationEndpoints', options.configurationEndpoints);\n if (options.configurationDependencies)\n params.set('configurationDependencies', options.configurationDependencies);\n if (options.configurationTarget)\n params.set('configurationTarget', options.configurationTarget);\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n"],"names":[],"mappings":";;AAkEO,MAAM,iBAAiB,YAAA,CAA0B;AAAA,EACtD,EAAA,EAAI;AACN,CAAC;AAEM,MAAM,cAAA,CAAsC;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAA,EAA6D;AACvE,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,YAAA,GAA8C;AAClD,IAAA,OAAO,IAAA,CAAK,IAAI,eAAe,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,GAA+B,EAAC,EACT;AACvB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,QACpC;AAAA,OACD,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CACJ,IAAA,EACA,QACA,OAAA,EACA,OAAA,GAA+B,EAAC,EACD;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACV,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,QACpC;AAAA,OACD,aAAa,kBAAA,CAAmB,OAAO,CAAC,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,KACjE;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,cAAA,CACJ,OAAA,GAAiC,EAAC,EACT;AACzB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAQ,OAAA,GAAU,YAAA,GAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,kBAAA,CACJ,QAAA,EACA,OAAA,GAA4C,EAAC,EAChB;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,UAAU,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AACvE,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,WAAW,GAAG,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,OAAA,GAA+C,EAAC,EACvB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AAC3C,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC1E,IAAA,IAAI,QAAQ,MAAA,KAAW,MAAA;AACrB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,GAAA,EAAmC;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAAA,MAC5B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK;AAAA,KAC7B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAA,GAAiD;AACrD,IAAA,OAAO,KAAK,OAAA,CAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,MAAA,IAAU,SAAS,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAc,IAAO,IAAA,EAA0B;AAC7C,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,OAAA,CACZ,IAAA,EACA,IAAA,EACA,WAAW,UAAA,EACC;AACZ,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA;AACpE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,EAAC;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,OAAA,EAAS,KAAA,EAAO,OAAA,IACd,CAAA,yBAAA,EAA4B,SAAS,MAAM,CAAA,CAAA;AAAA,OAC/C;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAAA,EAAsC;AACxD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChE,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,WAAW,GAAG,CAAA;AAC9C,EAAA,IAAI,OAAA,CAAQ,sBAAA;AACV,IAAA,MAAA,CAAO,GAAA,CAAI,wBAAA,EAA0B,OAAA,CAAQ,sBAAsB,CAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,yBAAA;AACV,IAAA,MAAA,CAAO,GAAA,CAAI,2BAAA,EAA6B,OAAA,CAAQ,yBAAyB,CAAA;AAC3E,EAAA,IAAI,OAAA,CAAQ,mBAAA;AACV,IAAA,MAAA,CAAO,GAAA,CAAI,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,EAAA,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAA;AAC/B;;;;"}
@@ -142,9 +142,8 @@ const CloudResourceBriefView = ({
142
142
  children: /* @__PURE__ */ jsxs(Typography, { color: "textSecondary", children: [
143
143
  "Read-only Anyshift evidence \xB7 last refreshed",
144
144
  " ",
145
- new Date(brief.refreshedAt).toLocaleString(),
146
- " \xB7 window",
147
- " ",
145
+ formatCloudTimestamp(brief.refreshedAt),
146
+ " \xB7 window ",
148
147
  brief.since
149
148
  ] })
150
149
  }
@@ -237,7 +236,7 @@ const ChangesSection = ({
237
236
  section.data?.items?.length ? section.data.items.map((event) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 20 }, children: [
238
237
  /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", children: event.summary || humanize(event.type) }),
239
238
  /* @__PURE__ */ jsxs(Typography, { color: "textSecondary", children: [
240
- new Date(event.timestamp).toLocaleString(),
239
+ formatCloudTimestamp(event.timestamp),
241
240
  " \xB7 ",
242
241
  event.category,
243
242
  " \xB7",
@@ -345,6 +344,15 @@ const Definition = ({ label, value }) => /* @__PURE__ */ jsxs(Typography, { para
345
344
  function humanize(value) {
346
345
  return value.replaceAll("_", " ");
347
346
  }
347
+ function formatCloudTimestamp(value) {
348
+ const directTimestamp = Date.parse(value);
349
+ if (!Number.isNaN(directTimestamp)) {
350
+ return new Date(directTimestamp).toLocaleString();
351
+ }
352
+ const withoutBracketedZone = value.replace(/\[[^\]]+\]$/, "");
353
+ const normalizedTimestamp = Date.parse(withoutBracketedZone);
354
+ return Number.isNaN(normalizedTimestamp) ? value : new Date(normalizedTimestamp).toLocaleString();
355
+ }
348
356
 
349
- export { CloudResourceBriefView, CloudResourceContent, cloudResourceIdentity };
357
+ export { CloudResourceBriefView, CloudResourceContent, cloudResourceIdentity, formatCloudTimestamp };
350
358
  //# sourceMappingURL=CloudResourceContent.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CloudResourceContent.esm.js","sources":["../../../src/components/cloud/CloudResourceContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useState, type ReactNode } from 'react';\nimport {\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { InfoCard, Link, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_CLOUD_REGION_ANNOTATION,\n ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION,\n ANYSHIFT_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_RESOURCE_TYPE_ANNOTATION,\n type BriefSection,\n type CloudEventsEvidence,\n type CloudResourceBrief,\n type IacDriftEvidence,\n type IacEvidence,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { EntityRefLink, useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\n\nexport function cloudResourceIdentity(entity: Entity): string | undefined {\n const annotations = entity.metadata.annotations ?? {};\n return (\n annotations[ANYSHIFT_RESOURCE_ID_ANNOTATION] ||\n annotations[ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION]\n );\n}\n\nexport const CloudResourceContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const resourceId = cloudResourceIdentity(entity);\n const [brief, setBrief] = useState<CloudResourceBrief>();\n const [error, setError] = useState<string>();\n const [refreshing, setRefreshing] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n\n const load = useCallback(\n async (refresh = false) => {\n if (!resourceId) return;\n setRefreshing(refresh);\n setError(undefined);\n try {\n setBrief(\n await api.cloudResourceBrief(resourceId, {\n since: '24h',\n diff: true,\n refresh,\n }),\n );\n } catch (loadError) {\n setError(\n loadError instanceof Error\n ? loadError.message\n : 'Unable to load cloud evidence',\n );\n } finally {\n setRefreshing(false);\n }\n },\n [api, resourceId],\n );\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const loadMore = useCallback(async () => {\n const cursor = brief?.changes.data?.page.nextCursor;\n if (!resourceId || !cursor) return;\n setLoadingMore(true);\n try {\n const next = await api.cloudResourceBrief(resourceId, {\n since: brief.since,\n diff: true,\n cursor,\n });\n setBrief(current => {\n if (\n !current?.changes.data ||\n next.changes.state !== 'data' ||\n !next.changes.data\n ) {\n return current;\n }\n return {\n ...current,\n refreshedAt: next.refreshedAt,\n changes: {\n state: 'data',\n data: {\n ...next.changes.data,\n items: [\n ...current.changes.data.items,\n ...next.changes.data.items,\n ],\n },\n },\n };\n });\n } catch (loadError) {\n setError(\n loadError instanceof Error\n ? loadError.message\n : 'Unable to load more cloud changes',\n );\n } finally {\n setLoadingMore(false);\n }\n }, [api, brief, resourceId]);\n\n if (!resourceId) {\n return (\n <Alert severity=\"info\">\n This catalog entity has no stable Anyshift resource ID or cloud ARN.\n </Alert>\n );\n }\n if (error && !brief) {\n return (\n <Alert severity=\"error\">\n {error} <Button onClick={() => void load(true)}>Retry</Button>\n </Alert>\n );\n }\n if (!brief) return <Progress />;\n\n return (\n <CloudResourceBriefView\n entity={entity}\n brief={brief}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n loadingMore={loadingMore}\n onLoadMore={() => void loadMore()}\n error={error}\n />\n );\n};\n\nexport const CloudResourceBriefView = ({\n entity,\n brief,\n refreshing,\n onRefresh,\n loadingMore,\n onLoadMore,\n error,\n}: {\n entity: Entity;\n brief: CloudResourceBrief;\n refreshing?: boolean;\n onRefresh: () => void;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n error?: string;\n}) => {\n const annotations = entity.metadata.annotations ?? {};\n const relationships = (entity.relations ?? []).filter(relation =>\n ['dependencyOf', 'dependsOn'].includes(relation.type),\n );\n const consoleLink = entity.metadata.links?.find(link =>\n link.url.startsWith('https://console.aws.amazon.com/'),\n );\n\n return (\n <Grid container spacing={3}>\n {error && (\n <Grid item xs={12}>\n <Alert severity=\"error\">{error}</Alert>\n </Grid>\n )}\n <Grid item xs={12}>\n <InfoCard\n title=\"Cloud evidence\"\n action={\n <Button\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshing}\n startIcon={\n refreshing ? <CircularProgress size={14} /> : undefined\n }\n >\n Refresh\n </Button>\n }\n >\n <Typography color=\"textSecondary\">\n Read-only Anyshift evidence · last refreshed{' '}\n {new Date(brief.refreshedAt).toLocaleString()} · window{' '}\n {brief.since}\n </Typography>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <ChangesSection\n section={brief.changes}\n loadingMore={loadingMore}\n onLoadMore={onLoadMore}\n />\n </Grid>\n <Grid item xs={12} md={6}>\n <ProvenanceSection section={brief.provenance} />\n </Grid>\n <Grid item xs={12} md={6}>\n <DriftSection section={brief.drift} />\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Cloud identity\">\n <Definition\n label=\"Provider\"\n value={annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]}\n />\n <Definition\n label=\"Resource type\"\n value={\n annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] ||\n String(entity.spec?.type || '')\n }\n />\n <Definition\n label=\"Region\"\n value={annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || 'Global'}\n />\n <Definition\n label=\"Account\"\n value={annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION]}\n />\n {consoleLink && <Link to={consoleLink.url}>Open in AWS Console</Link>}\n </InfoCard>\n </Grid>\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Catalog context\">\n <Definition\n label=\"Owner\"\n value={\n typeof entity.spec?.owner === 'string'\n ? entity.spec.owner\n : undefined\n }\n />\n <Definition\n label=\"Namespace\"\n value={entity.metadata.namespace || 'default'}\n />\n <Typography variant=\"subtitle2\">Relationships</Typography>\n {relationships.length === 0 ? (\n <Typography color=\"textSecondary\">\n No component or resource relationships are available yet.\n </Typography>\n ) : (\n <ul>\n {relationships.map(relation => (\n <li key={`${relation.type}:${relation.targetRef}`}>\n <Chip\n size=\"small\"\n label={relation.type}\n style={{ marginRight: 8 }}\n />\n <EntityRefLink entityRef={relation.targetRef} />\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Stable resource identity\">\n <Typography\n component=\"code\"\n style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}\n >\n {brief.resourceId}\n </Typography>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};\n\nconst ChangesSection = ({\n section,\n loadingMore,\n onLoadMore,\n}: {\n section: BriefSection<CloudEventsEvidence>;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n}) => (\n <InfoCard title=\"Recent cloud changes\">\n <SectionState section={section}>\n {section.data?.warnings?.map(warning => (\n <Alert severity=\"warning\" key={warning} style={{ marginBottom: 8 }}>\n {humanize(warning)}\n </Alert>\n ))}\n {section.data?.items?.length ? (\n section.data.items.map(event => (\n <div key={event.id} style={{ marginBottom: 20 }}>\n <Typography variant=\"subtitle1\">\n {event.summary || humanize(event.type)}\n </Typography>\n <Typography color=\"textSecondary\">\n {new Date(event.timestamp).toLocaleString()} · {event.category} ·{' '}\n {event.evidence.source} · {event.evidence.status}\n {event.actor?.name || event.actor?.id\n ? ` · ${event.actor.name || event.actor.id}`\n : ''}\n </Typography>\n {event.change.fields.length > 0 && (\n <details>\n <summary>View sanitized field changes</summary>\n <ul>\n {event.change.fields.map(field => {\n const detail = event.change.details.find(\n candidate => candidate.field === field,\n );\n return (\n <li key={field}>\n <code>{field}</code>\n {detail\n ? `: ${detail.before ?? '∅'} → ${detail.after ?? '∅'}`\n : ''}\n </li>\n );\n })}\n </ul>\n </details>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No cloud changes were found in this window.\n </Typography>\n )}\n {section.data?.page.hasMore && onLoadMore && (\n <Button\n size=\"small\"\n onClick={onLoadMore}\n disabled={loadingMore}\n startIcon={loadingMore ? <CircularProgress size={14} /> : undefined}\n >\n Load more changes\n </Button>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst ProvenanceSection = ({\n section,\n}: {\n section: BriefSection<IacEvidence>;\n}) => (\n <InfoCard title=\"IaC provenance\">\n <SectionState section={section}>\n {section.data?.resources?.length ? (\n section.data.resources.map(resource => (\n <div key={resource.terraform.hashedID} style={{ marginBottom: 16 }}>\n <Typography variant=\"subtitle1\">\n {resource.terraform.address}\n </Typography>\n <Chip size=\"small\" label={humanize(resource.status)} />\n <Definition label=\"File\" value={resource.terraform.fileRef ?? ''} />\n <Definition\n label=\"State links\"\n value={String(resource.states.length)}\n />\n <Definition\n label=\"Cloud links\"\n value={String(resource.clouds.length)}\n />\n {resource.terraform.githubUrl && (\n <Link to={resource.terraform.githubUrl}>Open source</Link>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No Terraform provenance is linked to this resource.\n </Typography>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst DriftSection = ({\n section,\n}: {\n section: BriefSection<IacDriftEvidence>;\n}) => (\n <InfoCard title=\"IaC drift evidence\">\n <SectionState section={section}>\n {section.data?.items?.length ? (\n section.data.items.map(item => (\n <div key={item.terraform.hashedID} style={{ marginBottom: 16 }}>\n <Typography variant=\"subtitle1\">\n {item.terraform.address}\n </Typography>\n <Chip\n size=\"small\"\n color={item.status === 'drifted' ? 'secondary' : 'default'}\n label={humanize(item.status)}\n />\n <Typography color=\"textSecondary\">\n {item.status === 'unknown'\n ? `Unknown is not drift: ${humanize(item.reason)}.`\n : `${item.comparedFields} supported fields compared.`}\n </Typography>\n {item.differences.length > 0 && (\n <details>\n <summary>View sanitized differences</summary>\n <ul>\n {item.differences.map(difference => (\n <li key={difference.field}>\n <code>{difference.field}</code>:{' '}\n {difference.lastApplied ?? '∅'} →{' '}\n {difference.observed ?? '∅'}\n </li>\n ))}\n </ul>\n </details>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No comparable Terraform evidence is available.\n </Typography>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst SectionState = ({\n section,\n children,\n}: {\n section: BriefSection;\n children: ReactNode;\n}) => {\n if (section.state === 'error') {\n return <Alert severity=\"error\">{section.message}</Alert>;\n }\n if (section.state === 'unsupported') {\n return <Alert severity=\"info\">{section.message}</Alert>;\n }\n if (section.state === 'empty') {\n return <Typography color=\"textSecondary\">{section.message}</Typography>;\n }\n return <>{children}</>;\n};\n\nconst Definition = ({ label, value }: { label: string; value?: string }) => (\n <Typography paragraph>\n <strong>{label}:</strong> {value || 'Not available'}\n </Typography>\n);\n\nfunction humanize(value: string): string {\n return value.replaceAll('_', ' ');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CloudResourceContent.esm.js","sources":["../../../src/components/cloud/CloudResourceContent.tsx"],"sourcesContent":["import { useCallback, useEffect, useState, type ReactNode } from 'react';\nimport {\n Button,\n Chip,\n CircularProgress,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { InfoCard, Link, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport type { Entity } from '@backstage/catalog-model';\nimport {\n ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION,\n ANYSHIFT_CLOUD_PROVIDER_ANNOTATION,\n ANYSHIFT_CLOUD_REGION_ANNOTATION,\n ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION,\n ANYSHIFT_RESOURCE_ID_ANNOTATION,\n ANYSHIFT_RESOURCE_TYPE_ANNOTATION,\n type BriefSection,\n type CloudEventsEvidence,\n type CloudResourceBrief,\n type IacDriftEvidence,\n type IacEvidence,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { EntityRefLink, useEntity } from '@backstage/plugin-catalog-react';\nimport { anyshiftApiRef } from '../../api/AnyshiftApi';\n\nexport function cloudResourceIdentity(entity: Entity): string | undefined {\n const annotations = entity.metadata.annotations ?? {};\n return (\n annotations[ANYSHIFT_RESOURCE_ID_ANNOTATION] ||\n annotations[ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION]\n );\n}\n\nexport const CloudResourceContent = () => {\n const { entity } = useEntity();\n const api = useApi(anyshiftApiRef);\n const resourceId = cloudResourceIdentity(entity);\n const [brief, setBrief] = useState<CloudResourceBrief>();\n const [error, setError] = useState<string>();\n const [refreshing, setRefreshing] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n\n const load = useCallback(\n async (refresh = false) => {\n if (!resourceId) return;\n setRefreshing(refresh);\n setError(undefined);\n try {\n setBrief(\n await api.cloudResourceBrief(resourceId, {\n since: '24h',\n diff: true,\n refresh,\n }),\n );\n } catch (loadError) {\n setError(\n loadError instanceof Error\n ? loadError.message\n : 'Unable to load cloud evidence',\n );\n } finally {\n setRefreshing(false);\n }\n },\n [api, resourceId],\n );\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const loadMore = useCallback(async () => {\n const cursor = brief?.changes.data?.page.nextCursor;\n if (!resourceId || !cursor) return;\n setLoadingMore(true);\n try {\n const next = await api.cloudResourceBrief(resourceId, {\n since: brief.since,\n diff: true,\n cursor,\n });\n setBrief(current => {\n if (\n !current?.changes.data ||\n next.changes.state !== 'data' ||\n !next.changes.data\n ) {\n return current;\n }\n return {\n ...current,\n refreshedAt: next.refreshedAt,\n changes: {\n state: 'data',\n data: {\n ...next.changes.data,\n items: [\n ...current.changes.data.items,\n ...next.changes.data.items,\n ],\n },\n },\n };\n });\n } catch (loadError) {\n setError(\n loadError instanceof Error\n ? loadError.message\n : 'Unable to load more cloud changes',\n );\n } finally {\n setLoadingMore(false);\n }\n }, [api, brief, resourceId]);\n\n if (!resourceId) {\n return (\n <Alert severity=\"info\">\n This catalog entity has no stable Anyshift resource ID or cloud ARN.\n </Alert>\n );\n }\n if (error && !brief) {\n return (\n <Alert severity=\"error\">\n {error} <Button onClick={() => void load(true)}>Retry</Button>\n </Alert>\n );\n }\n if (!brief) return <Progress />;\n\n return (\n <CloudResourceBriefView\n entity={entity}\n brief={brief}\n refreshing={refreshing}\n onRefresh={() => void load(true)}\n loadingMore={loadingMore}\n onLoadMore={() => void loadMore()}\n error={error}\n />\n );\n};\n\nexport const CloudResourceBriefView = ({\n entity,\n brief,\n refreshing,\n onRefresh,\n loadingMore,\n onLoadMore,\n error,\n}: {\n entity: Entity;\n brief: CloudResourceBrief;\n refreshing?: boolean;\n onRefresh: () => void;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n error?: string;\n}) => {\n const annotations = entity.metadata.annotations ?? {};\n const relationships = (entity.relations ?? []).filter(relation =>\n ['dependencyOf', 'dependsOn'].includes(relation.type),\n );\n const consoleLink = entity.metadata.links?.find(link =>\n link.url.startsWith('https://console.aws.amazon.com/'),\n );\n\n return (\n <Grid container spacing={3}>\n {error && (\n <Grid item xs={12}>\n <Alert severity=\"error\">{error}</Alert>\n </Grid>\n )}\n <Grid item xs={12}>\n <InfoCard\n title=\"Cloud evidence\"\n action={\n <Button\n size=\"small\"\n onClick={onRefresh}\n disabled={refreshing}\n startIcon={\n refreshing ? <CircularProgress size={14} /> : undefined\n }\n >\n Refresh\n </Button>\n }\n >\n <Typography color=\"textSecondary\">\n Read-only Anyshift evidence · last refreshed{' '}\n {formatCloudTimestamp(brief.refreshedAt)} · window {brief.since}\n </Typography>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <ChangesSection\n section={brief.changes}\n loadingMore={loadingMore}\n onLoadMore={onLoadMore}\n />\n </Grid>\n <Grid item xs={12} md={6}>\n <ProvenanceSection section={brief.provenance} />\n </Grid>\n <Grid item xs={12} md={6}>\n <DriftSection section={brief.drift} />\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Cloud identity\">\n <Definition\n label=\"Provider\"\n value={annotations[ANYSHIFT_CLOUD_PROVIDER_ANNOTATION]}\n />\n <Definition\n label=\"Resource type\"\n value={\n annotations[ANYSHIFT_RESOURCE_TYPE_ANNOTATION] ||\n String(entity.spec?.type || '')\n }\n />\n <Definition\n label=\"Region\"\n value={annotations[ANYSHIFT_CLOUD_REGION_ANNOTATION] || 'Global'}\n />\n <Definition\n label=\"Account\"\n value={annotations[ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION]}\n />\n {consoleLink && <Link to={consoleLink.url}>Open in AWS Console</Link>}\n </InfoCard>\n </Grid>\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Catalog context\">\n <Definition\n label=\"Owner\"\n value={\n typeof entity.spec?.owner === 'string'\n ? entity.spec.owner\n : undefined\n }\n />\n <Definition\n label=\"Namespace\"\n value={entity.metadata.namespace || 'default'}\n />\n <Typography variant=\"subtitle2\">Relationships</Typography>\n {relationships.length === 0 ? (\n <Typography color=\"textSecondary\">\n No component or resource relationships are available yet.\n </Typography>\n ) : (\n <ul>\n {relationships.map(relation => (\n <li key={`${relation.type}:${relation.targetRef}`}>\n <Chip\n size=\"small\"\n label={relation.type}\n style={{ marginRight: 8 }}\n />\n <EntityRefLink entityRef={relation.targetRef} />\n </li>\n ))}\n </ul>\n )}\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Stable resource identity\">\n <Typography\n component=\"code\"\n style={{ overflowWrap: 'anywhere', whiteSpace: 'pre-wrap' }}\n >\n {brief.resourceId}\n </Typography>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};\n\nconst ChangesSection = ({\n section,\n loadingMore,\n onLoadMore,\n}: {\n section: BriefSection<CloudEventsEvidence>;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n}) => (\n <InfoCard title=\"Recent cloud changes\">\n <SectionState section={section}>\n {section.data?.warnings?.map(warning => (\n <Alert severity=\"warning\" key={warning} style={{ marginBottom: 8 }}>\n {humanize(warning)}\n </Alert>\n ))}\n {section.data?.items?.length ? (\n section.data.items.map(event => (\n <div key={event.id} style={{ marginBottom: 20 }}>\n <Typography variant=\"subtitle1\">\n {event.summary || humanize(event.type)}\n </Typography>\n <Typography color=\"textSecondary\">\n {formatCloudTimestamp(event.timestamp)} · {event.category} ·{' '}\n {event.evidence.source} · {event.evidence.status}\n {event.actor?.name || event.actor?.id\n ? ` · ${event.actor.name || event.actor.id}`\n : ''}\n </Typography>\n {event.change.fields.length > 0 && (\n <details>\n <summary>View sanitized field changes</summary>\n <ul>\n {event.change.fields.map(field => {\n const detail = event.change.details.find(\n candidate => candidate.field === field,\n );\n return (\n <li key={field}>\n <code>{field}</code>\n {detail\n ? `: ${detail.before ?? '∅'} → ${detail.after ?? '∅'}`\n : ''}\n </li>\n );\n })}\n </ul>\n </details>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No cloud changes were found in this window.\n </Typography>\n )}\n {section.data?.page.hasMore && onLoadMore && (\n <Button\n size=\"small\"\n onClick={onLoadMore}\n disabled={loadingMore}\n startIcon={loadingMore ? <CircularProgress size={14} /> : undefined}\n >\n Load more changes\n </Button>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst ProvenanceSection = ({\n section,\n}: {\n section: BriefSection<IacEvidence>;\n}) => (\n <InfoCard title=\"IaC provenance\">\n <SectionState section={section}>\n {section.data?.resources?.length ? (\n section.data.resources.map(resource => (\n <div key={resource.terraform.hashedID} style={{ marginBottom: 16 }}>\n <Typography variant=\"subtitle1\">\n {resource.terraform.address}\n </Typography>\n <Chip size=\"small\" label={humanize(resource.status)} />\n <Definition label=\"File\" value={resource.terraform.fileRef ?? ''} />\n <Definition\n label=\"State links\"\n value={String(resource.states.length)}\n />\n <Definition\n label=\"Cloud links\"\n value={String(resource.clouds.length)}\n />\n {resource.terraform.githubUrl && (\n <Link to={resource.terraform.githubUrl}>Open source</Link>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No Terraform provenance is linked to this resource.\n </Typography>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst DriftSection = ({\n section,\n}: {\n section: BriefSection<IacDriftEvidence>;\n}) => (\n <InfoCard title=\"IaC drift evidence\">\n <SectionState section={section}>\n {section.data?.items?.length ? (\n section.data.items.map(item => (\n <div key={item.terraform.hashedID} style={{ marginBottom: 16 }}>\n <Typography variant=\"subtitle1\">\n {item.terraform.address}\n </Typography>\n <Chip\n size=\"small\"\n color={item.status === 'drifted' ? 'secondary' : 'default'}\n label={humanize(item.status)}\n />\n <Typography color=\"textSecondary\">\n {item.status === 'unknown'\n ? `Unknown is not drift: ${humanize(item.reason)}.`\n : `${item.comparedFields} supported fields compared.`}\n </Typography>\n {item.differences.length > 0 && (\n <details>\n <summary>View sanitized differences</summary>\n <ul>\n {item.differences.map(difference => (\n <li key={difference.field}>\n <code>{difference.field}</code>:{' '}\n {difference.lastApplied ?? '∅'} →{' '}\n {difference.observed ?? '∅'}\n </li>\n ))}\n </ul>\n </details>\n )}\n </div>\n ))\n ) : (\n <Typography color=\"textSecondary\">\n No comparable Terraform evidence is available.\n </Typography>\n )}\n </SectionState>\n </InfoCard>\n);\n\nconst SectionState = ({\n section,\n children,\n}: {\n section: BriefSection;\n children: ReactNode;\n}) => {\n if (section.state === 'error') {\n return <Alert severity=\"error\">{section.message}</Alert>;\n }\n if (section.state === 'unsupported') {\n return <Alert severity=\"info\">{section.message}</Alert>;\n }\n if (section.state === 'empty') {\n return <Typography color=\"textSecondary\">{section.message}</Typography>;\n }\n return <>{children}</>;\n};\n\nconst Definition = ({ label, value }: { label: string; value?: string }) => (\n <Typography paragraph>\n <strong>{label}:</strong> {value || 'Not available'}\n </Typography>\n);\n\nfunction humanize(value: string): string {\n return value.replaceAll('_', ' ');\n}\n\nexport function formatCloudTimestamp(value: string): string {\n const directTimestamp = Date.parse(value);\n if (!Number.isNaN(directTimestamp)) {\n return new Date(directTimestamp).toLocaleString();\n }\n\n const withoutBracketedZone = value.replace(/\\[[^\\]]+\\]$/, '');\n const normalizedTimestamp = Date.parse(withoutBracketedZone);\n return Number.isNaN(normalizedTimestamp)\n ? value\n : new Date(normalizedTimestamp).toLocaleString();\n}\n"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useState, useRef, useCallback, useEffect } from 'react';
3
3
  import { Typography, Box, Chip, Button, CircularProgress, Grid } from '@material-ui/core';
4
4
  import { Progress } from '@backstage/core-components';
5
5
  import { useApi } from '@backstage/frontend-plugin-api';
6
- import { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
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
9
  import { OverviewSection, DatadogSignalSection, ArchitectureSection, DependencySection, BriefRail, TimelineSection } from './BriefSections.esm.js';
@@ -15,6 +15,9 @@ const AnyshiftEntityContent = () => {
15
15
  const target = entityTarget(entity);
16
16
  const kind = annotations[ANYSHIFT_KIND_ANNOTATION] || "workload";
17
17
  const namespace = entity.metadata.namespace;
18
+ const configurationEndpoints = annotations[ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION];
19
+ const configurationDependencies = annotations[ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION];
20
+ const configurationTarget = annotations[ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION];
18
21
  const [brief, setBrief] = useState();
19
22
  const [error, setError] = useState();
20
23
  const [refreshingAll, setRefreshingAll] = useState(false);
@@ -27,7 +30,13 @@ const AnyshiftEntityContent = () => {
27
30
  setError(void 0);
28
31
  if (refresh) setRefreshingAll(true);
29
32
  try {
30
- const next = await api.brief(kind, target, { namespace, refresh });
33
+ const next = await api.brief(kind, target, {
34
+ namespace,
35
+ refresh,
36
+ configurationEndpoints,
37
+ configurationDependencies,
38
+ configurationTarget
39
+ });
31
40
  if (active.current) setBrief(next);
32
41
  } catch (cause) {
33
42
  if (active.current)
@@ -36,7 +45,15 @@ const AnyshiftEntityContent = () => {
36
45
  if (active.current) setRefreshingAll(false);
37
46
  }
38
47
  },
39
- [api, kind, namespace, target]
48
+ [
49
+ api,
50
+ configurationDependencies,
51
+ configurationEndpoints,
52
+ configurationTarget,
53
+ kind,
54
+ namespace,
55
+ target
56
+ ]
40
57
  );
41
58
  const retrySection = useCallback(
42
59
  async (section) => {
@@ -44,7 +61,10 @@ const AnyshiftEntityContent = () => {
44
61
  try {
45
62
  const response = await api.briefSection(kind, target, section, {
46
63
  namespace,
47
- refresh: true
64
+ refresh: true,
65
+ configurationEndpoints,
66
+ configurationDependencies,
67
+ configurationTarget
48
68
  });
49
69
  if (active.current) {
50
70
  setBrief(
@@ -66,7 +86,15 @@ const AnyshiftEntityContent = () => {
66
86
  }
67
87
  }
68
88
  },
69
- [api, kind, namespace, target]
89
+ [
90
+ api,
91
+ configurationDependencies,
92
+ configurationEndpoints,
93
+ configurationTarget,
94
+ kind,
95
+ namespace,
96
+ target
97
+ ]
70
98
  );
71
99
  useEffect(() => {
72
100
  active.current = true;
@@ -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_KIND_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} 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 [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, { namespace, refresh });\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 [api, kind, namespace, target],\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 });\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 [api, kind, namespace, target],\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 <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":";;;;;;;;;;AA6BO,MAAM,wBAAwB,MAAM;AACzC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,wBAAwB,CAAA,IAAK,UAAA;AACtD,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,SAAA;AAClC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAuB;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAiB;AAC3C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA;AAAA,wBAC9B,GAAA;AAAI,GACV;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,OAAO,UAAU,KAAA,KAAU;AACzB,MAAA,QAAA,CAAS,MAAS,CAAA;AAClB,MAAA,IAAI,OAAA,mBAA0B,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,KAAA,CAAM,MAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AACjE,QAAA,IAAI,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,MAAA,CAAO,OAAA;AACT,UAAA,QAAA,CAAS,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACnE,CAAA,SAAE;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,MAAM;AAAA,GAC/B;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,OAAO,OAAA,KAA8B;AACnC,MAAA,aAAA,CAAc,aAAW,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,CAAA;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,QAAQ,OAAA,EAAS;AAAA,UAC7D,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,QAAA;AAAA,YAAS,aACP,OAAA,GACI;AAAA,cACE,GAAG,OAAA;AAAA,cACH,CAAC,OAAO,GAAG,QAAA,CAAS,KAAA;AAAA,cACpB,aAAa,QAAA,CAAS,WAAA;AAAA,cACtB,GAAI,SAAS,eAAA,GACT,EAAE,iBAAiB,QAAA,CAAS,eAAA,KAC5B;AAAC,aACP,GACA;AAAA,WACN;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,aAAA,CAAc,CAAA,OAAA,KAAW;AACvB,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAO,CAAA;AAC5B,YAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AACnB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,MAAM;AAAA,GAC/B;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,KAAA,IAAS,CAAC,KAAA,EAAO,2BAAQ,UAAA,EAAA,EAAW,KAAA,EAAM,SAAS,QAAA,EAAA,KAAA,EAAM,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,EAAO,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,UAAA;AAAA,MACA,SAAA,EAAW,MAAM,KAAK,IAAA,CAAK,IAAI,CAAA;AAAA,MAC/B,aAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ;AAEO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,0BAA0B,CAAA,EAAG,IAAA,EAAK;AAC/D,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,8BAA8B,CAAA,EAAG,IAAA,EAAK;AAC/D,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA;AACzD,EAAA,OAAO,UAAA,IAAc,OAAO,QAAA,CAAS,IAAA;AACvC;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAI;AAAA,EACrB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,qBAQE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAY,cAAA;AAAA,MACZ,OAAA,EAAQ,kBAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,cAAA,EAAe,eAAA,EAAgB,SAAS,EAAA,EAC1D,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,yBAAA,EAErD,CAAA;AAAA,4BACA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,UAAS,MAAA,EAAO,UAAA,EAAW,QAAA,EAAS,OAAA,EAAS,CAAA,EAC/D,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,OAAO,CAAA,cAAA,EAAc,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,CAAA;AAAA,kCACvD,UAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,KAAA,EAAM,WAAU,QAAA,EAAA,QAAA,EAE/C,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAM,SAAA;AAAA,kBACN,KAAA,EAAO,CAAA,sBAAA,EACL,KAAA,CAAM,eAAA,IAAmB,cAC3B,CAAA;AAAA;AAAA;AACF,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,eAAA,EAAgB,QAAA,EAAA;AAAA,cAAA,qBAAA;AAAA,cAC9B,MAAM,SAAA,IAAa,SAAA;AAAA,cAAU,iBAAA;AAAA,cAAa,GAAA;AAAA,cAC7D,eAAA,CAAgB,MAAM,WAAW;AAAA,aAAA,EACpC;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,UAAA;AAAA,cACR,IAAA,EAAK,OAAA;AAAA,cACL,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,aAAA;AAAA,cACV,WAAW,aAAA,mBAAgB,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,GAAK,MAAA;AAAA,cAE3D,0BAAgB,kBAAA,GAAgB;AAAA;AAAA;AACnC,SAAA,EACF,CAAA;AAAA,QACC,gCACC,IAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAQ,SAAQ,SAAA,EAAU,QAAA,EAAA;AAAA,UAAA,kBAAA;AAAA,UACzB,YAAA;AAAA,UAAa;AAAA,SAAA,EAChC;AAAA;AAAA;AAAA,GAEJ;AAAA,uBAEC,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,OAAA,EAAS,CAAA,EAAG,YAAW,SAAA,EACrC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,aAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,eAAe;AAAA;AAAA,KAC5C,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,YAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,cAAc;AAAA;AAAA,KAC3C,EACF,CAAA;AAAA,wBACC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,OAAA,EAAkB,YAAwB,CAAA,EACrE,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF;AAAA,GAAA,EACF;AAAA,CAAA,EACF;AAGF,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,MAAM,MAAM,CAAA,GAAI,QAAQ,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,cAAA,EAAe;AACxE;;;;"}
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} 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 <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":";;;;;;;;;;AAgCO,MAAM,wBAAwB,MAAM;AACzC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,wBAAwB,CAAA,IAAK,UAAA;AACtD,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,SAAA;AAClC,EAAA,MAAM,sBAAA,GACJ,YAAY,2CAA2C,CAAA;AACzD,EAAA,MAAM,yBAAA,GACJ,YAAY,8CAA8C,CAAA;AAC5D,EAAA,MAAM,mBAAA,GACJ,YAAY,uCAAuC,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAuB;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAiB;AAC3C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA;AAAA,wBAC9B,GAAA;AAAI,GACV;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,OAAO,UAAU,KAAA,KAAU;AACzB,MAAA,QAAA,CAAS,MAAS,CAAA;AAClB,MAAA,IAAI,OAAA,mBAA0B,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,KAAA,CAAM,MAAM,MAAA,EAAQ;AAAA,UACzC,SAAA;AAAA,UACA,OAAA;AAAA,UACA,sBAAA;AAAA,UACA,yBAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,MAAA,CAAO,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,MAAA,CAAO,OAAA;AACT,UAAA,QAAA,CAAS,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACnE,CAAA,SAAE;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA,yBAAA;AAAA,MACA,sBAAA;AAAA,MACA,mBAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,OAAO,OAAA,KAA8B;AACnC,MAAA,aAAA,CAAc,aAAW,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,CAAA;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,QAAQ,OAAA,EAAS;AAAA,UAC7D,SAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA,UACT,sBAAA;AAAA,UACA,yBAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,QAAA;AAAA,YAAS,aACP,OAAA,GACI;AAAA,cACE,GAAG,OAAA;AAAA,cACH,CAAC,OAAO,GAAG,QAAA,CAAS,KAAA;AAAA,cACpB,aAAa,QAAA,CAAS,WAAA;AAAA,cACtB,GAAI,SAAS,eAAA,GACT,EAAE,iBAAiB,QAAA,CAAS,eAAA,KAC5B;AAAC,aACP,GACA;AAAA,WACN;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,aAAA,CAAc,CAAA,OAAA,KAAW;AACvB,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAO,CAAA;AAC5B,YAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AACnB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,GAAA;AAAA,MACA,yBAAA;AAAA,MACA,sBAAA;AAAA,MACA,mBAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,KAAA,IAAS,CAAC,KAAA,EAAO,2BAAQ,UAAA,EAAA,EAAW,KAAA,EAAM,SAAS,QAAA,EAAA,KAAA,EAAM,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,EAAO,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,UAAA;AAAA,MACA,SAAA,EAAW,MAAM,KAAK,IAAA,CAAK,IAAI,CAAA;AAAA,MAC/B,aAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ;AAEO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,EAAC;AACpD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,0BAA0B,CAAA,EAAG,IAAA,EAAK;AAC/D,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,8BAA8B,CAAA,EAAG,IAAA,EAAK;AAC/D,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA;AACzD,EAAA,OAAO,UAAA,IAAc,OAAO,QAAA,CAAS,IAAA;AACvC;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAI;AAAA,EACrB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,qBAQE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAY,cAAA;AAAA,MACZ,OAAA,EAAQ,kBAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,cAAA,EAAe,eAAA,EAAgB,SAAS,EAAA,EAC1D,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,yBAAA,EAErD,CAAA;AAAA,4BACA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,UAAS,MAAA,EAAO,UAAA,EAAW,QAAA,EAAS,OAAA,EAAS,CAAA,EAC/D,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,OAAO,CAAA,cAAA,EAAc,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,CAAA;AAAA,kCACvD,UAAA,EAAA,EAAW,aAAA,EAAY,MAAA,EAAO,KAAA,EAAM,WAAU,QAAA,EAAA,QAAA,EAE/C,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAM,SAAA;AAAA,kBACN,KAAA,EAAO,CAAA,sBAAA,EACL,KAAA,CAAM,eAAA,IAAmB,cAC3B,CAAA;AAAA;AAAA;AACF,aAAA,EACF,CAAA;AAAA,4BACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,OAAM,eAAA,EAAgB,QAAA,EAAA;AAAA,cAAA,qBAAA;AAAA,cAC9B,MAAM,SAAA,IAAa,SAAA;AAAA,cAAU,iBAAA;AAAA,cAAa,GAAA;AAAA,cAC7D,eAAA,CAAgB,MAAM,WAAW;AAAA,aAAA,EACpC;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,UAAA;AAAA,cACR,IAAA,EAAK,OAAA;AAAA,cACL,OAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAU,aAAA;AAAA,cACV,WAAW,aAAA,mBAAgB,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,GAAK,MAAA;AAAA,cAE3D,0BAAgB,kBAAA,GAAgB;AAAA;AAAA;AACnC,SAAA,EACF,CAAA;AAAA,QACC,gCACC,IAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAQ,SAAQ,SAAA,EAAU,QAAA,EAAA;AAAA,UAAA,kBAAA;AAAA,UACzB,YAAA;AAAA,UAAa;AAAA,SAAA,EAChC;AAAA;AAAA;AAAA,GAEJ;AAAA,uBAEC,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,OAAA,EAAS,CAAA,EAAG,YAAW,SAAA,EACrC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,aAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,eAAe;AAAA;AAAA,KAC5C,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,YAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,cAAc;AAAA;AAAA,KAC3C,EACF,CAAA;AAAA,wBACC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,OAAA,EAAkB,YAAwB,CAAA,EACrE,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,QAAA;AAAA,QACf,OAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,UAAU;AAAA;AAAA,KACvC,EACF;AAAA,GAAA,EACF;AAAA,CAAA,EACF;AAGF,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,MAAM,MAAM,CAAA,GAAI,QAAQ,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,cAAA,EAAe;AACxE;;;;"}
@@ -47,6 +47,24 @@ const DependencyFootprintPresenter = ({ data }) => {
47
47
  const direct = isRecord(calls.target) ? calls.target : {};
48
48
  const callers = textArray(direct.callers);
49
49
  const callees = textArray(direct.callees);
50
+ const configuration = isRecord(root.configuration) ? root.configuration : {};
51
+ const configuredNodes = new Map(
52
+ recordsFrom(configuration.nodes).flatMap((node) => {
53
+ const id = readText(node, ["id"]);
54
+ const name = readText(node, ["name"]);
55
+ return id && name ? [[id, name]] : [];
56
+ })
57
+ );
58
+ const configuredEdges = recordsFrom(configuration.edges);
59
+ const configuredCallers = configuredEdges.flatMap((edge) => {
60
+ const from = readText(edge, ["from"]);
61
+ const to = readText(edge, ["to"]);
62
+ return from && to && !to.startsWith("configured:") ? [configuredNodes.get(from) ?? from] : [];
63
+ });
64
+ const configuredCallees = configuredEdges.flatMap((edge) => {
65
+ const to = readText(edge, ["to"]);
66
+ return to?.startsWith("configured:") ? [configuredNodes.get(to) ?? to.slice("configured:".length)] : [];
67
+ });
50
68
  const footprint = [
51
69
  metricLabel(tree.serviceCount, "service", "services"),
52
70
  metricLabel(tree.datastoreCount, "datastore", "datastores"),
@@ -74,6 +92,19 @@ const DependencyFootprintPresenter = ({ data }) => {
74
92
  ] })
75
93
  ] }),
76
94
  footprint.length > 0 && /* @__PURE__ */ jsx(Box, { display: "flex", flexWrap: "wrap", gridGap: 8, mt: 2, children: footprint.map((item) => /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: item }, item)) }),
95
+ (configuredCallers.length > 0 || configuredCallees.length > 0) && /* @__PURE__ */ jsxs(Box, { mt: 2, children: [
96
+ /* @__PURE__ */ jsx(Chip, { size: "small", color: "primary", label: "Configured evidence" }),
97
+ /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
98
+ /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, md: 6, children: [
99
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: "Configured callers" }),
100
+ /* @__PURE__ */ jsx(NamedResources, { names: configuredCallers })
101
+ ] }),
102
+ /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, md: 6, children: [
103
+ /* @__PURE__ */ jsx(Typography, { variant: "overline", color: "textSecondary", children: "Configured dependencies" }),
104
+ /* @__PURE__ */ jsx(NamedResources, { names: configuredCallees })
105
+ ] })
106
+ ] })
107
+ ] }),
77
108
  /* @__PURE__ */ jsx(EvidenceDisclosure, { data })
78
109
  ] });
79
110
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SectionPresenters.esm.js","sources":["../../../src/components/entity/SectionPresenters.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ButtonGroup,\n Chip,\n Divider,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { SafeguardResult } from '../../api/types';\nimport { ArchitectureDiagram } from './MermaidArchitecture';\nimport type { ArchitectureGraph } from './architectureDiagram';\nimport { EvidenceDisclosure } from './EvidenceDisclosure';\nimport {\n eventFrom,\n factsFrom,\n firstRecordFrom,\n isRecord,\n readText,\n recordsFrom,\n statusFrom,\n type Fact,\n type StatusSummary,\n} from './sectionData';\n\nconst SAFEGUARD_LABELS: Record<SafeguardResult['capability'], string> = {\n pdb: 'Pod disruption budget',\n scaling: 'Scaling',\n priority: 'Priority',\n storage: 'Storage',\n};\n\nconst OVERVIEW_SIGNALS = [\n ['callerCount', 'Direct callers'],\n ['calleeCount', 'Direct callees'],\n ['downstreamServiceCount', 'Downstream services'],\n ['datastoreCount', 'Datastores'],\n ['externalCount', 'External systems'],\n ['eventCount24h', 'Changes · 24h'],\n] as const;\n\nexport const OverviewPresenter = ({ data }: { data: unknown }) => {\n const value = isRecord(data) ? data : {};\n return (\n <>\n <Grid container spacing={2} aria-label=\"Service signals\">\n {OVERVIEW_SIGNALS.map(([key, label]) => (\n <Grid item xs={6} sm={4} md={2} key={key}>\n <Typography variant=\"h5\">\n {typeof value[key] === 'number' ? String(value[key]) : 'N/A'}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {label}\n </Typography>\n </Grid>\n ))}\n <Grid item xs={6} sm={4} md={2}>\n <Typography variant=\"subtitle1\">\n {readableStatus(value.sloStatus)}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Service level\n </Typography>\n </Grid>\n <Grid item xs={6} sm={4} md={2}>\n <Typography variant=\"subtitle1\">\n {typeof value.activeAlertCount === 'number'\n ? `${value.activeAlertCount} active`\n : 'N/A'}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Alerts\n </Typography>\n </Grid>\n </Grid>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const DependencyFootprintPresenter = ({ data }: { data: unknown }) => {\n const root = isRecord(data) ? data : {};\n const serviceTree = isRecord(root.serviceTree) ? root.serviceTree : {};\n const tree = isRecord(serviceTree.target) ? serviceTree.target : {};\n const calls = isRecord(root.calls) ? root.calls : {};\n const direct = isRecord(calls.target) ? calls.target : {};\n const callers = textArray(direct.callers);\n const callees = textArray(direct.callees);\n const footprint = [\n metricLabel(tree.serviceCount, 'service', 'services'),\n metricLabel(tree.datastoreCount, 'datastore', 'datastores'),\n metricLabel(tree.externalCount, 'external', 'externals'),\n ].filter((value): value is string => Boolean(value));\n\n return (\n <>\n {tree.hasCycle === true && (\n <Box mb={2}>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label=\"Dependency cycle detected\"\n />\n </Box>\n )}\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Called by\n </Typography>\n <NamedResources names={callers} />\n {callers.length === 0 && <Muted>Not resolved</Muted>}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Calls\n </Typography>\n <NamedResources names={callees} />\n {callees.length === 0 && <Muted>Not resolved</Muted>}\n </Grid>\n </Grid>\n {footprint.length > 0 && (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8} mt={2}>\n {footprint.map(item => (\n <Chip key={item} size=\"small\" variant=\"outlined\" label={item} />\n ))}\n </Box>\n )}\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const OperationalPosturePresenter = ({ data }: { data: unknown }) => {\n const root = isRecord(data) ? data : {};\n const slo = isRecord(root.slo) ? root.slo : {};\n const sloTarget = isRecord(slo.target) ? slo.target : {};\n const alerts = isRecord(root.alerts) ? root.alerts : {};\n const deployImpact = isRecord(root.deployImpact) ? root.deployImpact : {};\n const gitops = isRecord(root.gitops) ? root.gitops : {};\n const owner = isRecord(gitops.owner) ? gitops.owner : {};\n const alertCause = isRecord(root.alertCause) ? root.alertCause : {};\n const changes = Array.isArray(alertCause.changes)\n ? alertCause.changes.length\n : undefined;\n const findings = [\n {\n label: sloTarget.status\n ? `${readableStatus(sloTarget.status)} SLO`\n : 'SLO not resolved',\n detail: readText(sloTarget, ['name']),\n },\n {\n label:\n alerts.total === 0\n ? 'No active alerts'\n : typeof alerts.total === 'number'\n ? `${alerts.total} active alerts`\n : 'Alerts not resolved',\n },\n {\n label:\n typeof deployImpact.rollouts === 'number'\n ? `${deployImpact.rollouts} rollouts · ${\n typeof deployImpact.total === 'number'\n ? deployImpact.total\n : 'N/A'\n } correlated failures`\n : 'Deployment impact not resolved',\n },\n {\n label: owner.application ? String(owner.application) : 'No GitOps owner',\n },\n {\n label:\n changes === undefined\n ? 'Recent cause not resolved'\n : `${changes} recent correlated ${\n changes === 1 ? 'change' : 'changes'\n }`,\n },\n ];\n\n return (\n <>\n <Box component=\"ul\" m={0} p={0} aria-label=\"Operational findings\">\n {findings.map((finding, index) => (\n <Box component=\"li\" key={finding.label} style={{ listStyle: 'none' }}>\n {index > 0 && <Divider />}\n <Box py={1}>\n <Typography variant=\"subtitle2\">{finding.label}</Typography>\n {finding.detail && <Muted>{finding.detail}</Muted>}\n </Box>\n </Box>\n ))}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const ImpactPresenter = ({ data }: { data: unknown }) => {\n const affected = namedRecords(data);\n const total = numberFrom(data, ['total', 'count', 'affectedCount']);\n const status = statusFrom(data);\n\n return (\n <>\n {(total !== undefined || affected.length > 0) && (\n <Box mb={2}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Affected resources\n </Typography>\n <Typography variant=\"h5\">{total ?? affected.length}</Typography>\n </Box>\n )}\n {status && <StatusChip status={status} />}\n <GenericFacts data={data} omit={['total', 'count', 'affectedCount']} />\n <NamedResources names={affected} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const LatestChangePresenter = ({ data }: { data: unknown }) => {\n const record = firstRecordFrom(data);\n const event = eventFrom(record);\n if (!record) {\n return <PresenterFallback data={data} />;\n }\n\n return (\n <>\n <EventHeading event={event} />\n <FactGrid facts={event.facts} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const SafeguardsPresenter = ({ data }: { data: SafeguardResult[] }) => (\n <>\n <Box component=\"ul\" m={0} p={0} aria-label=\"Service safeguards\">\n {data.map((item, index) => (\n <Box component=\"li\" key={item.capability} style={{ listStyle: 'none' }}>\n {index > 0 && <Divider />}\n <Box width=\"100%\" py={1}>\n <Typography variant=\"subtitle2\">\n {SAFEGUARD_LABELS[item.capability]}\n </Typography>\n <SafeguardState item={item} />\n </Box>\n </Box>\n ))}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n);\n\nexport const TimelinePresenter = ({\n data,\n fallbackLabel = 'Change recorded',\n}: {\n data: unknown;\n fallbackLabel?: string;\n}) => {\n const records = recordsFrom(data).slice(0, 10);\n if (records.length === 0) return <PresenterFallback data={data} />;\n\n return (\n <>\n <Box component=\"ol\" m={0} pl={3}>\n {records.map((record, index) => {\n const event = eventFrom(record);\n return (\n <Box component=\"li\" key={eventKey(record, index)} pb={2}>\n <EventHeading event={event} fallbackLabel={fallbackLabel} />\n {event.summary && (\n <Typography variant=\"body2\">{event.summary}</Typography>\n )}\n </Box>\n );\n })}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const ArchitecturePresenter = ({ data }: { data: unknown }) => {\n const graph = architectureFrom(data);\n const [view, setView] = useState<'context' | 'runtime'>('context');\n if (graph.nodes.length === 0) {\n return <PresenterFallback data={data} />;\n }\n\n return (\n <>\n <Box display=\"flex\" justifyContent=\"flex-end\" mb={1}>\n <ButtonGroup size=\"small\" aria-label=\"Service map depth\">\n <Button\n type=\"button\"\n aria-pressed={view === 'context'}\n color={view === 'context' ? 'primary' : 'default'}\n onClick={() => setView('context')}\n >\n Service context\n </Button>\n <Button\n type=\"button\"\n aria-pressed={view === 'runtime'}\n color={view === 'runtime' ? 'primary' : 'default'}\n onClick={() => setView('runtime')}\n >\n Runtime detail\n </Button>\n </ButtonGroup>\n </Box>\n <ArchitectureDiagram graph={graph} view={view} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const GenericFacts = ({\n data,\n omit = [],\n}: {\n data: unknown;\n omit?: string[];\n}) => {\n const omitted = new Set(omit);\n const facts = factsFrom(data).filter(fact => !omitted.has(factKey(fact)));\n if (facts.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n No readable summary is available.\n </Typography>\n );\n }\n return <FactGrid facts={facts} />;\n};\n\nconst PresenterFallback = ({ data }: { data: unknown }) => (\n <>\n <GenericFacts data={data} />\n <EvidenceDisclosure data={data} />\n </>\n);\n\nconst SafeguardState = ({ item }: { item: SafeguardResult }) => {\n if (item.section.state === 'error') {\n return <Typography color=\"error\">{item.section.message}</Typography>;\n }\n if (item.section.state === 'empty' || item.section.state === 'unsupported') {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {item.section.message || 'No evidence returned.'}\n </Typography>\n );\n }\n\n const names = namedRecords(item.section.data);\n return (\n <Box mt={0.5}>\n {statusFrom(item.section.data) && (\n <StatusChip status={statusFrom(item.section.data)!} />\n )}\n <GenericFacts data={item.section.data} />\n <NamedResources names={names} />\n </Box>\n );\n};\n\nconst EventHeading = ({\n event,\n fallbackLabel = 'Change recorded',\n}: {\n event: ReturnType<typeof eventFrom>;\n fallbackLabel?: string;\n}) => (\n <Box>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Typography variant=\"subtitle2\">{event.type || fallbackLabel}</Typography>\n {event.status && <StatusChip status={event.status} />}\n </Box>\n {event.target && <Typography variant=\"body2\">{event.target}</Typography>}\n {event.timestamp && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatTimestamp(event.timestamp)}\n </Typography>\n )}\n </Box>\n);\n\nconst StatusChip = ({ status }: { status: StatusSummary }) => (\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={\n status.tone === 'success'\n ? 'primary'\n : status.tone === 'warning' || status.tone === 'error'\n ? 'secondary'\n : 'default'\n }\n label={status.label}\n />\n);\n\nconst FactGrid = ({ facts }: { facts: Fact[] }) => (\n <Grid component=\"dl\" container spacing={1} style={{ margin: 0 }}>\n {facts.map(fact => (\n <Grid\n item\n xs={fact.label === 'Summary' ? 12 : 6}\n sm={fact.label === 'Summary' ? 12 : 4}\n key={`${fact.label}-${fact.value}`}\n >\n <Typography component=\"dt\" variant=\"caption\" color=\"textSecondary\">\n {fact.label}\n </Typography>\n <Typography component=\"dd\" variant=\"body2\" style={{ margin: 0 }}>\n {fact.value}\n </Typography>\n </Grid>\n ))}\n </Grid>\n);\n\nconst NamedResources = ({ names }: { names: string[] }) =>\n names.length > 0 ? (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={6} mt={1}>\n {names.slice(0, 20).map(name => (\n <Chip key={name} size=\"small\" label={name} />\n ))}\n </Box>\n ) : null;\n\nfunction namedRecords(value: unknown): string[] {\n return [\n ...new Set(\n recordsFrom(value)\n .map(record => readText(record, ['name', 'target', 'resource', 'id']))\n .filter((name): name is string => Boolean(name)),\n ),\n ].slice(0, 20);\n}\n\nfunction numberFrom(value: unknown, keys: string[]): number | undefined {\n if (!isRecord(value)) return undefined;\n for (const key of keys) {\n if (typeof value[key] === 'number') return value[key];\n }\n return undefined;\n}\n\nfunction factKey(fact: Fact): string {\n return fact.label.replace(/\\s+/g, '').toLocaleLowerCase();\n}\n\nfunction eventKey(record: Record<string, unknown>, index: number): string {\n const identity =\n readText(record, ['id', 'ts', 'timestamp', 'time']) ?? 'event';\n return `${identity}-${index}`;\n}\n\nfunction formatTimestamp(value: string): string {\n const timestamp = Date.parse(value);\n return Number.isNaN(timestamp) ? value : new Date(timestamp).toLocaleString();\n}\n\nfunction architectureFrom(value: unknown): ArchitectureGraph {\n if (!isRecord(value)) return { nodes: [], edges: [] };\n const nodeValues = Array.isArray(value.nodes)\n ? value.nodes.filter(isRecord)\n : [];\n const nodes = nodeValues.map((node, index) => {\n const id = readText(node, ['id', 'name']) ?? `node-${index}`;\n const name = readText(node, ['name', 'id']) ?? id;\n return {\n id,\n name,\n type: readText(node, ['type']),\n namespace: readText(node, ['namespace']),\n image: readText(node, ['image']),\n };\n });\n\n const edgeValues = Array.isArray(value.edges)\n ? value.edges.filter(isRecord)\n : [];\n const edges = edgeValues.flatMap(edge => {\n const from = endpointId(edge.from ?? edge.source);\n const to = endpointId(edge.to ?? edge.target);\n if (!from || !to) return [];\n return [\n {\n from,\n to,\n type: readText(edge, ['type', 'label', 'relationship']) ?? 'RELATES_TO',\n },\n ];\n });\n\n return { nodes, edges };\n}\n\nfunction endpointId(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (!isRecord(value)) return undefined;\n return readText(value, ['id', 'name']);\n}\n\nconst Muted = ({ children }: { children: ReactNode }) => (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {children}\n </Typography>\n);\n\nfunction textArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction metricLabel(\n value: unknown,\n singular: string,\n plural: string,\n): string | undefined {\n return typeof value === 'number'\n ? `${value} ${value === 1 ? singular : plural}`\n : undefined;\n}\n\nfunction readableStatus(value: unknown): string {\n if (typeof value !== 'string' || !value) return 'Not resolved';\n return value.charAt(0).toUpperCase() + value.slice(1).replace(/_/g, ' ');\n}\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,gBAAA,GAAkE;AAAA,EACtE,GAAA,EAAK,uBAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,MAAM,gBAAA,GAAmB;AAAA,EACvB,CAAC,eAAe,gBAAgB,CAAA;AAAA,EAChC,CAAC,eAAe,gBAAgB,CAAA;AAAA,EAChC,CAAC,0BAA0B,qBAAqB,CAAA;AAAA,EAChD,CAAC,kBAAkB,YAAY,CAAA;AAAA,EAC/B,CAAC,iBAAiB,kBAAkB,CAAA;AAAA,EACpC,CAAC,iBAAiB,kBAAe;AACnC,CAAA;AAEO,MAAM,iBAAA,GAAoB,CAAC,EAAE,IAAA,EAAK,KAAyB;AAChE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,EAAC;AACvC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,SAAA,EAAS,IAAA,EAAC,OAAA,EAAS,CAAA,EAAG,cAAW,iBAAA,EACpC,QAAA,EAAA;AAAA,MAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBAChC,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAC3B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EACjB,QAAA,EAAA,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,IAAI,KAAA,EACzD,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,iBACjC,QAAA,EAAA,KAAA,EACH;AAAA,OAAA,EAAA,EANmC,GAOrC,CACD,CAAA;AAAA,sBACD,IAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAC3B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,WAAA,EACjB,QAAA,EAAA,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA,EACjC,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,iBAAgB,QAAA,EAAA,eAAA,EAEpD;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAC3B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EACjB,QAAA,EAAA,OAAO,KAAA,CAAM,gBAAA,KAAqB,QAAA,GAC/B,CAAA,EAAG,KAAA,CAAM,gBAAgB,CAAA,OAAA,CAAA,GACzB,KAAA,EACN,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,iBAAgB,QAAA,EAAA,QAAA,EAEpD;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,4BAAA,GAA+B,CAAC,EAAE,IAAA,EAAK,KAAyB;AAC3E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,EAAC;AACtC,EAAA,MAAM,cAAc,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,cAAc,EAAC;AACrE,EAAA,MAAM,OAAO,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA,GAAI,WAAA,CAAY,SAAS,EAAC;AAClE,EAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AACnD,EAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA,CAAM,SAAS,EAAC;AACxD,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,WAAA,CAAY,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,UAAU,CAAA;AAAA,IACpD,WAAA,CAAY,IAAA,CAAK,cAAA,EAAgB,WAAA,EAAa,YAAY,CAAA;AAAA,IAC1D,WAAA,CAAY,IAAA,CAAK,aAAA,EAAe,UAAA,EAAY,WAAW;AAAA,IACvD,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAA,CAAQ,KAAK,CAAC,CAAA;AAEnD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,QAAA,KAAa,IAAA,oBACjB,GAAA,CAAC,GAAA,EAAA,EAAI,IAAI,CAAA,EACP,QAAA,kBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,OAAA,EAAQ,UAAA;AAAA,QACR,KAAA,EAAM;AAAA;AAAA,KACR,EACF,CAAA;AAAA,oBAEF,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,WAAA,EAErD,CAAA;AAAA,wBACA,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,QAC/B,OAAA,CAAQ,MAAA,KAAW,CAAA,oBAAK,GAAA,CAAC,SAAM,QAAA,EAAA,cAAA,EAAY;AAAA,OAAA,EAC9C,CAAA;AAAA,2BACC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,OAAA,EAErD,CAAA;AAAA,wBACA,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,QAC/B,OAAA,CAAQ,MAAA,KAAW,CAAA,oBAAK,GAAA,CAAC,SAAM,QAAA,EAAA,cAAA,EAAY;AAAA,OAAA,EAC9C;AAAA,KAAA,EACF,CAAA;AAAA,IACC,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClB,GAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,QAAA,EAAS,MAAA,EAAO,OAAA,EAAS,CAAA,EAAG,EAAA,EAAI,CAAA,EACjD,oBAAU,GAAA,CAAI,CAAA,IAAA,qBACb,GAAA,CAAC,IAAA,EAAA,EAAgB,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAO,IAAA,EAAA,EAA7C,IAAmD,CAC/D,CAAA,EACH,CAAA;AAAA,oBAEF,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,2BAAA,GAA8B,CAAC,EAAE,IAAA,EAAK,KAAyB;AAC1E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,EAAC;AACtC,EAAA,MAAM,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,EAAC;AAC7C,EAAA,MAAM,YAAY,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,SAAS,EAAC;AACvD,EAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,SAAS,EAAC;AACtD,EAAA,MAAM,eAAe,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA,CAAK,eAAe,EAAC;AACxE,EAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,SAAS,EAAC;AACtD,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAC;AACvD,EAAA,MAAM,aAAa,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,aAAa,EAAC;AAClE,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,GAC5C,UAAA,CAAW,QAAQ,MAAA,GACnB,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW;AAAA,IACf;AAAA,MACE,KAAA,EAAO,UAAU,MAAA,GACb,CAAA,EAAG,eAAe,SAAA,CAAU,MAAM,CAAC,CAAA,IAAA,CAAA,GACnC,kBAAA;AAAA,MACJ,MAAA,EAAQ,QAAA,CAAS,SAAA,EAAW,CAAC,MAAM,CAAC;AAAA,KACtC;AAAA,IACA;AAAA,MACE,KAAA,EACE,MAAA,CAAO,KAAA,KAAU,CAAA,GACb,kBAAA,GACA,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GACxB,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,cAAA,CAAA,GACf;AAAA,KACR;AAAA,IACA;AAAA,MACE,OACE,OAAO,YAAA,CAAa,QAAA,KAAa,QAAA,GAC7B,GAAG,YAAA,CAAa,QAAQ,CAAA,eAAA,EACtB,OAAO,aAAa,KAAA,KAAU,QAAA,GAC1B,YAAA,CAAa,KAAA,GACb,KACN,CAAA,oBAAA,CAAA,GACA;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAO,KAAA,CAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,GAAI;AAAA,KACzD;AAAA,IACA;AAAA,MACE,KAAA,EACE,OAAA,KAAY,MAAA,GACR,2BAAA,GACA,CAAA,EAAG,OAAO,CAAA,mBAAA,EACR,OAAA,KAAY,CAAA,GAAI,QAAA,GAAW,SAC7B,CAAA;AAAA;AACR,GACF;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,IAAA,EAAK,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,YAAA,EAAW,sBAAA,EACxC,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,0BACrB,GAAA,EAAA,EAAI,SAAA,EAAU,MAAyB,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO,EAChE,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,CAAA,wBAAM,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACvB,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAa,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,QAC9C,OAAA,CAAQ,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAO,kBAAQ,MAAA,EAAO;AAAA,OAAA,EAC5C;AAAA,KAAA,EAAA,EALuB,OAAA,CAAQ,KAMjC,CACD,CAAA,EACH,CAAA;AAAA,oBACA,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,EAAK,KAAyB;AAC9D,EAAA,MAAM,QAAA,GAAW,aAAa,IAAI,CAAA;AAClC,EAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,EAAM,CAAC,OAAA,EAAS,OAAA,EAAS,eAAe,CAAC,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAE9B,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,KAAU,UAAa,QAAA,CAAS,MAAA,GAAS,sBACzC,IAAA,CAAC,GAAA,EAAA,EAAI,IAAI,CAAA,EACP,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,iBAAgB,QAAA,EAAA,oBAAA,EAErD,CAAA;AAAA,0BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAM,QAAA,EAAA,KAAA,IAAS,SAAS,MAAA,EAAO;AAAA,KAAA,EACrD,CAAA;AAAA,IAED,MAAA,oBAAU,GAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,CAAA;AAAA,oBACvC,GAAA,CAAC,gBAAa,IAAA,EAAY,IAAA,EAAM,CAAC,OAAA,EAAS,OAAA,EAAS,eAAe,CAAA,EAAG,CAAA;AAAA,oBACrE,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,oBACjC,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,qBAAA,GAAwB,CAAC,EAAE,IAAA,EAAK,KAAyB;AACpE,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBAAO,GAAA,CAAC,qBAAkB,IAAA,EAAY,CAAA;AAAA,EACxC;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,gBAAa,KAAA,EAAc,CAAA;AAAA,oBAC5B,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,oBAC9B,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,mBAAA,GAAsB,CAAC,EAAE,IAAA,uBACpC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,IAAA,EAAK,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,YAAA,EAAW,oBAAA,EACxC,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,0BACd,GAAA,EAAA,EAAI,SAAA,EAAU,MAA2B,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO,EAClE,QAAA,EAAA;AAAA,IAAA,KAAA,GAAQ,CAAA,wBAAM,OAAA,EAAA,EAAQ,CAAA;AAAA,oBACvB,IAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,IAAI,CAAA,EACpB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,WAAA,EACjB,QAAA,EAAA,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA,EACnC,CAAA;AAAA,sBACA,GAAA,CAAC,kBAAe,IAAA,EAAY;AAAA,KAAA,EAC9B;AAAA,GAAA,EAAA,EAPuB,IAAA,CAAK,UAQ9B,CACD,CAAA,EACH,CAAA;AAAA,kBACA,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,CAAA,EAClC;AAGK,MAAM,oBAAoB,CAAC;AAAA,EAChC,IAAA;AAAA,EACA,aAAA,GAAgB;AAClB,CAAA,KAGM;AACJ,EAAA,MAAM,UAAU,WAAA,CAAY,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC7C,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,uBAAO,GAAA,CAAC,qBAAkB,IAAA,EAAY,CAAA;AAEhE,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,IAAA,EAAK,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAC3B,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,MAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,IAAA,EAAmC,IAAI,CAAA,EACpD,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,OAAc,aAAA,EAA8B,CAAA;AAAA,QACzD,MAAM,OAAA,oBACL,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAS,gBAAM,OAAA,EAAQ;AAAA,OAAA,EAAA,EAHtB,QAAA,CAAS,MAAA,EAAQ,KAAK,CAK/C,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBACA,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,qBAAA,GAAwB,CAAC,EAAE,IAAA,EAAK,KAAyB;AACpE,EAAA,MAAM,KAAA,GAAQ,iBAAiB,IAAI,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAgC,SAAS,CAAA;AACjE,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,uBAAO,GAAA,CAAC,qBAAkB,IAAA,EAAY,CAAA;AAAA,EACxC;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,cAAA,EAAe,UAAA,EAAW,EAAA,EAAI,CAAA,EAChD,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,OAAA,EAAQ,YAAA,EAAW,mBAAA,EACnC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,gBAAc,IAAA,KAAS,SAAA;AAAA,UACvB,KAAA,EAAO,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,UACxC,OAAA,EAAS,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,UACjC,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,gBAAc,IAAA,KAAS,SAAA;AAAA,UACvB,KAAA,EAAO,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,UACxC,OAAA,EAAS,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,UACjC,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAc,IAAA,EAAY,CAAA;AAAA,oBAC/C,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,GAAA,EAClC,CAAA;AAEJ;AAEO,MAAM,eAAe,CAAC;AAAA,EAC3B,IAAA;AAAA,EACA,OAAO;AACT,CAAA,KAGM;AACJ,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAC,CAAA;AACxE,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,2BACG,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,mCAAA,EAElD,CAAA;AAAA,EAEJ;AACA,EAAA,uBAAO,GAAA,CAAC,YAAS,KAAA,EAAc,CAAA;AACjC;AAEA,MAAM,iBAAA,GAAoB,CAAC,EAAE,IAAA,uBAC3B,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,gBAAa,IAAA,EAAY,CAAA;AAAA,kBAC1B,GAAA,CAAC,sBAAmB,IAAA,EAAY;AAAA,CAAA,EAClC,CAAA;AAGF,MAAM,cAAA,GAAiB,CAAC,EAAE,IAAA,EAAK,KAAiC;AAC9D,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,OAAA,EAAS;AAClC,IAAA,2BAAQ,UAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAS,QAAA,EAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,KAAK,OAAA,CAAQ,KAAA,KAAU,WAAW,IAAA,CAAK,OAAA,CAAQ,UAAU,aAAA,EAAe;AAC1E,IAAA,uBACE,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,eAAA,EAC/B,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,uBAAA,EAC3B,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,GAAA,EACN,QAAA,EAAA;AAAA,IAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,oBAC3B,GAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAI,CAAA;AAAA,oBAEtD,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAA,EAAM,CAAA;AAAA,oBACvC,GAAA,CAAC,kBAAe,KAAA,EAAc;AAAA,GAAA,EAChC,CAAA;AAEJ,CAAA;AAEA,MAAM,eAAe,CAAC;AAAA,EACpB,KAAA;AAAA,EACA,aAAA,GAAgB;AAClB,CAAA,0BAIG,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,QAAA,EAAS,QAAO,UAAA,EAAW,QAAA,EAAS,SAAS,CAAA,EAC/D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAa,QAAA,EAAA,KAAA,CAAM,QAAQ,aAAA,EAAc,CAAA;AAAA,IAC5D,MAAM,MAAA,oBAAU,GAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,MAAM,MAAA,EAAQ;AAAA,GAAA,EACrD,CAAA;AAAA,EACC,MAAM,MAAA,oBAAU,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAS,gBAAM,MAAA,EAAO,CAAA;AAAA,EAC1D,KAAA,CAAM,SAAA,oBACL,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,eAAA,EACjC,QAAA,EAAA,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA,EAClC;AAAA,CAAA,EAEJ,CAAA;AAGF,MAAM,UAAA,GAAa,CAAC,EAAE,MAAA,EAAO,qBAC3B,GAAA;AAAA,EAAC,IAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,OAAA;AAAA,IACL,OAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EACE,MAAA,CAAO,IAAA,KAAS,SAAA,GACZ,SAAA,GACA,MAAA,CAAO,IAAA,KAAS,SAAA,IAAa,MAAA,CAAO,IAAA,KAAS,OAAA,GAC7C,WAAA,GACA,SAAA;AAAA,IAEN,OAAO,MAAA,CAAO;AAAA;AAChB,CAAA;AAGF,MAAM,QAAA,GAAW,CAAC,EAAE,KAAA,uBAClB,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,IAAA,EAAK,SAAA,EAAS,MAAC,OAAA,EAAS,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,GAAE,EAC3D,QAAA,EAAA,KAAA,CAAM,IAAI,CAAA,IAAA,qBACT,IAAA;AAAA,EAAC,IAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAI,IAAA;AAAA,IACJ,EAAA,EAAI,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,EAAA,GAAK,CAAA;AAAA,IACpC,EAAA,EAAI,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,EAAA,GAAK,CAAA;AAAA,IAGpC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,WAAU,IAAA,EAAK,OAAA,EAAQ,WAAU,KAAA,EAAM,eAAA,EAChD,eAAK,KAAA,EACR,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAE,EAC3D,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA;AAAA,GAAA;AAAA,EAPK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA;AAQlC,CACD,CAAA,EACH,CAAA;AAGF,MAAM,cAAA,GAAiB,CAAC,EAAE,KAAA,OACxB,KAAA,CAAM,MAAA,GAAS,CAAA,mBACb,GAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,QAAA,EAAS,MAAA,EAAO,SAAS,CAAA,EAAG,EAAA,EAAI,CAAA,EACjD,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAI,CAAA,IAAA,qBACtB,GAAA,CAAC,IAAA,EAAA,EAAgB,IAAA,EAAK,SAAQ,KAAA,EAAO,IAAA,EAAA,EAA1B,IAAgC,CAC5C,GACH,CAAA,GACE,IAAA;AAEN,SAAS,aAAa,KAAA,EAA0B;AAC9C,EAAA,OAAO;AAAA,IACL,GAAG,IAAI,GAAA;AAAA,MACL,WAAA,CAAY,KAAK,CAAA,CACd,GAAA,CAAI,YAAU,QAAA,CAAS,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAA,EAAU,YAAY,IAAI,CAAC,CAAC,CAAA,CACpE,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAA,CAAQ,IAAI,CAAC;AAAA;AACnD,GACF,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACf;AAEA,SAAS,UAAA,CAAW,OAAgB,IAAA,EAAoC;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,KAAA,CAAM,GAAG,MAAM,QAAA,EAAU,OAAO,MAAM,GAAG,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAoB;AACnC,EAAA,OAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,EAAE,iBAAA,EAAkB;AAC1D;AAEA,SAAS,QAAA,CAAS,QAAiC,KAAA,EAAuB;AACxE,EAAA,MAAM,QAAA,GACJ,SAAS,MAAA,EAAQ,CAAC,MAAM,IAAA,EAAM,WAAA,EAAa,MAAM,CAAC,CAAA,IAAK,OAAA;AACzD,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC7B;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAClC,EAAA,OAAO,MAAA,CAAO,MAAM,SAAS,CAAA,GAAI,QAAQ,IAAI,IAAA,CAAK,SAAS,CAAA,CAAE,cAAA,EAAe;AAC9E;AAEA,SAAS,iBAAiB,KAAA,EAAmC;AAC3D,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AACpD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GACxC,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,GAC3B,EAAC;AACL,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC5C,IAAA,MAAM,EAAA,GAAK,SAAS,IAAA,EAAM,CAAC,MAAM,MAAM,CAAC,CAAA,IAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA,EAAM,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA,IAAK,EAAA;AAC/C,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,CAAC,MAAM,CAAC,CAAA;AAAA,MAC7B,SAAA,EAAW,QAAA,CAAS,IAAA,EAAM,CAAC,WAAW,CAAC,CAAA;AAAA,MACvC,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,CAAC,OAAO,CAAC;AAAA,KACjC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GACxC,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,GAC3B,EAAC;AACL,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACvC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,IAAA,IAAQ,KAAK,MAAM,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,EAAA,IAAM,KAAK,MAAM,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,SAAW,EAAC;AAC1B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAA,EAAM,SAAS,IAAA,EAAM,CAAC,QAAQ,OAAA,EAAS,cAAc,CAAC,CAAA,IAAK;AAAA;AAC7D,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;AAEA,SAAS,WAAW,KAAA,EAAoC;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,OAAO,QAAA,CAAS,KAAA,EAAO,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AACvC;AAEA,MAAM,KAAA,GAAQ,CAAC,EAAE,QAAA,EAAS,qBACxB,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAC/B,QAAA,EACH,CAAA;AAGF,SAAS,UAAU,KAAA,EAA0B;AAC3C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,CAAA,GAC/D,EAAC;AACP;AAEA,SAAS,WAAA,CACP,KAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GACpB,CAAA,EAAG,KAAK,IAAI,KAAA,KAAU,CAAA,GAAI,QAAA,GAAW,MAAM,CAAA,CAAA,GAC3C,MAAA;AACN;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,OAAO,OAAO,cAAA;AAChD,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACzE;;;;"}
1
+ {"version":3,"file":"SectionPresenters.esm.js","sources":["../../../src/components/entity/SectionPresenters.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ButtonGroup,\n Chip,\n Divider,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { SafeguardResult } from '../../api/types';\nimport { ArchitectureDiagram } from './MermaidArchitecture';\nimport type { ArchitectureGraph } from './architectureDiagram';\nimport { EvidenceDisclosure } from './EvidenceDisclosure';\nimport {\n eventFrom,\n factsFrom,\n firstRecordFrom,\n isRecord,\n readText,\n recordsFrom,\n statusFrom,\n type Fact,\n type StatusSummary,\n} from './sectionData';\n\nconst SAFEGUARD_LABELS: Record<SafeguardResult['capability'], string> = {\n pdb: 'Pod disruption budget',\n scaling: 'Scaling',\n priority: 'Priority',\n storage: 'Storage',\n};\n\nconst OVERVIEW_SIGNALS = [\n ['callerCount', 'Direct callers'],\n ['calleeCount', 'Direct callees'],\n ['downstreamServiceCount', 'Downstream services'],\n ['datastoreCount', 'Datastores'],\n ['externalCount', 'External systems'],\n ['eventCount24h', 'Changes · 24h'],\n] as const;\n\nexport const OverviewPresenter = ({ data }: { data: unknown }) => {\n const value = isRecord(data) ? data : {};\n return (\n <>\n <Grid container spacing={2} aria-label=\"Service signals\">\n {OVERVIEW_SIGNALS.map(([key, label]) => (\n <Grid item xs={6} sm={4} md={2} key={key}>\n <Typography variant=\"h5\">\n {typeof value[key] === 'number' ? String(value[key]) : 'N/A'}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {label}\n </Typography>\n </Grid>\n ))}\n <Grid item xs={6} sm={4} md={2}>\n <Typography variant=\"subtitle1\">\n {readableStatus(value.sloStatus)}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Service level\n </Typography>\n </Grid>\n <Grid item xs={6} sm={4} md={2}>\n <Typography variant=\"subtitle1\">\n {typeof value.activeAlertCount === 'number'\n ? `${value.activeAlertCount} active`\n : 'N/A'}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Alerts\n </Typography>\n </Grid>\n </Grid>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const DependencyFootprintPresenter = ({ data }: { data: unknown }) => {\n const root = isRecord(data) ? data : {};\n const serviceTree = isRecord(root.serviceTree) ? root.serviceTree : {};\n const tree = isRecord(serviceTree.target) ? serviceTree.target : {};\n const calls = isRecord(root.calls) ? root.calls : {};\n const direct = isRecord(calls.target) ? calls.target : {};\n const callers = textArray(direct.callers);\n const callees = textArray(direct.callees);\n const configuration = isRecord(root.configuration) ? root.configuration : {};\n const configuredNodes = new Map(\n recordsFrom(configuration.nodes).flatMap(node => {\n const id = readText(node, ['id']);\n const name = readText(node, ['name']);\n return id && name ? [[id, name] as const] : [];\n }),\n );\n const configuredEdges = recordsFrom(configuration.edges);\n const configuredCallers = configuredEdges.flatMap(edge => {\n const from = readText(edge, ['from']);\n const to = readText(edge, ['to']);\n return from && to && !to.startsWith('configured:')\n ? [configuredNodes.get(from) ?? from]\n : [];\n });\n const configuredCallees = configuredEdges.flatMap(edge => {\n const to = readText(edge, ['to']);\n return to?.startsWith('configured:')\n ? [configuredNodes.get(to) ?? to.slice('configured:'.length)]\n : [];\n });\n const footprint = [\n metricLabel(tree.serviceCount, 'service', 'services'),\n metricLabel(tree.datastoreCount, 'datastore', 'datastores'),\n metricLabel(tree.externalCount, 'external', 'externals'),\n ].filter((value): value is string => Boolean(value));\n\n return (\n <>\n {tree.hasCycle === true && (\n <Box mb={2}>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label=\"Dependency cycle detected\"\n />\n </Box>\n )}\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Called by\n </Typography>\n <NamedResources names={callers} />\n {callers.length === 0 && <Muted>Not resolved</Muted>}\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Calls\n </Typography>\n <NamedResources names={callees} />\n {callees.length === 0 && <Muted>Not resolved</Muted>}\n </Grid>\n </Grid>\n {footprint.length > 0 && (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={8} mt={2}>\n {footprint.map(item => (\n <Chip key={item} size=\"small\" variant=\"outlined\" label={item} />\n ))}\n </Box>\n )}\n {(configuredCallers.length > 0 || configuredCallees.length > 0) && (\n <Box mt={2}>\n <Chip size=\"small\" color=\"primary\" label=\"Configured evidence\" />\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Configured callers\n </Typography>\n <NamedResources names={configuredCallers} />\n </Grid>\n <Grid item xs={12} md={6}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Configured dependencies\n </Typography>\n <NamedResources names={configuredCallees} />\n </Grid>\n </Grid>\n </Box>\n )}\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const OperationalPosturePresenter = ({ data }: { data: unknown }) => {\n const root = isRecord(data) ? data : {};\n const slo = isRecord(root.slo) ? root.slo : {};\n const sloTarget = isRecord(slo.target) ? slo.target : {};\n const alerts = isRecord(root.alerts) ? root.alerts : {};\n const deployImpact = isRecord(root.deployImpact) ? root.deployImpact : {};\n const gitops = isRecord(root.gitops) ? root.gitops : {};\n const owner = isRecord(gitops.owner) ? gitops.owner : {};\n const alertCause = isRecord(root.alertCause) ? root.alertCause : {};\n const changes = Array.isArray(alertCause.changes)\n ? alertCause.changes.length\n : undefined;\n const findings = [\n {\n label: sloTarget.status\n ? `${readableStatus(sloTarget.status)} SLO`\n : 'SLO not resolved',\n detail: readText(sloTarget, ['name']),\n },\n {\n label:\n alerts.total === 0\n ? 'No active alerts'\n : typeof alerts.total === 'number'\n ? `${alerts.total} active alerts`\n : 'Alerts not resolved',\n },\n {\n label:\n typeof deployImpact.rollouts === 'number'\n ? `${deployImpact.rollouts} rollouts · ${\n typeof deployImpact.total === 'number'\n ? deployImpact.total\n : 'N/A'\n } correlated failures`\n : 'Deployment impact not resolved',\n },\n {\n label: owner.application ? String(owner.application) : 'No GitOps owner',\n },\n {\n label:\n changes === undefined\n ? 'Recent cause not resolved'\n : `${changes} recent correlated ${\n changes === 1 ? 'change' : 'changes'\n }`,\n },\n ];\n\n return (\n <>\n <Box component=\"ul\" m={0} p={0} aria-label=\"Operational findings\">\n {findings.map((finding, index) => (\n <Box component=\"li\" key={finding.label} style={{ listStyle: 'none' }}>\n {index > 0 && <Divider />}\n <Box py={1}>\n <Typography variant=\"subtitle2\">{finding.label}</Typography>\n {finding.detail && <Muted>{finding.detail}</Muted>}\n </Box>\n </Box>\n ))}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const ImpactPresenter = ({ data }: { data: unknown }) => {\n const affected = namedRecords(data);\n const total = numberFrom(data, ['total', 'count', 'affectedCount']);\n const status = statusFrom(data);\n\n return (\n <>\n {(total !== undefined || affected.length > 0) && (\n <Box mb={2}>\n <Typography variant=\"overline\" color=\"textSecondary\">\n Affected resources\n </Typography>\n <Typography variant=\"h5\">{total ?? affected.length}</Typography>\n </Box>\n )}\n {status && <StatusChip status={status} />}\n <GenericFacts data={data} omit={['total', 'count', 'affectedCount']} />\n <NamedResources names={affected} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const LatestChangePresenter = ({ data }: { data: unknown }) => {\n const record = firstRecordFrom(data);\n const event = eventFrom(record);\n if (!record) {\n return <PresenterFallback data={data} />;\n }\n\n return (\n <>\n <EventHeading event={event} />\n <FactGrid facts={event.facts} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const SafeguardsPresenter = ({ data }: { data: SafeguardResult[] }) => (\n <>\n <Box component=\"ul\" m={0} p={0} aria-label=\"Service safeguards\">\n {data.map((item, index) => (\n <Box component=\"li\" key={item.capability} style={{ listStyle: 'none' }}>\n {index > 0 && <Divider />}\n <Box width=\"100%\" py={1}>\n <Typography variant=\"subtitle2\">\n {SAFEGUARD_LABELS[item.capability]}\n </Typography>\n <SafeguardState item={item} />\n </Box>\n </Box>\n ))}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n);\n\nexport const TimelinePresenter = ({\n data,\n fallbackLabel = 'Change recorded',\n}: {\n data: unknown;\n fallbackLabel?: string;\n}) => {\n const records = recordsFrom(data).slice(0, 10);\n if (records.length === 0) return <PresenterFallback data={data} />;\n\n return (\n <>\n <Box component=\"ol\" m={0} pl={3}>\n {records.map((record, index) => {\n const event = eventFrom(record);\n return (\n <Box component=\"li\" key={eventKey(record, index)} pb={2}>\n <EventHeading event={event} fallbackLabel={fallbackLabel} />\n {event.summary && (\n <Typography variant=\"body2\">{event.summary}</Typography>\n )}\n </Box>\n );\n })}\n </Box>\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const ArchitecturePresenter = ({ data }: { data: unknown }) => {\n const graph = architectureFrom(data);\n const [view, setView] = useState<'context' | 'runtime'>('context');\n if (graph.nodes.length === 0) {\n return <PresenterFallback data={data} />;\n }\n\n return (\n <>\n <Box display=\"flex\" justifyContent=\"flex-end\" mb={1}>\n <ButtonGroup size=\"small\" aria-label=\"Service map depth\">\n <Button\n type=\"button\"\n aria-pressed={view === 'context'}\n color={view === 'context' ? 'primary' : 'default'}\n onClick={() => setView('context')}\n >\n Service context\n </Button>\n <Button\n type=\"button\"\n aria-pressed={view === 'runtime'}\n color={view === 'runtime' ? 'primary' : 'default'}\n onClick={() => setView('runtime')}\n >\n Runtime detail\n </Button>\n </ButtonGroup>\n </Box>\n <ArchitectureDiagram graph={graph} view={view} />\n <EvidenceDisclosure data={data} />\n </>\n );\n};\n\nexport const GenericFacts = ({\n data,\n omit = [],\n}: {\n data: unknown;\n omit?: string[];\n}) => {\n const omitted = new Set(omit);\n const facts = factsFrom(data).filter(fact => !omitted.has(factKey(fact)));\n if (facts.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n No readable summary is available.\n </Typography>\n );\n }\n return <FactGrid facts={facts} />;\n};\n\nconst PresenterFallback = ({ data }: { data: unknown }) => (\n <>\n <GenericFacts data={data} />\n <EvidenceDisclosure data={data} />\n </>\n);\n\nconst SafeguardState = ({ item }: { item: SafeguardResult }) => {\n if (item.section.state === 'error') {\n return <Typography color=\"error\">{item.section.message}</Typography>;\n }\n if (item.section.state === 'empty' || item.section.state === 'unsupported') {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {item.section.message || 'No evidence returned.'}\n </Typography>\n );\n }\n\n const names = namedRecords(item.section.data);\n return (\n <Box mt={0.5}>\n {statusFrom(item.section.data) && (\n <StatusChip status={statusFrom(item.section.data)!} />\n )}\n <GenericFacts data={item.section.data} />\n <NamedResources names={names} />\n </Box>\n );\n};\n\nconst EventHeading = ({\n event,\n fallbackLabel = 'Change recorded',\n}: {\n event: ReturnType<typeof eventFrom>;\n fallbackLabel?: string;\n}) => (\n <Box>\n <Box display=\"flex\" flexWrap=\"wrap\" alignItems=\"center\" gridGap={8}>\n <Typography variant=\"subtitle2\">{event.type || fallbackLabel}</Typography>\n {event.status && <StatusChip status={event.status} />}\n </Box>\n {event.target && <Typography variant=\"body2\">{event.target}</Typography>}\n {event.timestamp && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatTimestamp(event.timestamp)}\n </Typography>\n )}\n </Box>\n);\n\nconst StatusChip = ({ status }: { status: StatusSummary }) => (\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={\n status.tone === 'success'\n ? 'primary'\n : status.tone === 'warning' || status.tone === 'error'\n ? 'secondary'\n : 'default'\n }\n label={status.label}\n />\n);\n\nconst FactGrid = ({ facts }: { facts: Fact[] }) => (\n <Grid component=\"dl\" container spacing={1} style={{ margin: 0 }}>\n {facts.map(fact => (\n <Grid\n item\n xs={fact.label === 'Summary' ? 12 : 6}\n sm={fact.label === 'Summary' ? 12 : 4}\n key={`${fact.label}-${fact.value}`}\n >\n <Typography component=\"dt\" variant=\"caption\" color=\"textSecondary\">\n {fact.label}\n </Typography>\n <Typography component=\"dd\" variant=\"body2\" style={{ margin: 0 }}>\n {fact.value}\n </Typography>\n </Grid>\n ))}\n </Grid>\n);\n\nconst NamedResources = ({ names }: { names: string[] }) =>\n names.length > 0 ? (\n <Box display=\"flex\" flexWrap=\"wrap\" gridGap={6} mt={1}>\n {names.slice(0, 20).map(name => (\n <Chip key={name} size=\"small\" label={name} />\n ))}\n </Box>\n ) : null;\n\nfunction namedRecords(value: unknown): string[] {\n return [\n ...new Set(\n recordsFrom(value)\n .map(record => readText(record, ['name', 'target', 'resource', 'id']))\n .filter((name): name is string => Boolean(name)),\n ),\n ].slice(0, 20);\n}\n\nfunction numberFrom(value: unknown, keys: string[]): number | undefined {\n if (!isRecord(value)) return undefined;\n for (const key of keys) {\n if (typeof value[key] === 'number') return value[key];\n }\n return undefined;\n}\n\nfunction factKey(fact: Fact): string {\n return fact.label.replace(/\\s+/g, '').toLocaleLowerCase();\n}\n\nfunction eventKey(record: Record<string, unknown>, index: number): string {\n const identity =\n readText(record, ['id', 'ts', 'timestamp', 'time']) ?? 'event';\n return `${identity}-${index}`;\n}\n\nfunction formatTimestamp(value: string): string {\n const timestamp = Date.parse(value);\n return Number.isNaN(timestamp) ? value : new Date(timestamp).toLocaleString();\n}\n\nfunction architectureFrom(value: unknown): ArchitectureGraph {\n if (!isRecord(value)) return { nodes: [], edges: [] };\n const nodeValues = Array.isArray(value.nodes)\n ? value.nodes.filter(isRecord)\n : [];\n const nodes = nodeValues.map((node, index) => {\n const id = readText(node, ['id', 'name']) ?? `node-${index}`;\n const name = readText(node, ['name', 'id']) ?? id;\n return {\n id,\n name,\n type: readText(node, ['type']),\n namespace: readText(node, ['namespace']),\n image: readText(node, ['image']),\n };\n });\n\n const edgeValues = Array.isArray(value.edges)\n ? value.edges.filter(isRecord)\n : [];\n const edges = edgeValues.flatMap(edge => {\n const from = endpointId(edge.from ?? edge.source);\n const to = endpointId(edge.to ?? edge.target);\n if (!from || !to) return [];\n return [\n {\n from,\n to,\n type: readText(edge, ['type', 'label', 'relationship']) ?? 'RELATES_TO',\n },\n ];\n });\n\n return { nodes, edges };\n}\n\nfunction endpointId(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (!isRecord(value)) return undefined;\n return readText(value, ['id', 'name']);\n}\n\nconst Muted = ({ children }: { children: ReactNode }) => (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {children}\n </Typography>\n);\n\nfunction textArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction metricLabel(\n value: unknown,\n singular: string,\n plural: string,\n): string | undefined {\n return typeof value === 'number'\n ? `${value} ${value === 1 ? singular : plural}`\n : undefined;\n}\n\nfunction readableStatus(value: unknown): string {\n if (typeof value !== 'string' || !value) return 'Not resolved';\n return value.charAt(0).toUpperCase() + value.slice(1).replace(/_/g, ' ');\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import * as _backstage_filter_predicates from '@backstage/filter-predicates';
3
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
4
4
  import { Entity } from '@backstage/catalog-model';
5
5
  import { AnyshiftCapabilities, ServiceBrief, BriefSectionName, BriefSectionResponse, EstateInsights, DatadogSignals, CloudResourceBrief, CatalogSummary, QueryResult, CatalogSyncReport } from '@anyshift/backstage-plugin-anyshift-common';
6
- export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, CloudEventEvidenceItem, CloudEventsEvidence, CloudResourceBrief, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, IacDriftEvidence, IacEvidence, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
6
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION, ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, CloudEventEvidenceItem, CloudEventsEvidence, CloudResourceBrief, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, IacDriftEvidence, IacEvidence, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
7
7
 
8
8
  declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
9
9
  root: _backstage_frontend_plugin_api.RouteRef<undefined>;
@@ -203,6 +203,9 @@ interface AnyshiftApi {
203
203
  interface BriefRequestOptions {
204
204
  namespace?: string;
205
205
  refresh?: boolean;
206
+ configurationEndpoints?: string;
207
+ configurationDependencies?: string;
208
+ configurationTarget?: string;
206
209
  }
207
210
  interface CloudResourceBriefRequestOptions {
208
211
  since?: string;
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { anyshiftPlugin, anyshiftPlugin as default } from './plugin.esm.js';
2
2
  export { anyshiftApiRef } from './api/AnyshiftApi.esm.js';
3
- export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
3
+ export { ANYSHIFT_CLOUD_ACCOUNT_ANNOTATION, ANYSHIFT_CLOUD_PROVIDER_ANNOTATION, ANYSHIFT_CLOUD_REGION_ANNOTATION, ANYSHIFT_CLOUD_RESOURCE_ARN_ANNOTATION, ANYSHIFT_CONFIGURATION_DEPENDENCIES_ANNOTATION, ANYSHIFT_CONFIGURATION_ENDPOINTS_ANNOTATION, ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_RUNTIME_RESOURCE_ID_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
4
4
  //# sourceMappingURL=index.esm.js.map
@@ -1,5 +1,5 @@
1
1
  var name = "@anyshift/backstage-plugin-anyshift";
2
- var version = "0.1.0-beta.7";
2
+ var version = "0.1.0-beta.9";
3
3
  var description = "Read-only Anyshift infrastructure context for Backstage";
4
4
  var main = "src/index.ts";
5
5
  var types = "src/index.ts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anyshift/backstage-plugin-anyshift",
3
- "version": "0.1.0-beta.7",
3
+ "version": "0.1.0-beta.9",
4
4
  "description": "Read-only Anyshift infrastructure context for Backstage",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,7 +45,7 @@
45
45
  "clean": "backstage-cli package clean"
46
46
  },
47
47
  "dependencies": {
48
- "@anyshift/backstage-plugin-anyshift-common": "^0.1.0-beta.7",
48
+ "@anyshift/backstage-plugin-anyshift-common": "^0.1.0-beta.8",
49
49
  "@backstage/catalog-model": "^1.9.0",
50
50
  "@backstage/core-components": "^0.18.11",
51
51
  "@backstage/frontend-plugin-api": "^0.17.2",