@burdenoff/microfe-botmanor 2026.821.1 → 2026.925.1
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/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.js +4 -4
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/ErrorState.js +33 -29
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/RouteLoader.js +52 -48
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.js +74 -77
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.js +31 -30
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +116 -124
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +169 -172
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +96 -90
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +228 -231
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +84 -87
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +144 -147
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.js +156 -149
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.js +126 -129
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +111 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +163 -159
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +159 -154
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +119 -114
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +144 -159
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +122 -105
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +176 -175
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.js +1 -1
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +33 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/AgentDetailPage.tsx"],"sourcesContent":["/**\n * Agent Detail Page\n * @module botlit/pages\n *\n * Displays agent details using flat API fields from the real GraphQL backend.\n * Maps flat fields (systemPrompt, llmModelId, mcpConnectionIds, knowledgeBaseIds, capabilities[])\n * to a rich detail view with tabs.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Play,\n Settings,\n BarChart3,\n BookOpen,\n Wrench,\n Shield,\n Brain,\n MessageSquare,\n Edit,\n Share2,\n FileText,\n Trash2,\n History,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { toast } from 'sonner';\nimport { PagePurpose, NextSteps, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { VersionHistoryPanel } from '../components/VersionHistoryPanel';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\n\ntype TabType =\n | 'overview'\n | 'prompt'\n | 'llm'\n | 'tools'\n | 'knowledge'\n | 'guardrails'\n | 'a2a'\n | 'versions';\n\nexport const AgentDetailPage: FC = () => {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: agent, loading, refetch: refetchAgent } = useAgent(agentId);\n const [updateAgent, updateAgentResult] = useUpdateAgent();\n const [deleteAgent, deleteAgentResult] = useDeleteAgent();\n const [activeTab, setActiveTab] = useState<TabType>('overview');\n\n if (loading) {\n return (\n <PageLayout title={t('botlit.common.loading', 'Loading...')}>\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!agent) {\n return (\n <PageLayout title={t('botlit.agentDetail.notFound.title', 'Agent Not Found')}>\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentDetail.notFound.title', 'Agent Not Found')}\n description={t(\n 'botlit.agentDetail.notFound.description',\n \"The agent you're looking for doesn't exist.\"\n )}\n action={\n <Button onClick={() => navigateTo('agents')}>\n {t('botlit.agentDetail.notFound.backAction', 'Back to Agents')}\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n // `AgentRecord` declares every field the agent query selects — read directly.\n const systemPrompt = agent.systemPrompt || '';\n const llmModelId = agent.llmModelId || '';\n const temperature = agent.temperature;\n const maxTokens = agent.maxTokens;\n const mcpConnectionIds = agent.mcpConnectionIds ?? [];\n const knowledgeBaseIds = agent.knowledgeBaseIds ?? [];\n const workflowIds = agent.workflowIds ?? [];\n const capabilities = agent.capabilities ?? [];\n const tagIds = agent.tagIds ?? [];\n const maxConcurrentExecutions = agent.maxConcurrentExecutions || 10;\n const metadata = agent.metadata ?? null;\n\n const tabs: { id: TabType; label: string; icon: ReactNode }[] = [\n {\n id: 'overview',\n label: t('botlit.agentDetail.tabs.overview', 'Overview'),\n icon: <BarChart3 size={16} />,\n },\n {\n id: 'prompt',\n label: t('botlit.agentDetail.tabs.prompt', 'Prompt'),\n icon: <FileText size={16} />,\n },\n {\n id: 'llm',\n label: t('botlit.agentDetail.tabs.llmConfig', 'LLM Config'),\n icon: <Brain size={16} />,\n },\n { id: 'tools', label: t('botlit.agentDetail.tabs.tools', 'Tools'), icon: <Wrench size={16} /> },\n {\n id: 'knowledge',\n label: t('botlit.agentDetail.tabs.knowledge', 'Knowledge'),\n icon: <BookOpen size={16} />,\n },\n {\n id: 'guardrails',\n label: t('botlit.agentDetail.tabs.guardrails', 'Guardrails'),\n icon: <Shield size={16} />,\n },\n { id: 'a2a', label: t('botlit.agentDetail.tabs.a2a', 'A2A'), icon: <Share2 size={16} /> },\n {\n id: 'versions',\n label: t('botlit.agentDetail.tabs.versions', 'Versions'),\n icon: <History size={16} />,\n },\n ];\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('agents')}>\n <ArrowLeft size={20} />\n </Button>\n <span className=\"text-3xl\">{'🤖'}</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{agent.name}</span>\n <StatusBadge status={agent.status} />\n <Badge variant=\"outline\">{agent.slug}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{agent.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {agent.status === 'DRAFT' || agent.status === 'ARCHIVED' ? (\n <Button\n variant=\"default\"\n isLoading={updateAgentResult.loading}\n onClick={async () => {\n try {\n if (!agentId) return;\n await updateAgent({ agentId, input: { status: 'ACTIVE' } });\n await refetchAgent();\n toast.success(\n `${t('botlit.agentDetail.activate.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.activate.successSuffix', 'activated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.activate.error', 'Failed to activate agent')\n );\n }\n }}\n >\n {t('botlit.agentDetail.actions.activate', 'Activate')}\n </Button>\n ) : (\n <Button\n variant=\"outline\"\n isLoading={updateAgentResult.loading}\n onClick={async () => {\n try {\n if (!agentId) return;\n await updateAgent({ agentId, input: { status: 'DRAFT' } });\n await refetchAgent();\n toast.success(\n `${t('botlit.agentDetail.deactivate.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.deactivate.successSuffix', 'deactivated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.deactivate.error', 'Failed to deactivate agent')\n );\n }\n }}\n >\n {t('botlit.agentDetail.actions.deactivate', 'Deactivate')}\n </Button>\n )}\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => navigateTo(`agents/${agentId}/edit`)}\n >\n {t('botlit.agentDetail.actions.editAgent', 'Edit Agent')}\n </Button>\n <Button leftIcon={<Play size={16} />} onClick={() => navigateTo(`chat/${agentId}`)}>\n {t('botlit.agentDetail.actions.testAgent', 'Test Agent')}\n </Button>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n isLoading={deleteAgentResult.loading}\n onClick={async () => {\n if (!agentId) return;\n if (\n !confirm(\n `${t('botlit.agentDetail.delete.confirmPrefix', 'Are you sure you want to delete')} \"${agent.name}\"? ${t('botlit.agentDetail.delete.confirmSuffix', 'This action cannot be undone.')}`\n )\n )\n return;\n try {\n await deleteAgent(agentId);\n toast.success(\n `${t('botlit.agentDetail.delete.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.delete.successSuffix', 'deleted successfully')}`\n );\n navigateTo('agents');\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.delete.error', 'Failed to delete agent')\n );\n }\n }}\n >\n {t('botlit.common.delete', 'Delete')}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Brain size={18} />}>\n {t(\n 'botlit.agentDetail.purpose',\n 'This is the full configuration for a single agent — its prompt, model settings, the tools and knowledge it can use, its guardrails and how it talks to other agents. Use the tabs to inspect or change any part, and test the agent in chat to confirm it behaves the way you expect before going live.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle overflow-x-auto\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-medium border-b-2 transition-colors whitespace-nowrap',\n activeTab === tab.id\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n {tab.icon}\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n <NextSteps\n storageKey={`botlit-agent-${agentId}`}\n steps={[\n {\n id: 'test',\n label: t('botlit.agentDetail.nextSteps.test', 'Test the agent in chat'),\n description: t(\n 'botlit.agentDetail.nextSteps.testDesc',\n 'Send it a few real prompts to see how it responds.'\n ),\n icon: <Play size={16} />,\n onClick: () => navigateTo(`chat/${agentId}`),\n },\n {\n id: 'prompt',\n label: t('botlit.agentDetail.nextSteps.prompt', 'Refine the system prompt'),\n description: t(\n 'botlit.agentDetail.nextSteps.promptDesc',\n 'Tune its instructions and behaviour.'\n ),\n icon: <FileText size={16} />,\n onClick: () => setActiveTab('prompt'),\n },\n {\n id: 'tools',\n label: t('botlit.agentDetail.nextSteps.tools', 'Connect tools & knowledge'),\n description: t(\n 'botlit.agentDetail.nextSteps.toolsDesc',\n 'Give it MCP tools and knowledge bases to work with.'\n ),\n icon: <Wrench size={16} />,\n onClick: () => setActiveTab('tools'),\n },\n {\n id: 'activate',\n label: t('botlit.agentDetail.nextSteps.activate', 'Activate and attach to a bot'),\n description: t(\n 'botlit.agentDetail.nextSteps.activateDesc',\n 'Put it live so a bot can route conversations to it.'\n ),\n icon: <Share2 size={16} />,\n onClick: () => navigateTo(`agents/${agentId}/edit`),\n done: agent.status === 'ACTIVE',\n },\n ]}\n />\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Quick Info */}\n <Card className=\"lg:col-span-1\">\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <StatusBadge status={agent.status} />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Type</p>\n <Badge variant=\"outline\">{agent.type}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{agent.visibility}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">LLM Model</p>\n <p className=\"font-medium font-mono text-sm\">\n {llmModelId || 'Not configured'}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">MCP Connections</p>\n <p className=\"font-medium\">{mcpConnectionIds.length} servers</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Knowledge Bases</p>\n <p className=\"font-medium\">{knowledgeBaseIds.length} KBs</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Max Concurrent</p>\n <p className=\"font-medium\">{maxConcurrentExecutions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"font-medium\">{agent.executionCount ?? 0}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.updatedAt)}</p>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <GlassCard treatment=\"glass\" glow className=\"lg:col-span-2 p-6\">\n <h3 className=\"mb-4 text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.agentDetail.capabilities.title', 'Capabilities')}\n </h3>\n <div>\n {capabilities.length > 0 ? (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {capabilities.map((cap: string) => (\n <div\n key={cap}\n className=\"p-3 rounded-lg border border-green-500 bg-green-500/10\"\n >\n <p className=\"font-medium\">{cap}</p>\n <Badge variant=\"success\">\n {t('botlit.agentDetail.capabilities.enabled', 'Enabled')}\n </Badge>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.capabilities.empty', 'No capabilities configured')}\n </p>\n )}\n </div>\n </GlassCard>\n\n {/* Tags */}\n {tagIds.length > 0 && (\n <Card className=\"lg:col-span-3\">\n <CardHeader>\n <CardTitle>{t('botlit.agentDetail.tags.title', 'Tags')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {tagIds.map((tag: string) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n )}\n\n {/* Prompt Tab */}\n {activeTab === 'prompt' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n {t('botlit.agentDetail.prompt.title', 'System Prompt')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentDetail.prompt.description',\n \"The system prompt that defines this agent's behavior\"\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {systemPrompt ? (\n <pre className=\"p-4 bg-bg-sunken rounded-lg text-sm whitespace-pre-wrap font-mono\">\n {systemPrompt}\n </pre>\n ) : (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.prompt.empty', 'No system prompt configured')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* LLM Config Tab */}\n {activeTab === 'llm' && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Brain size={18} />\n {t('botlit.agentDetail.llm.title', 'Model Configuration')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">LLM Model ID</p>\n <p className=\"font-medium font-mono\">{llmModelId || 'Not configured'}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Temperature</p>\n <p className=\"font-medium\">{temperature != null ? temperature : 'Default'}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Max Tokens</p>\n <p className=\"font-medium\">{maxTokens != null ? maxTokens : 'Default'}</p>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare size={18} />\n {t('botlit.agentDetail.executionLimits.title', 'Execution Limits')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Max Concurrent Executions</p>\n <p className=\"font-medium\">{maxConcurrentExecutions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Total Executions</p>\n <p className=\"font-medium\">{agent.executionCount ?? 0}</p>\n </div>\n {agent.lastExecutedAt && (\n <div>\n <p className=\"text-sm text-text-secondary\">Last Executed</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.lastExecutedAt)}</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Tools Tab */}\n {activeTab === 'tools' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n MCP Server Connections\n </CardTitle>\n <CardDescription>Connected MCP servers providing tools</CardDescription>\n </CardHeader>\n <CardContent>\n {mcpConnectionIds.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {mcpConnectionIds.map((mcpId: string) => (\n <div\n key={mcpId}\n className=\"flex items-center gap-3 p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <Wrench size={18} className=\"text-primary\" />\n </div>\n <div>\n <p className=\"font-medium\">MCP Server</p>\n <p className=\"text-sm text-text-secondary font-mono\">{mcpId}</p>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No MCP servers connected</p>\n )}\n </CardContent>\n </Card>\n\n {workflowIds.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Workflows\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {workflowIds.map((wfId: string) => (\n <div key={wfId} className=\"p-4 border border-border-subtle rounded-lg\">\n <p className=\"font-mono text-sm\">{wfId}</p>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n )}\n\n {/* Knowledge Tab */}\n {activeTab === 'knowledge' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BookOpen size={18} />\n Knowledge Bases\n </CardTitle>\n <CardDescription>Connected knowledge bases for RAG</CardDescription>\n </CardHeader>\n <CardContent>\n {knowledgeBaseIds.length > 0 ? (\n <div className=\"space-y-4\">\n {knowledgeBaseIds.map((kbId: string, index: number) => (\n <div\n key={index}\n className=\"p-4 border border-border-subtle rounded-lg space-y-2\"\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium\">Knowledge Base</p>\n <Badge variant=\"outline\">#{index + 1}</Badge>\n </div>\n <p className=\"font-mono text-sm\">{kbId}</p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No knowledge bases connected</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Guardrails Tab */}\n {activeTab === 'guardrails' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Guardrails & Policies\n </CardTitle>\n <CardDescription>Security and policy configurations</CardDescription>\n </CardHeader>\n <CardContent>\n {metadata ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(metadata)\n .filter(([_, value]) => value)\n .map(([key, value]) => (\n <div key={key} className=\"p-4 border border-border-subtle rounded-lg\">\n <p className=\"text-sm text-text-secondary capitalize\">\n {key\n .replace('Id', '')\n .replace(/([A-Z])/g, ' $1')\n .trim()}\n </p>\n <p className=\"font-mono text-sm\">{String(value)}</p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No policy bindings configured</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* A2A Tab */}\n {activeTab === 'a2a' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Share2 size={18} />\n A2A Configuration\n </CardTitle>\n <CardDescription>Agent-to-Agent communication settings</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-secondary\">A2A is not enabled for this agent</p>\n </CardContent>\n </Card>\n )}\n\n {/* Versions Tab (BOFF-4381) */}\n {activeTab === 'versions' && agentId && (\n <VersionHistoryPanel\n agentId={agentId}\n draftVersionId={agent.draftVersionId}\n currentVersionId={agent.currentVersionId}\n onChanged={() => void refetchAgent()}\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/AgentDetailPage.tsx"],"sourcesContent":["/**\n * Agent Detail Page\n * @module botlit/pages\n *\n * Displays agent details using flat API fields from the real GraphQL backend.\n * Maps flat fields (systemPrompt, llmModelId, mcpConnectionIds, knowledgeBaseIds, capabilities[])\n * to a rich detail view with tabs.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Play,\n Settings,\n BarChart3,\n BookOpen,\n Wrench,\n Shield,\n Brain,\n MessageSquare,\n Edit,\n Share2,\n FileText,\n Trash2,\n History,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { toast } from 'sonner';\nimport { PagePurpose, NextSteps, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { VersionHistoryPanel } from '../components/VersionHistoryPanel';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\n\ntype TabType =\n | 'overview'\n | 'prompt'\n | 'llm'\n | 'tools'\n | 'knowledge'\n | 'guardrails'\n | 'a2a'\n | 'versions';\n\nexport const AgentDetailPage: FC = () => {\n const t = useTr();\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: agent, loading, refetch: refetchAgent } = useAgent(agentId);\n const [updateAgent, updateAgentResult] = useUpdateAgent();\n const [deleteAgent, deleteAgentResult] = useDeleteAgent();\n const [activeTab, setActiveTab] = useState<TabType>('overview');\n\n if (loading) {\n return (\n <PageLayout title={t('botlit.common.loading', 'Loading...')}>\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!agent) {\n return (\n <PageLayout title={t('botlit.agentDetail.notFound.title', 'Agent Not Found')}>\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentDetail.notFound.title', 'Agent Not Found')}\n description={t(\n 'botlit.agentDetail.notFound.description',\n \"The agent you're looking for doesn't exist.\"\n )}\n action={\n <Button onClick={() => navigateTo('agents')}>\n {t('botlit.agentDetail.notFound.backAction', 'Back to Agents')}\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n // `AgentRecord` declares every field the agent query selects — read directly.\n const systemPrompt = agent.systemPrompt || '';\n const llmModelId = agent.llmModelId || '';\n const temperature = agent.temperature;\n const maxTokens = agent.maxTokens;\n const mcpConnectionIds = agent.mcpConnectionIds ?? [];\n const knowledgeBaseIds = agent.knowledgeBaseIds ?? [];\n const workflowIds = agent.workflowIds ?? [];\n const capabilities = agent.capabilities ?? [];\n const tagIds = agent.tagIds ?? [];\n const maxConcurrentExecutions = agent.maxConcurrentExecutions || 10;\n const metadata = agent.metadata ?? null;\n\n const tabs: { id: TabType; label: string; icon: ReactNode }[] = [\n {\n id: 'overview',\n label: t('botlit.agentDetail.tabs.overview', 'Overview'),\n icon: <BarChart3 size={16} />,\n },\n {\n id: 'prompt',\n label: t('botlit.agentDetail.tabs.prompt', 'Prompt'),\n icon: <FileText size={16} />,\n },\n {\n id: 'llm',\n label: t('botlit.agentDetail.tabs.llmConfig', 'LLM Config'),\n icon: <Brain size={16} />,\n },\n { id: 'tools', label: t('botlit.agentDetail.tabs.tools', 'Tools'), icon: <Wrench size={16} /> },\n {\n id: 'knowledge',\n label: t('botlit.agentDetail.tabs.knowledge', 'Knowledge'),\n icon: <BookOpen size={16} />,\n },\n {\n id: 'guardrails',\n label: t('botlit.agentDetail.tabs.guardrails', 'Guardrails'),\n icon: <Shield size={16} />,\n },\n { id: 'a2a', label: t('botlit.agentDetail.tabs.a2a', 'A2A'), icon: <Share2 size={16} /> },\n {\n id: 'versions',\n label: t('botlit.agentDetail.tabs.versions', 'Versions'),\n icon: <History size={16} />,\n },\n ];\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('agents')}>\n <ArrowLeft size={20} />\n </Button>\n <span className=\"text-3xl\">{'🤖'}</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{agent.name}</span>\n <StatusBadge status={agent.status} />\n <Badge variant=\"outline\">{agent.slug}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{agent.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {agent.status === 'DRAFT' || agent.status === 'ARCHIVED' ? (\n <Button\n variant=\"default\"\n isLoading={updateAgentResult.loading}\n onClick={async () => {\n try {\n if (!agentId) return;\n await updateAgent({ agentId, input: { status: 'ACTIVE' } });\n await refetchAgent();\n toast.success(\n `${t('botlit.agentDetail.activate.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.activate.successSuffix', 'activated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.activate.error', 'Failed to activate agent')\n );\n }\n }}\n >\n {t('botlit.agentDetail.actions.activate', 'Activate')}\n </Button>\n ) : (\n <Button\n variant=\"outline\"\n isLoading={updateAgentResult.loading}\n onClick={async () => {\n try {\n if (!agentId) return;\n await updateAgent({ agentId, input: { status: 'DRAFT' } });\n await refetchAgent();\n toast.success(\n `${t('botlit.agentDetail.deactivate.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.deactivate.successSuffix', 'deactivated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.deactivate.error', 'Failed to deactivate agent')\n );\n }\n }}\n >\n {t('botlit.agentDetail.actions.deactivate', 'Deactivate')}\n </Button>\n )}\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => navigateTo(`agents/${agentId}/edit`)}\n >\n {t('botlit.agentDetail.actions.editAgent', 'Edit Agent')}\n </Button>\n <Button leftIcon={<Play size={16} />} onClick={() => navigateTo(`chat/${agentId}`)}>\n {t('botlit.agentDetail.actions.testAgent', 'Test Agent')}\n </Button>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n isLoading={deleteAgentResult.loading}\n onClick={async () => {\n if (!agentId) return;\n if (\n !confirm(\n `${t('botlit.agentDetail.delete.confirmPrefix', 'Are you sure you want to delete')} \"${agent.name}\"? ${t('botlit.agentDetail.delete.confirmSuffix', 'This action cannot be undone.')}`\n )\n )\n return;\n try {\n await deleteAgent(agentId);\n toast.success(\n `${t('botlit.agentDetail.delete.successPrefix', 'Agent')} \"${agent.name}\" ${t('botlit.agentDetail.delete.successSuffix', 'deleted successfully')}`\n );\n navigateTo('agents');\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.delete.error', 'Failed to delete agent')\n );\n }\n }}\n >\n {t('botlit.common.delete', 'Delete')}\n </Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Brain size={18} />}>\n {t(\n 'botlit.agentDetail.purpose',\n 'This is the full configuration for a single agent — its prompt, model settings, the tools and knowledge it can use, its guardrails and how it talks to other agents. Use the tabs to inspect or change any part, and test the agent in chat to confirm it behaves the way you expect before going live.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle overflow-x-auto\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-medium border-b-2 transition-colors whitespace-nowrap',\n activeTab === tab.id\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n {tab.icon}\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n <NextSteps\n storageKey={`botlit-agent-${agentId}`}\n steps={[\n {\n id: 'test',\n label: t('botlit.agentDetail.nextSteps.test', 'Test the agent in chat'),\n description: t(\n 'botlit.agentDetail.nextSteps.testDesc',\n 'Send it a few real prompts to see how it responds.'\n ),\n icon: <Play size={16} />,\n onClick: () => navigateTo(`chat/${agentId}`),\n },\n {\n id: 'prompt',\n label: t('botlit.agentDetail.nextSteps.prompt', 'Refine the system prompt'),\n description: t(\n 'botlit.agentDetail.nextSteps.promptDesc',\n 'Tune its instructions and behaviour.'\n ),\n icon: <FileText size={16} />,\n onClick: () => setActiveTab('prompt'),\n },\n {\n id: 'tools',\n label: t('botlit.agentDetail.nextSteps.tools', 'Connect tools & knowledge'),\n description: t(\n 'botlit.agentDetail.nextSteps.toolsDesc',\n 'Give it MCP tools and knowledge bases to work with.'\n ),\n icon: <Wrench size={16} />,\n onClick: () => setActiveTab('tools'),\n },\n {\n id: 'activate',\n label: t('botlit.agentDetail.nextSteps.activate', 'Activate and attach to a bot'),\n description: t(\n 'botlit.agentDetail.nextSteps.activateDesc',\n 'Put it live so a bot can route conversations to it.'\n ),\n icon: <Share2 size={16} />,\n onClick: () => navigateTo(`agents/${agentId}/edit`),\n done: agent.status === 'ACTIVE',\n },\n ]}\n />\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Quick Info */}\n <Card className=\"lg:col-span-1\">\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <StatusBadge status={agent.status} />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Type</p>\n <Badge variant=\"outline\">{agent.type}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{agent.visibility}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">LLM Model</p>\n <p className=\"font-medium font-mono text-sm\">\n {llmModelId || 'Not configured'}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">MCP Connections</p>\n <p className=\"font-medium\">{mcpConnectionIds.length} servers</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Knowledge Bases</p>\n <p className=\"font-medium\">{knowledgeBaseIds.length} KBs</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Max Concurrent</p>\n <p className=\"font-medium\">{maxConcurrentExecutions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"font-medium\">{agent.executionCount ?? 0}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.updatedAt)}</p>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <GlassCard treatment=\"glass\" glow className=\"lg:col-span-2 p-6\">\n <h3 className=\"mb-4 text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.agentDetail.capabilities.title', 'Capabilities')}\n </h3>\n <div>\n {capabilities.length > 0 ? (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {capabilities.map((cap: string) => (\n <div\n key={cap}\n className=\"p-3 rounded-lg border border-green-500 bg-green-500/10\"\n >\n <p className=\"font-medium\">{cap}</p>\n <Badge variant=\"success\">\n {t('botlit.agentDetail.capabilities.enabled', 'Enabled')}\n </Badge>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.capabilities.empty', 'No capabilities configured')}\n </p>\n )}\n </div>\n </GlassCard>\n\n {/* Tags */}\n {tagIds.length > 0 && (\n <Card className=\"lg:col-span-3\">\n <CardHeader>\n <CardTitle>{t('botlit.agentDetail.tags.title', 'Tags')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {tagIds.map((tag: string) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n )}\n\n {/* Prompt Tab */}\n {activeTab === 'prompt' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n {t('botlit.agentDetail.prompt.title', 'System Prompt')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentDetail.prompt.description',\n \"The system prompt that defines this agent's behavior\"\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {systemPrompt ? (\n <pre className=\"p-4 bg-bg-sunken rounded-lg text-sm whitespace-pre-wrap font-mono\">\n {systemPrompt}\n </pre>\n ) : (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.prompt.empty', 'No system prompt configured')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* LLM Config Tab */}\n {activeTab === 'llm' && (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Brain size={18} />\n {t('botlit.agentDetail.llm.title', 'Model Configuration')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">LLM Model ID</p>\n <p className=\"font-medium font-mono\">{llmModelId || 'Not configured'}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Temperature</p>\n <p className=\"font-medium\">{temperature != null ? temperature : 'Default'}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Max Tokens</p>\n <p className=\"font-medium\">{maxTokens != null ? maxTokens : 'Default'}</p>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare size={18} />\n {t('botlit.agentDetail.executionLimits.title', 'Execution Limits')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Max Concurrent Executions</p>\n <p className=\"font-medium\">{maxConcurrentExecutions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Total Executions</p>\n <p className=\"font-medium\">{agent.executionCount ?? 0}</p>\n </div>\n {agent.lastExecutedAt && (\n <div>\n <p className=\"text-sm text-text-secondary\">Last Executed</p>\n <p className=\"font-medium\">{formatRelativeTime(agent.lastExecutedAt)}</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Tools Tab */}\n {activeTab === 'tools' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n MCP Server Connections\n </CardTitle>\n <CardDescription>Connected MCP servers providing tools</CardDescription>\n </CardHeader>\n <CardContent>\n {mcpConnectionIds.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {mcpConnectionIds.map((mcpId: string) => (\n <div\n key={mcpId}\n className=\"flex items-center gap-3 p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <Wrench size={18} className=\"text-primary\" />\n </div>\n <div>\n <p className=\"font-medium\">MCP Server</p>\n <p className=\"text-sm text-text-secondary font-mono\">{mcpId}</p>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No MCP servers connected</p>\n )}\n </CardContent>\n </Card>\n\n {workflowIds.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Workflows\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {workflowIds.map((wfId: string) => (\n <div key={wfId} className=\"p-4 border border-border-subtle rounded-lg\">\n <p className=\"font-mono text-sm\">{wfId}</p>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n )}\n\n {/* Knowledge Tab */}\n {activeTab === 'knowledge' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BookOpen size={18} />\n Knowledge Bases\n </CardTitle>\n <CardDescription>Connected knowledge bases for RAG</CardDescription>\n </CardHeader>\n <CardContent>\n {knowledgeBaseIds.length > 0 ? (\n <div className=\"space-y-4\">\n {knowledgeBaseIds.map((kbId: string, index: number) => (\n <div\n key={index}\n className=\"p-4 border border-border-subtle rounded-lg space-y-2\"\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium\">Knowledge Base</p>\n <Badge variant=\"outline\">#{index + 1}</Badge>\n </div>\n <p className=\"font-mono text-sm\">{kbId}</p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No knowledge bases connected</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Guardrails Tab */}\n {activeTab === 'guardrails' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Guardrails & Policies\n </CardTitle>\n <CardDescription>Security and policy configurations</CardDescription>\n </CardHeader>\n <CardContent>\n {metadata ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(metadata)\n .filter(([_, value]) => value)\n .map(([key, value]) => (\n <div key={key} className=\"p-4 border border-border-subtle rounded-lg\">\n <p className=\"text-sm text-text-secondary capitalize\">\n {key\n .replace('Id', '')\n .replace(/([A-Z])/g, ' $1')\n .trim()}\n </p>\n <p className=\"font-mono text-sm\">{String(value)}</p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No policy bindings configured</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* A2A Tab */}\n {activeTab === 'a2a' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Share2 size={18} />\n A2A Configuration\n </CardTitle>\n <CardDescription>Agent-to-Agent communication settings</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-secondary\">A2A is not enabled for this agent</p>\n </CardContent>\n </Card>\n )}\n\n {/* Versions Tab (BOFF-4381) */}\n {activeTab === 'versions' && agentId && (\n <VersionHistoryPanel\n agentId={agentId}\n draftVersionId={agent.draftVersionId}\n currentVersionId={agent.currentVersionId}\n onChanged={() => void refetchAgent()}\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
1
|
+
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
|
+
import { useBotlit as t } from "../providers/BotlitProvider.js";
|
|
3
|
+
import { useBotlitStore as n } from "../store/botlitStore.js";
|
|
4
|
+
import { useAgents as r, useDeleteAgent as i } from "../hooks/useAgents.js";
|
|
5
|
+
import { cn as a } from "../utils/cn.js";
|
|
6
|
+
import { formatNumber as o, formatRelativeTime as s } from "../utils/formatters.js";
|
|
7
|
+
import { PageLayout as c } from "../components/PageLayout.js";
|
|
8
|
+
import { Card as l, CardContent as u } from "../components/Card.js";
|
|
9
|
+
import { Button as d } from "../components/Button.js";
|
|
10
|
+
import { StatusBadge as f } from "../components/Badge.js";
|
|
11
|
+
import { isNative as p, nativeConfirm as m, nativeImpact as h, nativeNotify as g } from "../../utils/nativeBridge.js";
|
|
12
|
+
import { EmptyState as ee } from "../components/EmptyState.js";
|
|
12
13
|
import { Input as _ } from "../components/Input.js";
|
|
13
14
|
import { ErrorState as v } from "../components/ErrorState.js";
|
|
14
15
|
import { useState as y } from "react";
|
|
@@ -19,48 +20,48 @@ import { Bot as E, Grid3X3 as D, List as O, MessageSquare as k, MoreVertical as
|
|
|
19
20
|
import { toast as I } from "sonner";
|
|
20
21
|
//#region src/botlit/pages/AgentsListPage.tsx
|
|
21
22
|
var L = () => {
|
|
22
|
-
let { botId:
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
let t = await
|
|
26
|
-
title: "Delete agent?",
|
|
27
|
-
message:
|
|
28
|
-
okButtonTitle: "Delete",
|
|
29
|
-
cancelButtonTitle: "Cancel"
|
|
23
|
+
let L = e(), { botId: R } = T(), { navigateTo: z, getPath: B } = t(), { data: V, loading: H, error: U, refetch: W } = r(), [G] = i(), { viewMode: K, setViewMode: q, agentFilter: J, updateAgentFilter: Y } = n(), [X, Z] = y(null), Q = (e) => {
|
|
24
|
+
Y({ search: e.target.value });
|
|
25
|
+
}, te = async (e) => {
|
|
26
|
+
let t = await m({
|
|
27
|
+
title: L("botlit.agentsList.delete.title", "Delete agent?"),
|
|
28
|
+
message: L("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: e.name }),
|
|
29
|
+
okButtonTitle: L("botlit.agentsList.delete.okButton", "Delete"),
|
|
30
|
+
cancelButtonTitle: L("botlit.agentsList.delete.cancelButton", "Cancel")
|
|
30
31
|
});
|
|
31
|
-
if (t === null ? confirm(
|
|
32
|
-
|
|
32
|
+
if (t === null ? confirm(L("botlit.agentsList.delete.message", "Are you sure you want to delete \"{{name}}\"?", { name: e.name })) : t) {
|
|
33
|
+
h("medium");
|
|
33
34
|
try {
|
|
34
|
-
await
|
|
35
|
+
await G(e.id), I.success(L("botlit.agentsList.delete.success", "Agent \"{{name}}\" deleted successfully", { name: e.name })), p() && g("success");
|
|
35
36
|
} catch (e) {
|
|
36
|
-
let t = e instanceof Error ? e.message : "Failed to delete agent";
|
|
37
|
-
I.error(t),
|
|
37
|
+
let t = e instanceof Error ? e.message : L("botlit.agentsList.delete.error", "Failed to delete agent");
|
|
38
|
+
I.error(t), p() && g("error");
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
}, $ =
|
|
42
|
-
if (
|
|
43
|
-
let t =
|
|
41
|
+
Z(null);
|
|
42
|
+
}, $ = V.filter((e) => {
|
|
43
|
+
if (J.search) {
|
|
44
|
+
let t = J.search.toLowerCase();
|
|
44
45
|
return e.name.toLowerCase().includes(t) || (e.description?.toLowerCase().includes(t) ?? !1);
|
|
45
46
|
}
|
|
46
47
|
return !0;
|
|
47
48
|
});
|
|
48
|
-
return /* @__PURE__ */ S(
|
|
49
|
-
title:
|
|
50
|
-
description:
|
|
51
|
-
actions: /* @__PURE__ */ S(
|
|
49
|
+
return /* @__PURE__ */ S(c, {
|
|
50
|
+
title: R ? L("botlit.agentsList.titleBot", "Bot Agents") : L("botlit.agentsList.title", "All Agents"),
|
|
51
|
+
description: R ? L("botlit.agentsList.descriptionBot", "Manage agents for this bot") : L("botlit.agentsList.description", "View and manage all your AI agents"),
|
|
52
|
+
actions: /* @__PURE__ */ S(d, {
|
|
52
53
|
leftIcon: /* @__PURE__ */ S(M, { size: 16 }),
|
|
53
|
-
onClick: () => R
|
|
54
|
-
children: "Create Agent"
|
|
54
|
+
onClick: () => z(R ? `bots/${R}/agents/new` : "agents/new"),
|
|
55
|
+
children: L("botlit.agentsList.actions.createAgent", "Create Agent")
|
|
55
56
|
}),
|
|
56
57
|
children: /* @__PURE__ */ C("div", {
|
|
57
58
|
className: "space-y-6",
|
|
58
59
|
children: [
|
|
59
60
|
/* @__PURE__ */ S(x, {
|
|
60
61
|
icon: /* @__PURE__ */ S(E, { size: 18 }),
|
|
61
|
-
children: "Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel."
|
|
62
|
+
children: L("botlit.agentsList.purpose", "Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.")
|
|
62
63
|
}),
|
|
63
|
-
|
|
64
|
+
V.length > 0 ? /* @__PURE__ */ C("div", {
|
|
64
65
|
className: "grid grid-cols-2 gap-4 sm:grid-cols-3",
|
|
65
66
|
children: [
|
|
66
67
|
/* @__PURE__ */ C(b, {
|
|
@@ -69,10 +70,10 @@ var L = () => {
|
|
|
69
70
|
className: "p-4",
|
|
70
71
|
children: [/* @__PURE__ */ S("p", {
|
|
71
72
|
className: "text-sm text-text-secondary",
|
|
72
|
-
children: "Total agents"
|
|
73
|
+
children: L("botlit.agentsList.summary.total", "Total agents")
|
|
73
74
|
}), /* @__PURE__ */ S("p", {
|
|
74
75
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
75
|
-
children:
|
|
76
|
+
children: V.length
|
|
76
77
|
})]
|
|
77
78
|
}),
|
|
78
79
|
/* @__PURE__ */ C(b, {
|
|
@@ -80,10 +81,10 @@ var L = () => {
|
|
|
80
81
|
className: "p-4",
|
|
81
82
|
children: [/* @__PURE__ */ S("p", {
|
|
82
83
|
className: "text-sm text-text-secondary",
|
|
83
|
-
children: "Active"
|
|
84
|
+
children: L("botlit.agentsList.summary.active", "Active")
|
|
84
85
|
}), /* @__PURE__ */ S("p", {
|
|
85
86
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
86
|
-
children:
|
|
87
|
+
children: V.filter((e) => e.status === "ACTIVE").length
|
|
87
88
|
})]
|
|
88
89
|
}),
|
|
89
90
|
/* @__PURE__ */ C(b, {
|
|
@@ -91,10 +92,10 @@ var L = () => {
|
|
|
91
92
|
className: "col-span-2 p-4 sm:col-span-1",
|
|
92
93
|
children: [/* @__PURE__ */ S("p", {
|
|
93
94
|
className: "text-sm text-text-secondary",
|
|
94
|
-
children: "Total executions"
|
|
95
|
+
children: L("botlit.agentsList.summary.executions", "Total executions")
|
|
95
96
|
}), /* @__PURE__ */ S("p", {
|
|
96
97
|
className: "mt-1 text-2xl font-semibold tabular-nums text-text-primary",
|
|
97
|
-
children:
|
|
98
|
+
children: o(V.reduce((e, t) => e + (t.executionCount ?? 0), 0))
|
|
98
99
|
})]
|
|
99
100
|
})
|
|
100
101
|
]
|
|
@@ -104,28 +105,28 @@ var L = () => {
|
|
|
104
105
|
children: [/* @__PURE__ */ C("div", {
|
|
105
106
|
className: "relative flex-1 max-w-md",
|
|
106
107
|
children: [/* @__PURE__ */ S(N, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S(_, {
|
|
107
|
-
placeholder: "Search agents...",
|
|
108
|
-
value:
|
|
109
|
-
onChange:
|
|
108
|
+
placeholder: L("botlit.agentsList.searchPlaceholder", "Search agents..."),
|
|
109
|
+
value: J.search || "",
|
|
110
|
+
onChange: Q,
|
|
110
111
|
className: "pl-9"
|
|
111
112
|
})]
|
|
112
113
|
}), /* @__PURE__ */ C("div", {
|
|
113
114
|
className: "flex items-center gap-2",
|
|
114
|
-
children: [/* @__PURE__ */ S(
|
|
115
|
-
variant:
|
|
115
|
+
children: [/* @__PURE__ */ S(d, {
|
|
116
|
+
variant: K === "grid" ? "secondary" : "ghost",
|
|
116
117
|
size: "icon",
|
|
117
|
-
onClick: () =>
|
|
118
|
+
onClick: () => q("grid"),
|
|
118
119
|
children: /* @__PURE__ */ S(D, { size: 18 })
|
|
119
|
-
}), /* @__PURE__ */ S(
|
|
120
|
-
variant:
|
|
120
|
+
}), /* @__PURE__ */ S(d, {
|
|
121
|
+
variant: K === "list" ? "secondary" : "ghost",
|
|
121
122
|
size: "icon",
|
|
122
|
-
onClick: () =>
|
|
123
|
+
onClick: () => q("list"),
|
|
123
124
|
children: /* @__PURE__ */ S(O, { size: 18 })
|
|
124
125
|
})]
|
|
125
126
|
})]
|
|
126
127
|
}),
|
|
127
|
-
|
|
128
|
-
className:
|
|
128
|
+
H ? /* @__PURE__ */ S("div", {
|
|
129
|
+
className: a("gap-4", K === "grid" ? "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : "flex flex-col"),
|
|
129
130
|
children: [
|
|
130
131
|
1,
|
|
131
132
|
2,
|
|
@@ -134,16 +135,16 @@ var L = () => {
|
|
|
134
135
|
5,
|
|
135
136
|
6
|
|
136
137
|
].map((e) => /* @__PURE__ */ S("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
137
|
-
}) :
|
|
138
|
+
}) : U ? /* @__PURE__ */ S(v, {
|
|
138
139
|
resource: "agents",
|
|
139
|
-
error:
|
|
140
|
-
onRetry: () => void
|
|
141
|
-
}) : $.length > 0 ?
|
|
140
|
+
error: U,
|
|
141
|
+
onRetry: () => void W()
|
|
142
|
+
}) : $.length > 0 ? K === "grid" ? /* @__PURE__ */ S("div", {
|
|
142
143
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
143
|
-
children: $.map((e) => /* @__PURE__ */ S(
|
|
144
|
+
children: $.map((e) => /* @__PURE__ */ S(l, {
|
|
144
145
|
className: "group hover:shadow-md transition-shadow cursor-pointer relative",
|
|
145
|
-
onClick: () =>
|
|
146
|
-
children: /* @__PURE__ */ C(
|
|
146
|
+
onClick: () => z(`agents/${e.id}`),
|
|
147
|
+
children: /* @__PURE__ */ C(u, {
|
|
147
148
|
className: "pt-6",
|
|
148
149
|
children: [
|
|
149
150
|
/* @__PURE__ */ C("div", {
|
|
@@ -158,41 +159,41 @@ var L = () => {
|
|
|
158
159
|
children: e.name
|
|
159
160
|
}), /* @__PURE__ */ S("div", {
|
|
160
161
|
className: "flex items-center gap-2 mt-1",
|
|
161
|
-
children: /* @__PURE__ */ S(
|
|
162
|
+
children: /* @__PURE__ */ S(f, { status: e.status })
|
|
162
163
|
})] })]
|
|
163
164
|
}), /* @__PURE__ */ C("div", {
|
|
164
165
|
className: "relative",
|
|
165
|
-
children: [/* @__PURE__ */ S(
|
|
166
|
+
children: [/* @__PURE__ */ S(d, {
|
|
166
167
|
variant: "ghost",
|
|
167
168
|
size: "icon",
|
|
168
169
|
className: "opacity-0 group-hover:opacity-100 transition-opacity",
|
|
169
170
|
onClick: (t) => {
|
|
170
|
-
t.stopPropagation(), X
|
|
171
|
+
t.stopPropagation(), Z(X === e.id ? null : e.id);
|
|
171
172
|
},
|
|
172
173
|
children: /* @__PURE__ */ S(A, { size: 16 })
|
|
173
|
-
}),
|
|
174
|
+
}), X === e.id && /* @__PURE__ */ C("div", {
|
|
174
175
|
className: "absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10",
|
|
175
176
|
children: [
|
|
176
177
|
/* @__PURE__ */ C("button", {
|
|
177
178
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
178
179
|
onClick: (t) => {
|
|
179
|
-
t.stopPropagation(),
|
|
180
|
+
t.stopPropagation(), z(`agents/${e.id}/chat`), Z(null);
|
|
180
181
|
},
|
|
181
|
-
children: [/* @__PURE__ */ S(j, { size: 16 }), "Test Agent"]
|
|
182
|
+
children: [/* @__PURE__ */ S(j, { size: 16 }), L("botlit.agentsList.menu.testAgent", "Test Agent")]
|
|
182
183
|
}),
|
|
183
184
|
/* @__PURE__ */ C("button", {
|
|
184
185
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2",
|
|
185
186
|
onClick: (t) => {
|
|
186
|
-
t.stopPropagation(),
|
|
187
|
+
t.stopPropagation(), z(`agents/${e.id}/edit`), Z(null);
|
|
187
188
|
},
|
|
188
|
-
children: [/* @__PURE__ */ S(P, { size: 16 }), "Edit Agent"]
|
|
189
|
+
children: [/* @__PURE__ */ S(P, { size: 16 }), L("botlit.agentsList.menu.editAgent", "Edit Agent")]
|
|
189
190
|
}),
|
|
190
191
|
/* @__PURE__ */ C("button", {
|
|
191
192
|
className: "w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2",
|
|
192
193
|
onClick: (t) => {
|
|
193
|
-
t.stopPropagation(),
|
|
194
|
+
t.stopPropagation(), te(e);
|
|
194
195
|
},
|
|
195
|
-
children: [/* @__PURE__ */ S(F, { size: 16 }), "Delete"]
|
|
196
|
+
children: [/* @__PURE__ */ S(F, { size: 16 }), L("botlit.agentsList.menu.delete", "Delete")]
|
|
196
197
|
})
|
|
197
198
|
]
|
|
198
199
|
})]
|
|
@@ -208,8 +209,9 @@ var L = () => {
|
|
|
208
209
|
className: "flex items-center gap-1",
|
|
209
210
|
children: [
|
|
210
211
|
/* @__PURE__ */ S(k, { size: 14 }),
|
|
211
|
-
|
|
212
|
-
"
|
|
212
|
+
o(e.executionCount),
|
|
213
|
+
" ",
|
|
214
|
+
L("botlit.agentsList.card.executions", "executions")
|
|
213
215
|
]
|
|
214
216
|
})
|
|
215
217
|
}),
|
|
@@ -217,15 +219,19 @@ var L = () => {
|
|
|
217
219
|
className: "mt-3 pt-3 border-t border-border-subtle flex items-center justify-between",
|
|
218
220
|
children: [/* @__PURE__ */ C("span", {
|
|
219
221
|
className: "text-xs text-text-secondary",
|
|
220
|
-
children: [
|
|
221
|
-
|
|
222
|
+
children: [
|
|
223
|
+
L("botlit.agentsList.card.created", "Created"),
|
|
224
|
+
" ",
|
|
225
|
+
s(e.createdAt)
|
|
226
|
+
]
|
|
227
|
+
}), /* @__PURE__ */ S(d, {
|
|
222
228
|
size: "sm",
|
|
223
229
|
variant: "ghost",
|
|
224
230
|
leftIcon: /* @__PURE__ */ S(j, { size: 14 }),
|
|
225
231
|
onClick: (t) => {
|
|
226
|
-
t.stopPropagation(),
|
|
232
|
+
t.stopPropagation(), z(`agents/${e.id}/chat`);
|
|
227
233
|
},
|
|
228
|
-
children: "Test"
|
|
234
|
+
children: L("botlit.agentsList.card.test", "Test")
|
|
229
235
|
})]
|
|
230
236
|
})
|
|
231
237
|
]
|
|
@@ -233,10 +239,10 @@ var L = () => {
|
|
|
233
239
|
}, e.id))
|
|
234
240
|
}) : /* @__PURE__ */ S("div", {
|
|
235
241
|
className: "space-y-2",
|
|
236
|
-
children: $.map((e) => /* @__PURE__ */ S(
|
|
242
|
+
children: $.map((e) => /* @__PURE__ */ S(l, {
|
|
237
243
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
238
|
-
onClick: () =>
|
|
239
|
-
children: /* @__PURE__ */ S(
|
|
244
|
+
onClick: () => z(`agents/${e.id}`),
|
|
245
|
+
children: /* @__PURE__ */ S(u, {
|
|
240
246
|
className: "py-4",
|
|
241
247
|
children: /* @__PURE__ */ C("div", {
|
|
242
248
|
className: "flex items-center justify-between",
|
|
@@ -250,7 +256,7 @@ var L = () => {
|
|
|
250
256
|
children: [/* @__PURE__ */ S("h3", {
|
|
251
257
|
className: "font-semibold text-text-primary",
|
|
252
258
|
children: e.name
|
|
253
|
-
}), /* @__PURE__ */ S(
|
|
259
|
+
}), /* @__PURE__ */ S(f, { status: e.status })]
|
|
254
260
|
}), /* @__PURE__ */ S("p", {
|
|
255
261
|
className: "text-sm text-text-secondary line-clamp-1",
|
|
256
262
|
children: e.description
|
|
@@ -258,14 +264,14 @@ var L = () => {
|
|
|
258
264
|
}), /* @__PURE__ */ C("div", {
|
|
259
265
|
className: "flex items-center gap-4 text-sm text-text-secondary",
|
|
260
266
|
children: [
|
|
261
|
-
/* @__PURE__ */ C("span", { children: [
|
|
262
|
-
/* @__PURE__ */ S("span", { children:
|
|
263
|
-
/* @__PURE__ */ S(
|
|
267
|
+
/* @__PURE__ */ C("span", { children: [o(e.executionCount), " executions"] }),
|
|
268
|
+
/* @__PURE__ */ S("span", { children: s(e.createdAt) }),
|
|
269
|
+
/* @__PURE__ */ S(d, {
|
|
264
270
|
variant: "outline",
|
|
265
271
|
size: "sm",
|
|
266
272
|
leftIcon: /* @__PURE__ */ S(j, { size: 14 }),
|
|
267
273
|
children: /* @__PURE__ */ S(w, {
|
|
268
|
-
to:
|
|
274
|
+
to: B(`agents/${e.id}/chat`),
|
|
269
275
|
children: "Test"
|
|
270
276
|
})
|
|
271
277
|
})
|
|
@@ -274,14 +280,14 @@ var L = () => {
|
|
|
274
280
|
})
|
|
275
281
|
})
|
|
276
282
|
}, e.id))
|
|
277
|
-
}) : /* @__PURE__ */ S(
|
|
283
|
+
}) : /* @__PURE__ */ S(ee, {
|
|
278
284
|
illustration: "empty-agents",
|
|
279
|
-
title: "No agents yet",
|
|
280
|
-
description: "Create your first AI agent to start building intelligent automations.",
|
|
281
|
-
action: /* @__PURE__ */ S(
|
|
285
|
+
title: L("botlit.agentsList.empty.title", "No agents yet"),
|
|
286
|
+
description: L("botlit.agentsList.empty.description", "Create your first AI agent to start building intelligent automations."),
|
|
287
|
+
action: /* @__PURE__ */ S(d, {
|
|
282
288
|
leftIcon: /* @__PURE__ */ S(M, { size: 16 }),
|
|
283
|
-
onClick: () => R
|
|
284
|
-
children: "Create Agent"
|
|
289
|
+
onClick: () => z(R ? `bots/${R}/agents/new` : "agents/new"),
|
|
290
|
+
children: L("botlit.agentsList.actions.createAgent", "Create Agent")
|
|
285
291
|
})
|
|
286
292
|
})
|
|
287
293
|
]
|