@acarmisc/backstage-plugin-ai-agents 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const AgentOverviewCard: React.FC;
package/dist/index.cjs.js CHANGED
@@ -949,12 +949,56 @@ var init_AgentsPage = __esm({
949
949
  }
950
950
  });
951
951
 
952
+ // src/components/AgentOverviewCard.tsx
953
+ var AgentOverviewCard_exports = {};
954
+ __export(AgentOverviewCard_exports, {
955
+ AgentOverviewCard: () => AgentOverviewCard
956
+ });
957
+ var import_react12, import_material10, import_OpenInNew2, import_Memory2, import_CloudQueue2, import_Functions2, import_Extension2, import_plugin_catalog_react, RUNTIME_ICON, Field, AgentOverviewCard;
958
+ var init_AgentOverviewCard = __esm({
959
+ "src/components/AgentOverviewCard.tsx"() {
960
+ "use strict";
961
+ import_react12 = __toESM(require("react"));
962
+ import_material10 = require("@mui/material");
963
+ import_OpenInNew2 = __toESM(require("@mui/icons-material/OpenInNew"));
964
+ import_Memory2 = __toESM(require("@mui/icons-material/Memory"));
965
+ import_CloudQueue2 = __toESM(require("@mui/icons-material/CloudQueue"));
966
+ import_Functions2 = __toESM(require("@mui/icons-material/Functions"));
967
+ import_Extension2 = __toESM(require("@mui/icons-material/Extension"));
968
+ init_types();
969
+ init_AgentAvatar();
970
+ init_AgentStatusBadge();
971
+ init_AgentCapabilities();
972
+ init_BillingBadge();
973
+ import_plugin_catalog_react = require("@backstage/plugin-catalog-react");
974
+ RUNTIME_ICON = {
975
+ "bedrock-agentcore": /* @__PURE__ */ import_react12.default.createElement(import_CloudQueue2.default, { fontSize: "small" }),
976
+ litellm: /* @__PURE__ */ import_react12.default.createElement(import_Memory2.default, { fontSize: "small" }),
977
+ lambda: /* @__PURE__ */ import_react12.default.createElement(import_Functions2.default, { fontSize: "small" }),
978
+ custom: /* @__PURE__ */ import_react12.default.createElement(import_Extension2.default, { fontSize: "small" })
979
+ };
980
+ Field = ({
981
+ label,
982
+ value,
983
+ mono
984
+ }) => /* @__PURE__ */ import_react12.default.createElement(import_material10.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, label), /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "body2", sx: { wordBreak: "break-all" }, style: mono ? { fontFamily: "monospace" } : void 0 }, value ?? "\u2014"));
985
+ AgentOverviewCard = () => {
986
+ const { entity } = (0, import_plugin_catalog_react.useEntity)();
987
+ if (!entity || entity.spec?.type !== "ai-agent") return null;
988
+ const agent = entityToAgent(entity);
989
+ if (!agent) return null;
990
+ return /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { p: 2 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { display: "flex", alignItems: "center", gap: 1.5, mb: 2 } }, /* @__PURE__ */ import_react12.default.createElement(AgentAvatar, { name: agent.name, avatarUrl: agent.avatarUrl, size: 48 }), /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { flexGrow: 1, minWidth: 0 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "h6", noWrap: true }, agent.title ?? agent.name), /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary", noWrap: true }, agent.entityRef)), /* @__PURE__ */ import_react12.default.createElement(AgentStatusBadge, { status: agent.status })), /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "body2", sx: { mb: 2 } }, agent.purpose || agent.description || "No description provided."), /* @__PURE__ */ import_react12.default.createElement(import_material10.Grid, { container: true, spacing: 2 }, /* @__PURE__ */ import_react12.default.createElement(Field, { label: "Runtime", value: /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, RUNTIME_ICON[agent.runtime.runtime] ?? /* @__PURE__ */ import_react12.default.createElement(import_Extension2.default, { fontSize: "small" }), agent.runtime.runtime) }), /* @__PURE__ */ import_react12.default.createElement(Field, { label: "Billing", value: /* @__PURE__ */ import_react12.default.createElement(BillingBadge, { billing: agent.billing }) }), /* @__PURE__ */ import_react12.default.createElement(Field, { label: "Owner", value: agent.owner }), /* @__PURE__ */ import_react12.default.createElement(Field, { label: "Lifecycle", value: agent.lifecycle }), /* @__PURE__ */ import_react12.default.createElement(Field, { label: "Version", value: agent.version }), /* @__PURE__ */ import_react12.default.createElement(Field, { label: "System", value: agent.system })), agent.runtime.endpoint && /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 1.5 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, "Endpoint"), /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "body2", sx: { wordBreak: "break-all" } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Link, { href: agent.runtime.endpoint, target: "_blank", rel: "noopener noreferrer", sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, agent.runtime.endpoint, " ", /* @__PURE__ */ import_react12.default.createElement(import_OpenInNew2.default, { sx: { fontSize: 12 } })))), agent.runtime.runtimeHandle && /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 1 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, "Runtime handle"), /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "body2", style: { fontFamily: "monospace", wordBreak: "break-all" } }, agent.runtime.runtimeHandle)), agent.capabilities.length > 0 && /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 1.5 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, "Capabilities"), /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 0.5 } }, /* @__PURE__ */ import_react12.default.createElement(AgentCapabilities, { capabilities: agent.capabilities, max: 20 }))), agent.tags.length > 0 && /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 1.5 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, "Tags"), /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 0.5, display: "flex", flexWrap: "wrap", gap: 0.5 } }, agent.tags.map((t) => /* @__PURE__ */ import_react12.default.createElement(import_material10.Chip, { key: t, size: "small", label: t, variant: "outlined" })))), agent.links.length > 0 && /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 1.5 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Typography, { variant: "caption", color: "text.secondary" }, "Links"), /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 0.5, display: "flex", flexWrap: "wrap", gap: 1 } }, agent.links.map((l, i) => /* @__PURE__ */ import_react12.default.createElement(import_material10.Tooltip, { key: i, title: l.title }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Link, { href: l.url, target: "_blank", rel: "noopener noreferrer", sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, l.title, " ", /* @__PURE__ */ import_react12.default.createElement(import_OpenInNew2.default, { sx: { fontSize: 12 } })))))), /* @__PURE__ */ import_react12.default.createElement(import_material10.Box, { sx: { mt: 2 } }, /* @__PURE__ */ import_react12.default.createElement(import_material10.Link, { href: `/ai-agents` }, "View on the AI Agents page")));
991
+ };
992
+ }
993
+ });
994
+
952
995
  // src/index.ts
953
996
  var index_exports = {};
