@burdenoff/microfe-botmanor 2026.1110.2 → 2026.1110.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AgentDetailPage.js","names":["_Fragment","AgentDetailPage","t","useTr","useParams","useBotlit","can","useBotmanorCan","agent","refetchAgent","useAgent","agentId","updateAgent","updateAgentResult","useUpdateAgent","deleteAgent","deleteAgentResult","useDeleteAgent","activeTab","setActiveTab","useState","approvalSettings","useAgentApprovalSettings","loading","PageLayout","EmptyState","Button","navigateTo","systemPrompt","llmModelId","temperature","maxTokens","mcpConnectionIds","knowledgeBaseIds","workflowIds","capabilities","tagIds","maxConcurrentExecutions","metadata","tabs","Settings","BarChart3","FileText","Brain","Wrench","BookOpen","Shield","ShieldCheck","Share2","History","ArrowLeft","StatusBadge","Badge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","toast","err","Edit","Play","Trash2","AssistantRuntimeSetupPanel","Fragment","AssistantWebsitePanel","AssistantChannelPanel","PagePurpose","tab","cn","NextSteps","AgentApprovalPanel","Card","CardHeader","CardTitle","CardContent","formatRelativeTime","GlassCard","cap","tag","CardDescription","MessageSquare","mcpId","wfId","index","kbId","_","value","key","AiOperationsPanel","VersionHistoryPanel"],"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 ShieldCheck,\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 { AgentApprovalPanel } from '../components/AgentApprovalPanel';\nimport { useAgentApprovalSettings } from '../hooks/useAgentApprovals';\nimport { AssistantRuntimeSetupPanel } from '../components/AssistantRuntimeSetupPanel';\nimport { AssistantChannelPanel } from '../components/AssistantChannelPanel';\nimport { AssistantWebsitePanel } from '../components/AssistantWebsitePanel';\nimport { AiOperationsPanel } from '../components/AiOperationsPanel';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ntype TabType =\n | 'overview'\n | 'prompt'\n | 'llm'\n | 'tools'\n | 'knowledge'\n | 'guardrails'\n | 'aiOperations'\n | 'a2a'\n | 'versions'\n | 'assistant';\n\nexport const AgentDetailPage: FC = () => {\n const t = useTr();\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const can = useBotmanorCan();\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 // BOFF-9682: when the workspace requires activation approval, an agent that\n // has never been published goes live through a reviewer, not this button.\n const approvalSettings = useAgentApprovalSettings();\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 { id: 'assistant', label: 'Assistant setup', icon: <Settings size={16} /> },\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 {\n id: 'aiOperations',\n label: t('botlit.agentDetail.tabs.aiOperations', 'AI Operations'),\n icon: <ShieldCheck 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 {approvalSettings.data?.requireActivationApproval &&\n (agent.status === 'DRAFT' || agent.status === 'ARCHIVED') &&\n !agent.currentVersionId ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\n <Button\n variant=\"default\"\n onClick={() => {\n setActiveTab('overview');\n requestAnimationFrame(() =>\n document\n .querySelector('[data-testid=\"agent-approval-panel\"]')\n ?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n );\n }}\n >\n {t('botlit.agentApproval.requestAction', 'Request activation')}\n </Button>\n </BotmanorPermissionGate>\n ) : agent.status === 'DRAFT' || agent.status === 'ARCHIVED' ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button leftIcon={<Play size={16} />} onClick={() => navigateTo(`chat/${agentId}`)}>\n {t('botlit.agentDetail.actions.testAgent', 'Test Agent')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_DELETE}>\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 </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n {activeTab === 'assistant' && agentId && (\n <div className=\"space-y-5\">\n {/* Each panel is setup work: runtime configuration needs update, and\n publishing (whose listings are publish-gated too) needs publish. */}\n {can(BOTMANOR_PERMISSIONS.AGENT_UPDATE) && (\n <AssistantRuntimeSetupPanel\n agentId={agentId}\n onConfigured={() => void refetchAgent()}\n />\n )}\n {can(BOTMANOR_PERMISSIONS.AGENT_PUBLISH) && (\n <>\n <AssistantWebsitePanel agentId={agentId} knowledgeBaseIds={knowledgeBaseIds} />\n <AssistantChannelPanel agentId={agentId} />\n </>\n )}\n {!can(BOTMANOR_PERMISSIONS.AGENT_UPDATE) &&\n !can(BOTMANOR_PERMISSIONS.AGENT_PUBLISH) && (\n <p role=\"status\" className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.agentDetail.assistant.readOnly',\n 'Assistant setup and publishing are available to members who can edit or publish agents in this workspace.'\n )}\n </p>\n )}\n </div>\n )}\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 {agentId && (\n <AgentApprovalPanel\n agentId={agentId}\n agentStatus={agent.status}\n onChanged={() => void refetchAgent()}\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-status-success-border bg-status-success-bg-subtle\"\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 {/* AI Operations Tab (supervisor findings for this agent, BOFF-3839) */}\n {activeTab === 'aiOperations' && agentId && (\n <AiOperationsPanel\n filter={{ subjectType: 'AGENT', subjectId: agentId }}\n description={t(\n 'botlit.agentDetail.aiOperationsDescription',\n 'What the supervisor flagged for this agent — drift, evidence and the recommended action.'\n )}\n />\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":["_Fragment","AgentDetailPage","t","useTr","useParams","useBotlit","can","useBotmanorCan","agent","refetchAgent","useAgent","agentId","updateAgent","updateAgentResult","useUpdateAgent","deleteAgent","deleteAgentResult","useDeleteAgent","activeTab","setActiveTab","useState","approvalSettings","useAgentApprovalSettings","loading","PageLayout","EmptyState","Button","navigateTo","systemPrompt","llmModelId","temperature","maxTokens","mcpConnectionIds","knowledgeBaseIds","workflowIds","capabilities","tagIds","maxConcurrentExecutions","metadata","tabs","Settings","BarChart3","FileText","Brain","Wrench","BookOpen","Shield","Headset","ShieldCheck","Share2","History","ArrowLeft","StatusBadge","Badge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","toast","err","Edit","Play","Trash2","AssistantRuntimeSetupPanel","Fragment","AssistantWebsitePanel","AssistantChannelPanel","PagePurpose","tab","cn","NextSteps","AgentApprovalPanel","Card","CardHeader","CardTitle","CardContent","formatRelativeTime","GlassCard","cap","tag","CardDescription","MessageSquare","mcpId","wfId","index","kbId","HandoffConfigPanel","_","value","key","AiOperationsPanel","VersionHistoryPanel"],"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 ShieldCheck,\n Headset,\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 { HandoffConfigPanel } from '../components/HandoffConfigPanel';\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 { AgentApprovalPanel } from '../components/AgentApprovalPanel';\nimport { useAgentApprovalSettings } from '../hooks/useAgentApprovals';\nimport { AssistantRuntimeSetupPanel } from '../components/AssistantRuntimeSetupPanel';\nimport { AssistantChannelPanel } from '../components/AssistantChannelPanel';\nimport { AssistantWebsitePanel } from '../components/AssistantWebsitePanel';\nimport { AiOperationsPanel } from '../components/AiOperationsPanel';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ntype TabType =\n | 'overview'\n | 'prompt'\n | 'llm'\n | 'tools'\n | 'knowledge'\n | 'guardrails'\n | 'handoff'\n | 'aiOperations'\n | 'a2a'\n | 'versions'\n | 'assistant';\n\nexport const AgentDetailPage: FC = () => {\n const t = useTr();\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const can = useBotmanorCan();\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 // BOFF-9682: when the workspace requires activation approval, an agent that\n // has never been published goes live through a reviewer, not this button.\n const approvalSettings = useAgentApprovalSettings();\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 { id: 'assistant', label: 'Assistant setup', icon: <Settings size={16} /> },\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 {\n id: 'handoff',\n label: t('botlit.agentDetail.tabs.handoff', 'Handoff'),\n icon: <Headset size={16} />,\n },\n {\n id: 'aiOperations',\n label: t('botlit.agentDetail.tabs.aiOperations', 'AI Operations'),\n icon: <ShieldCheck 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 {approvalSettings.data?.requireActivationApproval &&\n (agent.status === 'DRAFT' || agent.status === 'ARCHIVED') &&\n !agent.currentVersionId ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\n <Button\n variant=\"default\"\n onClick={() => {\n setActiveTab('overview');\n requestAnimationFrame(() =>\n document\n .querySelector('[data-testid=\"agent-approval-panel\"]')\n ?.scrollIntoView({ behavior: 'smooth', block: 'start' })\n );\n }}\n >\n {t('botlit.agentApproval.requestAction', 'Request activation')}\n </Button>\n </BotmanorPermissionGate>\n ) : agent.status === 'DRAFT' || agent.status === 'ARCHIVED' ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\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 </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button leftIcon={<Play size={16} />} onClick={() => navigateTo(`chat/${agentId}`)}>\n {t('botlit.agentDetail.actions.testAgent', 'Test Agent')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_DELETE}>\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 </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n {activeTab === 'assistant' && agentId && (\n <div className=\"space-y-5\">\n {/* Each panel is setup work: runtime configuration needs update, and\n publishing (whose listings are publish-gated too) needs publish. */}\n {can(BOTMANOR_PERMISSIONS.AGENT_UPDATE) && (\n <AssistantRuntimeSetupPanel\n agentId={agentId}\n onConfigured={() => void refetchAgent()}\n />\n )}\n {can(BOTMANOR_PERMISSIONS.AGENT_PUBLISH) && (\n <>\n <AssistantWebsitePanel agentId={agentId} knowledgeBaseIds={knowledgeBaseIds} />\n <AssistantChannelPanel agentId={agentId} />\n </>\n )}\n {!can(BOTMANOR_PERMISSIONS.AGENT_UPDATE) &&\n !can(BOTMANOR_PERMISSIONS.AGENT_PUBLISH) && (\n <p role=\"status\" className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.agentDetail.assistant.readOnly',\n 'Assistant setup and publishing are available to members who can edit or publish agents in this workspace.'\n )}\n </p>\n )}\n </div>\n )}\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 {agentId && (\n <AgentApprovalPanel\n agentId={agentId}\n agentStatus={agent.status}\n onChanged={() => void refetchAgent()}\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-status-success-border bg-status-success-bg-subtle\"\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 {/* Handoff Tab (BOFF-5813) */}\n {activeTab === 'handoff' && agentId && (\n <div className=\"mx-auto w-full max-w-3xl\">\n <HandoffConfigPanel agentId={agentId} />\n </div>\n )}\n\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 {/* AI Operations Tab (supervisor findings for this agent, BOFF-3839) */}\n {activeTab === 'aiOperations' && agentId && (\n <AiOperationsPanel\n filter={{ subjectType: 'AGENT', subjectId: agentId }}\n description={t(\n 'botlit.agentDetail.aiOperationsDescription',\n 'What the supervisor flagged for this agent — drift, evidence and the recommended action.'\n )}\n />\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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"}
@@ -13,40 +13,40 @@ import "../permissions/index.js";
13
13
  import { GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
14
14
  import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
15
15
  import { Link as b } from "react-router";
16
- import { AppWindow as x, ArrowRight as S, BookOpen as C, Bot as w, Plus as T, Zap as E } from "lucide-react";
16
+ import { AppWindow as x, ArrowRight as S, BookOpen as C, Bot as w, Headset as T, Plus as E, Zap as D } from "lucide-react";
17
17
  // src/botlit/pages/DashboardPage.tsx
18
- var D = () => {
19
- let D = e(), { currentUser: O, navigateTo: k, getPath: A } = f(), { data: j, loading: M } = u(), { data: N, loading: P } = d(), F = [{
20
- label: D("botlit.dashboard.stats.totalBots", "Total Bots"),
21
- value: j?.length || 0,
18
+ var O = () => {
19
+ let O = e(), { currentUser: k, navigateTo: A, getPath: j } = f(), { data: M, loading: N } = u(), { data: P, loading: F } = d(), I = [{
20
+ label: O("botlit.dashboard.stats.totalBots", "Total Bots"),
21
+ value: M?.length || 0,
22
22
  icon: /* @__PURE__ */ v(x, { className: "h-5 w-5" }),
23
23
  hero: !0
24
24
  }, {
25
- label: D("botlit.dashboard.stats.activeAgents", "Active Agents"),
26
- value: N?.filter((e) => e.status === "ACTIVE").length || 0,
25
+ label: O("botlit.dashboard.stats.activeAgents", "Active Agents"),
26
+ value: P?.filter((e) => e.status === "ACTIVE").length || 0,
27
27
  icon: /* @__PURE__ */ v(w, { className: "h-5 w-5" }),
28
28
  hero: !1
29
- }], I = O?.name ? O.name.split(" ")[0] : "";
29
+ }], L = k?.name ? k.name.split(" ")[0] : "";
30
30
  return /* @__PURE__ */ v(t, {
31
31
  hero: !0,
32
- title: /* @__PURE__ */ y(_, { children: [D("botlit.dashboard.title", "Welcome back"), I ? /* @__PURE__ */ y(_, { children: [", ", /* @__PURE__ */ v(h, { children: I })] }) : null] }),
33
- description: D("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
32
+ title: /* @__PURE__ */ y(_, { children: [O("botlit.dashboard.title", "Welcome back"), L ? /* @__PURE__ */ y(_, { children: [", ", /* @__PURE__ */ v(h, { children: L })] }) : null] }),
33
+ description: O("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
34
34
  actions: /* @__PURE__ */ y("div", {
35
35
  className: "flex gap-2",
36
36
  children: [/* @__PURE__ */ v(l, {
37
37
  permission: c.APP_CREATE,
38
38
  children: /* @__PURE__ */ v(o, {
39
39
  variant: "outline",
40
- leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
41
- onClick: () => k("bots/new"),
42
- children: D("botlit.dashboard.actions.newBot", "New Bot")
40
+ leftIcon: /* @__PURE__ */ v(E, { size: 16 }),
41
+ onClick: () => A("bots/new"),
42
+ children: O("botlit.dashboard.actions.newBot", "New Bot")
43
43
  })
44
44
  }), /* @__PURE__ */ v(l, {
45
45
  permission: c.AGENT_CREATE,
46
46
  children: /* @__PURE__ */ v(o, {
47
47
  leftIcon: /* @__PURE__ */ v(w, { size: 16 }),
48
- onClick: () => k("agents/new"),
49
- children: D("botlit.dashboard.actions.createAgent", "Create Agent")
48
+ onClick: () => A("agents/new"),
49
+ children: O("botlit.dashboard.actions.createAgent", "Create Agent")
50
50
  })
51
51
  })]
52
52
  }),
@@ -54,12 +54,12 @@ var D = () => {
54
54
  className: "space-y-6",
55
55
  children: [
56
56
  /* @__PURE__ */ v(g, {
57
- icon: /* @__PURE__ */ v(E, { size: 18 }),
58
- children: D("botlit.dashboard.purpose", "This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.")
57
+ icon: /* @__PURE__ */ v(D, { size: 18 }),
58
+ children: O("botlit.dashboard.purpose", "This is your home base — a quick pulse on every bot and agent in your workspace. Glance at the headline numbers, jump back into recent work, and use the quick actions below to start something new. If you are just getting started, create your first agent and connect it to a bot.")
59
59
  }),
60
60
  /* @__PURE__ */ v("div", {
61
61
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
62
- children: F.map((e) => /* @__PURE__ */ v(n, {
62
+ children: I.map((e) => /* @__PURE__ */ v(n, {
63
63
  treatment: e.hero ? "glass" : "metric",
64
64
  glow: e.hero,
65
65
  children: /* @__PURE__ */ v(r, {
@@ -86,24 +86,24 @@ var D = () => {
86
86
  treatment: "insight",
87
87
  children: [/* @__PURE__ */ y(i, {
88
88
  className: "flex flex-row items-center justify-between",
89
- children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ v(o, {
89
+ children: [/* @__PURE__ */ v(a, { children: O("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ v(o, {
90
90
  variant: "ghost",
91
91
  size: "sm",
92
92
  rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
93
- onClick: () => k("bots"),
94
- children: D("botlit.common.viewAll", "View All")
93
+ onClick: () => A("bots"),
94
+ children: O("botlit.common.viewAll", "View All")
95
95
  })]
96
- }), /* @__PURE__ */ v(r, { children: M ? /* @__PURE__ */ v("div", {
96
+ }), /* @__PURE__ */ v(r, { children: N ? /* @__PURE__ */ v("div", {
97
97
  className: "space-y-3",
98
98
  children: [
99
99
  1,
100
100
  2,
101
101
  3
102
102
  ].map((e) => /* @__PURE__ */ v("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
103
- }) : j && j.length > 0 ? /* @__PURE__ */ v("div", {
103
+ }) : M && M.length > 0 ? /* @__PURE__ */ v("div", {
104
104
  className: "space-y-3",
105
- children: j.slice(0, 4).map((e) => /* @__PURE__ */ y(b, {
106
- to: A(`bots/${e.id}`),
105
+ children: M.slice(0, 4).map((e) => /* @__PURE__ */ y(b, {
106
+ to: j(`bots/${e.id}`),
107
107
  className: "flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors",
108
108
  children: [/* @__PURE__ */ y("div", {
109
109
  className: "flex items-center gap-3",
@@ -118,7 +118,7 @@ var D = () => {
118
118
  children: [
119
119
  e.executionCount || 0,
120
120
  " ",
121
- D("botlit.common.executions", "executions")
121
+ O("botlit.common.executions", "executions")
122
122
  ]
123
123
  })] })]
124
124
  }), /* @__PURE__ */ v(s, { status: e.status })]
@@ -127,15 +127,15 @@ var D = () => {
127
127
  className: "text-center py-8 text-text-secondary",
128
128
  children: [
129
129
  /* @__PURE__ */ v(x, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
130
- /* @__PURE__ */ v("p", { children: D("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
130
+ /* @__PURE__ */ v("p", { children: O("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
131
131
  /* @__PURE__ */ v(l, {
132
132
  permission: c.APP_CREATE,
133
133
  children: /* @__PURE__ */ v(o, {
134
134
  variant: "outline",
135
135
  size: "sm",
136
136
  className: "mt-3",
137
- onClick: () => k("bots/new"),
138
- children: D("botlit.dashboard.recentBots.emptyAction", "Create your first bot")
137
+ onClick: () => A("bots/new"),
138
+ children: O("botlit.dashboard.recentBots.emptyAction", "Create your first bot")
139
139
  })
140
140
  })
141
141
  ]
@@ -144,24 +144,24 @@ var D = () => {
144
144
  treatment: "insight",
145
145
  children: [/* @__PURE__ */ y(i, {
146
146
  className: "flex flex-row items-center justify-between",
147
- children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ v(o, {
147
+ children: [/* @__PURE__ */ v(a, { children: O("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ v(o, {
148
148
  variant: "ghost",
149
149
  size: "sm",
150
150
  rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
151
- onClick: () => k("agents"),
152
- children: D("botlit.common.viewAll", "View All")
151
+ onClick: () => A("agents"),
152
+ children: O("botlit.common.viewAll", "View All")
153
153
  })]
154
- }), /* @__PURE__ */ v(r, { children: P ? /* @__PURE__ */ v("div", {
154
+ }), /* @__PURE__ */ v(r, { children: F ? /* @__PURE__ */ v("div", {
155
155
  className: "space-y-3",
156
156
  children: [
157
157
  1,
158
158
  2,
159
159
  3
160
160
  ].map((e) => /* @__PURE__ */ v("div", { className: "h-16 bg-bg-sunken rounded-lg motion-safe:animate-vc-shimmer" }, e))
161
- }) : N && N.length > 0 ? /* @__PURE__ */ v("div", {
161
+ }) : P && P.length > 0 ? /* @__PURE__ */ v("div", {
162
162
  className: "space-y-3",
163
- children: N.filter((e) => e.status === "ACTIVE").slice(0, 4).map((e) => /* @__PURE__ */ v(b, {
164
- to: A(`agents/${e.id}`),
163
+ children: P.filter((e) => e.status === "ACTIVE").slice(0, 4).map((e) => /* @__PURE__ */ v(b, {
164
+ to: j(`agents/${e.id}`),
165
165
  className: "flex items-center justify-between p-3 rounded-lg border border-border-seam hover:border-border-strong hover:bg-accent transition-colors",
166
166
  children: /* @__PURE__ */ y("div", {
167
167
  className: "flex items-center gap-3",
@@ -176,7 +176,7 @@ var D = () => {
176
176
  children: [
177
177
  p(e.executionCount ?? 0),
178
178
  " ",
179
- D("botlit.common.executions", "executions")
179
+ O("botlit.common.executions", "executions")
180
180
  ]
181
181
  })] })]
182
182
  })
@@ -185,15 +185,15 @@ var D = () => {
185
185
  className: "text-center py-8 text-text-secondary",
186
186
  children: [
187
187
  /* @__PURE__ */ v(w, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
188
- /* @__PURE__ */ v("p", { children: D("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
188
+ /* @__PURE__ */ v("p", { children: O("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
189
189
  /* @__PURE__ */ v(l, {
190
190
  permission: c.AGENT_CREATE,
191
191
  children: /* @__PURE__ */ v(o, {
192
192
  variant: "outline",
193
193
  size: "sm",
194
194
  className: "mt-3",
195
- onClick: () => k("agents/new"),
196
- children: D("botlit.dashboard.activeAgents.emptyAction", "Create your first agent")
195
+ onClick: () => A("agents/new"),
196
+ children: O("botlit.dashboard.activeAgents.emptyAction", "Create your first agent")
197
197
  })
198
198
  })
199
199
  ]
@@ -205,40 +205,48 @@ var D = () => {
205
205
  className: "border-border-seam p-6",
206
206
  children: [/* @__PURE__ */ v("h2", {
207
207
  className: "text-lg font-semibold tracking-tight text-text-primary",
208
- children: D("botlit.dashboard.quickActions.title", "Quick Actions")
208
+ children: O("botlit.dashboard.quickActions.title", "Quick Actions")
209
209
  }), /* @__PURE__ */ y("div", {
210
210
  className: "mt-4 grid grid-cols-2 md:grid-cols-4 gap-4",
211
211
  children: [
212
212
  /* @__PURE__ */ y(b, {
213
- to: A("bots/new"),
213
+ to: j("bots/new"),
214
214
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
215
215
  children: [/* @__PURE__ */ v(x, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
216
216
  className: "text-sm font-medium",
217
- children: D("botlit.dashboard.quickActions.createBot", "Create Bot")
217
+ children: O("botlit.dashboard.quickActions.createBot", "Create Bot")
218
218
  })]
219
219
  }),
220
220
  /* @__PURE__ */ y(b, {
221
- to: A("agents/new"),
221
+ to: j("agents/new"),
222
222
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
223
223
  children: [/* @__PURE__ */ v(w, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
224
224
  className: "text-sm font-medium",
225
- children: D("botlit.dashboard.quickActions.buildAgent", "Build Agent")
225
+ children: O("botlit.dashboard.quickActions.buildAgent", "Build Agent")
226
226
  })]
227
227
  }),
228
228
  /* @__PURE__ */ y(b, {
229
- to: A("knowledge/new"),
229
+ to: j("knowledge/new"),
230
230
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
231
231
  children: [/* @__PURE__ */ v(C, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
232
232
  className: "text-sm font-medium",
233
- children: D("botlit.dashboard.quickActions.addKnowledge", "Add Knowledge")
233
+ children: O("botlit.dashboard.quickActions.addKnowledge", "Add Knowledge")
234
234
  })]
235
235
  }),
236
236
  /* @__PURE__ */ y("a", {
237
237
  href: "/conversations",
238
238
  className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
239
- children: [/* @__PURE__ */ v(E, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
239
+ children: [/* @__PURE__ */ v(D, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
240
240
  className: "text-sm font-medium",
241
- children: D("botlit.dashboard.quickActions.quickChat", "Quick Chat")
241
+ children: O("botlit.dashboard.quickActions.quickChat", "Quick Chat")
242
+ })]
243
+ }),
244
+ /* @__PURE__ */ y(b, {
245
+ to: j("handoffs"),
246
+ className: "flex flex-col items-center gap-2 p-4 rounded-card border border-border-seam bg-bg-surface hover:border-border-strong hover:shadow-elevation-2 transition-[box-shadow,border-color]",
247
+ children: [/* @__PURE__ */ v(T, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ v("span", {
248
+ className: "text-sm font-medium",
249
+ children: O("botlit.dashboard.quickActions.handoffs", "Human Handoffs")
242
250
  })]
243
251
  })
244
252
  ]
@@ -248,6 +256,6 @@ var D = () => {
248
256
  })
249
257
  });
250
258
  };
251
- export { D as DashboardPage };
259
+ export { O as DashboardPage };
252
260
 
253
261
  //# sourceMappingURL=DashboardPage.js.map