@acarmisc/backstage-plugin-ai-agents 0.1.0 → 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.
- package/dist/components/AgentOverviewCard.d.ts +2 -0
- package/dist/index.cjs.js +64 -6
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +62 -4
- package/dist/index.esm.js.map +4 -4
- package/dist/plugin.d.ts +27 -2
- package/package.json +2 -2
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
|
|
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
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
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
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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
|
|
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__ */
|
|
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__ */
|
|
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,
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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": "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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", "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<
|
|
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.
|
|
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": "^
|
|
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",
|