954
997
  __export(index_exports, {
955
998
  AI_AGENT_ANNOTATION_PREFIX: () => AI_AGENT_ANNOTATION_PREFIX,
956
999
  AI_AGENT_TYPE: () => AI_AGENT_TYPE,
957
1000
  AgentCard: () => AgentCard,
1001
+ AgentOverviewCard: () => AgentOverviewCard,
958
1002
  AgentsPage: () => AgentsPage,
959
1003
  AiAgentsApi: () => AiAgentsApi,
960
1004
  aiAgentsApiRef: () => aiAgentsApiRef,
@@ -964,15 +1008,16 @@ __export(index_exports, {
964
1008
  module.exports = __toCommonJS(index_exports);
965
1009
 
966
1010
  // src/plugin.tsx
967
- var import_react12 = __toESM(require("react"));
1011
+ var import_react13 = __toESM(require("react"));
968
1012
  var import_icons_material = require("@mui/icons-material");
969
1013
  var import_frontend_plugin_api = require("@backstage/frontend-plugin-api");
970
- var import_plugin_catalog_react = require("@backstage/plugin-catalog-react");
1014
+ var import_plugin_catalog_react2 = require("@backstage/plugin-catalog-react");
1015
+ var import_alpha = require("@backstage/plugin-catalog-react/alpha");
971
1016
  init_api();
972
1017
  var aiAgentsApi = import_frontend_plugin_api.ApiBlueprint.make({
973
1018
  params: (defineParams) => defineParams({
974
1019
  api: aiAgentsApiRef,
975
- deps: { fetchApi: import_frontend_plugin_api.fetchApiRef, catalogApi: import_plugin_catalog_react.catalogApiRef },
1020
+ deps: { fetchApi: import_frontend_plugin_api.fetchApiRef, catalogApi: import_plugin_catalog_react2.catalogApiRef },
976
1021
  factory: ({ fetchApi, catalogApi }) => new AiAgentsApi({ fetchApi, catalogApi })
977
1022
  })
978
1023
  });
@@ -980,21 +1025,34 @@ var aiAgentsPage = import_frontend_plugin_api.PageBlueprint.make({
980
1025
  params: {
981
1026
  path: "/ai-agents",
982
1027
  title: "AI Agents",
983
- icon: /* @__PURE__ */ import_react12.default.createElement(import_icons_material.SmartToy, null),
1028
+ icon: /* @__PURE__ */ import_react13.default.createElement(import_icons_material.SmartToy, null),
984
1029
  loader: async () => {
985
1030
  const { AgentsPage: AgentsPage2 } = await Promise.resolve().then(() => (init_AgentsPage(), AgentsPage_exports));
986
- return /* @__PURE__ */ import_react12.default.createElement(AgentsPage2, null);
1031
+ return /* @__PURE__ */ import_react13.default.createElement(AgentsPage2, null);
1032
+ }
1033
+ }
1034
+ });
1035
+ var aiAgentOverviewCard = import_alpha.EntityCardBlueprint.make({
1036
+ name: "overview",
1037
+ params: {
1038
+ filter: {
1039
+ "spec.type": "ai-agent"
1040
+ },
1041
+ loader: async () => {
1042
+ const { AgentOverviewCard: AgentOverviewCard2 } = await Promise.resolve().then(() => (init_AgentOverviewCard(), AgentOverviewCard_exports));
1043
+ return /* @__PURE__ */ import_react13.default.createElement(AgentOverviewCard2, null);
987
1044
  }
988
1045
  }
989
1046
  });
990
1047
  var aiAgentsPlugin = (0, import_frontend_plugin_api.createFrontendPlugin)({
991
1048
  pluginId: "ai-agents",
992
- extensions: [aiAgentsApi, aiAgentsPage]
1049
+ extensions: [aiAgentsApi, aiAgentsPage, aiAgentOverviewCard]
993
1050
  });
994
1051
 
995
1052
  // src/index.ts
996
1053
  init_AgentsPage();
997
1054
  init_AgentCard();
1055
+ init_AgentOverviewCard();
998
1056
  init_api();
999
1057
  init_types();
1000
1058
  //# sourceMappingURL=index.cjs.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/types.ts", "../src/api.ts", "../src/hooks/useAgents.ts", "../src/components/AgentFilters.tsx", "../src/components/AgentAvatar.tsx", "../src/components/AgentStatusBadge.tsx", "../src/components/AgentCapabilities.tsx", "../src/components/RuntimeBadge.tsx", "../src/components/BillingBadge.tsx", "../src/components/AgentCard.tsx", "../src/components/AgentsGrid.tsx", "../src/components/AgentDetailDrawer.tsx", "../src/components/AgentsPage.tsx", "../src/index.ts", "../src/plugin.tsx"],
4
- "sourcesContent": ["import { Entity } from '@backstage/catalog-model';\n\n/** Value of `spec.type` that marks a catalog Component as an AI agent. */\nexport const AI_AGENT_TYPE = 'ai-agent';\n\n/** Annotation namespace for agent-specific fields on a catalog entity. */\nexport const AI_AGENT_ANNOTATION_PREFIX = 'ai-agent.acarmisc.org';\n\nexport type AgentRuntimeName =\n | 'bedrock-agentcore'\n | 'litellm'\n | 'lambda'\n | 'custom'\n | string;\n\nexport interface AgentRuntimeInfo {\n /** Runtime identifier, e.g. \"bedrock-agentcore\", \"litellm\", \"lambda\", \"custom\". */\n runtime: AgentRuntimeName;\n /** Opaque handle/ARN/identifier the backend uses to probe the agent. */\n runtimeHandle?: string;\n /** Public invocation endpoint, if any. */\n endpoint?: string;\n /** Health-check URL the backend can call. */\n healthUrl?: string;\n}\n\nexport type AgentBillingModel =\n | 'per-invocation'\n | 'per-token'\n | 'subscription'\n | 'free'\n | string;\n\nexport interface AgentBilling {\n model: AgentBillingModel;\n /** Cost per 1000 invocations (per-invocation) or per 1M tokens (per-token). */\n unitCost?: number;\n /** Monthly spend cap if known. */\n budget?: number;\n}\n\nexport type AgentCapabilityCategory =\n | 'reasoning'\n | 'retrieval'\n | 'tools'\n | 'vision'\n | 'voice'\n | 'data'\n | 'safety';\n\nexport interface AgentCapability {\n label: string;\n category?: AgentCapabilityCategory;\n}\n\nexport type AgentStatusState = 'healthy' | 'degraded' | 'down' | 'unknown';\n\nexport interface AgentStatus {\n state: AgentStatusState;\n lastChecked?: string;\n latencyMs?: number;\n message?: string;\n}\n\nexport interface AiAgent {\n /** Backstage entity ref, e.g. \"component:default/support-triage-agent\". */\n entityRef: string;\n name: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n owner?: string;\n system?: string;\n lifecycle?: string;\n version?: string;\n /** Human-readable purpose (defaults to description when no dedicated field). */\n purpose: string;\n runtime: AgentRuntimeInfo;\n billing: AgentBilling;\n capabilities: AgentCapability[];\n tags: string[];\n links: { url: string; title: string; icon?: string }[];\n /** Populated by the backend status probe; undefined in the static view. */\n status?: AgentStatus;\n rawEntity: Entity;\n}\n\nconst VALID_CATEGORIES = new Set<AgentCapabilityCategory>([\n 'reasoning',\n 'retrieval',\n 'tools',\n 'vision',\n 'voice',\n 'data',\n 'safety',\n]);\n\nfunction annotation(entity: Entity, key: string): string | undefined {\n return entity.metadata.annotations?.[`${AI_AGENT_ANNOTATION_PREFIX}/${key}`];\n}\n\nfunction parseFloatSafe(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCapabilities(raw: string | undefined): AgentCapability[] {\n if (!raw) return [];\n return raw\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(Boolean)\n .map(token => {\n const [label, catRaw] = token.split(':').map(s => s.trim());\n const category = catRaw ? (catRaw as AgentCapabilityCategory) : undefined;\n return {\n label,\n category:\n category && VALID_CATEGORIES.has(category) ? category : undefined,\n };\n });\n}\n\nfunction entityRef(entity: Entity): string {\n const ns = entity.metadata.namespace ?? 'default';\n return `${entity.kind.toLowerCase()}:${ns}/${entity.metadata.name}`;\n}\n\nfunction purpose(entity: Entity): string {\n const explicit = annotation(entity, 'purpose');\n return (explicit ?? entity.metadata.description ?? '').trim();\n}\n\n/** Map a Backstage catalog Component entity to the plugin's AiAgent shape. */\nexport function entityToAgent(\n entity: Entity,\n status?: AgentStatus,\n): AiAgent | undefined {\n if (entity.spec?.type !== AI_AGENT_TYPE) return undefined;\n\n const links = (entity.metadata.links ?? []).map(l => ({\n url: l.url,\n title: l.title ?? l.url,\n icon: l.icon,\n }));\n\n return {\n entityRef: entityRef(entity),\n name: entity.metadata.name,\n title: entity.metadata.title,\n description: entity.metadata.description,\n avatarUrl: annotation(entity, 'avatar'),\n owner: (entity.spec as Record<string, unknown> | undefined)?.owner as\n | string\n | undefined,\n system: (entity.spec as Record<string, unknown> | undefined)?.system as\n | string\n | undefined,\n lifecycle: (entity.spec as Record<string, unknown> | undefined)?.lifecycle as\n | string\n | undefined,\n version: annotation(entity, 'version'),\n purpose: purpose(entity),\n runtime: {\n runtime: annotation(entity, 'runtime') ?? 'custom',\n runtimeHandle: annotation(entity, 'runtime-handle'),\n endpoint: annotation(entity, 'endpoint'),\n healthUrl: annotation(entity, 'health'),\n },\n billing: {\n model: annotation(entity, 'billing-model') ?? 'free',\n unitCost: parseFloatSafe(annotation(entity, 'cost-per-1k')),\n budget: parseFloatSafe(annotation(entity, 'budget')),\n },\n capabilities: parseCapabilities(annotation(entity, 'capabilities')),\n tags: entity.metadata.tags ?? [],\n links,\n status,\n rawEntity: entity,\n };\n}", "import { createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport {\n AI_AGENT_TYPE,\n AiAgent,\n AgentStatus,\n entityToAgent,\n} from './types';\n\nexport interface AiAgentsApiInterface {\n listAgents(): Promise<AiAgent[]>;\n getAgent(entityRef: string): Promise<AiAgent | undefined>;\n /** Probe live status for the given entity refs via the backend. */\n getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>>;\n}\n\nexport const aiAgentsApiRef = createApiRef<AiAgentsApiInterface>({\n id: 'plugin.ai-agents.api',\n});\n\nexport class AiAgentsApi implements AiAgentsApiInterface {\n constructor(\n private readonly opts: {\n fetchApi: FetchApi;\n catalogApi: CatalogApi;\n },\n private readonly basePath = '/api/ai-agents',\n ) {}\n\n async listAgents(): Promise<AiAgent[]> {\n const result = await this.opts.catalogApi.getEntities({\n filter: { kind: 'Component', 'spec.type': AI_AGENT_TYPE },\n });\n return result.items\n .map(e => entityToAgent(e))\n .filter((a): a is AiAgent => a !== undefined);\n }\n\n async getAgent(entityRef: string): Promise<AiAgent | undefined> {\n const entity = await this.opts.catalogApi.getEntityByRef(entityRef);\n return entity ? entityToAgent(entity) : undefined;\n }\n\n async getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>> {\n if (!entityRefs.length) return {};\n try {\n const res = await this.opts.fetchApi.fetch(\n `${this.basePath}/statuses?refs=${encodeURIComponent(entityRefs.join(','))}`,\n );\n if (!res.ok) return {};\n return (await res.json()) as Record<string, AgentStatus>;\n } catch {\n return {};\n }\n }\n}", "import { useCallback, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent } from '../types';\n\nexport interface AgentFilters {\n search: string;\n runtime: string[];\n capability: string[];\n lifecycle: string[];\n owner: string[];\n}\n\nexport const initialFilters: AgentFilters = {\n search: '',\n runtime: [],\n capability: [],\n lifecycle: [],\n owner: [],\n};\n\nexport function applyFilters(\n agents: AiAgent[],\n filters: AgentFilters,\n): AiAgent[] {\n const search = filters.search.trim().toLowerCase();\n return agents.filter(a => {\n if (search) {\n const haystack = [a.name, a.title, a.description, a.purpose]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(search)) return false;\n }\n if (filters.runtime.length && !filters.runtime.includes(a.runtime.runtime)) {\n return false;\n }\n if (filters.capability.length) {\n const caps = a.capabilities.map(c => c.label);\n if (!filters.capability.every(c => caps.includes(c))) return false;\n }\n if (filters.lifecycle.length && !filters.lifecycle.includes(a.lifecycle ?? '')) {\n return false;\n }\n if (filters.owner.length && !filters.owner.includes(a.owner ?? '')) {\n return false;\n }\n return true;\n });\n}\n\nexport function useAgents() {\n const api = useApi(aiAgentsApiRef);\n const {\n value: agents,\n loading,\n error,\n retry,\n } = useAsyncRetry(() => api.listAgents(), [api]);\n\n const [filters, setFilters] = useState<AgentFilters>(initialFilters);\n\n const filtered = useMemo(\n () => applyFilters(agents ?? [], filters),\n [agents, filters],\n );\n\n const update = useCallback(\n (patch: Partial<AgentFilters>) =>\n setFilters(prev => ({ ...prev, ...patch })),\n [],\n );\n\n const reset = useCallback(() => setFilters(initialFilters), []);\n\n return {\n agents: filtered,\n allAgents: agents ?? [],\n loading,\n error,\n retry,\n filters,\n update,\n reset,\n };\n}", "import React from 'react';\nimport {\n Box,\n IconButton,\n InputAdornment,\n MenuItem,\n Paper,\n TextField,\n Tooltip,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type { AiAgent } from '../types';\nimport type { AgentFilters } from '../hooks/useAgents';\n\nexport interface AgentFiltersBarProps {\n agents: AiAgent[];\n filters: AgentFilters;\n onChange: (patch: Partial<AgentFilters>) => void;\n onReset: () => void;\n}\n\nconst SELECT_PROPS = {\n SelectProps: { multiple: true, renderValue: (v: unknown) => (v as string[]).join(', ') || 'All' },\n} as const;\n\nexport const AgentFiltersBar: React.FC<AgentFiltersBarProps> = ({\n agents,\n filters,\n onChange,\n onReset,\n}) => {\n const runtimes = Array.from(new Set(agents.map(a => a.runtime.runtime))).sort();\n const capabilities = Array.from(\n new Set(agents.flatMap(a => a.capabilities.map(c => c.label))),\n ).sort();\n const lifecycles = Array.from(new Set(agents.map(a => a.lifecycle).filter(Boolean))) as string[];\n const owners = Array.from(new Set(agents.map(a => a.owner).filter(Boolean))) as string[];\n\n const hasFilters =\n filters.search ||\n filters.runtime.length ||\n filters.capability.length ||\n filters.lifecycle.length ||\n filters.owner.length;\n\n return (\n <Paper sx={{ p: 1.5, mb: 2, display: 'flex', gap: 1.5, flexWrap: 'wrap', alignItems: 'center' }}>\n <TextField\n size=\"small\"\n placeholder=\"Search agents\u2026\"\n value={filters.search}\n onChange={e => onChange({ search: e.target.value })}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: filters.search ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={() => onChange({ search: '' })}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n\n <TextField select size=\"small\" label=\"Runtime\" value={filters.runtime}\n onChange={e => onChange({ runtime: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {runtimes.map(r => <MenuItem key={r} value={r}>{r}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Capability\" value={filters.capability}\n onChange={e => onChange({ capability: e.target.value as unknown as string[] })}\n sx={{ minWidth: 150 }} {...SELECT_PROPS}>\n {capabilities.map(c => <MenuItem key={c} value={c}>{c}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Lifecycle\" value={filters.lifecycle}\n onChange={e => onChange({ lifecycle: e.target.value as unknown as string[] })}\n sx={{ minWidth: 130 }} {...SELECT_PROPS}>\n {lifecycles.map(l => <MenuItem key={l} value={l}>{l}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Owner\" value={filters.owner}\n onChange={e => onChange({ owner: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {owners.map(o => <MenuItem key={o} value={o}>{o}</MenuItem>)}\n </TextField>\n\n {hasFilters && (\n <Tooltip title=\"Clear filters\">\n <IconButton size=\"small\" onClick={onReset}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Box sx={{ ml: 'auto', alignSelf: 'center' }}>\n <strong>{agents.length}</strong> agent{agents.length !== 1 ? 's' : ''}\n </Box>\n </Paper>\n );\n};", "import React, { useState } from 'react';\nimport { Box } from '@mui/material';\n\nconst PALETTE = [\n '#1976d2', '#388e3c', '#f57c00', '#7b1fa2',\n '#c62828', '#0097a7', '#5d4037', '#455a64',\n];\n\nfunction initialsOf(name: string): string {\n const parts = name.replace(/[-_]+/g, ' ').trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction colorFor(name: string): string {\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0;\n return PALETTE[Math.abs(hash) % PALETTE.length];\n}\n\nexport interface AgentAvatarProps {\n name: string;\n avatarUrl?: string;\n size?: number;\n}\n\nexport const AgentAvatar: React.FC<AgentAvatarProps> = ({\n name,\n avatarUrl,\n size = 44,\n}) => {\n const [broken, setBroken] = useState(false);\n const showImage = avatarUrl && !broken;\n\n return (\n <Box\n sx={{\n width: size,\n height: size,\n flexShrink: 0,\n borderRadius: '50%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: showImage ? 'transparent' : colorFor(name),\n color: 'common.white',\n fontSize: size * 0.36,\n fontWeight: 700,\n }}\n >\n {showImage ? (\n <img\n src={avatarUrl}\n alt={name}\n width={size}\n height={size}\n onError={() => setBroken(true)}\n style={{ objectFit: 'cover', borderRadius: '50%' }}\n />\n ) : (\n initialsOf(name)\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { AgentStatus, AgentStatusState } from '../types';\n\nconst STATE_COLOR: Record<AgentStatusState, string> = {\n healthy: 'success.main',\n degraded: 'warning.main',\n down: 'error.main',\n unknown: 'text.disabled',\n};\n\nexport interface AgentStatusBadgeProps {\n status?: AgentStatus;\n}\n\nexport const AgentStatusBadge: React.FC<AgentStatusBadgeProps> = ({ status }) => {\n const state = status?.state ?? 'unknown';\n const color = STATE_COLOR[state];\n const ring = state === 'unknown' ? `1px dashed ${color}` : 'none';\n\n const title = status\n ? [\n `Status: ${state}`,\n status.lastChecked ? `Last checked: ${new Date(status.lastChecked).toLocaleString()}` : null,\n status.latencyMs != null ? `Latency: ${status.latencyMs}ms` : null,\n status.message ? status.message : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')\n : 'Status: unknown';\n\n return (\n <Tooltip title={title} arrow>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n cursor: 'help',\n }}\n >\n <Box\n component=\"span\"\n sx={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: color,\n border: ring,\n flexShrink: 0,\n }}\n />\n {status?.latencyMs != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.latencyMs}ms\n </Typography>\n )}\n </Box>\n </Tooltip>\n );\n};", "import React, { useState } from 'react';\nimport { Chip, Box, Popover } from '@mui/material';\nimport type { AgentCapability, AgentCapabilityCategory } from '../types';\n\nconst CATEGORY_COLOR: Record<\n AgentCapabilityCategory,\n 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'error' | 'default'\n> = {\n reasoning: 'primary',\n retrieval: 'info',\n tools: 'secondary',\n vision: 'success',\n voice: 'warning',\n data: 'default',\n safety: 'error',\n};\n\nconst MAX_VISIBLE = 5;\n\nexport interface AgentCapabilitiesProps {\n capabilities: AgentCapability[];\n max?: number;\n size?: 'small' | 'medium';\n}\n\nexport const AgentCapabilities: React.FC<AgentCapabilitiesProps> = ({\n capabilities,\n max = MAX_VISIBLE,\n size = 'small',\n}) => {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n if (!capabilities.length) return null;\n const visible = capabilities.slice(0, max);\n const overflow = capabilities.length - visible.length;\n\n return (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {visible.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size={size}\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n {overflow > 0 && (\n <>\n <Chip\n label={`+${overflow}`}\n size={size}\n clickable\n onClick={e => {\n e.stopPropagation();\n setAnchor(e.currentTarget);\n }}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Box sx={{ p: 1, maxWidth: 280, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {capabilities.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size=\"small\"\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n </Box>\n </Popover>\n </>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Chip, Box } from '@mui/material';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport type { AgentRuntimeName } from '../types';\n\nconst RUNTIME_META: Record<\n string,\n { label: string; icon: React.ReactNode }\n> = {\n 'bedrock-agentcore': { label: 'Bedrock AgentCore', icon: <CloudQueueIcon fontSize=\"small\" /> },\n litellm: { label: 'LiteLLM', icon: <MemoryIcon fontSize=\"small\" /> },\n lambda: { label: 'AWS Lambda', icon: <FunctionsIcon fontSize=\"small\" /> },\n custom: { label: 'Custom', icon: <ExtensionIcon fontSize=\"small\" /> },\n};\n\nexport interface RuntimeBadgeProps {\n runtime: AgentRuntimeName;\n size?: 'small' | 'medium';\n onClick?: (runtime: string) => void;\n}\n\nexport const RuntimeBadge: React.FC<RuntimeBadgeProps> = ({\n runtime,\n size = 'small',\n onClick,\n}) => {\n const meta = RUNTIME_META[runtime] ?? {\n label: String(runtime),\n icon: <ExtensionIcon fontSize=\"small\" />,\n };\n return (\n <Chip\n size={size}\n variant=\"outlined\"\n label={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {meta.icon}\n {meta.label}\n </Box>\n }\n onClick={onClick ? () => onClick(runtime) : undefined}\n clickable={Boolean(onClick)}\n />\n );\n};", "import React from 'react';\nimport { Chip, Box, Typography } from '@mui/material';\nimport type { AgentBilling } from '../types';\n\nconst BILLING_COLOR: Record<string, 'primary' | 'secondary' | 'success' | 'default'> = {\n 'per-invocation': 'primary',\n 'per-token': 'secondary',\n subscription: 'success',\n free: 'default',\n};\n\nexport interface BillingBadgeProps {\n billing: AgentBilling;\n}\n\nexport const BillingBadge: React.FC<BillingBadgeProps> = ({ billing }) => {\n const color = BILLING_COLOR[billing.model] ?? 'default';\n const unitLabel =\n billing.model === 'per-token'\n ? 'per 1M tokens'\n : billing.model === 'per-invocation'\n ? 'per 1k calls'\n : null;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n <Chip size=\"small\" color={color} label={billing.model} variant=\"outlined\" />\n {billing.unitCost != null && unitLabel && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~${billing.unitCost} {unitLabel}\n </Typography>\n )}\n {billing.budget != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n budget: ${billing.budget}\n </Typography>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Card, CardActionArea, Chip, Link, Tooltip, Typography } from '@mui/material';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LIFECYCLE_COLOR: Record<string, 'success' | 'warning' | 'error' | 'default'> = {\n production: 'success',\n experimental: 'warning',\n deprecated: 'error',\n};\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentCardProps {\n agent: AiAgent;\n onClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentCard: React.FC<AgentCardProps> = ({\n agent,\n onClick,\n onRuntimeClick,\n}) => {\n const title = agent.title ?? agent.name;\n const lifecycleColor = agent.lifecycle\n ? LIFECYCLE_COLOR[agent.lifecycle] ?? 'default'\n : 'default';\n\n return (\n <Card\n variant=\"outlined\"\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n transition: theme => `box-shadow ${theme.transitions.duration.short}ms`,\n '&:hover': { boxShadow: 6 },\n }}\n >\n <CardActionArea\n onClick={() => onClick?.(agent)}\n sx={{ flexGrow: 1, p: 2, alignItems: 'stretch', display: 'flex' }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\n {/* Header: avatar + title + status */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 1 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\" fontWeight={700} noWrap title={title}>\n {title}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.name}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n {/* Purpose */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n minHeight: '2.6em',\n mb: 1.5,\n }}\n >\n {agent.purpose || 'No description provided.'}\n </Typography>\n\n {/* Runtime */}\n <Box sx={{ mb: 1 }}>\n <RuntimeBadge\n runtime={agent.runtime.runtime}\n onClick={onRuntimeClick}\n />\n </Box>\n\n {/* Capabilities */}\n {agent.capabilities.length > 0 && (\n <Box sx={{ mb: 1.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} />\n </Box>\n )}\n\n {/* Billing */}\n <Box sx={{ mb: 1.5 }}>\n <BillingBadge billing={agent.billing} />\n </Box>\n\n {/* Footer: owner + lifecycle + version */}\n <Box\n sx={{\n mt: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexWrap: 'wrap',\n }}\n >\n {agent.owner && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {agent.owner}\n </Typography>\n )}\n {agent.lifecycle && (\n <Chip\n size=\"small\"\n color={lifecycleColor}\n label={agent.lifecycle}\n variant=\"outlined\"\n sx={{ height: 20, '& .MuiChip-label': { px: 0.75, fontSize: '0.7rem' } }}\n />\n )}\n {agent.version && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n v{agent.version}\n </Typography>\n )}\n </Box>\n\n {/* Links */}\n {agent.links.length > 0 && (\n <Box sx={{ display: 'flex', gap: 1.5, mt: 1.5, pt: 1, borderTop: '1px solid', borderColor: 'divider' }}>\n {agent.links.slice(0, 4).map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={e => e.stopPropagation()}\n sx={{ display: 'inline-flex', color: 'text.secondary' }}\n >\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </Link>\n </Tooltip>\n ))}\n </Box>\n )}\n </Box>\n </CardActionArea>\n </Card>\n );\n};", "import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { AiAgent } from '../types';\nimport { AgentCard } from './AgentCard';\n\nexport interface AgentsGridProps {\n agents: AiAgent[];\n onAgentClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentsGrid: React.FC<AgentsGridProps> = ({\n agents,\n onAgentClick,\n onRuntimeClick,\n}) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 2,\n }}\n >\n {agents.map(a => (\n <AgentCard\n key={a.entityRef}\n agent={a}\n onClick={onAgentClick}\n onRuntimeClick={onRuntimeClick}\n />\n ))}\n </Box>\n );\n};", "import React from 'react';\nimport {\n Box,\n Chip,\n Drawer,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Stack,\n Typography,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentDetailDrawerProps {\n agent: AiAgent | null;\n open: boolean;\n onClose: () => void;\n onRefreshStatus?: (entityRef: string) => void;\n}\n\nconst Row: React.FC<{ label: string; children: React.ReactNode }> = ({\n label,\n children,\n}) => (\n <Box sx={{ display: 'flex', gap: 1, mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 110 }}>\n {label}\n </Typography>\n <Box sx={{ flexGrow: 1 }}>{children}</Box>\n </Box>\n);\n\nexport const AgentDetailDrawer: React.FC<AgentDetailDrawerProps> = ({\n agent,\n open,\n onClose,\n onRefreshStatus,\n}) => {\n if (!agent) return null;\n const title = agent.title ?? agent.name;\n\n const copyRef = () => {\n navigator.clipboard?.writeText(agent.entityRef).catch(() => {});\n };\n\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n sx={{ '& .MuiDrawer-paper': { width: { xs: '100%', sm: 480 } } }}\n >\n <Box sx={{ p: 2, display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={56} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h6\">{title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n cursor: 'pointer',\n }}\n onClick={copyRef}\n >\n {agent.entityRef}\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n </Typography>\n </Box>\n <IconButton size=\"small\" onClick={onClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Box sx={{ px: 2, pb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <AgentStatusBadge status={agent.status} />\n {onRefreshStatus && (\n <IconButton\n size=\"small\"\n title=\"Refresh status\"\n onClick={() => onRefreshStatus(agent.entityRef)}\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n\n <Box sx={{ px: 2, pb: 3 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Row label=\"Runtime\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <RuntimeBadge runtime={agent.runtime.runtime} />\n {agent.runtime.endpoint && (\n <Link\n href={agent.runtime.endpoint}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}\n >\n endpoint <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n )}\n </Stack>\n {agent.runtime.runtimeHandle && (\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5, wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n )}\n </Row>\n\n <Row label=\"Capabilities\">\n {agent.capabilities.length ? (\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n <Row label=\"Billing\">\n <BillingBadge billing={agent.billing} />\n </Row>\n\n <Row label=\"Owner\">{agent.owner ?? '\u2014'}</Row>\n <Row label=\"System\">{agent.system ?? '\u2014'}</Row>\n <Row label=\"Lifecycle\">{agent.lifecycle ?? '\u2014'}</Row>\n <Row label=\"Version\">{agent.version ?? '\u2014'}</Row>\n <Row label=\"Tags\">\n {agent.tags.length ? (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => (\n <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n {agent.links.length > 0 && (\n <Row label=\"Links\">\n <List dense disablePadding>\n {agent.links.map((l, i) => (\n <ListItem\n key={i}\n component=\"a\"\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ color: 'text.primary', borderRadius: 1, '&:hover': { bgcolor: 'action.hover' } }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </ListItemIcon>\n <ListItemText primary={l.title} secondary={l.url}\n secondaryTypographyProps={{ sx: { fontSize: '0.7rem' } as const, noWrap: true }} />\n </ListItem>\n ))}\n </List>\n </Row>\n )}\n\n <Row label=\"Catalog\">\n <Link href={`/catalog/${agent.entityRef.replace(':', '/')}`}>\n Open in catalog <OpenInNewIcon sx={{ fontSize: 12, verticalAlign: 'middle' }} />\n </Link>\n </Row>\n </Box>\n </Drawer>\n );\n};", "import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\nimport { EmptyState } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent, AgentStatus } from '../types';\nimport { useAgents } from '../hooks/useAgents';\nimport { AgentFiltersBar } from './AgentFilters';\nimport { AgentsGrid } from './AgentsGrid';\nimport { AgentDetailDrawer } from './AgentDetailDrawer';\n\nconst POLL_INTERVAL_MS = 30_000;\n\nexport const AgentsPage: React.FC = () => {\n const api = useApi(aiAgentsApiRef);\n const { agents, allAgents, loading, error, retry, filters, update, reset } =\n useAgents();\n\n const [selected, setSelected] = useState<AiAgent | null>(null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [statuses, setStatuses] = useState<Record<string, AgentStatus>>({});\n\n const refs = allAgents.map(a => a.entityRef);\n\n // Initial + on-ref-change status fetch. Polling runs separately below.\n useEffect(() => {\n let cancelled = false;\n if (!refs.length) return;\n api.getStatuses(refs).then(result => {\n if (!cancelled) setStatuses(result);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.join(',')]);\n\n // Best-effort polling for live status while the page is mounted.\n useEffect(() => {\n if (!refs.length) return;\n const id = setInterval(async () => {\n const result = await api.getStatuses(refs);\n setStatuses(prev => ({ ...prev, ...result }));\n }, POLL_INTERVAL_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.length]);\n\n const agentsWithStatus = agents.map(a => ({\n ...a,\n status: statuses[a.entityRef] ?? a.status,\n }));\n\n const handleCardClick = useCallback((agent: AiAgent) => {\n setSelected(agent);\n setDrawerOpen(true);\n }, []);\n\n const handleRuntimeClick = useCallback(\n (runtime: string) => {\n if (!filters.runtime.includes(runtime)) {\n update({ runtime: [...filters.runtime, runtime] });\n }\n },\n [filters.runtime, update],\n );\n\n const handleRefreshStatus = useCallback(\n async (entityRef: string) => {\n const result = await api.getStatuses([entityRef]);\n setStatuses(prev => ({ ...prev, ...result }));\n setSelected(prev =>\n prev && prev.entityRef === entityRef\n ? { ...prev, status: result[entityRef] ?? prev.status }\n : prev,\n );\n },\n [api],\n );\n\n if (loading && !allAgents.length) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"40vh\">\n <CircularProgress />\n </Box>\n );\n }\n\n if (error) {\n return (\n <EmptyState\n title=\"Failed to load AI agents\"\n description={error.message}\n missing=\"content\"\n />\n );\n }\n\n return (\n <Box sx={{ p: 3 }}>\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"h4\">AI Agents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n AI agents registered in the catalog as <code>Component</code> entities\n with <code>spec.type: ai-agent</code>.\n </Typography>\n </Box>\n\n <AgentFiltersBar\n agents={allAgents}\n filters={filters}\n onChange={update}\n onReset={reset}\n />\n\n {agentsWithStatus.length === 0 ? (\n <EmptyState\n title=\"No AI agents registered\"\n description=\"Add a Component with spec.type: ai-agent to the catalog, or adjust your filters.\"\n missing=\"content\"\n action={<button onClick={() => retry()}>Retry</button>}\n />\n ) : (\n <AgentsGrid\n agents={agentsWithStatus}\n onAgentClick={handleCardClick}\n onRuntimeClick={handleRuntimeClick}\n />\n )}\n\n <AgentDetailDrawer\n agent={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefreshStatus={handleRefreshStatus}\n />\n </Box>\n );\n};", "export { aiAgentsPlugin } from './plugin';\nexport { AgentsPage } from './components/AgentsPage';\nexport { AgentCard } from './components/AgentCard';\nexport { aiAgentsApiRef, AiAgentsApi } from './api';\nexport type { AiAgentsApiInterface } from './api';\nexport {\n AI_AGENT_TYPE,\n AI_AGENT_ANNOTATION_PREFIX,\n entityToAgent,\n} from './types';\nexport type {\n AiAgent,\n AgentRuntimeInfo,\n AgentRuntimeName,\n AgentBilling,\n AgentBillingModel,\n AgentCapability,\n AgentCapabilityCategory,\n AgentStatus,\n AgentStatusState,\n} from './types';", "import React from 'react';\nimport { SmartToy as AgentIcon } from '@mui/icons-material';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { aiAgentsApiRef, AiAgentsApi } from './api';\n\nconst aiAgentsApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: aiAgentsApiRef,\n deps: { fetchApi: fetchApiRef, catalogApi: catalogApiRef },\n factory: ({ fetchApi, catalogApi }) =>\n new AiAgentsApi({ fetchApi, catalogApi }),\n }),\n});\n\nconst aiAgentsPage = PageBlueprint.make({\n params: {\n path: '/ai-agents',\n title: 'AI Agents',\n icon: <AgentIcon />,\n loader: async () => {\n const { AgentsPage } = await import('./components/AgentsPage');\n return <AgentsPage />;\n },\n },\n});\n\nexport const aiAgentsPlugin = createFrontendPlugin({\n pluginId: 'ai-agents',\n extensions: [aiAgentsApi, aiAgentsPage],\n});"],
5
- "mappings": "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",
6
- "names": ["entityRef", "import_core_plugin_api", "import_react", "React", "SearchIcon", "ClearIcon", "import_react", "import_material", "React", "import_react", "import_material", "React", "import_react", "import_material", "React", "import_react", "import_material", "React", "CloudQueueIcon", "MemoryIcon", "FunctionsIcon", "ExtensionIcon", "import_react", "import_material", "React", "import_react", "import_material", "React", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "import_react", "React", "Box", "import_react", "import_material", "import_Dashboard", "import_Description", "import_Article", "import_BugReport", "LINK_ICON", "React", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "ContentCopyIcon", "CloseIcon", "RefreshIcon", "OpenInNewIcon", "import_react", "import_material", "import_core_plugin_api", "entityRef", "React", "import_react", "React", "AgentIcon", "AgentsPage"]
3
+ "sources": ["../src/types.ts", "../src/api.ts", "../src/hooks/useAgents.ts", "../src/components/AgentFilters.tsx", "../src/components/AgentAvatar.tsx", "../src/components/AgentStatusBadge.tsx", "../src/components/AgentCapabilities.tsx", "../src/components/RuntimeBadge.tsx", "../src/components/BillingBadge.tsx", "../src/components/AgentCard.tsx", "../src/components/AgentsGrid.tsx", "../src/components/AgentDetailDrawer.tsx", "../src/components/AgentsPage.tsx", "../src/components/AgentOverviewCard.tsx", "../src/index.ts", "../src/plugin.tsx"],
4
+ "sourcesContent": ["import { Entity } from '@backstage/catalog-model';\n\n/** Value of `spec.type` that marks a catalog Component as an AI agent. */\nexport const AI_AGENT_TYPE = 'ai-agent';\n\n/** Annotation namespace for agent-specific fields on a catalog entity. */\nexport const AI_AGENT_ANNOTATION_PREFIX = 'ai-agent.acarmisc.org';\n\nexport type AgentRuntimeName =\n | 'bedrock-agentcore'\n | 'litellm'\n | 'lambda'\n | 'custom'\n | string;\n\nexport interface AgentRuntimeInfo {\n /** Runtime identifier, e.g. \"bedrock-agentcore\", \"litellm\", \"lambda\", \"custom\". */\n runtime: AgentRuntimeName;\n /** Opaque handle/ARN/identifier the backend uses to probe the agent. */\n runtimeHandle?: string;\n /** Public invocation endpoint, if any. */\n endpoint?: string;\n /** Health-check URL the backend can call. */\n healthUrl?: string;\n}\n\nexport type AgentBillingModel =\n | 'per-invocation'\n | 'per-token'\n | 'subscription'\n | 'free'\n | string;\n\nexport interface AgentBilling {\n model: AgentBillingModel;\n /** Cost per 1000 invocations (per-invocation) or per 1M tokens (per-token). */\n unitCost?: number;\n /** Monthly spend cap if known. */\n budget?: number;\n}\n\nexport type AgentCapabilityCategory =\n | 'reasoning'\n | 'retrieval'\n | 'tools'\n | 'vision'\n | 'voice'\n | 'data'\n | 'safety';\n\nexport interface AgentCapability {\n label: string;\n category?: AgentCapabilityCategory;\n}\n\nexport type AgentStatusState = 'healthy' | 'degraded' | 'down' | 'unknown';\n\nexport interface AgentStatus {\n state: AgentStatusState;\n lastChecked?: string;\n latencyMs?: number;\n message?: string;\n}\n\nexport interface AiAgent {\n /** Backstage entity ref, e.g. \"component:default/support-triage-agent\". */\n entityRef: string;\n name: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n owner?: string;\n system?: string;\n lifecycle?: string;\n version?: string;\n /** Human-readable purpose (defaults to description when no dedicated field). */\n purpose: string;\n runtime: AgentRuntimeInfo;\n billing: AgentBilling;\n capabilities: AgentCapability[];\n tags: string[];\n links: { url: string; title: string; icon?: string }[];\n /** Populated by the backend status probe; undefined in the static view. */\n status?: AgentStatus;\n rawEntity: Entity;\n}\n\nconst VALID_CATEGORIES = new Set<AgentCapabilityCategory>([\n 'reasoning',\n 'retrieval',\n 'tools',\n 'vision',\n 'voice',\n 'data',\n 'safety',\n]);\n\nfunction annotation(entity: Entity, key: string): string | undefined {\n return entity.metadata.annotations?.[`${AI_AGENT_ANNOTATION_PREFIX}/${key}`];\n}\n\nfunction parseFloatSafe(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCapabilities(raw: string | undefined): AgentCapability[] {\n if (!raw) return [];\n return raw\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(Boolean)\n .map(token => {\n const [label, catRaw] = token.split(':').map(s => s.trim());\n const category = catRaw ? (catRaw as AgentCapabilityCategory) : undefined;\n return {\n label,\n category:\n category && VALID_CATEGORIES.has(category) ? category : undefined,\n };\n });\n}\n\nfunction entityRef(entity: Entity): string {\n const ns = entity.metadata.namespace ?? 'default';\n return `${entity.kind.toLowerCase()}:${ns}/${entity.metadata.name}`;\n}\n\nfunction purpose(entity: Entity): string {\n const explicit = annotation(entity, 'purpose');\n return (explicit ?? entity.metadata.description ?? '').trim();\n}\n\n/** Map a Backstage catalog Component entity to the plugin's AiAgent shape. */\nexport function entityToAgent(\n entity: Entity,\n status?: AgentStatus,\n): AiAgent | undefined {\n if (entity.spec?.type !== AI_AGENT_TYPE) return undefined;\n\n const links = (entity.metadata.links ?? []).map(l => ({\n url: l.url,\n title: l.title ?? l.url,\n icon: l.icon,\n }));\n\n return {\n entityRef: entityRef(entity),\n name: entity.metadata.name,\n title: entity.metadata.title,\n description: entity.metadata.description,\n avatarUrl: annotation(entity, 'avatar'),\n owner: (entity.spec as Record<string, unknown> | undefined)?.owner as\n | string\n | undefined,\n system: (entity.spec as Record<string, unknown> | undefined)?.system as\n | string\n | undefined,\n lifecycle: (entity.spec as Record<string, unknown> | undefined)?.lifecycle as\n | string\n | undefined,\n version: annotation(entity, 'version'),\n purpose: purpose(entity),\n runtime: {\n runtime: annotation(entity, 'runtime') ?? 'custom',\n runtimeHandle: annotation(entity, 'runtime-handle'),\n endpoint: annotation(entity, 'endpoint'),\n healthUrl: annotation(entity, 'health'),\n },\n billing: {\n model: annotation(entity, 'billing-model') ?? 'free',\n unitCost: parseFloatSafe(annotation(entity, 'cost-per-1k')),\n budget: parseFloatSafe(annotation(entity, 'budget')),\n },\n capabilities: parseCapabilities(annotation(entity, 'capabilities')),\n tags: entity.metadata.tags ?? [],\n links,\n status,\n rawEntity: entity,\n };\n}", "import { createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport {\n AI_AGENT_TYPE,\n AiAgent,\n AgentStatus,\n entityToAgent,\n} from './types';\n\nexport interface AiAgentsApiInterface {\n listAgents(): Promise<AiAgent[]>;\n getAgent(entityRef: string): Promise<AiAgent | undefined>;\n /** Probe live status for the given entity refs via the backend. */\n getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>>;\n}\n\nexport const aiAgentsApiRef = createApiRef<AiAgentsApiInterface>({\n id: 'plugin.ai-agents.api',\n});\n\nexport class AiAgentsApi implements AiAgentsApiInterface {\n constructor(\n private readonly opts: {\n fetchApi: FetchApi;\n catalogApi: CatalogApi;\n },\n private readonly basePath = '/api/ai-agents',\n ) {}\n\n async listAgents(): Promise<AiAgent[]> {\n const result = await this.opts.catalogApi.getEntities({\n filter: { kind: 'Component', 'spec.type': AI_AGENT_TYPE },\n });\n return result.items\n .map(e => entityToAgent(e))\n .filter((a): a is AiAgent => a !== undefined);\n }\n\n async getAgent(entityRef: string): Promise<AiAgent | undefined> {\n const entity = await this.opts.catalogApi.getEntityByRef(entityRef);\n return entity ? entityToAgent(entity) : undefined;\n }\n\n async getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>> {\n if (!entityRefs.length) return {};\n try {\n const res = await this.opts.fetchApi.fetch(\n `${this.basePath}/statuses?refs=${encodeURIComponent(entityRefs.join(','))}`,\n );\n if (!res.ok) return {};\n return (await res.json()) as Record<string, AgentStatus>;\n } catch {\n return {};\n }\n }\n}", "import { useCallback, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent } from '../types';\n\nexport interface AgentFilters {\n search: string;\n runtime: string[];\n capability: string[];\n lifecycle: string[];\n owner: string[];\n}\n\nexport const initialFilters: AgentFilters = {\n search: '',\n runtime: [],\n capability: [],\n lifecycle: [],\n owner: [],\n};\n\nexport function applyFilters(\n agents: AiAgent[],\n filters: AgentFilters,\n): AiAgent[] {\n const search = filters.search.trim().toLowerCase();\n return agents.filter(a => {\n if (search) {\n const haystack = [a.name, a.title, a.description, a.purpose]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(search)) return false;\n }\n if (filters.runtime.length && !filters.runtime.includes(a.runtime.runtime)) {\n return false;\n }\n if (filters.capability.length) {\n const caps = a.capabilities.map(c => c.label);\n if (!filters.capability.every(c => caps.includes(c))) return false;\n }\n if (filters.lifecycle.length && !filters.lifecycle.includes(a.lifecycle ?? '')) {\n return false;\n }\n if (filters.owner.length && !filters.owner.includes(a.owner ?? '')) {\n return false;\n }\n return true;\n });\n}\n\nexport function useAgents() {\n const api = useApi(aiAgentsApiRef);\n const {\n value: agents,\n loading,\n error,\n retry,\n } = useAsyncRetry(() => api.listAgents(), [api]);\n\n const [filters, setFilters] = useState<AgentFilters>(initialFilters);\n\n const filtered = useMemo(\n () => applyFilters(agents ?? [], filters),\n [agents, filters],\n );\n\n const update = useCallback(\n (patch: Partial<AgentFilters>) =>\n setFilters(prev => ({ ...prev, ...patch })),\n [],\n );\n\n const reset = useCallback(() => setFilters(initialFilters), []);\n\n return {\n agents: filtered,\n allAgents: agents ?? [],\n loading,\n error,\n retry,\n filters,\n update,\n reset,\n };\n}", "import React from 'react';\nimport {\n Box,\n IconButton,\n InputAdornment,\n MenuItem,\n Paper,\n TextField,\n Tooltip,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type { AiAgent } from '../types';\nimport type { AgentFilters } from '../hooks/useAgents';\n\nexport interface AgentFiltersBarProps {\n agents: AiAgent[];\n filters: AgentFilters;\n onChange: (patch: Partial<AgentFilters>) => void;\n onReset: () => void;\n}\n\nconst SELECT_PROPS = {\n SelectProps: { multiple: true, renderValue: (v: unknown) => (v as string[]).join(', ') || 'All' },\n} as const;\n\nexport const AgentFiltersBar: React.FC<AgentFiltersBarProps> = ({\n agents,\n filters,\n onChange,\n onReset,\n}) => {\n const runtimes = Array.from(new Set(agents.map(a => a.runtime.runtime))).sort();\n const capabilities = Array.from(\n new Set(agents.flatMap(a => a.capabilities.map(c => c.label))),\n ).sort();\n const lifecycles = Array.from(new Set(agents.map(a => a.lifecycle).filter(Boolean))) as string[];\n const owners = Array.from(new Set(agents.map(a => a.owner).filter(Boolean))) as string[];\n\n const hasFilters =\n filters.search ||\n filters.runtime.length ||\n filters.capability.length ||\n filters.lifecycle.length ||\n filters.owner.length;\n\n return (\n <Paper sx={{ p: 1.5, mb: 2, display: 'flex', gap: 1.5, flexWrap: 'wrap', alignItems: 'center' }}>\n <TextField\n size=\"small\"\n placeholder=\"Search agents\u2026\"\n value={filters.search}\n onChange={e => onChange({ search: e.target.value })}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: filters.search ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={() => onChange({ search: '' })}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n\n <TextField select size=\"small\" label=\"Runtime\" value={filters.runtime}\n onChange={e => onChange({ runtime: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {runtimes.map(r => <MenuItem key={r} value={r}>{r}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Capability\" value={filters.capability}\n onChange={e => onChange({ capability: e.target.value as unknown as string[] })}\n sx={{ minWidth: 150 }} {...SELECT_PROPS}>\n {capabilities.map(c => <MenuItem key={c} value={c}>{c}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Lifecycle\" value={filters.lifecycle}\n onChange={e => onChange({ lifecycle: e.target.value as unknown as string[] })}\n sx={{ minWidth: 130 }} {...SELECT_PROPS}>\n {lifecycles.map(l => <MenuItem key={l} value={l}>{l}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Owner\" value={filters.owner}\n onChange={e => onChange({ owner: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {owners.map(o => <MenuItem key={o} value={o}>{o}</MenuItem>)}\n </TextField>\n\n {hasFilters && (\n <Tooltip title=\"Clear filters\">\n <IconButton size=\"small\" onClick={onReset}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Box sx={{ ml: 'auto', alignSelf: 'center' }}>\n <strong>{agents.length}</strong> agent{agents.length !== 1 ? 's' : ''}\n </Box>\n </Paper>\n );\n};", "import React, { useState } from 'react';\nimport { Box } from '@mui/material';\n\nconst PALETTE = [\n '#1976d2', '#388e3c', '#f57c00', '#7b1fa2',\n '#c62828', '#0097a7', '#5d4037', '#455a64',\n];\n\nfunction initialsOf(name: string): string {\n const parts = name.replace(/[-_]+/g, ' ').trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction colorFor(name: string): string {\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0;\n return PALETTE[Math.abs(hash) % PALETTE.length];\n}\n\nexport interface AgentAvatarProps {\n name: string;\n avatarUrl?: string;\n size?: number;\n}\n\nexport const AgentAvatar: React.FC<AgentAvatarProps> = ({\n name,\n avatarUrl,\n size = 44,\n}) => {\n const [broken, setBroken] = useState(false);\n const showImage = avatarUrl && !broken;\n\n return (\n <Box\n sx={{\n width: size,\n height: size,\n flexShrink: 0,\n borderRadius: '50%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: showImage ? 'transparent' : colorFor(name),\n color: 'common.white',\n fontSize: size * 0.36,\n fontWeight: 700,\n }}\n >\n {showImage ? (\n <img\n src={avatarUrl}\n alt={name}\n width={size}\n height={size}\n onError={() => setBroken(true)}\n style={{ objectFit: 'cover', borderRadius: '50%' }}\n />\n ) : (\n initialsOf(name)\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { AgentStatus, AgentStatusState } from '../types';\n\nconst STATE_COLOR: Record<AgentStatusState, string> = {\n healthy: 'success.main',\n degraded: 'warning.main',\n down: 'error.main',\n unknown: 'text.disabled',\n};\n\nexport interface AgentStatusBadgeProps {\n status?: AgentStatus;\n}\n\nexport const AgentStatusBadge: React.FC<AgentStatusBadgeProps> = ({ status }) => {\n const state = status?.state ?? 'unknown';\n const color = STATE_COLOR[state];\n const ring = state === 'unknown' ? `1px dashed ${color}` : 'none';\n\n const title = status\n ? [\n `Status: ${state}`,\n status.lastChecked ? `Last checked: ${new Date(status.lastChecked).toLocaleString()}` : null,\n status.latencyMs != null ? `Latency: ${status.latencyMs}ms` : null,\n status.message ? status.message : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')\n : 'Status: unknown';\n\n return (\n <Tooltip title={title} arrow>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n cursor: 'help',\n }}\n >\n <Box\n component=\"span\"\n sx={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: color,\n border: ring,\n flexShrink: 0,\n }}\n />\n {status?.latencyMs != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.latencyMs}ms\n </Typography>\n )}\n </Box>\n </Tooltip>\n );\n};", "import React, { useState } from 'react';\nimport { Chip, Box, Popover } from '@mui/material';\nimport type { AgentCapability, AgentCapabilityCategory } from '../types';\n\nconst CATEGORY_COLOR: Record<\n AgentCapabilityCategory,\n 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'error' | 'default'\n> = {\n reasoning: 'primary',\n retrieval: 'info',\n tools: 'secondary',\n vision: 'success',\n voice: 'warning',\n data: 'default',\n safety: 'error',\n};\n\nconst MAX_VISIBLE = 5;\n\nexport interface AgentCapabilitiesProps {\n capabilities: AgentCapability[];\n max?: number;\n size?: 'small' | 'medium';\n}\n\nexport const AgentCapabilities: React.FC<AgentCapabilitiesProps> = ({\n capabilities,\n max = MAX_VISIBLE,\n size = 'small',\n}) => {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n if (!capabilities.length) return null;\n const visible = capabilities.slice(0, max);\n const overflow = capabilities.length - visible.length;\n\n return (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {visible.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size={size}\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n {overflow > 0 && (\n <>\n <Chip\n label={`+${overflow}`}\n size={size}\n clickable\n onClick={e => {\n e.stopPropagation();\n setAnchor(e.currentTarget);\n }}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Box sx={{ p: 1, maxWidth: 280, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {capabilities.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size=\"small\"\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n </Box>\n </Popover>\n </>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Chip, Box } from '@mui/material';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport type { AgentRuntimeName } from '../types';\n\nconst RUNTIME_META: Record<\n string,\n { label: string; icon: React.ReactNode }\n> = {\n 'bedrock-agentcore': { label: 'Bedrock AgentCore', icon: <CloudQueueIcon fontSize=\"small\" /> },\n litellm: { label: 'LiteLLM', icon: <MemoryIcon fontSize=\"small\" /> },\n lambda: { label: 'AWS Lambda', icon: <FunctionsIcon fontSize=\"small\" /> },\n custom: { label: 'Custom', icon: <ExtensionIcon fontSize=\"small\" /> },\n};\n\nexport interface RuntimeBadgeProps {\n runtime: AgentRuntimeName;\n size?: 'small' | 'medium';\n onClick?: (runtime: string) => void;\n}\n\nexport const RuntimeBadge: React.FC<RuntimeBadgeProps> = ({\n runtime,\n size = 'small',\n onClick,\n}) => {\n const meta = RUNTIME_META[runtime] ?? {\n label: String(runtime),\n icon: <ExtensionIcon fontSize=\"small\" />,\n };\n return (\n <Chip\n size={size}\n variant=\"outlined\"\n label={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {meta.icon}\n {meta.label}\n </Box>\n }\n onClick={onClick ? () => onClick(runtime) : undefined}\n clickable={Boolean(onClick)}\n />\n );\n};", "import React from 'react';\nimport { Chip, Box, Typography } from '@mui/material';\nimport type { AgentBilling } from '../types';\n\nconst BILLING_COLOR: Record<string, 'primary' | 'secondary' | 'success' | 'default'> = {\n 'per-invocation': 'primary',\n 'per-token': 'secondary',\n subscription: 'success',\n free: 'default',\n};\n\nexport interface BillingBadgeProps {\n billing: AgentBilling;\n}\n\nexport const BillingBadge: React.FC<BillingBadgeProps> = ({ billing }) => {\n const color = BILLING_COLOR[billing.model] ?? 'default';\n const unitLabel =\n billing.model === 'per-token'\n ? 'per 1M tokens'\n : billing.model === 'per-invocation'\n ? 'per 1k calls'\n : null;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n <Chip size=\"small\" color={color} label={billing.model} variant=\"outlined\" />\n {billing.unitCost != null && unitLabel && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~${billing.unitCost} {unitLabel}\n </Typography>\n )}\n {billing.budget != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n budget: ${billing.budget}\n </Typography>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Card, CardActionArea, Chip, Link, Tooltip, Typography } from '@mui/material';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LIFECYCLE_COLOR: Record<string, 'success' | 'warning' | 'error' | 'default'> = {\n production: 'success',\n experimental: 'warning',\n deprecated: 'error',\n};\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentCardProps {\n agent: AiAgent;\n onClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentCard: React.FC<AgentCardProps> = ({\n agent,\n onClick,\n onRuntimeClick,\n}) => {\n const title = agent.title ?? agent.name;\n const lifecycleColor = agent.lifecycle\n ? LIFECYCLE_COLOR[agent.lifecycle] ?? 'default'\n : 'default';\n\n return (\n <Card\n variant=\"outlined\"\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n transition: theme => `box-shadow ${theme.transitions.duration.short}ms`,\n '&:hover': { boxShadow: 6 },\n }}\n >\n <CardActionArea\n onClick={() => onClick?.(agent)}\n sx={{ flexGrow: 1, p: 2, alignItems: 'stretch', display: 'flex' }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\n {/* Header: avatar + title + status */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 1 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\" fontWeight={700} noWrap title={title}>\n {title}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.name}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n {/* Purpose */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n minHeight: '2.6em',\n mb: 1.5,\n }}\n >\n {agent.purpose || 'No description provided.'}\n </Typography>\n\n {/* Runtime */}\n <Box sx={{ mb: 1 }}>\n <RuntimeBadge\n runtime={agent.runtime.runtime}\n onClick={onRuntimeClick}\n />\n </Box>\n\n {/* Capabilities */}\n {agent.capabilities.length > 0 && (\n <Box sx={{ mb: 1.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} />\n </Box>\n )}\n\n {/* Billing */}\n <Box sx={{ mb: 1.5 }}>\n <BillingBadge billing={agent.billing} />\n </Box>\n\n {/* Footer: owner + lifecycle + version */}\n <Box\n sx={{\n mt: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexWrap: 'wrap',\n }}\n >\n {agent.owner && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {agent.owner}\n </Typography>\n )}\n {agent.lifecycle && (\n <Chip\n size=\"small\"\n color={lifecycleColor}\n label={agent.lifecycle}\n variant=\"outlined\"\n sx={{ height: 20, '& .MuiChip-label': { px: 0.75, fontSize: '0.7rem' } }}\n />\n )}\n {agent.version && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n v{agent.version}\n </Typography>\n )}\n </Box>\n\n {/* Links */}\n {agent.links.length > 0 && (\n <Box sx={{ display: 'flex', gap: 1.5, mt: 1.5, pt: 1, borderTop: '1px solid', borderColor: 'divider' }}>\n {agent.links.slice(0, 4).map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={e => e.stopPropagation()}\n sx={{ display: 'inline-flex', color: 'text.secondary' }}\n >\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </Link>\n </Tooltip>\n ))}\n </Box>\n )}\n </Box>\n </CardActionArea>\n </Card>\n );\n};", "import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { AiAgent } from '../types';\nimport { AgentCard } from './AgentCard';\n\nexport interface AgentsGridProps {\n agents: AiAgent[];\n onAgentClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentsGrid: React.FC<AgentsGridProps> = ({\n agents,\n onAgentClick,\n onRuntimeClick,\n}) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 2,\n }}\n >\n {agents.map(a => (\n <AgentCard\n key={a.entityRef}\n agent={a}\n onClick={onAgentClick}\n onRuntimeClick={onRuntimeClick}\n />\n ))}\n </Box>\n );\n};", "import React from 'react';\nimport {\n Box,\n Chip,\n Drawer,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Stack,\n Typography,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentDetailDrawerProps {\n agent: AiAgent | null;\n open: boolean;\n onClose: () => void;\n onRefreshStatus?: (entityRef: string) => void;\n}\n\nconst Row: React.FC<{ label: string; children: React.ReactNode }> = ({\n label,\n children,\n}) => (\n <Box sx={{ display: 'flex', gap: 1, mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 110 }}>\n {label}\n </Typography>\n <Box sx={{ flexGrow: 1 }}>{children}</Box>\n </Box>\n);\n\nexport const AgentDetailDrawer: React.FC<AgentDetailDrawerProps> = ({\n agent,\n open,\n onClose,\n onRefreshStatus,\n}) => {\n if (!agent) return null;\n const title = agent.title ?? agent.name;\n\n const copyRef = () => {\n navigator.clipboard?.writeText(agent.entityRef).catch(() => {});\n };\n\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n sx={{ '& .MuiDrawer-paper': { width: { xs: '100%', sm: 480 } } }}\n >\n <Box sx={{ p: 2, display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={56} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h6\">{title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n cursor: 'pointer',\n }}\n onClick={copyRef}\n >\n {agent.entityRef}\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n </Typography>\n </Box>\n <IconButton size=\"small\" onClick={onClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Box sx={{ px: 2, pb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <AgentStatusBadge status={agent.status} />\n {onRefreshStatus && (\n <IconButton\n size=\"small\"\n title=\"Refresh status\"\n onClick={() => onRefreshStatus(agent.entityRef)}\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n\n <Box sx={{ px: 2, pb: 3 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Row label=\"Runtime\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <RuntimeBadge runtime={agent.runtime.runtime} />\n {agent.runtime.endpoint && (\n <Link\n href={agent.runtime.endpoint}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}\n >\n endpoint <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n )}\n </Stack>\n {agent.runtime.runtimeHandle && (\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5, wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n )}\n </Row>\n\n <Row label=\"Capabilities\">\n {agent.capabilities.length ? (\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n <Row label=\"Billing\">\n <BillingBadge billing={agent.billing} />\n </Row>\n\n <Row label=\"Owner\">{agent.owner ?? '\u2014'}</Row>\n <Row label=\"System\">{agent.system ?? '\u2014'}</Row>\n <Row label=\"Lifecycle\">{agent.lifecycle ?? '\u2014'}</Row>\n <Row label=\"Version\">{agent.version ?? '\u2014'}</Row>\n <Row label=\"Tags\">\n {agent.tags.length ? (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => (\n <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n {agent.links.length > 0 && (\n <Row label=\"Links\">\n <List dense disablePadding>\n {agent.links.map((l, i) => (\n <ListItem\n key={i}\n component=\"a\"\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ color: 'text.primary', borderRadius: 1, '&:hover': { bgcolor: 'action.hover' } }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </ListItemIcon>\n <ListItemText primary={l.title} secondary={l.url}\n secondaryTypographyProps={{ sx: { fontSize: '0.7rem' } as const, noWrap: true }} />\n </ListItem>\n ))}\n </List>\n </Row>\n )}\n\n <Row label=\"Catalog\">\n <Link href={`/catalog/${agent.entityRef.replace(':', '/')}`}>\n Open in catalog <OpenInNewIcon sx={{ fontSize: 12, verticalAlign: 'middle' }} />\n </Link>\n </Row>\n </Box>\n </Drawer>\n );\n};", "import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\nimport { EmptyState } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent, AgentStatus } from '../types';\nimport { useAgents } from '../hooks/useAgents';\nimport { AgentFiltersBar } from './AgentFilters';\nimport { AgentsGrid } from './AgentsGrid';\nimport { AgentDetailDrawer } from './AgentDetailDrawer';\n\nconst POLL_INTERVAL_MS = 30_000;\n\nexport const AgentsPage: React.FC = () => {\n const api = useApi(aiAgentsApiRef);\n const { agents, allAgents, loading, error, retry, filters, update, reset } =\n useAgents();\n\n const [selected, setSelected] = useState<AiAgent | null>(null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [statuses, setStatuses] = useState<Record<string, AgentStatus>>({});\n\n const refs = allAgents.map(a => a.entityRef);\n\n // Initial + on-ref-change status fetch. Polling runs separately below.\n useEffect(() => {\n let cancelled = false;\n if (!refs.length) return;\n api.getStatuses(refs).then(result => {\n if (!cancelled) setStatuses(result);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.join(',')]);\n\n // Best-effort polling for live status while the page is mounted.\n useEffect(() => {\n if (!refs.length) return;\n const id = setInterval(async () => {\n const result = await api.getStatuses(refs);\n setStatuses(prev => ({ ...prev, ...result }));\n }, POLL_INTERVAL_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.length]);\n\n const agentsWithStatus = agents.map(a => ({\n ...a,\n status: statuses[a.entityRef] ?? a.status,\n }));\n\n const handleCardClick = useCallback((agent: AiAgent) => {\n setSelected(agent);\n setDrawerOpen(true);\n }, []);\n\n const handleRuntimeClick = useCallback(\n (runtime: string) => {\n if (!filters.runtime.includes(runtime)) {\n update({ runtime: [...filters.runtime, runtime] });\n }\n },\n [filters.runtime, update],\n );\n\n const handleRefreshStatus = useCallback(\n async (entityRef: string) => {\n const result = await api.getStatuses([entityRef]);\n setStatuses(prev => ({ ...prev, ...result }));\n setSelected(prev =>\n prev && prev.entityRef === entityRef\n ? { ...prev, status: result[entityRef] ?? prev.status }\n : prev,\n );\n },\n [api],\n );\n\n if (loading && !allAgents.length) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"40vh\">\n <CircularProgress />\n </Box>\n );\n }\n\n if (error) {\n return (\n <EmptyState\n title=\"Failed to load AI agents\"\n description={error.message}\n missing=\"content\"\n />\n );\n }\n\n return (\n <Box sx={{ p: 3 }}>\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"h4\">AI Agents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n AI agents registered in the catalog as <code>Component</code> entities\n with <code>spec.type: ai-agent</code>.\n </Typography>\n </Box>\n\n <AgentFiltersBar\n agents={allAgents}\n filters={filters}\n onChange={update}\n onReset={reset}\n />\n\n {agentsWithStatus.length === 0 ? (\n <EmptyState\n title=\"No AI agents registered\"\n description=\"Add a Component with spec.type: ai-agent to the catalog, or adjust your filters.\"\n missing=\"content\"\n action={<button onClick={() => retry()}>Retry</button>}\n />\n ) : (\n <AgentsGrid\n agents={agentsWithStatus}\n onAgentClick={handleCardClick}\n onRuntimeClick={handleRuntimeClick}\n />\n )}\n\n <AgentDetailDrawer\n agent={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefreshStatus={handleRefreshStatus}\n />\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Chip, Grid, Link, Tooltip, Typography } from '@mui/material';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport { entityToAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { BillingBadge } from './BillingBadge';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nconst RUNTIME_ICON: Record<string, React.ReactNode> = {\n 'bedrock-agentcore': <CloudQueueIcon fontSize=\"small\" />,\n litellm: <MemoryIcon fontSize=\"small\" />,\n lambda: <FunctionsIcon fontSize=\"small\" />,\n custom: <ExtensionIcon fontSize=\"small\" />,\n};\n\nconst Field: React.FC<{ label: string; value?: React.ReactNode; mono?: boolean }> = ({\n label,\n value,\n mono,\n}) => (\n <Grid item xs={6}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" sx={{ wordBreak: 'break-all' }} style={mono ? { fontFamily: 'monospace' } : undefined}>\n {value ?? '\u2014'}\n </Typography>\n </Grid>\n);\n\nexport const AgentOverviewCard: React.FC = () => {\n const { entity } = useEntity();\n if (!entity || entity.spec?.type !== 'ai-agent') return null;\n const agent = entityToAgent(entity);\n if (!agent) return null;\n\n return (\n <Box sx={{ p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 2 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={48} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"h6\" noWrap>{agent.title ?? agent.name}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.entityRef}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Grid container spacing={2}>\n <Field label=\"Runtime\" value={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {RUNTIME_ICON[agent.runtime.runtime] ?? <ExtensionIcon fontSize=\"small\" />}\n {agent.runtime.runtime}\n </Box>\n } />\n <Field label=\"Billing\" value={<BillingBadge billing={agent.billing} />} />\n <Field label=\"Owner\" value={agent.owner} />\n <Field label=\"Lifecycle\" value={agent.lifecycle} />\n <Field label=\"Version\" value={agent.version} />\n <Field label=\"System\" value={agent.system} />\n </Grid>\n\n {agent.runtime.endpoint && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Endpoint</Typography>\n <Typography variant=\"body2\" sx={{ wordBreak: 'break-all' }}>\n <Link href={agent.runtime.endpoint} target=\"_blank\" rel=\"noopener noreferrer\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {agent.runtime.endpoint} <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n </Typography>\n </Box>\n )}\n\n {agent.runtime.runtimeHandle && (\n <Box sx={{ mt: 1 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Runtime handle</Typography>\n <Typography variant=\"body2\" style={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n </Box>\n )}\n\n {agent.capabilities.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Capabilities</Typography>\n <Box sx={{ mt: 0.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n </Box>\n </Box>\n )}\n\n {agent.tags.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Tags</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />)}\n </Box>\n </Box>\n )}\n\n {agent.links.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Links</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {agent.links.map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link href={l.url} target=\"_blank\" rel=\"noopener noreferrer\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {l.title} <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n </Tooltip>\n ))}\n </Box>\n </Box>\n )}\n\n <Box sx={{ mt: 2 }}>\n <Link href={`/ai-agents`}>View on the AI Agents page</Link>\n </Box>\n </Box>\n );\n};", "export { aiAgentsPlugin } from './plugin';\nexport { AgentsPage } from './components/AgentsPage';\nexport { AgentCard } from './components/AgentCard';\nexport { AgentOverviewCard } from './components/AgentOverviewCard';\nexport { aiAgentsApiRef, AiAgentsApi } from './api';\nexport type { AiAgentsApiInterface } from './api';\nexport {\n AI_AGENT_TYPE,\n AI_AGENT_ANNOTATION_PREFIX,\n entityToAgent,\n} from './types';\nexport type {\n AiAgent,\n AgentRuntimeInfo,\n AgentRuntimeName,\n AgentBilling,\n AgentBillingModel,\n AgentCapability,\n AgentCapabilityCategory,\n AgentStatus,\n AgentStatusState,\n} from './types';", "import React from 'react';\nimport { SmartToy as AgentIcon } from '@mui/icons-material';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { aiAgentsApiRef, AiAgentsApi } from './api';\n\nconst aiAgentsApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: aiAgentsApiRef,\n deps: { fetchApi: fetchApiRef, catalogApi: catalogApiRef },\n factory: ({ fetchApi, catalogApi }) =>\n new AiAgentsApi({ fetchApi, catalogApi }),\n }),\n});\n\nconst aiAgentsPage = PageBlueprint.make({\n params: {\n path: '/ai-agents',\n title: 'AI Agents',\n icon: <AgentIcon />,\n loader: async () => {\n const { AgentsPage } = await import('./components/AgentsPage');\n return <AgentsPage />;\n },\n },\n});\n\n// Entity-page card shown on Component entities with spec.type: ai-agent.\n// Renders an agent overview (runtime, billing, capabilities, status) inside\n// the catalog entity Overview page. The filter restricts it to ai-agent\n// entities so it stays hidden on regular services/APIs/resources.\nconst aiAgentOverviewCard = EntityCardBlueprint.make({\n name: 'overview',\n params: {\n filter: {\n 'spec.type': 'ai-agent',\n },\n loader: async () => {\n const { AgentOverviewCard } = await import('./components/AgentOverviewCard');\n return <AgentOverviewCard />;\n },\n },\n});\n\nexport const aiAgentsPlugin = createFrontendPlugin({\n pluginId: 'ai-agents',\n extensions: [aiAgentsApi, aiAgentsPage, aiAgentOverviewCard],\n});"],
5
+ "mappings": "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",
6
+ "names": ["entityRef", "import_core_plugin_api", "import_react", "React", "SearchIcon", "ClearIcon", "import_react", "import_material", "React", "import_react", "import_material", "React", "import_react", "import_material", "React", "import_react", "import_material", "React", "CloudQueueIcon", "MemoryIcon", "FunctionsIcon", "ExtensionIcon", "import_react", "import_material", "React", "import_react", "import_material", "React", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "import_react", "React", "Box", "import_react", "import_material", "import_Dashboard", "import_Description", "import_Article", "import_BugReport", "LINK_ICON", "React", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "ContentCopyIcon", "CloseIcon", "RefreshIcon", "OpenInNewIcon", "import_react", "import_material", "import_core_plugin_api", "entityRef", "React", "import_react", "import_material", "import_OpenInNew", "import_Memory", "import_CloudQueue", "import_Functions", "import_Extension", "React", "CloudQueueIcon", "MemoryIcon", "FunctionsIcon", "ExtensionIcon", "OpenInNewIcon", "import_react", "import_plugin_catalog_react", "React", "AgentIcon", "AgentsPage", "AgentOverviewCard"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { aiAgentsPlugin } from './plugin';
2
2
  export { AgentsPage } from './components/AgentsPage';
3
3
  export { AgentCard } from './components/AgentCard';
4
+ export { AgentOverviewCard } from './components/AgentOverviewCard';
4
5
  export { aiAgentsApiRef, AiAgentsApi } from './api';
5
6
  export type { AiAgentsApiInterface } from './api';
6
7
  export { AI_AGENT_TYPE, AI_AGENT_ANNOTATION_PREFIX, entityToAgent, } from './types';
package/dist/index.esm.js CHANGED
@@ -947,9 +947,52 @@ var init_AgentsPage = __esm({
947
947
  }
948
948
  });
949
949
 
950
+ // src/components/AgentOverviewCard.tsx
951
+ var AgentOverviewCard_exports = {};
952
+ __export(AgentOverviewCard_exports, {
953
+ AgentOverviewCard: () => AgentOverviewCard
954
+ });
955
+ import React11 from "react";
956
+ import { Box as Box11, Chip as Chip6, Grid, Link as Link3, Tooltip as Tooltip4, Typography as Typography6 } from "@mui/material";
957
+ import OpenInNewIcon2 from "@mui/icons-material/OpenInNew";
958
+ import MemoryIcon2 from "@mui/icons-material/Memory";
959
+ import CloudQueueIcon2 from "@mui/icons-material/CloudQueue";
960
+ import FunctionsIcon2 from "@mui/icons-material/Functions";
961
+ import ExtensionIcon2 from "@mui/icons-material/Extension";
962
+ import { useEntity } from "@backstage/plugin-catalog-react";
963
+ var RUNTIME_ICON, Field, AgentOverviewCard;
964
+ var init_AgentOverviewCard = __esm({
965
+ "src/components/AgentOverviewCard.tsx"() {
966
+ "use strict";
967
+ init_types();
968
+ init_AgentAvatar();
969
+ init_AgentStatusBadge();
970
+ init_AgentCapabilities();
971
+ init_BillingBadge();
972
+ RUNTIME_ICON = {
973
+ "bedrock-agentcore": /* @__PURE__ */ React11.createElement(CloudQueueIcon2, { fontSize: "small" }),
974
+ litellm: /* @__PURE__ */ React11.createElement(MemoryIcon2, { fontSize: "small" }),
975
+ lambda: /* @__PURE__ */ React11.createElement(FunctionsIcon2, { fontSize: "small" }),
976
+ custom: /* @__PURE__ */ React11.createElement(ExtensionIcon2, { fontSize: "small" })
977
+ };
978
+ Field = ({
979
+ label,
980
+ value,
981
+ mono
982
+ }) => /* @__PURE__ */ React11.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, label), /* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", sx: { wordBreak: "break-all" }, style: mono ? { fontFamily: "monospace" } : void 0 }, value ?? "\u2014"));
983
+ AgentOverviewCard = () => {
984
+ const { entity } = useEntity();
985
+ if (!entity || entity.spec?.type !== "ai-agent") return null;
986
+ const agent = entityToAgent(entity);
987
+ if (!agent) return null;
988
+ return /* @__PURE__ */ React11.createElement(Box11, { sx: { p: 2 } }, /* @__PURE__ */ React11.createElement(Box11, { sx: { display: "flex", alignItems: "center", gap: 1.5, mb: 2 } }, /* @__PURE__ */ React11.createElement(AgentAvatar, { name: agent.name, avatarUrl: agent.avatarUrl, size: 48 }), /* @__PURE__ */ React11.createElement(Box11, { sx: { flexGrow: 1, minWidth: 0 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "h6", noWrap: true }, agent.title ?? agent.name), /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary", noWrap: true }, agent.entityRef)), /* @__PURE__ */ React11.createElement(AgentStatusBadge, { status: agent.status })), /* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", sx: { mb: 2 } }, agent.purpose || agent.description || "No description provided."), /* @__PURE__ */ React11.createElement(Grid, { container: true, spacing: 2 }, /* @__PURE__ */ React11.createElement(Field, { label: "Runtime", value: /* @__PURE__ */ React11.createElement(Box11, { sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, RUNTIME_ICON[agent.runtime.runtime] ?? /* @__PURE__ */ React11.createElement(ExtensionIcon2, { fontSize: "small" }), agent.runtime.runtime) }), /* @__PURE__ */ React11.createElement(Field, { label: "Billing", value: /* @__PURE__ */ React11.createElement(BillingBadge, { billing: agent.billing }) }), /* @__PURE__ */ React11.createElement(Field, { label: "Owner", value: agent.owner }), /* @__PURE__ */ React11.createElement(Field, { label: "Lifecycle", value: agent.lifecycle }), /* @__PURE__ */ React11.createElement(Field, { label: "Version", value: agent.version }), /* @__PURE__ */ React11.createElement(Field, { label: "System", value: agent.system })), agent.runtime.endpoint && /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 1.5 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, "Endpoint"), /* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", sx: { wordBreak: "break-all" } }, /* @__PURE__ */ React11.createElement(Link3, { href: agent.runtime.endpoint, target: "_blank", rel: "noopener noreferrer", sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, agent.runtime.endpoint, " ", /* @__PURE__ */ React11.createElement(OpenInNewIcon2, { sx: { fontSize: 12 } })))), agent.runtime.runtimeHandle && /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 1 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, "Runtime handle"), /* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", style: { fontFamily: "monospace", wordBreak: "break-all" } }, agent.runtime.runtimeHandle)), agent.capabilities.length > 0 && /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 1.5 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, "Capabilities"), /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 0.5 } }, /* @__PURE__ */ React11.createElement(AgentCapabilities, { capabilities: agent.capabilities, max: 20 }))), agent.tags.length > 0 && /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 1.5 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, "Tags"), /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 0.5, display: "flex", flexWrap: "wrap", gap: 0.5 } }, agent.tags.map((t) => /* @__PURE__ */ React11.createElement(Chip6, { key: t, size: "small", label: t, variant: "outlined" })))), agent.links.length > 0 && /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 1.5 } }, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary" }, "Links"), /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 0.5, display: "flex", flexWrap: "wrap", gap: 1 } }, agent.links.map((l, i) => /* @__PURE__ */ React11.createElement(Tooltip4, { key: i, title: l.title }, /* @__PURE__ */ React11.createElement(Link3, { href: l.url, target: "_blank", rel: "noopener noreferrer", sx: { display: "inline-flex", alignItems: "center", gap: 0.5 } }, l.title, " ", /* @__PURE__ */ React11.createElement(OpenInNewIcon2, { sx: { fontSize: 12 } })))))), /* @__PURE__ */ React11.createElement(Box11, { sx: { mt: 2 } }, /* @__PURE__ */ React11.createElement(Link3, { href: `/ai-agents` }, "View on the AI Agents page")));
989
+ };
990
+ }
991
+ });
992
+
950
993
  // src/plugin.tsx
951
994
  init_api();
952
- import React11 from "react";
995
+ import React12 from "react";
953
996
  import { SmartToy as AgentIcon } from "@mui/icons-material";
954
997
  import {
955
998
  ApiBlueprint,
@@ -958,6 +1001,7 @@ import {
958
1001
  fetchApiRef
959
1002
  } from "@backstage/frontend-plugin-api";
960
1003
  import { catalogApiRef } from "@backstage/plugin-catalog-react";
1004
+ import { EntityCardBlueprint } from "@backstage/plugin-catalog-react/alpha";
961
1005
  var aiAgentsApi = ApiBlueprint.make({
962
1006
  params: (defineParams) => defineParams({
963
1007
  api: aiAgentsApiRef,
@@ -969,27 +1013,41 @@ var aiAgentsPage = PageBlueprint.make({
969
1013
  params: {
970
1014
  path: "/ai-agents",
971
1015
  title: "AI Agents",
972
- icon: /* @__PURE__ */ React11.createElement(AgentIcon, null),
1016
+ icon: /* @__PURE__ */ React12.createElement(AgentIcon, null),
973
1017
  loader: async () => {
974
1018
  const { AgentsPage: AgentsPage2 } = await Promise.resolve().then(() => (init_AgentsPage(), AgentsPage_exports));
975
- return /* @__PURE__ */ React11.createElement(AgentsPage2, null);
1019
+ return /* @__PURE__ */ React12.createElement(AgentsPage2, null);
1020
+ }
1021
+ }
1022
+ });
1023
+ var aiAgentOverviewCard = EntityCardBlueprint.make({
1024
+ name: "overview",
1025
+ params: {
1026
+ filter: {
1027
+ "spec.type": "ai-agent"
1028
+ },
1029
+ loader: async () => {
1030
+ const { AgentOverviewCard: AgentOverviewCard2 } = await Promise.resolve().then(() => (init_AgentOverviewCard(), AgentOverviewCard_exports));
1031
+ return /* @__PURE__ */ React12.createElement(AgentOverviewCard2, null);
976
1032
  }
977
1033
  }
978
1034
  });
979
1035
  var aiAgentsPlugin = createFrontendPlugin({
980
1036
  pluginId: "ai-agents",
981
- extensions: [aiAgentsApi, aiAgentsPage]
1037
+ extensions: [aiAgentsApi, aiAgentsPage, aiAgentOverviewCard]
982
1038
  });
983
1039
 
984
1040
  // src/index.ts
985
1041
  init_AgentsPage();
986
1042
  init_AgentCard();
1043
+ init_AgentOverviewCard();
987
1044
  init_api();
988
1045
  init_types();
989
1046
  export {
990
1047
  AI_AGENT_ANNOTATION_PREFIX,
991
1048
  AI_AGENT_TYPE,
992
1049
  AgentCard,
1050
+ AgentOverviewCard,
993
1051
  AgentsPage,
994
1052
  AiAgentsApi,
995
1053
  aiAgentsApiRef,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/types.ts", "../src/api.ts", "../src/hooks/useAgents.ts", "../src/components/AgentFilters.tsx", "../src/components/AgentAvatar.tsx", "../src/components/AgentStatusBadge.tsx", "../src/components/AgentCapabilities.tsx", "../src/components/RuntimeBadge.tsx", "../src/components/BillingBadge.tsx", "../src/components/AgentCard.tsx", "../src/components/AgentsGrid.tsx", "../src/components/AgentDetailDrawer.tsx", "../src/components/AgentsPage.tsx", "../src/plugin.tsx", "../src/index.ts"],
4
- "sourcesContent": ["import { Entity } from '@backstage/catalog-model';\n\n/** Value of `spec.type` that marks a catalog Component as an AI agent. */\nexport const AI_AGENT_TYPE = 'ai-agent';\n\n/** Annotation namespace for agent-specific fields on a catalog entity. */\nexport const AI_AGENT_ANNOTATION_PREFIX = 'ai-agent.acarmisc.org';\n\nexport type AgentRuntimeName =\n | 'bedrock-agentcore'\n | 'litellm'\n | 'lambda'\n | 'custom'\n | string;\n\nexport interface AgentRuntimeInfo {\n /** Runtime identifier, e.g. \"bedrock-agentcore\", \"litellm\", \"lambda\", \"custom\". */\n runtime: AgentRuntimeName;\n /** Opaque handle/ARN/identifier the backend uses to probe the agent. */\n runtimeHandle?: string;\n /** Public invocation endpoint, if any. */\n endpoint?: string;\n /** Health-check URL the backend can call. */\n healthUrl?: string;\n}\n\nexport type AgentBillingModel =\n | 'per-invocation'\n | 'per-token'\n | 'subscription'\n | 'free'\n | string;\n\nexport interface AgentBilling {\n model: AgentBillingModel;\n /** Cost per 1000 invocations (per-invocation) or per 1M tokens (per-token). */\n unitCost?: number;\n /** Monthly spend cap if known. */\n budget?: number;\n}\n\nexport type AgentCapabilityCategory =\n | 'reasoning'\n | 'retrieval'\n | 'tools'\n | 'vision'\n | 'voice'\n | 'data'\n | 'safety';\n\nexport interface AgentCapability {\n label: string;\n category?: AgentCapabilityCategory;\n}\n\nexport type AgentStatusState = 'healthy' | 'degraded' | 'down' | 'unknown';\n\nexport interface AgentStatus {\n state: AgentStatusState;\n lastChecked?: string;\n latencyMs?: number;\n message?: string;\n}\n\nexport interface AiAgent {\n /** Backstage entity ref, e.g. \"component:default/support-triage-agent\". */\n entityRef: string;\n name: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n owner?: string;\n system?: string;\n lifecycle?: string;\n version?: string;\n /** Human-readable purpose (defaults to description when no dedicated field). */\n purpose: string;\n runtime: AgentRuntimeInfo;\n billing: AgentBilling;\n capabilities: AgentCapability[];\n tags: string[];\n links: { url: string; title: string; icon?: string }[];\n /** Populated by the backend status probe; undefined in the static view. */\n status?: AgentStatus;\n rawEntity: Entity;\n}\n\nconst VALID_CATEGORIES = new Set<AgentCapabilityCategory>([\n 'reasoning',\n 'retrieval',\n 'tools',\n 'vision',\n 'voice',\n 'data',\n 'safety',\n]);\n\nfunction annotation(entity: Entity, key: string): string | undefined {\n return entity.metadata.annotations?.[`${AI_AGENT_ANNOTATION_PREFIX}/${key}`];\n}\n\nfunction parseFloatSafe(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCapabilities(raw: string | undefined): AgentCapability[] {\n if (!raw) return [];\n return raw\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(Boolean)\n .map(token => {\n const [label, catRaw] = token.split(':').map(s => s.trim());\n const category = catRaw ? (catRaw as AgentCapabilityCategory) : undefined;\n return {\n label,\n category:\n category && VALID_CATEGORIES.has(category) ? category : undefined,\n };\n });\n}\n\nfunction entityRef(entity: Entity): string {\n const ns = entity.metadata.namespace ?? 'default';\n return `${entity.kind.toLowerCase()}:${ns}/${entity.metadata.name}`;\n}\n\nfunction purpose(entity: Entity): string {\n const explicit = annotation(entity, 'purpose');\n return (explicit ?? entity.metadata.description ?? '').trim();\n}\n\n/** Map a Backstage catalog Component entity to the plugin's AiAgent shape. */\nexport function entityToAgent(\n entity: Entity,\n status?: AgentStatus,\n): AiAgent | undefined {\n if (entity.spec?.type !== AI_AGENT_TYPE) return undefined;\n\n const links = (entity.metadata.links ?? []).map(l => ({\n url: l.url,\n title: l.title ?? l.url,\n icon: l.icon,\n }));\n\n return {\n entityRef: entityRef(entity),\n name: entity.metadata.name,\n title: entity.metadata.title,\n description: entity.metadata.description,\n avatarUrl: annotation(entity, 'avatar'),\n owner: (entity.spec as Record<string, unknown> | undefined)?.owner as\n | string\n | undefined,\n system: (entity.spec as Record<string, unknown> | undefined)?.system as\n | string\n | undefined,\n lifecycle: (entity.spec as Record<string, unknown> | undefined)?.lifecycle as\n | string\n | undefined,\n version: annotation(entity, 'version'),\n purpose: purpose(entity),\n runtime: {\n runtime: annotation(entity, 'runtime') ?? 'custom',\n runtimeHandle: annotation(entity, 'runtime-handle'),\n endpoint: annotation(entity, 'endpoint'),\n healthUrl: annotation(entity, 'health'),\n },\n billing: {\n model: annotation(entity, 'billing-model') ?? 'free',\n unitCost: parseFloatSafe(annotation(entity, 'cost-per-1k')),\n budget: parseFloatSafe(annotation(entity, 'budget')),\n },\n capabilities: parseCapabilities(annotation(entity, 'capabilities')),\n tags: entity.metadata.tags ?? [],\n links,\n status,\n rawEntity: entity,\n };\n}", "import { createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport {\n AI_AGENT_TYPE,\n AiAgent,\n AgentStatus,\n entityToAgent,\n} from './types';\n\nexport interface AiAgentsApiInterface {\n listAgents(): Promise<AiAgent[]>;\n getAgent(entityRef: string): Promise<AiAgent | undefined>;\n /** Probe live status for the given entity refs via the backend. */\n getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>>;\n}\n\nexport const aiAgentsApiRef = createApiRef<AiAgentsApiInterface>({\n id: 'plugin.ai-agents.api',\n});\n\nexport class AiAgentsApi implements AiAgentsApiInterface {\n constructor(\n private readonly opts: {\n fetchApi: FetchApi;\n catalogApi: CatalogApi;\n },\n private readonly basePath = '/api/ai-agents',\n ) {}\n\n async listAgents(): Promise<AiAgent[]> {\n const result = await this.opts.catalogApi.getEntities({\n filter: { kind: 'Component', 'spec.type': AI_AGENT_TYPE },\n });\n return result.items\n .map(e => entityToAgent(e))\n .filter((a): a is AiAgent => a !== undefined);\n }\n\n async getAgent(entityRef: string): Promise<AiAgent | undefined> {\n const entity = await this.opts.catalogApi.getEntityByRef(entityRef);\n return entity ? entityToAgent(entity) : undefined;\n }\n\n async getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>> {\n if (!entityRefs.length) return {};\n try {\n const res = await this.opts.fetchApi.fetch(\n `${this.basePath}/statuses?refs=${encodeURIComponent(entityRefs.join(','))}`,\n );\n if (!res.ok) return {};\n return (await res.json()) as Record<string, AgentStatus>;\n } catch {\n return {};\n }\n }\n}", "import { useCallback, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent } from '../types';\n\nexport interface AgentFilters {\n search: string;\n runtime: string[];\n capability: string[];\n lifecycle: string[];\n owner: string[];\n}\n\nexport const initialFilters: AgentFilters = {\n search: '',\n runtime: [],\n capability: [],\n lifecycle: [],\n owner: [],\n};\n\nexport function applyFilters(\n agents: AiAgent[],\n filters: AgentFilters,\n): AiAgent[] {\n const search = filters.search.trim().toLowerCase();\n return agents.filter(a => {\n if (search) {\n const haystack = [a.name, a.title, a.description, a.purpose]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(search)) return false;\n }\n if (filters.runtime.length && !filters.runtime.includes(a.runtime.runtime)) {\n return false;\n }\n if (filters.capability.length) {\n const caps = a.capabilities.map(c => c.label);\n if (!filters.capability.every(c => caps.includes(c))) return false;\n }\n if (filters.lifecycle.length && !filters.lifecycle.includes(a.lifecycle ?? '')) {\n return false;\n }\n if (filters.owner.length && !filters.owner.includes(a.owner ?? '')) {\n return false;\n }\n return true;\n });\n}\n\nexport function useAgents() {\n const api = useApi(aiAgentsApiRef);\n const {\n value: agents,\n loading,\n error,\n retry,\n } = useAsyncRetry(() => api.listAgents(), [api]);\n\n const [filters, setFilters] = useState<AgentFilters>(initialFilters);\n\n const filtered = useMemo(\n () => applyFilters(agents ?? [], filters),\n [agents, filters],\n );\n\n const update = useCallback(\n (patch: Partial<AgentFilters>) =>\n setFilters(prev => ({ ...prev, ...patch })),\n [],\n );\n\n const reset = useCallback(() => setFilters(initialFilters), []);\n\n return {\n agents: filtered,\n allAgents: agents ?? [],\n loading,\n error,\n retry,\n filters,\n update,\n reset,\n };\n}", "import React from 'react';\nimport {\n Box,\n IconButton,\n InputAdornment,\n MenuItem,\n Paper,\n TextField,\n Tooltip,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type { AiAgent } from '../types';\nimport type { AgentFilters } from '../hooks/useAgents';\n\nexport interface AgentFiltersBarProps {\n agents: AiAgent[];\n filters: AgentFilters;\n onChange: (patch: Partial<AgentFilters>) => void;\n onReset: () => void;\n}\n\nconst SELECT_PROPS = {\n SelectProps: { multiple: true, renderValue: (v: unknown) => (v as string[]).join(', ') || 'All' },\n} as const;\n\nexport const AgentFiltersBar: React.FC<AgentFiltersBarProps> = ({\n agents,\n filters,\n onChange,\n onReset,\n}) => {\n const runtimes = Array.from(new Set(agents.map(a => a.runtime.runtime))).sort();\n const capabilities = Array.from(\n new Set(agents.flatMap(a => a.capabilities.map(c => c.label))),\n ).sort();\n const lifecycles = Array.from(new Set(agents.map(a => a.lifecycle).filter(Boolean))) as string[];\n const owners = Array.from(new Set(agents.map(a => a.owner).filter(Boolean))) as string[];\n\n const hasFilters =\n filters.search ||\n filters.runtime.length ||\n filters.capability.length ||\n filters.lifecycle.length ||\n filters.owner.length;\n\n return (\n <Paper sx={{ p: 1.5, mb: 2, display: 'flex', gap: 1.5, flexWrap: 'wrap', alignItems: 'center' }}>\n <TextField\n size=\"small\"\n placeholder=\"Search agents\u2026\"\n value={filters.search}\n onChange={e => onChange({ search: e.target.value })}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: filters.search ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={() => onChange({ search: '' })}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n\n <TextField select size=\"small\" label=\"Runtime\" value={filters.runtime}\n onChange={e => onChange({ runtime: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {runtimes.map(r => <MenuItem key={r} value={r}>{r}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Capability\" value={filters.capability}\n onChange={e => onChange({ capability: e.target.value as unknown as string[] })}\n sx={{ minWidth: 150 }} {...SELECT_PROPS}>\n {capabilities.map(c => <MenuItem key={c} value={c}>{c}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Lifecycle\" value={filters.lifecycle}\n onChange={e => onChange({ lifecycle: e.target.value as unknown as string[] })}\n sx={{ minWidth: 130 }} {...SELECT_PROPS}>\n {lifecycles.map(l => <MenuItem key={l} value={l}>{l}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Owner\" value={filters.owner}\n onChange={e => onChange({ owner: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {owners.map(o => <MenuItem key={o} value={o}>{o}</MenuItem>)}\n </TextField>\n\n {hasFilters && (\n <Tooltip title=\"Clear filters\">\n <IconButton size=\"small\" onClick={onReset}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Box sx={{ ml: 'auto', alignSelf: 'center' }}>\n <strong>{agents.length}</strong> agent{agents.length !== 1 ? 's' : ''}\n </Box>\n </Paper>\n );\n};", "import React, { useState } from 'react';\nimport { Box } from '@mui/material';\n\nconst PALETTE = [\n '#1976d2', '#388e3c', '#f57c00', '#7b1fa2',\n '#c62828', '#0097a7', '#5d4037', '#455a64',\n];\n\nfunction initialsOf(name: string): string {\n const parts = name.replace(/[-_]+/g, ' ').trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction colorFor(name: string): string {\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0;\n return PALETTE[Math.abs(hash) % PALETTE.length];\n}\n\nexport interface AgentAvatarProps {\n name: string;\n avatarUrl?: string;\n size?: number;\n}\n\nexport const AgentAvatar: React.FC<AgentAvatarProps> = ({\n name,\n avatarUrl,\n size = 44,\n}) => {\n const [broken, setBroken] = useState(false);\n const showImage = avatarUrl && !broken;\n\n return (\n <Box\n sx={{\n width: size,\n height: size,\n flexShrink: 0,\n borderRadius: '50%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: showImage ? 'transparent' : colorFor(name),\n color: 'common.white',\n fontSize: size * 0.36,\n fontWeight: 700,\n }}\n >\n {showImage ? (\n <img\n src={avatarUrl}\n alt={name}\n width={size}\n height={size}\n onError={() => setBroken(true)}\n style={{ objectFit: 'cover', borderRadius: '50%' }}\n />\n ) : (\n initialsOf(name)\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { AgentStatus, AgentStatusState } from '../types';\n\nconst STATE_COLOR: Record<AgentStatusState, string> = {\n healthy: 'success.main',\n degraded: 'warning.main',\n down: 'error.main',\n unknown: 'text.disabled',\n};\n\nexport interface AgentStatusBadgeProps {\n status?: AgentStatus;\n}\n\nexport const AgentStatusBadge: React.FC<AgentStatusBadgeProps> = ({ status }) => {\n const state = status?.state ?? 'unknown';\n const color = STATE_COLOR[state];\n const ring = state === 'unknown' ? `1px dashed ${color}` : 'none';\n\n const title = status\n ? [\n `Status: ${state}`,\n status.lastChecked ? `Last checked: ${new Date(status.lastChecked).toLocaleString()}` : null,\n status.latencyMs != null ? `Latency: ${status.latencyMs}ms` : null,\n status.message ? status.message : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')\n : 'Status: unknown';\n\n return (\n <Tooltip title={title} arrow>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n cursor: 'help',\n }}\n >\n <Box\n component=\"span\"\n sx={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: color,\n border: ring,\n flexShrink: 0,\n }}\n />\n {status?.latencyMs != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.latencyMs}ms\n </Typography>\n )}\n </Box>\n </Tooltip>\n );\n};", "import React, { useState } from 'react';\nimport { Chip, Box, Popover } from '@mui/material';\nimport type { AgentCapability, AgentCapabilityCategory } from '../types';\n\nconst CATEGORY_COLOR: Record<\n AgentCapabilityCategory,\n 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'error' | 'default'\n> = {\n reasoning: 'primary',\n retrieval: 'info',\n tools: 'secondary',\n vision: 'success',\n voice: 'warning',\n data: 'default',\n safety: 'error',\n};\n\nconst MAX_VISIBLE = 5;\n\nexport interface AgentCapabilitiesProps {\n capabilities: AgentCapability[];\n max?: number;\n size?: 'small' | 'medium';\n}\n\nexport const AgentCapabilities: React.FC<AgentCapabilitiesProps> = ({\n capabilities,\n max = MAX_VISIBLE,\n size = 'small',\n}) => {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n if (!capabilities.length) return null;\n const visible = capabilities.slice(0, max);\n const overflow = capabilities.length - visible.length;\n\n return (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {visible.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size={size}\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n {overflow > 0 && (\n <>\n <Chip\n label={`+${overflow}`}\n size={size}\n clickable\n onClick={e => {\n e.stopPropagation();\n setAnchor(e.currentTarget);\n }}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Box sx={{ p: 1, maxWidth: 280, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {capabilities.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size=\"small\"\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n </Box>\n </Popover>\n </>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Chip, Box } from '@mui/material';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport type { AgentRuntimeName } from '../types';\n\nconst RUNTIME_META: Record<\n string,\n { label: string; icon: React.ReactNode }\n> = {\n 'bedrock-agentcore': { label: 'Bedrock AgentCore', icon: <CloudQueueIcon fontSize=\"small\" /> },\n litellm: { label: 'LiteLLM', icon: <MemoryIcon fontSize=\"small\" /> },\n lambda: { label: 'AWS Lambda', icon: <FunctionsIcon fontSize=\"small\" /> },\n custom: { label: 'Custom', icon: <ExtensionIcon fontSize=\"small\" /> },\n};\n\nexport interface RuntimeBadgeProps {\n runtime: AgentRuntimeName;\n size?: 'small' | 'medium';\n onClick?: (runtime: string) => void;\n}\n\nexport const RuntimeBadge: React.FC<RuntimeBadgeProps> = ({\n runtime,\n size = 'small',\n onClick,\n}) => {\n const meta = RUNTIME_META[runtime] ?? {\n label: String(runtime),\n icon: <ExtensionIcon fontSize=\"small\" />,\n };\n return (\n <Chip\n size={size}\n variant=\"outlined\"\n label={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {meta.icon}\n {meta.label}\n </Box>\n }\n onClick={onClick ? () => onClick(runtime) : undefined}\n clickable={Boolean(onClick)}\n />\n );\n};", "import React from 'react';\nimport { Chip, Box, Typography } from '@mui/material';\nimport type { AgentBilling } from '../types';\n\nconst BILLING_COLOR: Record<string, 'primary' | 'secondary' | 'success' | 'default'> = {\n 'per-invocation': 'primary',\n 'per-token': 'secondary',\n subscription: 'success',\n free: 'default',\n};\n\nexport interface BillingBadgeProps {\n billing: AgentBilling;\n}\n\nexport const BillingBadge: React.FC<BillingBadgeProps> = ({ billing }) => {\n const color = BILLING_COLOR[billing.model] ?? 'default';\n const unitLabel =\n billing.model === 'per-token'\n ? 'per 1M tokens'\n : billing.model === 'per-invocation'\n ? 'per 1k calls'\n : null;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n <Chip size=\"small\" color={color} label={billing.model} variant=\"outlined\" />\n {billing.unitCost != null && unitLabel && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~${billing.unitCost} {unitLabel}\n </Typography>\n )}\n {billing.budget != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n budget: ${billing.budget}\n </Typography>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Card, CardActionArea, Chip, Link, Tooltip, Typography } from '@mui/material';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LIFECYCLE_COLOR: Record<string, 'success' | 'warning' | 'error' | 'default'> = {\n production: 'success',\n experimental: 'warning',\n deprecated: 'error',\n};\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentCardProps {\n agent: AiAgent;\n onClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentCard: React.FC<AgentCardProps> = ({\n agent,\n onClick,\n onRuntimeClick,\n}) => {\n const title = agent.title ?? agent.name;\n const lifecycleColor = agent.lifecycle\n ? LIFECYCLE_COLOR[agent.lifecycle] ?? 'default'\n : 'default';\n\n return (\n <Card\n variant=\"outlined\"\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n transition: theme => `box-shadow ${theme.transitions.duration.short}ms`,\n '&:hover': { boxShadow: 6 },\n }}\n >\n <CardActionArea\n onClick={() => onClick?.(agent)}\n sx={{ flexGrow: 1, p: 2, alignItems: 'stretch', display: 'flex' }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\n {/* Header: avatar + title + status */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 1 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\" fontWeight={700} noWrap title={title}>\n {title}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.name}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n {/* Purpose */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n minHeight: '2.6em',\n mb: 1.5,\n }}\n >\n {agent.purpose || 'No description provided.'}\n </Typography>\n\n {/* Runtime */}\n <Box sx={{ mb: 1 }}>\n <RuntimeBadge\n runtime={agent.runtime.runtime}\n onClick={onRuntimeClick}\n />\n </Box>\n\n {/* Capabilities */}\n {agent.capabilities.length > 0 && (\n <Box sx={{ mb: 1.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} />\n </Box>\n )}\n\n {/* Billing */}\n <Box sx={{ mb: 1.5 }}>\n <BillingBadge billing={agent.billing} />\n </Box>\n\n {/* Footer: owner + lifecycle + version */}\n <Box\n sx={{\n mt: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexWrap: 'wrap',\n }}\n >\n {agent.owner && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {agent.owner}\n </Typography>\n )}\n {agent.lifecycle && (\n <Chip\n size=\"small\"\n color={lifecycleColor}\n label={agent.lifecycle}\n variant=\"outlined\"\n sx={{ height: 20, '& .MuiChip-label': { px: 0.75, fontSize: '0.7rem' } }}\n />\n )}\n {agent.version && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n v{agent.version}\n </Typography>\n )}\n </Box>\n\n {/* Links */}\n {agent.links.length > 0 && (\n <Box sx={{ display: 'flex', gap: 1.5, mt: 1.5, pt: 1, borderTop: '1px solid', borderColor: 'divider' }}>\n {agent.links.slice(0, 4).map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={e => e.stopPropagation()}\n sx={{ display: 'inline-flex', color: 'text.secondary' }}\n >\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </Link>\n </Tooltip>\n ))}\n </Box>\n )}\n </Box>\n </CardActionArea>\n </Card>\n );\n};", "import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { AiAgent } from '../types';\nimport { AgentCard } from './AgentCard';\n\nexport interface AgentsGridProps {\n agents: AiAgent[];\n onAgentClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentsGrid: React.FC<AgentsGridProps> = ({\n agents,\n onAgentClick,\n onRuntimeClick,\n}) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 2,\n }}\n >\n {agents.map(a => (\n <AgentCard\n key={a.entityRef}\n agent={a}\n onClick={onAgentClick}\n onRuntimeClick={onRuntimeClick}\n />\n ))}\n </Box>\n );\n};", "import React from 'react';\nimport {\n Box,\n Chip,\n Drawer,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Stack,\n Typography,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentDetailDrawerProps {\n agent: AiAgent | null;\n open: boolean;\n onClose: () => void;\n onRefreshStatus?: (entityRef: string) => void;\n}\n\nconst Row: React.FC<{ label: string; children: React.ReactNode }> = ({\n label,\n children,\n}) => (\n <Box sx={{ display: 'flex', gap: 1, mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 110 }}>\n {label}\n </Typography>\n <Box sx={{ flexGrow: 1 }}>{children}</Box>\n </Box>\n);\n\nexport const AgentDetailDrawer: React.FC<AgentDetailDrawerProps> = ({\n agent,\n open,\n onClose,\n onRefreshStatus,\n}) => {\n if (!agent) return null;\n const title = agent.title ?? agent.name;\n\n const copyRef = () => {\n navigator.clipboard?.writeText(agent.entityRef).catch(() => {});\n };\n\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n sx={{ '& .MuiDrawer-paper': { width: { xs: '100%', sm: 480 } } }}\n >\n <Box sx={{ p: 2, display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={56} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h6\">{title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n cursor: 'pointer',\n }}\n onClick={copyRef}\n >\n {agent.entityRef}\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n </Typography>\n </Box>\n <IconButton size=\"small\" onClick={onClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Box sx={{ px: 2, pb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <AgentStatusBadge status={agent.status} />\n {onRefreshStatus && (\n <IconButton\n size=\"small\"\n title=\"Refresh status\"\n onClick={() => onRefreshStatus(agent.entityRef)}\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n\n <Box sx={{ px: 2, pb: 3 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Row label=\"Runtime\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <RuntimeBadge runtime={agent.runtime.runtime} />\n {agent.runtime.endpoint && (\n <Link\n href={agent.runtime.endpoint}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}\n >\n endpoint <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n )}\n </Stack>\n {agent.runtime.runtimeHandle && (\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5, wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n )}\n </Row>\n\n <Row label=\"Capabilities\">\n {agent.capabilities.length ? (\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n <Row label=\"Billing\">\n <BillingBadge billing={agent.billing} />\n </Row>\n\n <Row label=\"Owner\">{agent.owner ?? '\u2014'}</Row>\n <Row label=\"System\">{agent.system ?? '\u2014'}</Row>\n <Row label=\"Lifecycle\">{agent.lifecycle ?? '\u2014'}</Row>\n <Row label=\"Version\">{agent.version ?? '\u2014'}</Row>\n <Row label=\"Tags\">\n {agent.tags.length ? (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => (\n <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n {agent.links.length > 0 && (\n <Row label=\"Links\">\n <List dense disablePadding>\n {agent.links.map((l, i) => (\n <ListItem\n key={i}\n component=\"a\"\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ color: 'text.primary', borderRadius: 1, '&:hover': { bgcolor: 'action.hover' } }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </ListItemIcon>\n <ListItemText primary={l.title} secondary={l.url}\n secondaryTypographyProps={{ sx: { fontSize: '0.7rem' } as const, noWrap: true }} />\n </ListItem>\n ))}\n </List>\n </Row>\n )}\n\n <Row label=\"Catalog\">\n <Link href={`/catalog/${agent.entityRef.replace(':', '/')}`}>\n Open in catalog <OpenInNewIcon sx={{ fontSize: 12, verticalAlign: 'middle' }} />\n </Link>\n </Row>\n </Box>\n </Drawer>\n );\n};", "import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\nimport { EmptyState } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent, AgentStatus } from '../types';\nimport { useAgents } from '../hooks/useAgents';\nimport { AgentFiltersBar } from './AgentFilters';\nimport { AgentsGrid } from './AgentsGrid';\nimport { AgentDetailDrawer } from './AgentDetailDrawer';\n\nconst POLL_INTERVAL_MS = 30_000;\n\nexport const AgentsPage: React.FC = () => {\n const api = useApi(aiAgentsApiRef);\n const { agents, allAgents, loading, error, retry, filters, update, reset } =\n useAgents();\n\n const [selected, setSelected] = useState<AiAgent | null>(null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [statuses, setStatuses] = useState<Record<string, AgentStatus>>({});\n\n const refs = allAgents.map(a => a.entityRef);\n\n // Initial + on-ref-change status fetch. Polling runs separately below.\n useEffect(() => {\n let cancelled = false;\n if (!refs.length) return;\n api.getStatuses(refs).then(result => {\n if (!cancelled) setStatuses(result);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.join(',')]);\n\n // Best-effort polling for live status while the page is mounted.\n useEffect(() => {\n if (!refs.length) return;\n const id = setInterval(async () => {\n const result = await api.getStatuses(refs);\n setStatuses(prev => ({ ...prev, ...result }));\n }, POLL_INTERVAL_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.length]);\n\n const agentsWithStatus = agents.map(a => ({\n ...a,\n status: statuses[a.entityRef] ?? a.status,\n }));\n\n const handleCardClick = useCallback((agent: AiAgent) => {\n setSelected(agent);\n setDrawerOpen(true);\n }, []);\n\n const handleRuntimeClick = useCallback(\n (runtime: string) => {\n if (!filters.runtime.includes(runtime)) {\n update({ runtime: [...filters.runtime, runtime] });\n }\n },\n [filters.runtime, update],\n );\n\n const handleRefreshStatus = useCallback(\n async (entityRef: string) => {\n const result = await api.getStatuses([entityRef]);\n setStatuses(prev => ({ ...prev, ...result }));\n setSelected(prev =>\n prev && prev.entityRef === entityRef\n ? { ...prev, status: result[entityRef] ?? prev.status }\n : prev,\n );\n },\n [api],\n );\n\n if (loading && !allAgents.length) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"40vh\">\n <CircularProgress />\n </Box>\n );\n }\n\n if (error) {\n return (\n <EmptyState\n title=\"Failed to load AI agents\"\n description={error.message}\n missing=\"content\"\n />\n );\n }\n\n return (\n <Box sx={{ p: 3 }}>\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"h4\">AI Agents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n AI agents registered in the catalog as <code>Component</code> entities\n with <code>spec.type: ai-agent</code>.\n </Typography>\n </Box>\n\n <AgentFiltersBar\n agents={allAgents}\n filters={filters}\n onChange={update}\n onReset={reset}\n />\n\n {agentsWithStatus.length === 0 ? (\n <EmptyState\n title=\"No AI agents registered\"\n description=\"Add a Component with spec.type: ai-agent to the catalog, or adjust your filters.\"\n missing=\"content\"\n action={<button onClick={() => retry()}>Retry</button>}\n />\n ) : (\n <AgentsGrid\n agents={agentsWithStatus}\n onAgentClick={handleCardClick}\n onRuntimeClick={handleRuntimeClick}\n />\n )}\n\n <AgentDetailDrawer\n agent={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefreshStatus={handleRefreshStatus}\n />\n </Box>\n );\n};", "import React from 'react';\nimport { SmartToy as AgentIcon } from '@mui/icons-material';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { aiAgentsApiRef, AiAgentsApi } from './api';\n\nconst aiAgentsApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: aiAgentsApiRef,\n deps: { fetchApi: fetchApiRef, catalogApi: catalogApiRef },\n factory: ({ fetchApi, catalogApi }) =>\n new AiAgentsApi({ fetchApi, catalogApi }),\n }),\n});\n\nconst aiAgentsPage = PageBlueprint.make({\n params: {\n path: '/ai-agents',\n title: 'AI Agents',\n icon: <AgentIcon />,\n loader: async () => {\n const { AgentsPage } = await import('./components/AgentsPage');\n return <AgentsPage />;\n },\n },\n});\n\nexport const aiAgentsPlugin = createFrontendPlugin({\n pluginId: 'ai-agents',\n extensions: [aiAgentsApi, aiAgentsPage],\n});", "export { aiAgentsPlugin } from './plugin';\nexport { AgentsPage } from './components/AgentsPage';\nexport { AgentCard } from './components/AgentCard';\nexport { aiAgentsApiRef, AiAgentsApi } from './api';\nexport type { AiAgentsApiInterface } from './api';\nexport {\n AI_AGENT_TYPE,\n AI_AGENT_ANNOTATION_PREFIX,\n entityToAgent,\n} from './types';\nexport type {\n AiAgent,\n AgentRuntimeInfo,\n AgentRuntimeName,\n AgentBilling,\n AgentBillingModel,\n AgentCapability,\n AgentCapabilityCategory,\n AgentStatus,\n AgentStatusState,\n} from './types';"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAiGA,SAAS,WAAW,QAAgB,KAAiC;AACnE,SAAO,OAAO,SAAS,cAAc,GAAG,0BAA0B,IAAI,GAAG,EAAE;AAC7E;AAEA,SAAS,eAAe,OAA+C;AACrE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,OAAO,WAAW,KAAK;AACjC,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,kBAAkB,KAA4C;AACrE,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,SAAO,IACJ,MAAM,OAAO,EACb,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO,EACd,IAAI,WAAS;AACZ,UAAM,CAAC,OAAO,MAAM,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAC1D,UAAM,WAAW,SAAU,SAAqC;AAChE,WAAO;AAAA,MACL;AAAA,MACA,UACE,YAAY,iBAAiB,IAAI,QAAQ,IAAI,WAAW;AAAA,IAC5D;AAAA,EACF,CAAC;AACL;AAEA,SAAS,UAAU,QAAwB;AACzC,QAAM,KAAK,OAAO,SAAS,aAAa;AACxC,SAAO,GAAG,OAAO,KAAK,YAAY,CAAC,IAAI,EAAE,IAAI,OAAO,SAAS,IAAI;AACnE;AAEA,SAAS,QAAQ,QAAwB;AACvC,QAAM,WAAW,WAAW,QAAQ,SAAS;AAC7C,UAAQ,YAAY,OAAO,SAAS,eAAe,IAAI,KAAK;AAC9D;AAGO,SAAS,cACd,QACA,QACqB;AACrB,MAAI,OAAO,MAAM,SAAS,cAAe,QAAO;AAEhD,QAAM,SAAS,OAAO,SAAS,SAAS,CAAC,GAAG,IAAI,QAAM;AAAA,IACpD,KAAK,EAAE;AAAA,IACP,OAAO,EAAE,SAAS,EAAE;AAAA,IACpB,MAAM,EAAE;AAAA,EACV,EAAE;AAEF,SAAO;AAAA,IACL,WAAW,UAAU,MAAM;AAAA,IAC3B,MAAM,OAAO,SAAS;AAAA,IACtB,OAAO,OAAO,SAAS;AAAA,IACvB,aAAa,OAAO,SAAS;AAAA,IAC7B,WAAW,WAAW,QAAQ,QAAQ;AAAA,IACtC,OAAQ,OAAO,MAA8C;AAAA,IAG7D,QAAS,OAAO,MAA8C;AAAA,IAG9D,WAAY,OAAO,MAA8C;AAAA,IAGjE,SAAS,WAAW,QAAQ,SAAS;AAAA,IACrC,SAAS,QAAQ,MAAM;AAAA,IACvB,SAAS;AAAA,MACP,SAAS,WAAW,QAAQ,SAAS,KAAK;AAAA,MAC1C,eAAe,WAAW,QAAQ,gBAAgB;AAAA,MAClD,UAAU,WAAW,QAAQ,UAAU;AAAA,MACvC,WAAW,WAAW,QAAQ,QAAQ;AAAA,IACxC;AAAA,IACA,SAAS;AAAA,MACP,OAAO,WAAW,QAAQ,eAAe,KAAK;AAAA,MAC9C,UAAU,eAAe,WAAW,QAAQ,aAAa,CAAC;AAAA,MAC1D,QAAQ,eAAe,WAAW,QAAQ,QAAQ,CAAC;AAAA,IACrD;AAAA,IACA,cAAc,kBAAkB,WAAW,QAAQ,cAAc,CAAC;AAAA,IAClE,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACF;AArLA,IAGa,eAGA,4BAiFP;AAvFN;AAAA;AAAA;AAGO,IAAM,gBAAgB;AAGtB,IAAM,6BAA6B;AAiF1C,IAAM,mBAAmB,oBAAI,IAA6B;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;AC/FD,SAAS,oBAA8B;AAAvC,IAgBa,gBAIA;AApBb;AAAA;AAAA;AAEA;AAcO,IAAM,iBAAiB,aAAmC;AAAA,MAC/D,IAAI;AAAA,IACN,CAAC;AAEM,IAAM,cAAN,MAAkD;AAAA,MACvD,YACmB,MAIA,WAAW,kBAC5B;AALiB;AAIA;AAAA,MAChB;AAAA,MAEH,MAAM,aAAiC;AACrC,cAAM,SAAS,MAAM,KAAK,KAAK,WAAW,YAAY;AAAA,UACpD,QAAQ,EAAE,MAAM,aAAa,aAAa,cAAc;AAAA,QAC1D,CAAC;AACD,eAAO,OAAO,MACX,IAAI,OAAK,cAAc,CAAC,CAAC,EACzB,OAAO,CAAC,MAAoB,MAAM,MAAS;AAAA,MAChD;AAAA,MAEA,MAAM,SAASA,YAAiD;AAC9D,cAAM,SAAS,MAAM,KAAK,KAAK,WAAW,eAAeA,UAAS;AAClE,eAAO,SAAS,cAAc,MAAM,IAAI;AAAA,MAC1C;AAAA,MAEA,MAAM,YAAY,YAA4D;AAC5E,YAAI,CAAC,WAAW,OAAQ,QAAO,CAAC;AAChC,YAAI;AACF,gBAAM,MAAM,MAAM,KAAK,KAAK,SAAS;AAAA,YACnC,GAAG,KAAK,QAAQ,kBAAkB,mBAAmB,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,UAC5E;AACA,cAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,iBAAQ,MAAM,IAAI,KAAK;AAAA,QACzB,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvDA,SAAS,aAAa,SAAS,gBAAgB;AAC/C,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAoBvB,SAAS,aACd,QACA,SACW;AACX,QAAM,SAAS,QAAQ,OAAO,KAAK,EAAE,YAAY;AACjD,SAAO,OAAO,OAAO,OAAK;AACxB,QAAI,QAAQ;AACV,YAAM,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EACxD,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAY;AACf,UAAI,CAAC,SAAS,SAAS,MAAM,EAAG,QAAO;AAAA,IACzC;AACA,QAAI,QAAQ,QAAQ,UAAU,CAAC,QAAQ,QAAQ,SAAS,EAAE,QAAQ,OAAO,GAAG;AAC1E,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAM,OAAO,EAAE,aAAa,IAAI,OAAK,EAAE,KAAK;AAC5C,UAAI,CAAC,QAAQ,WAAW,MAAM,OAAK,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO;AAAA,IAC/D;AACA,QAAI,QAAQ,UAAU,UAAU,CAAC,QAAQ,UAAU,SAAS,EAAE,aAAa,EAAE,GAAG;AAC9E,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,MAAM,UAAU,CAAC,QAAQ,MAAM,SAAS,EAAE,SAAS,EAAE,GAAG;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,YAAY;AAC1B,QAAM,MAAM,OAAO,cAAc;AACjC,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc,MAAM,IAAI,WAAW,GAAG,CAAC,GAAG,CAAC;AAE/C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAuB,cAAc;AAEnE,QAAM,WAAW;AAAA,IACf,MAAM,aAAa,UAAU,CAAC,GAAG,OAAO;AAAA,IACxC,CAAC,QAAQ,OAAO;AAAA,EAClB;AAEA,QAAM,SAAS;AAAA,IACb,CAAC,UACC,WAAW,WAAS,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,YAAY,MAAM,WAAW,cAAc,GAAG,CAAC,CAAC;AAE9D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,WAAW,UAAU,CAAC;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAtFA,IAca;AAdb;AAAA;AAAA;AAGA;AAWO,IAAM,iBAA+B;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,YAAY,CAAC;AAAA,MACb,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,IACV;AAAA;AAAA;;;ACpBA,OAAO,WAAW;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,gBAAgB;AACvB,OAAO,eAAe;AAXtB,IAsBM,cAIO;AA1Bb;AAAA;AAAA;AAsBA,IAAM,eAAe;AAAA,MACnB,aAAa,EAAE,UAAU,MAAM,aAAa,CAAC,MAAgB,EAAe,KAAK,IAAI,KAAK,MAAM;AAAA,IAClG;AAEO,IAAM,kBAAkD,CAAC;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK;AAC9E,YAAM,eAAe,MAAM;AAAA,QACzB,IAAI,IAAI,OAAO,QAAQ,OAAK,EAAE,aAAa,IAAI,OAAK,EAAE,KAAK,CAAC,CAAC;AAAA,MAC/D,EAAE,KAAK;AACP,YAAM,aAAa,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,SAAS,EAAE,OAAO,OAAO,CAAC,CAAC;AACnF,YAAM,SAAS,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC;AAE3E,YAAM,aACJ,QAAQ,UACR,QAAQ,QAAQ,UAChB,QAAQ,WAAW,UACnB,QAAQ,UAAU,UAClB,QAAQ,MAAM;AAEhB,aACE,oCAAC,SAAM,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,SAAS,QAAQ,KAAK,KAAK,UAAU,QAAQ,YAAY,SAAS,KAC5F;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO,QAAQ;AAAA,UACf,UAAU,OAAK,SAAS,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,UAClD,IAAI,EAAE,UAAU,KAAK,UAAU,EAAE;AAAA,UACjC,YAAY;AAAA,YACV,gBACE,oCAAC,kBAAe,UAAS,WACvB,oCAAC,cAAW,UAAS,SAAQ,CAC/B;AAAA,YAEF,cAAc,QAAQ,SACpB,oCAAC,kBAAe,UAAS,SACvB,oCAAC,cAAW,MAAK,SAAQ,SAAS,MAAM,SAAS,EAAE,QAAQ,GAAG,CAAC,KAC7D,oCAAC,aAAU,UAAS,SAAQ,CAC9B,CACF,IACE;AAAA,UACN;AAAA;AAAA,MACF,GAEA;AAAA,QAAC;AAAA;AAAA,UAAU,QAAM;AAAA,UAAC,MAAK;AAAA,UAAQ,OAAM;AAAA,UAAU,OAAO,QAAQ;AAAA,UAC5D,UAAU,OAAK,SAAS,EAAE,SAAS,EAAE,OAAO,MAA6B,CAAC;AAAA,UAC1E,IAAI,EAAE,UAAU,IAAI;AAAA,UAAI,GAAG;AAAA;AAAA,QAC1B,SAAS,IAAI,OAAK,oCAAC,YAAS,KAAK,GAAG,OAAO,KAAI,CAAE,CAAW;AAAA,MAC/D,GAEA;AAAA,QAAC;AAAA;AAAA,UAAU,QAAM;AAAA,UAAC,MAAK;AAAA,UAAQ,OAAM;AAAA,UAAa,OAAO,QAAQ;AAAA,UAC/D,UAAU,OAAK,SAAS,EAAE,YAAY,EAAE,OAAO,MAA6B,CAAC;AAAA,UAC7E,IAAI,EAAE,UAAU,IAAI;AAAA,UAAI,GAAG;AAAA;AAAA,QAC1B,aAAa,IAAI,OAAK,oCAAC,YAAS,KAAK,GAAG,OAAO,KAAI,CAAE,CAAW;AAAA,MACnE,GAEA;AAAA,QAAC;AAAA;AAAA,UAAU,QAAM;AAAA,UAAC,MAAK;AAAA,UAAQ,OAAM;AAAA,UAAY,OAAO,QAAQ;AAAA,UAC9D,UAAU,OAAK,SAAS,EAAE,WAAW,EAAE,OAAO,MAA6B,CAAC;AAAA,UAC5E,IAAI,EAAE,UAAU,IAAI;AAAA,UAAI,GAAG;AAAA;AAAA,QAC1B,WAAW,IAAI,OAAK,oCAAC,YAAS,KAAK,GAAG,OAAO,KAAI,CAAE,CAAW;AAAA,MACjE,GAEA;AAAA,QAAC;AAAA;AAAA,UAAU,QAAM;AAAA,UAAC,MAAK;AAAA,UAAQ,OAAM;AAAA,UAAQ,OAAO,QAAQ;AAAA,UAC1D,UAAU,OAAK,SAAS,EAAE,OAAO,EAAE,OAAO,MAA6B,CAAC;AAAA,UACxE,IAAI,EAAE,UAAU,IAAI;AAAA,UAAI,GAAG;AAAA;AAAA,QAC1B,OAAO,IAAI,OAAK,oCAAC,YAAS,KAAK,GAAG,OAAO,KAAI,CAAE,CAAW;AAAA,MAC7D,GAEC,cACC,oCAAC,WAAQ,OAAM,mBACb,oCAAC,cAAW,MAAK,SAAQ,SAAS,WAChC,oCAAC,aAAU,UAAS,SAAQ,CAC9B,CACF,GAEF,oCAAC,OAAI,IAAI,EAAE,IAAI,QAAQ,WAAW,SAAS,KACzC,oCAAC,gBAAQ,OAAO,MAAO,GAAS,UAAO,OAAO,WAAW,IAAI,MAAM,EACrE,CACF;AAAA,IAEJ;AAAA;AAAA;;;AC1GA,OAAOC,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,YAAW;AAOpB,SAAS,WAAW,MAAsB;AACxC,QAAM,QAAQ,KAAK,QAAQ,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK;AAC5D,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAChE,UAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,YAAY;AAChE;AAEA,SAAS,SAAS,MAAsB;AACtC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,QAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,IAAK;AAChF,SAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,QAAQ,MAAM;AAChD;AAlBA,IAGM,SAuBO;AA1Bb;AAAA;AAAA;AAGA,IAAM,UAAU;AAAA,MACd;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,MACjC;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,IACnC;AAoBO,IAAM,cAA0C,CAAC;AAAA,MACtD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,MAAM;AACJ,YAAM,CAAC,QAAQ,SAAS,IAAID,UAAS,KAAK;AAC1C,YAAM,YAAY,aAAa,CAAC;AAEhC,aACE,gBAAAD,OAAA;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,SAAS,YAAY,gBAAgB,SAAS,IAAI;AAAA,YAClD,OAAO;AAAA,YACP,UAAU,OAAO;AAAA,YACjB,YAAY;AAAA,UACd;AAAA;AAAA,QAEC,YACC,gBAAAF,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS,MAAM,UAAU,IAAI;AAAA,YAC7B,OAAO,EAAE,WAAW,SAAS,cAAc,MAAM;AAAA;AAAA,QACnD,IAEA,WAAW,IAAI;AAAA,MAEnB;AAAA,IAEJ;AAAA;AAAA;;;ACjEA,OAAOG,YAAW;AAClB,SAAS,OAAAC,MAAK,WAAAC,UAAS,kBAAkB;AADzC,IAIM,aAWO;AAfb;AAAA;AAAA;AAIA,IAAM,cAAgD;AAAA,MACpD,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAMO,IAAM,mBAAoD,CAAC,EAAE,OAAO,MAAM;AAC/E,YAAM,QAAQ,QAAQ,SAAS;AAC/B,YAAM,QAAQ,YAAY,KAAK;AAC/B,YAAM,OAAO,UAAU,YAAY,cAAc,KAAK,KAAK;AAE3D,YAAM,QAAQ,SACV;AAAA,QACE,WAAW,KAAK;AAAA,QAChB,OAAO,cAAc,iBAAiB,IAAI,KAAK,OAAO,WAAW,EAAE,eAAe,CAAC,KAAK;AAAA,QACxF,OAAO,aAAa,OAAO,YAAY,OAAO,SAAS,OAAO;AAAA,QAC9D,OAAO,UAAU,OAAO,UAAU;AAAA,MACpC,EACG,OAAO,OAAO,EACd,KAAK,QAAK,IACb;AAEJ,aACE,gBAAAF,OAAA,cAACE,UAAA,EAAQ,OAAc,OAAK,QAC1B,gBAAAF,OAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,QAAQ;AAAA,UACV;AAAA;AAAA,QAEA,gBAAAD,OAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QACC,QAAQ,aAAa,QACpB,gBAAAD,OAAA,cAAC,cAAW,SAAQ,WAAU,OAAM,oBACjC,OAAO,WAAU,IACpB;AAAA,MAEJ,CACF;AAAA,IAEJ;AAAA;AAAA;;;AC5DA,OAAOG,UAAS,YAAAC,iBAAgB;AAChC,SAAS,MAAM,OAAAC,MAAK,eAAe;AADnC,IAIM,gBAaA,aAQO;AAzBb;AAAA;AAAA;AAIA,IAAM,iBAGF;AAAA,MACF,WAAW;AAAA,MACX,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAEA,IAAM,cAAc;AAQb,IAAM,oBAAsD,CAAC;AAAA,MAClE;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,IACT,MAAM;AACJ,YAAM,CAAC,QAAQ,SAAS,IAAID,UAA6B,IAAI;AAE7D,UAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,YAAM,UAAU,aAAa,MAAM,GAAG,GAAG;AACzC,YAAM,WAAW,aAAa,SAAS,QAAQ;AAE/C,aACE,gBAAAD,OAAA,cAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,IAAI,KACpD,QAAQ,IAAI,CAAC,GAAG,MACf,gBAAAF,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,UACpB,OAAO,EAAE;AAAA,UACT;AAAA,UACA,OAAO,EAAE,WAAW,eAAe,EAAE,QAAQ,IAAI;AAAA,UACjD,SAAS,EAAE,WAAW,WAAW;AAAA;AAAA,MACnC,CACD,GACA,WAAW,KACV,gBAAAA,OAAA,cAAAA,OAAA,gBACE,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,IAAI,QAAQ;AAAA,UACnB;AAAA,UACA,WAAS;AAAA,UACT,SAAS,OAAK;AACZ,cAAE,gBAAgB;AAClB,sBAAU,EAAE,aAAa;AAAA,UAC3B;AAAA;AAAA,MACF,GACA,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,QAAQ,MAAM;AAAA,UACpB,UAAU;AAAA,UACV,SAAS,MAAM,UAAU,IAAI;AAAA,UAC7B,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA;AAAA,QAEvD,gBAAAA,OAAA,cAACE,MAAA,EAAI,IAAI,EAAE,GAAG,GAAG,UAAU,KAAK,SAAS,QAAQ,UAAU,QAAQ,KAAK,IAAI,KACzE,aAAa,IAAI,CAAC,GAAG,MACpB,gBAAAF,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,YACpB,OAAO,EAAE;AAAA,YACT,MAAK;AAAA,YACL,OAAO,EAAE,WAAW,eAAe,EAAE,QAAQ,IAAI;AAAA,YACjD,SAAS,EAAE,WAAW,WAAW;AAAA;AAAA,QACnC,CACD,CACH;AAAA,MACF,CACF,CAEJ;AAAA,IAEJ;AAAA;AAAA;;;AChFA,OAAOG,YAAW;AAClB,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAC1B,OAAO,gBAAgB;AACvB,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAL1B,IAQM,cAgBO;AAxBb;AAAA;AAAA;AAQA,IAAM,eAGF;AAAA,MACF,qBAAqB,EAAE,OAAO,qBAAqB,MAAM,gBAAAF,OAAA,cAAC,kBAAe,UAAS,SAAQ,EAAG;AAAA,MAC7F,SAAS,EAAE,OAAO,WAAW,MAAM,gBAAAA,OAAA,cAAC,cAAW,UAAS,SAAQ,EAAG;AAAA,MACnE,QAAQ,EAAE,OAAO,cAAc,MAAM,gBAAAA,OAAA,cAAC,iBAAc,UAAS,SAAQ,EAAG;AAAA,MACxE,QAAQ,EAAE,OAAO,UAAU,MAAM,gBAAAA,OAAA,cAAC,iBAAc,UAAS,SAAQ,EAAG;AAAA,IACtE;AAQO,IAAM,eAA4C,CAAC;AAAA,MACxD;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,MAAM;AACJ,YAAM,OAAO,aAAa,OAAO,KAAK;AAAA,QACpC,OAAO,OAAO,OAAO;AAAA,QACrB,MAAM,gBAAAA,OAAA,cAAC,iBAAc,UAAS,SAAQ;AAAA,MACxC;AACA,aACE,gBAAAA,OAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,SAAQ;AAAA,UACR,OACE,gBAAAD,OAAA,cAACE,MAAA,EAAI,IAAI,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,IAAI,KAC/D,KAAK,MACL,KAAK,KACR;AAAA,UAEF,SAAS,UAAU,MAAM,QAAQ,OAAO,IAAI;AAAA,UAC5C,WAAW,QAAQ,OAAO;AAAA;AAAA,MAC5B;AAAA,IAEJ;AAAA;AAAA;;;AC/CA,OAAOC,YAAW;AAClB,SAAS,QAAAC,OAAM,OAAAC,MAAK,cAAAC,mBAAkB;AADtC,IAIM,eAWO;AAfb;AAAA;AAAA;AAIA,IAAM,gBAAiF;AAAA,MACrF,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,MAAM;AAAA,IACR;AAMO,IAAM,eAA4C,CAAC,EAAE,QAAQ,MAAM;AACxE,YAAM,QAAQ,cAAc,QAAQ,KAAK,KAAK;AAC9C,YAAM,YACJ,QAAQ,UAAU,cACd,kBACA,QAAQ,UAAU,mBAChB,iBACA;AACR,aACE,gBAAAH,OAAA,cAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,KAAK,KAC7D,gBAAAF,OAAA,cAACC,OAAA,EAAK,MAAK,SAAQ,OAAc,OAAO,QAAQ,OAAO,SAAQ,YAAW,GACzE,QAAQ,YAAY,QAAQ,aAC3B,gBAAAD,OAAA,cAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,oBAAiB,MAChD,QAAQ,UAAS,KAAE,SACxB,GAED,QAAQ,UAAU,QACjB,gBAAAH,OAAA,cAACG,aAAA,EAAW,SAAQ,WAAU,OAAM,oBAAiB,aACzC,QAAQ,MACpB,CAEJ;AAAA,IAEJ;AAAA;AAAA;;;ACtCA,OAAOC,YAAW;AAClB,SAAS,OAAAC,MAAK,MAAM,gBAAgB,QAAAC,OAAM,MAAM,WAAAC,UAAS,cAAAC,mBAAkB;AAC3E,OAAO,mBAAmB;AAC1B,OAAO,qBAAqB;AAC5B,OAAO,iBAAiB;AACxB,OAAO,mBAAmB;AAL1B,IAaM,iBAMA,WAaO;AAhCb;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA;AAEA,IAAM,kBAA+E;AAAA,MACnF,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAEA,IAAM,YAA6C;AAAA,MACjD,WAAW,gBAAAJ,OAAA,cAAC,iBAAc,UAAS,SAAQ;AAAA,MAC3C,MAAM,gBAAAA,OAAA,cAAC,mBAAgB,UAAS,SAAQ;AAAA,MACxC,UAAU,gBAAAA,OAAA,cAAC,eAAY,UAAS,SAAQ;AAAA,MACxC,QAAQ,gBAAAA,OAAA,cAAC,iBAAc,UAAS,SAAQ;AAAA,IAC1C;AAQO,IAAM,YAAsC,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,YAAM,iBAAiB,MAAM,YACzB,gBAAgB,MAAM,SAAS,KAAK,YACpC;AAEJ,aACE,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,IAAI;AAAA,YACF,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY,WAAS,cAAc,MAAM,YAAY,SAAS,KAAK;AAAA,YACnE,WAAW,EAAE,WAAW,EAAE;AAAA,UAC5B;AAAA;AAAA,QAEA,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,UAAU,KAAK;AAAA,YAC9B,IAAI,EAAE,UAAU,GAAG,GAAG,GAAG,YAAY,WAAW,SAAS,OAAO;AAAA;AAAA,UAEhE,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,OAAO,OAAO,KAEjE,gBAAAD,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KAAK,IAAI,EAAE,KAChE,gBAAAD,OAAA,cAAC,eAAY,MAAM,MAAM,MAAM,WAAW,MAAM,WAAW,GAC3D,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,KAClC,gBAAAD,OAAA,cAACI,aAAA,EAAW,SAAQ,aAAY,YAAY,KAAK,QAAM,MAAC,SACrD,KACH,GACA,gBAAAJ,OAAA,cAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,QAAM,QACxD,MAAM,IACT,CACF,GACA,gBAAAJ,OAAA,cAAC,oBAAiB,QAAQ,MAAM,QAAQ,CAC1C,GAGA,gBAAAA,OAAA;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,IAAI;AAAA,cACN;AAAA;AAAA,YAEC,MAAM,WAAW;AAAA,UACpB,GAGA,gBAAAJ,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,IAAI,EAAE,KACf,gBAAAD,OAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,QAAQ;AAAA,cACvB,SAAS;AAAA;AAAA,UACX,CACF,GAGC,MAAM,aAAa,SAAS,KAC3B,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,IAAI,IAAI,KACjB,gBAAAD,OAAA,cAAC,qBAAkB,cAAc,MAAM,cAAc,CACvD,GAIF,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,IAAI,IAAI,KACjB,gBAAAD,OAAA,cAAC,gBAAa,SAAS,MAAM,SAAS,CACxC,GAGA,gBAAAA,OAAA;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,UAAU;AAAA,cACZ;AAAA;AAAA,YAEC,MAAM,SACL,gBAAAD,OAAA,cAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,oBACjC,MAAM,KACT;AAAA,YAED,MAAM,aACL,gBAAAJ,OAAA;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO,MAAM;AAAA,gBACb,SAAQ;AAAA,gBACR,IAAI,EAAE,QAAQ,IAAI,oBAAoB,EAAE,IAAI,MAAM,UAAU,SAAS,EAAE;AAAA;AAAA,YACzE;AAAA,YAED,MAAM,WACL,gBAAAF,OAAA,cAACI,aAAA,EAAW,SAAQ,WAAU,OAAM,oBAAiB,KACjD,MAAM,OACV;AAAA,UAEJ,GAGC,MAAM,MAAM,SAAS,KACpB,gBAAAJ,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,WAAW,aAAa,aAAa,UAAU,KAClG,MAAM,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,MAC/B,gBAAAD,OAAA,cAACG,UAAA,EAAQ,KAAK,GAAG,OAAO,EAAE,SACxB,gBAAAH,OAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,EAAE;AAAA,cACR,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,SAAS,OAAK,EAAE,gBAAgB;AAAA,cAChC,IAAI,EAAE,SAAS,eAAe,OAAO,iBAAiB;AAAA;AAAA,YAErD,UAAU,EAAE,QAAQ,EAAE,KAAK,gBAAAA,OAAA,cAAC,mBAAgB,UAAS,SAAQ;AAAA,UAChE,CACF,CACD,CACH,CAEJ;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA;AAAA;;;ACjKA,OAAOK,YAAW;AAClB,OAAOC,UAAS;AADhB,IAWa;AAXb;AAAA;AAAA;AAGA;AAQO,IAAM,aAAwC,CAAC;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,aACE,gBAAAD,OAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,qBAAqB;AAAA,YACrB,KAAK;AAAA,UACP;AAAA;AAAA,QAEC,OAAO,IAAI,OACV,gBAAAD,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,EAAE;AAAA,YACP,OAAO;AAAA,YACP,SAAS;AAAA,YACT;AAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IAEJ;AAAA;AAAA;;;AClCA,OAAOE,YAAW;AAClB;AAAA,EACE,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,OACK;AACP,OAAO,eAAe;AACtB,OAAO,mBAAmB;AAC1B,OAAO,iBAAiB;AACxB,OAAOC,oBAAmB;AAC1B,OAAOC,sBAAqB;AAC5B,OAAOC,kBAAiB;AACxB,OAAOC,oBAAmB;AAC1B,OAAO,qBAAqB;AArB5B,IA6BMC,YAcA,KAYO;AAvDb;AAAA;AAAA;AAuBA;AACA;AACA;AACA;AACA;AAEA,IAAMA,aAA6C;AAAA,MACjD,WAAW,gBAAAV,OAAA,cAACM,gBAAA,EAAc,UAAS,SAAQ;AAAA,MAC3C,MAAM,gBAAAN,OAAA,cAACO,kBAAA,EAAgB,UAAS,SAAQ;AAAA,MACxC,UAAU,gBAAAP,OAAA,cAACQ,cAAA,EAAY,UAAS,SAAQ;AAAA,MACxC,QAAQ,gBAAAR,OAAA,cAACS,gBAAA,EAAc,UAAS,SAAQ;AAAA,IAC1C;AASA,IAAM,MAA8D,CAAC;AAAA,MACnE;AAAA,MACA;AAAA,IACF,MACE,gBAAAT,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,EAAE,KACxC,gBAAAD,OAAA,cAACK,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,UAAU,IAAI,KACpE,KACH,GACA,gBAAAL,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,UAAU,EAAE,KAAI,QAAS,CACtC;AAGK,IAAM,oBAAsD,CAAC;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,QAAQ,MAAM,SAAS,MAAM;AAEnC,YAAM,UAAU,MAAM;AACpB,kBAAU,WAAW,UAAU,MAAM,SAAS,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAChE;AAEA,aACE,gBAAAD,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,EAAE;AAAA;AAAA,QAE/D,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,GAAG,GAAG,SAAS,QAAQ,YAAY,cAAc,KAAK,IAAI,KACnE,gBAAAD,OAAA,cAAC,eAAY,MAAM,MAAM,MAAM,WAAW,MAAM,WAAW,MAAM,IAAI,GACrE,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,UAAU,EAAE,KACrB,gBAAAD,OAAA,cAACK,aAAA,EAAW,SAAQ,QAAM,KAAM,GAChC,gBAAAL,OAAA;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,IAAI;AAAA,cACF,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,QAAQ;AAAA,YACV;AAAA,YACA,SAAS;AAAA;AAAA,UAER,MAAM;AAAA,UACP,gBAAAL,OAAA,cAAC,mBAAgB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,QACzC,CACF,GACA,gBAAAA,OAAA,cAACG,aAAA,EAAW,MAAK,SAAQ,SAAS,WAChC,gBAAAH,OAAA,cAAC,aAAU,UAAS,SAAQ,CAC9B,CACF;AAAA,QAEA,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,KACrE,gBAAAD,OAAA,cAAC,oBAAiB,QAAQ,MAAM,QAAQ,GACvC,mBACC,gBAAAA,OAAA;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAAS,MAAM,gBAAgB,MAAM,SAAS;AAAA;AAAA,UAE9C,gBAAAH,OAAA,cAAC,eAAY,UAAS,SAAQ;AAAA,QAChC,CAEJ;AAAA,QAEA,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,KACtB,gBAAAD,OAAA,cAACK,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,KACrC,MAAM,WAAW,MAAM,eAAe,0BACzC,GAEA,gBAAAL,OAAA,cAAC,OAAI,OAAM,aACT,gBAAAA,OAAA,cAAC,SAAM,WAAU,OAAM,SAAS,GAAG,YAAW,YAC5C,gBAAAA,OAAA,cAAC,gBAAa,SAAS,MAAM,QAAQ,SAAS,GAC7C,MAAM,QAAQ,YACb,gBAAAA,OAAA;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,MAAM,MAAM,QAAQ;AAAA,YACpB,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,IAAI,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,IAAI;AAAA;AAAA,UAC9D;AAAA,UACU,gBAAAJ,OAAA,cAAC,iBAAc,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,QAChD,CAEJ,GACC,MAAM,QAAQ,iBACb,gBAAAA,OAAA,cAACK,aAAA,EAAW,SAAQ,WAAU,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,KAAK,WAAW,YAAY,KACxG,MAAM,QAAQ,aACjB,CAEJ,GAEA,gBAAAL,OAAA,cAAC,OAAI,OAAM,kBACR,MAAM,aAAa,SAClB,gBAAAA,OAAA,cAAC,qBAAkB,cAAc,MAAM,cAAc,KAAK,IAAI,IAE9D,gBAAAA,OAAA,cAACK,aAAA,EAAW,SAAQ,SAAQ,OAAM,oBAAiB,QAAC,CAExD,GAEA,gBAAAL,OAAA,cAAC,OAAI,OAAM,aACT,gBAAAA,OAAA,cAAC,gBAAa,SAAS,MAAM,SAAS,CACxC,GAEA,gBAAAA,OAAA,cAAC,OAAI,OAAM,WAAS,MAAM,SAAS,QAAI,GACvC,gBAAAA,OAAA,cAAC,OAAI,OAAM,YAAU,MAAM,UAAU,QAAI,GACzC,gBAAAA,OAAA,cAAC,OAAI,OAAM,eAAa,MAAM,aAAa,QAAI,GAC/C,gBAAAA,OAAA,cAAC,OAAI,OAAM,aAAW,MAAM,WAAW,QAAI,GAC3C,gBAAAA,OAAA,cAAC,OAAI,OAAM,UACR,MAAM,KAAK,SACV,gBAAAA,OAAA,cAACC,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,IAAI,KACpD,MAAM,KAAK,IAAI,OACd,gBAAAD,OAAA,cAACE,OAAA,EAAK,KAAK,GAAG,MAAK,SAAQ,OAAO,GAAG,SAAQ,YAAW,CACzD,CACH,IAEA,gBAAAF,OAAA,cAACK,aAAA,EAAW,SAAQ,SAAQ,OAAM,oBAAiB,QAAC,CAExD,GAEC,MAAM,MAAM,SAAS,KACpB,gBAAAL,OAAA,cAAC,OAAI,OAAM,WACT,gBAAAA,OAAA,cAAC,QAAK,OAAK,MAAC,gBAAc,QACvB,MAAM,MAAM,IAAI,CAAC,GAAG,MACnB,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,MAAM,EAAE;AAAA,YACR,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,IAAI,EAAE,OAAO,gBAAgB,cAAc,GAAG,WAAW,EAAE,SAAS,eAAe,EAAE;AAAA;AAAA,UAErF,gBAAAA,OAAA,cAAC,gBAAa,IAAI,EAAE,UAAU,GAAG,KAC9BU,WAAU,EAAE,QAAQ,EAAE,KAAK,gBAAAV,OAAA,cAACO,kBAAA,EAAgB,UAAS,SAAQ,CAChE;AAAA,UACA,gBAAAP,OAAA;AAAA,YAAC;AAAA;AAAA,cAAa,SAAS,EAAE;AAAA,cAAO,WAAW,EAAE;AAAA,cAC3C,0BAA0B,EAAE,IAAI,EAAE,UAAU,SAAS,GAAY,QAAQ,KAAK;AAAA;AAAA,UAAG;AAAA,QACrF,CACD,CACH,CACF,GAGF,gBAAAA,OAAA,cAAC,OAAI,OAAM,aACT,gBAAAA,OAAA,cAACI,OAAA,EAAK,MAAM,YAAY,MAAM,UAAU,QAAQ,KAAK,GAAG,CAAC,MAAI,oBAC3C,gBAAAJ,OAAA,cAAC,iBAAc,IAAI,EAAE,UAAU,IAAI,eAAe,SAAS,GAAG,CAChF,CACF,CACF;AAAA,MACF;AAAA,IAEJ;AAAA;AAAA;;;ACrMA;AAAA;AAAA;AAAA;AAAA,OAAOW,WAAS,eAAAC,cAAa,WAAW,YAAAC,iBAAgB;AACxD,SAAS,OAAAC,OAAK,kBAAkB,cAAAC,mBAAkB;AAClD,SAAS,kBAAkB;AAC3B,SAAS,UAAAC,eAAc;AAHvB,IAWM,kBAEO;AAbb;AAAA;AAAA;AAIA;AAEA;AACA;AACA;AACA;AAEA,IAAM,mBAAmB;AAElB,IAAM,aAAuB,MAAM;AACxC,YAAM,MAAMA,QAAO,cAAc;AACjC,YAAM,EAAE,QAAQ,WAAW,SAAS,OAAO,OAAO,SAAS,QAAQ,MAAM,IACvE,UAAU;AAEZ,YAAM,CAAC,UAAU,WAAW,IAAIH,UAAyB,IAAI;AAC7D,YAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,YAAM,CAAC,UAAU,WAAW,IAAIA,UAAsC,CAAC,CAAC;AAExE,YAAM,OAAO,UAAU,IAAI,OAAK,EAAE,SAAS;AAG3C,gBAAU,MAAM;AACd,YAAI,YAAY;AAChB,YAAI,CAAC,KAAK,OAAQ;AAClB,YAAI,YAAY,IAAI,EAAE,KAAK,YAAU;AACnC,cAAI,CAAC,UAAW,aAAY,MAAM;AAAA,QACpC,CAAC;AACD,eAAO,MAAM;AACX,sBAAY;AAAA,QACd;AAAA,MAEF,GAAG,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC;AAGxB,gBAAU,MAAM;AACd,YAAI,CAAC,KAAK,OAAQ;AAClB,cAAM,KAAK,YAAY,YAAY;AACjC,gBAAM,SAAS,MAAM,IAAI,YAAY,IAAI;AACzC,sBAAY,WAAS,EAAE,GAAG,MAAM,GAAG,OAAO,EAAE;AAAA,QAC9C,GAAG,gBAAgB;AACnB,eAAO,MAAM,cAAc,EAAE;AAAA,MAE/B,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC;AAErB,YAAM,mBAAmB,OAAO,IAAI,QAAM;AAAA,QACxC,GAAG;AAAA,QACH,QAAQ,SAAS,EAAE,SAAS,KAAK,EAAE;AAAA,MACrC,EAAE;AAEF,YAAM,kBAAkBD,aAAY,CAAC,UAAmB;AACtD,oBAAY,KAAK;AACjB,sBAAc,IAAI;AAAA,MACpB,GAAG,CAAC,CAAC;AAEL,YAAM,qBAAqBA;AAAA,QACzB,CAAC,YAAoB;AACnB,cAAI,CAAC,QAAQ,QAAQ,SAAS,OAAO,GAAG;AACtC,mBAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,SAAS,OAAO,EAAE,CAAC;AAAA,UACnD;AAAA,QACF;AAAA,QACA,CAAC,QAAQ,SAAS,MAAM;AAAA,MAC1B;AAEA,YAAM,sBAAsBA;AAAA,QAC1B,OAAOK,eAAsB;AAC3B,gBAAM,SAAS,MAAM,IAAI,YAAY,CAACA,UAAS,CAAC;AAChD,sBAAY,WAAS,EAAE,GAAG,MAAM,GAAG,OAAO,EAAE;AAC5C;AAAA,YAAY,UACV,QAAQ,KAAK,cAAcA,aACvB,EAAE,GAAG,MAAM,QAAQ,OAAOA,UAAS,KAAK,KAAK,OAAO,IACpD;AAAA,UACN;AAAA,QACF;AAAA,QACA,CAAC,GAAG;AAAA,MACN;AAEA,UAAI,WAAW,CAAC,UAAU,QAAQ;AAChC,eACE,gBAAAN,QAAA,cAACG,OAAA,EAAI,SAAQ,QAAO,gBAAe,UAAS,YAAW,UAAS,WAAU,UACxE,gBAAAH,QAAA,cAAC,sBAAiB,CACpB;AAAA,MAEJ;AAEA,UAAI,OAAO;AACT,eACE,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAa,MAAM;AAAA,YACnB,SAAQ;AAAA;AAAA,QACV;AAAA,MAEJ;AAEA,aACE,gBAAAA,QAAA,cAACG,OAAA,EAAI,IAAI,EAAE,GAAG,EAAE,KACd,gBAAAH,QAAA,cAACG,OAAA,EAAI,IAAI,EAAE,IAAI,EAAE,KACf,gBAAAH,QAAA,cAACI,aAAA,EAAW,SAAQ,QAAK,WAAS,GAClC,gBAAAJ,QAAA,cAACI,aAAA,EAAW,SAAQ,SAAQ,OAAM,oBAAiB,2CACV,gBAAAJ,QAAA,cAAC,cAAK,WAAS,GAAO,mBACxD,gBAAAA,QAAA,cAAC,cAAK,qBAAmB,GAAO,GACvC,CACF,GAEA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV,SAAS;AAAA;AAAA,MACX,GAEC,iBAAiB,WAAW,IAC3B,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,SAAQ;AAAA,UACR,QAAQ,gBAAAA,QAAA,cAAC,YAAO,SAAS,MAAM,MAAM,KAAG,OAAK;AAAA;AAAA,MAC/C,IAEA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,gBAAgB;AAAA;AAAA,MAClB,GAGF,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS,MAAM,cAAc,KAAK;AAAA,UAClC,iBAAiB;AAAA;AAAA,MACnB,CACF;AAAA,IAEJ;AAAA;AAAA;;;ACjIA;AATA,OAAOO,aAAW;AAClB,SAAS,YAAY,iBAAiB;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAG9B,IAAM,cAAc,aAAa,KAAK;AAAA,EACpC,QAAQ,kBACN,aAAa;AAAA,IACX,KAAK;AAAA,IACL,MAAM,EAAE,UAAU,aAAa,YAAY,cAAc;AAAA,IACzD,SAAS,CAAC,EAAE,UAAU,WAAW,MAC/B,IAAI,YAAY,EAAE,UAAU,WAAW,CAAC;AAAA,EAC5C,CAAC;AACL,CAAC;AAED,IAAM,eAAe,cAAc,KAAK;AAAA,EACtC,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAA,QAAA,cAAC,eAAU;AAAA,IACjB,QAAQ,YAAY;AAClB,YAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,aAAO,gBAAAD,QAAA,cAACC,aAAA,IAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiB,qBAAqB;AAAA,EACjD,UAAU;AAAA,EACV,YAAY,CAAC,aAAa,YAAY;AACxC,CAAC;;;ACnCD;AACA;AACA;AAEA;",
6
- "names": ["entityRef", "React", "useState", "Box", "React", "Box", "Tooltip", "React", "useState", "Box", "React", "Chip", "Box", "React", "Chip", "Box", "Typography", "React", "Box", "Chip", "Tooltip", "Typography", "React", "Box", "React", "Box", "Chip", "IconButton", "Link", "Typography", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "LINK_ICON", "React", "useCallback", "useState", "Box", "Typography", "useApi", "entityRef", "React", "AgentsPage"]
3
+ "sources": ["../src/types.ts", "../src/api.ts", "../src/hooks/useAgents.ts", "../src/components/AgentFilters.tsx", "../src/components/AgentAvatar.tsx", "../src/components/AgentStatusBadge.tsx", "../src/components/AgentCapabilities.tsx", "../src/components/RuntimeBadge.tsx", "../src/components/BillingBadge.tsx", "../src/components/AgentCard.tsx", "../src/components/AgentsGrid.tsx", "../src/components/AgentDetailDrawer.tsx", "../src/components/AgentsPage.tsx", "../src/components/AgentOverviewCard.tsx", "../src/plugin.tsx", "../src/index.ts"],
4
+ "sourcesContent": ["import { Entity } from '@backstage/catalog-model';\n\n/** Value of `spec.type` that marks a catalog Component as an AI agent. */\nexport const AI_AGENT_TYPE = 'ai-agent';\n\n/** Annotation namespace for agent-specific fields on a catalog entity. */\nexport const AI_AGENT_ANNOTATION_PREFIX = 'ai-agent.acarmisc.org';\n\nexport type AgentRuntimeName =\n | 'bedrock-agentcore'\n | 'litellm'\n | 'lambda'\n | 'custom'\n | string;\n\nexport interface AgentRuntimeInfo {\n /** Runtime identifier, e.g. \"bedrock-agentcore\", \"litellm\", \"lambda\", \"custom\". */\n runtime: AgentRuntimeName;\n /** Opaque handle/ARN/identifier the backend uses to probe the agent. */\n runtimeHandle?: string;\n /** Public invocation endpoint, if any. */\n endpoint?: string;\n /** Health-check URL the backend can call. */\n healthUrl?: string;\n}\n\nexport type AgentBillingModel =\n | 'per-invocation'\n | 'per-token'\n | 'subscription'\n | 'free'\n | string;\n\nexport interface AgentBilling {\n model: AgentBillingModel;\n /** Cost per 1000 invocations (per-invocation) or per 1M tokens (per-token). */\n unitCost?: number;\n /** Monthly spend cap if known. */\n budget?: number;\n}\n\nexport type AgentCapabilityCategory =\n | 'reasoning'\n | 'retrieval'\n | 'tools'\n | 'vision'\n | 'voice'\n | 'data'\n | 'safety';\n\nexport interface AgentCapability {\n label: string;\n category?: AgentCapabilityCategory;\n}\n\nexport type AgentStatusState = 'healthy' | 'degraded' | 'down' | 'unknown';\n\nexport interface AgentStatus {\n state: AgentStatusState;\n lastChecked?: string;\n latencyMs?: number;\n message?: string;\n}\n\nexport interface AiAgent {\n /** Backstage entity ref, e.g. \"component:default/support-triage-agent\". */\n entityRef: string;\n name: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n owner?: string;\n system?: string;\n lifecycle?: string;\n version?: string;\n /** Human-readable purpose (defaults to description when no dedicated field). */\n purpose: string;\n runtime: AgentRuntimeInfo;\n billing: AgentBilling;\n capabilities: AgentCapability[];\n tags: string[];\n links: { url: string; title: string; icon?: string }[];\n /** Populated by the backend status probe; undefined in the static view. */\n status?: AgentStatus;\n rawEntity: Entity;\n}\n\nconst VALID_CATEGORIES = new Set<AgentCapabilityCategory>([\n 'reasoning',\n 'retrieval',\n 'tools',\n 'vision',\n 'voice',\n 'data',\n 'safety',\n]);\n\nfunction annotation(entity: Entity, key: string): string | undefined {\n return entity.metadata.annotations?.[`${AI_AGENT_ANNOTATION_PREFIX}/${key}`];\n}\n\nfunction parseFloatSafe(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCapabilities(raw: string | undefined): AgentCapability[] {\n if (!raw) return [];\n return raw\n .split(/[,\\n]/)\n .map(s => s.trim())\n .filter(Boolean)\n .map(token => {\n const [label, catRaw] = token.split(':').map(s => s.trim());\n const category = catRaw ? (catRaw as AgentCapabilityCategory) : undefined;\n return {\n label,\n category:\n category && VALID_CATEGORIES.has(category) ? category : undefined,\n };\n });\n}\n\nfunction entityRef(entity: Entity): string {\n const ns = entity.metadata.namespace ?? 'default';\n return `${entity.kind.toLowerCase()}:${ns}/${entity.metadata.name}`;\n}\n\nfunction purpose(entity: Entity): string {\n const explicit = annotation(entity, 'purpose');\n return (explicit ?? entity.metadata.description ?? '').trim();\n}\n\n/** Map a Backstage catalog Component entity to the plugin's AiAgent shape. */\nexport function entityToAgent(\n entity: Entity,\n status?: AgentStatus,\n): AiAgent | undefined {\n if (entity.spec?.type !== AI_AGENT_TYPE) return undefined;\n\n const links = (entity.metadata.links ?? []).map(l => ({\n url: l.url,\n title: l.title ?? l.url,\n icon: l.icon,\n }));\n\n return {\n entityRef: entityRef(entity),\n name: entity.metadata.name,\n title: entity.metadata.title,\n description: entity.metadata.description,\n avatarUrl: annotation(entity, 'avatar'),\n owner: (entity.spec as Record<string, unknown> | undefined)?.owner as\n | string\n | undefined,\n system: (entity.spec as Record<string, unknown> | undefined)?.system as\n | string\n | undefined,\n lifecycle: (entity.spec as Record<string, unknown> | undefined)?.lifecycle as\n | string\n | undefined,\n version: annotation(entity, 'version'),\n purpose: purpose(entity),\n runtime: {\n runtime: annotation(entity, 'runtime') ?? 'custom',\n runtimeHandle: annotation(entity, 'runtime-handle'),\n endpoint: annotation(entity, 'endpoint'),\n healthUrl: annotation(entity, 'health'),\n },\n billing: {\n model: annotation(entity, 'billing-model') ?? 'free',\n unitCost: parseFloatSafe(annotation(entity, 'cost-per-1k')),\n budget: parseFloatSafe(annotation(entity, 'budget')),\n },\n capabilities: parseCapabilities(annotation(entity, 'capabilities')),\n tags: entity.metadata.tags ?? [],\n links,\n status,\n rawEntity: entity,\n };\n}", "import { createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport {\n AI_AGENT_TYPE,\n AiAgent,\n AgentStatus,\n entityToAgent,\n} from './types';\n\nexport interface AiAgentsApiInterface {\n listAgents(): Promise<AiAgent[]>;\n getAgent(entityRef: string): Promise<AiAgent | undefined>;\n /** Probe live status for the given entity refs via the backend. */\n getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>>;\n}\n\nexport const aiAgentsApiRef = createApiRef<AiAgentsApiInterface>({\n id: 'plugin.ai-agents.api',\n});\n\nexport class AiAgentsApi implements AiAgentsApiInterface {\n constructor(\n private readonly opts: {\n fetchApi: FetchApi;\n catalogApi: CatalogApi;\n },\n private readonly basePath = '/api/ai-agents',\n ) {}\n\n async listAgents(): Promise<AiAgent[]> {\n const result = await this.opts.catalogApi.getEntities({\n filter: { kind: 'Component', 'spec.type': AI_AGENT_TYPE },\n });\n return result.items\n .map(e => entityToAgent(e))\n .filter((a): a is AiAgent => a !== undefined);\n }\n\n async getAgent(entityRef: string): Promise<AiAgent | undefined> {\n const entity = await this.opts.catalogApi.getEntityByRef(entityRef);\n return entity ? entityToAgent(entity) : undefined;\n }\n\n async getStatuses(entityRefs: string[]): Promise<Record<string, AgentStatus>> {\n if (!entityRefs.length) return {};\n try {\n const res = await this.opts.fetchApi.fetch(\n `${this.basePath}/statuses?refs=${encodeURIComponent(entityRefs.join(','))}`,\n );\n if (!res.ok) return {};\n return (await res.json()) as Record<string, AgentStatus>;\n } catch {\n return {};\n }\n }\n}", "import { useCallback, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent } from '../types';\n\nexport interface AgentFilters {\n search: string;\n runtime: string[];\n capability: string[];\n lifecycle: string[];\n owner: string[];\n}\n\nexport const initialFilters: AgentFilters = {\n search: '',\n runtime: [],\n capability: [],\n lifecycle: [],\n owner: [],\n};\n\nexport function applyFilters(\n agents: AiAgent[],\n filters: AgentFilters,\n): AiAgent[] {\n const search = filters.search.trim().toLowerCase();\n return agents.filter(a => {\n if (search) {\n const haystack = [a.name, a.title, a.description, a.purpose]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(search)) return false;\n }\n if (filters.runtime.length && !filters.runtime.includes(a.runtime.runtime)) {\n return false;\n }\n if (filters.capability.length) {\n const caps = a.capabilities.map(c => c.label);\n if (!filters.capability.every(c => caps.includes(c))) return false;\n }\n if (filters.lifecycle.length && !filters.lifecycle.includes(a.lifecycle ?? '')) {\n return false;\n }\n if (filters.owner.length && !filters.owner.includes(a.owner ?? '')) {\n return false;\n }\n return true;\n });\n}\n\nexport function useAgents() {\n const api = useApi(aiAgentsApiRef);\n const {\n value: agents,\n loading,\n error,\n retry,\n } = useAsyncRetry(() => api.listAgents(), [api]);\n\n const [filters, setFilters] = useState<AgentFilters>(initialFilters);\n\n const filtered = useMemo(\n () => applyFilters(agents ?? [], filters),\n [agents, filters],\n );\n\n const update = useCallback(\n (patch: Partial<AgentFilters>) =>\n setFilters(prev => ({ ...prev, ...patch })),\n [],\n );\n\n const reset = useCallback(() => setFilters(initialFilters), []);\n\n return {\n agents: filtered,\n allAgents: agents ?? [],\n loading,\n error,\n retry,\n filters,\n update,\n reset,\n };\n}", "import React from 'react';\nimport {\n Box,\n IconButton,\n InputAdornment,\n MenuItem,\n Paper,\n TextField,\n Tooltip,\n} from '@mui/material';\nimport SearchIcon from '@mui/icons-material/Search';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport type { AiAgent } from '../types';\nimport type { AgentFilters } from '../hooks/useAgents';\n\nexport interface AgentFiltersBarProps {\n agents: AiAgent[];\n filters: AgentFilters;\n onChange: (patch: Partial<AgentFilters>) => void;\n onReset: () => void;\n}\n\nconst SELECT_PROPS = {\n SelectProps: { multiple: true, renderValue: (v: unknown) => (v as string[]).join(', ') || 'All' },\n} as const;\n\nexport const AgentFiltersBar: React.FC<AgentFiltersBarProps> = ({\n agents,\n filters,\n onChange,\n onReset,\n}) => {\n const runtimes = Array.from(new Set(agents.map(a => a.runtime.runtime))).sort();\n const capabilities = Array.from(\n new Set(agents.flatMap(a => a.capabilities.map(c => c.label))),\n ).sort();\n const lifecycles = Array.from(new Set(agents.map(a => a.lifecycle).filter(Boolean))) as string[];\n const owners = Array.from(new Set(agents.map(a => a.owner).filter(Boolean))) as string[];\n\n const hasFilters =\n filters.search ||\n filters.runtime.length ||\n filters.capability.length ||\n filters.lifecycle.length ||\n filters.owner.length;\n\n return (\n <Paper sx={{ p: 1.5, mb: 2, display: 'flex', gap: 1.5, flexWrap: 'wrap', alignItems: 'center' }}>\n <TextField\n size=\"small\"\n placeholder=\"Search agents\u2026\"\n value={filters.search}\n onChange={e => onChange({ search: e.target.value })}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: filters.search ? (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" onClick={() => onChange({ search: '' })}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n />\n\n <TextField select size=\"small\" label=\"Runtime\" value={filters.runtime}\n onChange={e => onChange({ runtime: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {runtimes.map(r => <MenuItem key={r} value={r}>{r}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Capability\" value={filters.capability}\n onChange={e => onChange({ capability: e.target.value as unknown as string[] })}\n sx={{ minWidth: 150 }} {...SELECT_PROPS}>\n {capabilities.map(c => <MenuItem key={c} value={c}>{c}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Lifecycle\" value={filters.lifecycle}\n onChange={e => onChange({ lifecycle: e.target.value as unknown as string[] })}\n sx={{ minWidth: 130 }} {...SELECT_PROPS}>\n {lifecycles.map(l => <MenuItem key={l} value={l}>{l}</MenuItem>)}\n </TextField>\n\n <TextField select size=\"small\" label=\"Owner\" value={filters.owner}\n onChange={e => onChange({ owner: e.target.value as unknown as string[] })}\n sx={{ minWidth: 140 }} {...SELECT_PROPS}>\n {owners.map(o => <MenuItem key={o} value={o}>{o}</MenuItem>)}\n </TextField>\n\n {hasFilters && (\n <Tooltip title=\"Clear filters\">\n <IconButton size=\"small\" onClick={onReset}>\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Box sx={{ ml: 'auto', alignSelf: 'center' }}>\n <strong>{agents.length}</strong> agent{agents.length !== 1 ? 's' : ''}\n </Box>\n </Paper>\n );\n};", "import React, { useState } from 'react';\nimport { Box } from '@mui/material';\n\nconst PALETTE = [\n '#1976d2', '#388e3c', '#f57c00', '#7b1fa2',\n '#c62828', '#0097a7', '#5d4037', '#455a64',\n];\n\nfunction initialsOf(name: string): string {\n const parts = name.replace(/[-_]+/g, ' ').trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction colorFor(name: string): string {\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0;\n return PALETTE[Math.abs(hash) % PALETTE.length];\n}\n\nexport interface AgentAvatarProps {\n name: string;\n avatarUrl?: string;\n size?: number;\n}\n\nexport const AgentAvatar: React.FC<AgentAvatarProps> = ({\n name,\n avatarUrl,\n size = 44,\n}) => {\n const [broken, setBroken] = useState(false);\n const showImage = avatarUrl && !broken;\n\n return (\n <Box\n sx={{\n width: size,\n height: size,\n flexShrink: 0,\n borderRadius: '50%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: showImage ? 'transparent' : colorFor(name),\n color: 'common.white',\n fontSize: size * 0.36,\n fontWeight: 700,\n }}\n >\n {showImage ? (\n <img\n src={avatarUrl}\n alt={name}\n width={size}\n height={size}\n onError={() => setBroken(true)}\n style={{ objectFit: 'cover', borderRadius: '50%' }}\n />\n ) : (\n initialsOf(name)\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Tooltip, Typography } from '@mui/material';\nimport type { AgentStatus, AgentStatusState } from '../types';\n\nconst STATE_COLOR: Record<AgentStatusState, string> = {\n healthy: 'success.main',\n degraded: 'warning.main',\n down: 'error.main',\n unknown: 'text.disabled',\n};\n\nexport interface AgentStatusBadgeProps {\n status?: AgentStatus;\n}\n\nexport const AgentStatusBadge: React.FC<AgentStatusBadgeProps> = ({ status }) => {\n const state = status?.state ?? 'unknown';\n const color = STATE_COLOR[state];\n const ring = state === 'unknown' ? `1px dashed ${color}` : 'none';\n\n const title = status\n ? [\n `Status: ${state}`,\n status.lastChecked ? `Last checked: ${new Date(status.lastChecked).toLocaleString()}` : null,\n status.latencyMs != null ? `Latency: ${status.latencyMs}ms` : null,\n status.message ? status.message : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')\n : 'Status: unknown';\n\n return (\n <Tooltip title={title} arrow>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n cursor: 'help',\n }}\n >\n <Box\n component=\"span\"\n sx={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n bgcolor: color,\n border: ring,\n flexShrink: 0,\n }}\n />\n {status?.latencyMs != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {status.latencyMs}ms\n </Typography>\n )}\n </Box>\n </Tooltip>\n );\n};", "import React, { useState } from 'react';\nimport { Chip, Box, Popover } from '@mui/material';\nimport type { AgentCapability, AgentCapabilityCategory } from '../types';\n\nconst CATEGORY_COLOR: Record<\n AgentCapabilityCategory,\n 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'error' | 'default'\n> = {\n reasoning: 'primary',\n retrieval: 'info',\n tools: 'secondary',\n vision: 'success',\n voice: 'warning',\n data: 'default',\n safety: 'error',\n};\n\nconst MAX_VISIBLE = 5;\n\nexport interface AgentCapabilitiesProps {\n capabilities: AgentCapability[];\n max?: number;\n size?: 'small' | 'medium';\n}\n\nexport const AgentCapabilities: React.FC<AgentCapabilitiesProps> = ({\n capabilities,\n max = MAX_VISIBLE,\n size = 'small',\n}) => {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n if (!capabilities.length) return null;\n const visible = capabilities.slice(0, max);\n const overflow = capabilities.length - visible.length;\n\n return (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {visible.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size={size}\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n {overflow > 0 && (\n <>\n <Chip\n label={`+${overflow}`}\n size={size}\n clickable\n onClick={e => {\n e.stopPropagation();\n setAnchor(e.currentTarget);\n }}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Box sx={{ p: 1, maxWidth: 280, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {capabilities.map((c, i) => (\n <Chip\n key={`${c.label}-${i}`}\n label={c.label}\n size=\"small\"\n color={c.category ? CATEGORY_COLOR[c.category] : 'default'}\n variant={c.category ? 'filled' : 'outlined'}\n />\n ))}\n </Box>\n </Popover>\n </>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Chip, Box } from '@mui/material';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport type { AgentRuntimeName } from '../types';\n\nconst RUNTIME_META: Record<\n string,\n { label: string; icon: React.ReactNode }\n> = {\n 'bedrock-agentcore': { label: 'Bedrock AgentCore', icon: <CloudQueueIcon fontSize=\"small\" /> },\n litellm: { label: 'LiteLLM', icon: <MemoryIcon fontSize=\"small\" /> },\n lambda: { label: 'AWS Lambda', icon: <FunctionsIcon fontSize=\"small\" /> },\n custom: { label: 'Custom', icon: <ExtensionIcon fontSize=\"small\" /> },\n};\n\nexport interface RuntimeBadgeProps {\n runtime: AgentRuntimeName;\n size?: 'small' | 'medium';\n onClick?: (runtime: string) => void;\n}\n\nexport const RuntimeBadge: React.FC<RuntimeBadgeProps> = ({\n runtime,\n size = 'small',\n onClick,\n}) => {\n const meta = RUNTIME_META[runtime] ?? {\n label: String(runtime),\n icon: <ExtensionIcon fontSize=\"small\" />,\n };\n return (\n <Chip\n size={size}\n variant=\"outlined\"\n label={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {meta.icon}\n {meta.label}\n </Box>\n }\n onClick={onClick ? () => onClick(runtime) : undefined}\n clickable={Boolean(onClick)}\n />\n );\n};", "import React from 'react';\nimport { Chip, Box, Typography } from '@mui/material';\nimport type { AgentBilling } from '../types';\n\nconst BILLING_COLOR: Record<string, 'primary' | 'secondary' | 'success' | 'default'> = {\n 'per-invocation': 'primary',\n 'per-token': 'secondary',\n subscription: 'success',\n free: 'default',\n};\n\nexport interface BillingBadgeProps {\n billing: AgentBilling;\n}\n\nexport const BillingBadge: React.FC<BillingBadgeProps> = ({ billing }) => {\n const color = BILLING_COLOR[billing.model] ?? 'default';\n const unitLabel =\n billing.model === 'per-token'\n ? 'per 1M tokens'\n : billing.model === 'per-invocation'\n ? 'per 1k calls'\n : null;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n <Chip size=\"small\" color={color} label={billing.model} variant=\"outlined\" />\n {billing.unitCost != null && unitLabel && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~${billing.unitCost} {unitLabel}\n </Typography>\n )}\n {billing.budget != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n budget: ${billing.budget}\n </Typography>\n )}\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Card, CardActionArea, Chip, Link, Tooltip, Typography } from '@mui/material';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LIFECYCLE_COLOR: Record<string, 'success' | 'warning' | 'error' | 'default'> = {\n production: 'success',\n experimental: 'warning',\n deprecated: 'error',\n};\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentCardProps {\n agent: AiAgent;\n onClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentCard: React.FC<AgentCardProps> = ({\n agent,\n onClick,\n onRuntimeClick,\n}) => {\n const title = agent.title ?? agent.name;\n const lifecycleColor = agent.lifecycle\n ? LIFECYCLE_COLOR[agent.lifecycle] ?? 'default'\n : 'default';\n\n return (\n <Card\n variant=\"outlined\"\n sx={{\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n transition: theme => `box-shadow ${theme.transitions.duration.short}ms`,\n '&:hover': { boxShadow: 6 },\n }}\n >\n <CardActionArea\n onClick={() => onClick?.(agent)}\n sx={{ flexGrow: 1, p: 2, alignItems: 'stretch', display: 'flex' }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\n {/* Header: avatar + title + status */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 1 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\" fontWeight={700} noWrap title={title}>\n {title}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.name}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n {/* Purpose */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n minHeight: '2.6em',\n mb: 1.5,\n }}\n >\n {agent.purpose || 'No description provided.'}\n </Typography>\n\n {/* Runtime */}\n <Box sx={{ mb: 1 }}>\n <RuntimeBadge\n runtime={agent.runtime.runtime}\n onClick={onRuntimeClick}\n />\n </Box>\n\n {/* Capabilities */}\n {agent.capabilities.length > 0 && (\n <Box sx={{ mb: 1.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} />\n </Box>\n )}\n\n {/* Billing */}\n <Box sx={{ mb: 1.5 }}>\n <BillingBadge billing={agent.billing} />\n </Box>\n\n {/* Footer: owner + lifecycle + version */}\n <Box\n sx={{\n mt: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n flexWrap: 'wrap',\n }}\n >\n {agent.owner && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {agent.owner}\n </Typography>\n )}\n {agent.lifecycle && (\n <Chip\n size=\"small\"\n color={lifecycleColor}\n label={agent.lifecycle}\n variant=\"outlined\"\n sx={{ height: 20, '& .MuiChip-label': { px: 0.75, fontSize: '0.7rem' } }}\n />\n )}\n {agent.version && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n v{agent.version}\n </Typography>\n )}\n </Box>\n\n {/* Links */}\n {agent.links.length > 0 && (\n <Box sx={{ display: 'flex', gap: 1.5, mt: 1.5, pt: 1, borderTop: '1px solid', borderColor: 'divider' }}>\n {agent.links.slice(0, 4).map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={e => e.stopPropagation()}\n sx={{ display: 'inline-flex', color: 'text.secondary' }}\n >\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </Link>\n </Tooltip>\n ))}\n </Box>\n )}\n </Box>\n </CardActionArea>\n </Card>\n );\n};", "import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { AiAgent } from '../types';\nimport { AgentCard } from './AgentCard';\n\nexport interface AgentsGridProps {\n agents: AiAgent[];\n onAgentClick?: (agent: AiAgent) => void;\n onRuntimeClick?: (runtime: string) => void;\n}\n\nexport const AgentsGrid: React.FC<AgentsGridProps> = ({\n agents,\n onAgentClick,\n onRuntimeClick,\n}) => {\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 2,\n }}\n >\n {agents.map(a => (\n <AgentCard\n key={a.entityRef}\n agent={a}\n onClick={onAgentClick}\n onRuntimeClick={onRuntimeClick}\n />\n ))}\n </Box>\n );\n};", "import React from 'react';\nimport {\n Box,\n Chip,\n Drawer,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Stack,\n Typography,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport ArticleIcon from '@mui/icons-material/Article';\nimport BugReportIcon from '@mui/icons-material/BugReport';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport type { AiAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { RuntimeBadge } from './RuntimeBadge';\nimport { BillingBadge } from './BillingBadge';\n\nconst LINK_ICON: Record<string, React.ReactNode> = {\n dashboard: <DashboardIcon fontSize=\"small\" />,\n docs: <DescriptionIcon fontSize=\"small\" />,\n playbook: <ArticleIcon fontSize=\"small\" />,\n issues: <BugReportIcon fontSize=\"small\" />,\n};\n\nexport interface AgentDetailDrawerProps {\n agent: AiAgent | null;\n open: boolean;\n onClose: () => void;\n onRefreshStatus?: (entityRef: string) => void;\n}\n\nconst Row: React.FC<{ label: string; children: React.ReactNode }> = ({\n label,\n children,\n}) => (\n <Box sx={{ display: 'flex', gap: 1, mb: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 110 }}>\n {label}\n </Typography>\n <Box sx={{ flexGrow: 1 }}>{children}</Box>\n </Box>\n);\n\nexport const AgentDetailDrawer: React.FC<AgentDetailDrawerProps> = ({\n agent,\n open,\n onClose,\n onRefreshStatus,\n}) => {\n if (!agent) return null;\n const title = agent.title ?? agent.name;\n\n const copyRef = () => {\n navigator.clipboard?.writeText(agent.entityRef).catch(() => {});\n };\n\n return (\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={onClose}\n sx={{ '& .MuiDrawer-paper': { width: { xs: '100%', sm: 480 } } }}\n >\n <Box sx={{ p: 2, display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={56} />\n <Box sx={{ flexGrow: 1 }}>\n <Typography variant=\"h6\">{title}</Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n cursor: 'pointer',\n }}\n onClick={copyRef}\n >\n {agent.entityRef}\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n </Typography>\n </Box>\n <IconButton size=\"small\" onClick={onClose}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Box sx={{ px: 2, pb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <AgentStatusBadge status={agent.status} />\n {onRefreshStatus && (\n <IconButton\n size=\"small\"\n title=\"Refresh status\"\n onClick={() => onRefreshStatus(agent.entityRef)}\n >\n <RefreshIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n\n <Box sx={{ px: 2, pb: 3 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Row label=\"Runtime\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <RuntimeBadge runtime={agent.runtime.runtime} />\n {agent.runtime.endpoint && (\n <Link\n href={agent.runtime.endpoint}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}\n >\n endpoint <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n )}\n </Stack>\n {agent.runtime.runtimeHandle && (\n <Typography variant=\"caption\" display=\"block\" color=\"text.secondary\" sx={{ mt: 0.5, wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n )}\n </Row>\n\n <Row label=\"Capabilities\">\n {agent.capabilities.length ? (\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n <Row label=\"Billing\">\n <BillingBadge billing={agent.billing} />\n </Row>\n\n <Row label=\"Owner\">{agent.owner ?? '\u2014'}</Row>\n <Row label=\"System\">{agent.system ?? '\u2014'}</Row>\n <Row label=\"Lifecycle\">{agent.lifecycle ?? '\u2014'}</Row>\n <Row label=\"Version\">{agent.version ?? '\u2014'}</Row>\n <Row label=\"Tags\">\n {agent.tags.length ? (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => (\n <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />\n ))}\n </Box>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\u2014</Typography>\n )}\n </Row>\n\n {agent.links.length > 0 && (\n <Row label=\"Links\">\n <List dense disablePadding>\n {agent.links.map((l, i) => (\n <ListItem\n key={i}\n component=\"a\"\n href={l.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n sx={{ color: 'text.primary', borderRadius: 1, '&:hover': { bgcolor: 'action.hover' } }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n {LINK_ICON[l.icon ?? ''] ?? <DescriptionIcon fontSize=\"small\" />}\n </ListItemIcon>\n <ListItemText primary={l.title} secondary={l.url}\n secondaryTypographyProps={{ sx: { fontSize: '0.7rem' } as const, noWrap: true }} />\n </ListItem>\n ))}\n </List>\n </Row>\n )}\n\n <Row label=\"Catalog\">\n <Link href={`/catalog/${agent.entityRef.replace(':', '/')}`}>\n Open in catalog <OpenInNewIcon sx={{ fontSize: 12, verticalAlign: 'middle' }} />\n </Link>\n </Row>\n </Box>\n </Drawer>\n );\n};", "import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, CircularProgress, Typography } from '@mui/material';\nimport { EmptyState } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { aiAgentsApiRef } from '../api';\nimport type { AiAgent, AgentStatus } from '../types';\nimport { useAgents } from '../hooks/useAgents';\nimport { AgentFiltersBar } from './AgentFilters';\nimport { AgentsGrid } from './AgentsGrid';\nimport { AgentDetailDrawer } from './AgentDetailDrawer';\n\nconst POLL_INTERVAL_MS = 30_000;\n\nexport const AgentsPage: React.FC = () => {\n const api = useApi(aiAgentsApiRef);\n const { agents, allAgents, loading, error, retry, filters, update, reset } =\n useAgents();\n\n const [selected, setSelected] = useState<AiAgent | null>(null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [statuses, setStatuses] = useState<Record<string, AgentStatus>>({});\n\n const refs = allAgents.map(a => a.entityRef);\n\n // Initial + on-ref-change status fetch. Polling runs separately below.\n useEffect(() => {\n let cancelled = false;\n if (!refs.length) return;\n api.getStatuses(refs).then(result => {\n if (!cancelled) setStatuses(result);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.join(',')]);\n\n // Best-effort polling for live status while the page is mounted.\n useEffect(() => {\n if (!refs.length) return;\n const id = setInterval(async () => {\n const result = await api.getStatuses(refs);\n setStatuses(prev => ({ ...prev, ...result }));\n }, POLL_INTERVAL_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, refs.length]);\n\n const agentsWithStatus = agents.map(a => ({\n ...a,\n status: statuses[a.entityRef] ?? a.status,\n }));\n\n const handleCardClick = useCallback((agent: AiAgent) => {\n setSelected(agent);\n setDrawerOpen(true);\n }, []);\n\n const handleRuntimeClick = useCallback(\n (runtime: string) => {\n if (!filters.runtime.includes(runtime)) {\n update({ runtime: [...filters.runtime, runtime] });\n }\n },\n [filters.runtime, update],\n );\n\n const handleRefreshStatus = useCallback(\n async (entityRef: string) => {\n const result = await api.getStatuses([entityRef]);\n setStatuses(prev => ({ ...prev, ...result }));\n setSelected(prev =>\n prev && prev.entityRef === entityRef\n ? { ...prev, status: result[entityRef] ?? prev.status }\n : prev,\n );\n },\n [api],\n );\n\n if (loading && !allAgents.length) {\n return (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" minHeight=\"40vh\">\n <CircularProgress />\n </Box>\n );\n }\n\n if (error) {\n return (\n <EmptyState\n title=\"Failed to load AI agents\"\n description={error.message}\n missing=\"content\"\n />\n );\n }\n\n return (\n <Box sx={{ p: 3 }}>\n <Box sx={{ mb: 2 }}>\n <Typography variant=\"h4\">AI Agents</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n AI agents registered in the catalog as <code>Component</code> entities\n with <code>spec.type: ai-agent</code>.\n </Typography>\n </Box>\n\n <AgentFiltersBar\n agents={allAgents}\n filters={filters}\n onChange={update}\n onReset={reset}\n />\n\n {agentsWithStatus.length === 0 ? (\n <EmptyState\n title=\"No AI agents registered\"\n description=\"Add a Component with spec.type: ai-agent to the catalog, or adjust your filters.\"\n missing=\"content\"\n action={<button onClick={() => retry()}>Retry</button>}\n />\n ) : (\n <AgentsGrid\n agents={agentsWithStatus}\n onAgentClick={handleCardClick}\n onRuntimeClick={handleRuntimeClick}\n />\n )}\n\n <AgentDetailDrawer\n agent={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onRefreshStatus={handleRefreshStatus}\n />\n </Box>\n );\n};", "import React from 'react';\nimport { Box, Chip, Grid, Link, Tooltip, Typography } from '@mui/material';\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\nimport MemoryIcon from '@mui/icons-material/Memory';\nimport CloudQueueIcon from '@mui/icons-material/CloudQueue';\nimport FunctionsIcon from '@mui/icons-material/Functions';\nimport ExtensionIcon from '@mui/icons-material/Extension';\nimport { entityToAgent } from '../types';\nimport { AgentAvatar } from './AgentAvatar';\nimport { AgentStatusBadge } from './AgentStatusBadge';\nimport { AgentCapabilities } from './AgentCapabilities';\nimport { BillingBadge } from './BillingBadge';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nconst RUNTIME_ICON: Record<string, React.ReactNode> = {\n 'bedrock-agentcore': <CloudQueueIcon fontSize=\"small\" />,\n litellm: <MemoryIcon fontSize=\"small\" />,\n lambda: <FunctionsIcon fontSize=\"small\" />,\n custom: <ExtensionIcon fontSize=\"small\" />,\n};\n\nconst Field: React.FC<{ label: string; value?: React.ReactNode; mono?: boolean }> = ({\n label,\n value,\n mono,\n}) => (\n <Grid item xs={6}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" sx={{ wordBreak: 'break-all' }} style={mono ? { fontFamily: 'monospace' } : undefined}>\n {value ?? '\u2014'}\n </Typography>\n </Grid>\n);\n\nexport const AgentOverviewCard: React.FC = () => {\n const { entity } = useEntity();\n if (!entity || entity.spec?.type !== 'ai-agent') return null;\n const agent = entityToAgent(entity);\n if (!agent) return null;\n\n return (\n <Box sx={{ p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5, mb: 2 }}>\n <AgentAvatar name={agent.name} avatarUrl={agent.avatarUrl} size={48} />\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Typography variant=\"h6\" noWrap>{agent.title ?? agent.name}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" noWrap>\n {agent.entityRef}\n </Typography>\n </Box>\n <AgentStatusBadge status={agent.status} />\n </Box>\n\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n {agent.purpose || agent.description || 'No description provided.'}\n </Typography>\n\n <Grid container spacing={2}>\n <Field label=\"Runtime\" value={\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {RUNTIME_ICON[agent.runtime.runtime] ?? <ExtensionIcon fontSize=\"small\" />}\n {agent.runtime.runtime}\n </Box>\n } />\n <Field label=\"Billing\" value={<BillingBadge billing={agent.billing} />} />\n <Field label=\"Owner\" value={agent.owner} />\n <Field label=\"Lifecycle\" value={agent.lifecycle} />\n <Field label=\"Version\" value={agent.version} />\n <Field label=\"System\" value={agent.system} />\n </Grid>\n\n {agent.runtime.endpoint && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Endpoint</Typography>\n <Typography variant=\"body2\" sx={{ wordBreak: 'break-all' }}>\n <Link href={agent.runtime.endpoint} target=\"_blank\" rel=\"noopener noreferrer\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {agent.runtime.endpoint} <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n </Typography>\n </Box>\n )}\n\n {agent.runtime.runtimeHandle && (\n <Box sx={{ mt: 1 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Runtime handle</Typography>\n <Typography variant=\"body2\" style={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {agent.runtime.runtimeHandle}\n </Typography>\n </Box>\n )}\n\n {agent.capabilities.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Capabilities</Typography>\n <Box sx={{ mt: 0.5 }}>\n <AgentCapabilities capabilities={agent.capabilities} max={20} />\n </Box>\n </Box>\n )}\n\n {agent.tags.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Tags</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\n {agent.tags.map(t => <Chip key={t} size=\"small\" label={t} variant=\"outlined\" />)}\n </Box>\n </Box>\n )}\n\n {agent.links.length > 0 && (\n <Box sx={{ mt: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">Links</Typography>\n <Box sx={{ mt: 0.5, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {agent.links.map((l, i) => (\n <Tooltip key={i} title={l.title}>\n <Link href={l.url} target=\"_blank\" rel=\"noopener noreferrer\" sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.5 }}>\n {l.title} <OpenInNewIcon sx={{ fontSize: 12 }} />\n </Link>\n </Tooltip>\n ))}\n </Box>\n </Box>\n )}\n\n <Box sx={{ mt: 2 }}>\n <Link href={`/ai-agents`}>View on the AI Agents page</Link>\n </Box>\n </Box>\n );\n};", "import React from 'react';\nimport { SmartToy as AgentIcon } from '@mui/icons-material';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { aiAgentsApiRef, AiAgentsApi } from './api';\n\nconst aiAgentsApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: aiAgentsApiRef,\n deps: { fetchApi: fetchApiRef, catalogApi: catalogApiRef },\n factory: ({ fetchApi, catalogApi }) =>\n new AiAgentsApi({ fetchApi, catalogApi }),\n }),\n});\n\nconst aiAgentsPage = PageBlueprint.make({\n params: {\n path: '/ai-agents',\n title: 'AI Agents',\n icon: <AgentIcon />,\n loader: async () => {\n const { AgentsPage } = await import('./components/AgentsPage');\n return <AgentsPage />;\n },\n },\n});\n\n// Entity-page card shown on Component entities with spec.type: ai-agent.\n// Renders an agent overview (runtime, billing, capabilities, status) inside\n// the catalog entity Overview page. The filter restricts it to ai-agent\n// entities so it stays hidden on regular services/APIs/resources.\nconst aiAgentOverviewCard = EntityCardBlueprint.make({\n name: 'overview',\n params: {\n filter: {\n 'spec.type': 'ai-agent',\n },\n loader: async () => {\n const { AgentOverviewCard } = await import('./components/AgentOverviewCard');\n return <AgentOverviewCard />;\n },\n },\n});\n\nexport const aiAgentsPlugin = createFrontendPlugin({\n pluginId: 'ai-agents',\n extensions: [aiAgentsApi, aiAgentsPage, aiAgentOverviewCard],\n});", "export { aiAgentsPlugin } from './plugin';\nexport { AgentsPage } from './components/AgentsPage';\nexport { AgentCard } from './components/AgentCard';\nexport { AgentOverviewCard } from './components/AgentOverviewCard';\nexport { aiAgentsApiRef, AiAgentsApi } from './api';\nexport type { AiAgentsApiInterface } from './api';\nexport {\n AI_AGENT_TYPE,\n AI_AGENT_ANNOTATION_PREFIX,\n entityToAgent,\n} from './types';\nexport type {\n AiAgent,\n AgentRuntimeInfo,\n AgentRuntimeName,\n AgentBilling,\n AgentBillingModel,\n AgentCapability,\n AgentCapabilityCategory,\n AgentStatus,\n AgentStatusState,\n} from './types';"],
5
+ "mappings": "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",
6
+ "names": ["entityRef", "React", "useState", "Box", "React", "Box", "Tooltip", "React", "useState", "Box", "React", "Chip", "Box", "React", "Chip", "Box", "Typography", "React", "Box", "Chip", "Tooltip", "Typography", "React", "Box", "React", "Box", "Chip", "IconButton", "Link", "Typography", "DashboardIcon", "DescriptionIcon", "ArticleIcon", "BugReportIcon", "LINK_ICON", "React", "useCallback", "useState", "Box", "Typography", "useApi", "entityRef", "React", "Box", "Chip", "Link", "Tooltip", "Typography", "OpenInNewIcon", "MemoryIcon", "CloudQueueIcon", "FunctionsIcon", "ExtensionIcon", "React", "AgentsPage", "AgentOverviewCard"]
7
7
  }
package/dist/plugin.d.ts CHANGED
@@ -9,6 +9,31 @@ export declare const aiAgentsPlugin: import("@backstage/frontend-plugin-api").Ov
9
9
  inputs: {};
10
10
  params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: import("@backstage/frontend-plugin-api").ApiFactory<TApi, TImpl, TDeps>) => import("@backstage/frontend-plugin-api").ExtensionBlueprintParams<import("@backstage/frontend-plugin-api").AnyApiFactory>;
11
11
  }>;
12
+ "entity-card:ai-agents/overview": import("@backstage/frontend-plugin-api").OverridableExtensionDefinition<{
13
+ kind: "entity-card";
14
+ name: "overview";
15
+ config: {
16
+ filter: import("@backstage/filter-predicates").FilterPredicate | undefined;
17
+ type: "content" | "info" | undefined;
18
+ };
19
+ configInput: {
20
+ filter?: import("@backstage/filter-predicates").FilterPredicate | undefined;
21
+ type?: "content" | "info" | undefined;
22
+ };
23
+ output: import("@backstage/frontend-plugin-api").ExtensionDataRef<React.JSX.Element, "core.reactElement", {}> | import("@backstage/frontend-plugin-api").ExtensionDataRef<(entity: import("@backstage/catalog-model").Entity) => boolean, "catalog.entity-filter-function", {
24
+ optional: true;
25
+ }> | import("@backstage/frontend-plugin-api").ExtensionDataRef<string, "catalog.entity-filter-expression", {
26
+ optional: true;
27
+ }> | import("@backstage/frontend-plugin-api").ExtensionDataRef<import("@backstage/plugin-catalog-react/alpha").EntityCardType, "catalog.entity-card-type", {
28
+ optional: true;
29
+ }>;
30
+ inputs: {};
31
+ params: {
32
+ loader: () => Promise<JSX.Element>;
33
+ filter?: string | import("@backstage/filter-predicates").FilterPredicate | ((entity: import("@backstage/catalog-model").Entity) => boolean);
34
+ type?: import("@backstage/plugin-catalog-react/alpha").EntityCardType;
35
+ };
36
+ }>;
12
37
  "page:ai-agents": import("@backstage/frontend-plugin-api").OverridableExtensionDefinition<{
13
38
  kind: "page";
14
39
  name: undefined;
@@ -20,9 +45,9 @@ export declare const aiAgentsPlugin: import("@backstage/frontend-plugin-api").Ov
20
45
  path?: string | undefined;
21
46
  title?: string | undefined;
22
47
  };
23
- output: import("@backstage/frontend-plugin-api").ExtensionDataRef<string, "core.routing.path", {}> | import("@backstage/frontend-plugin-api").ExtensionDataRef<import("@backstage/frontend-plugin-api").RouteRef<import("@backstage/frontend-plugin-api").AnyRouteRefParams>, "core.routing.ref", {
48
+ output: import("@backstage/frontend-plugin-api").ExtensionDataRef<React.JSX.Element, "core.reactElement", {}> | import("@backstage/frontend-plugin-api").ExtensionDataRef<string, "core.routing.path", {}> | import("@backstage/frontend-plugin-api").ExtensionDataRef<import("@backstage/frontend-plugin-api").RouteRef<import("@backstage/frontend-plugin-api").AnyRouteRefParams>, "core.routing.ref", {
24
49
  optional: true;
25
- }> | import("@backstage/frontend-plugin-api").ExtensionDataRef<React.JSX.Element, "core.reactElement", {}> | import("@backstage/frontend-plugin-api").ExtensionDataRef<string, "core.title", {
50
+ }> | import("@backstage/frontend-plugin-api").ExtensionDataRef<string, "core.title", {
26
51
  optional: true;
27
52
  }> | import("@backstage/frontend-plugin-api").ExtensionDataRef<import("@backstage/frontend-plugin-api").IconElement, "core.icon", {
28
53
  optional: true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acarmisc/backstage-plugin-ai-agents",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Backstage frontend plugin for managing AI Agents stored as catalog Components.",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -39,7 +39,7 @@
39
39
  "@backstage/core-components": "^0.18.10",
40
40
  "@backstage/core-plugin-api": "^1.12.6",
41
41
  "@backstage/frontend-plugin-api": "^0.17.0",
42
- "@backstage/plugin-catalog-react": "^1.15.0",
42
+ "@backstage/plugin-catalog-react": "^3.0.0",
43
43
  "@backstage/theme": "^0.6.0",
44
44
  "@emotion/react": "^11.11.0",
45
45
  "@emotion/styled": "^11.11.0",