@burdenoff/microfe-botmanor 2026.1108.1 → 2026.1109.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.d.ts +2 -0
- package/dist/botlit/BotlitRoutes.js +24 -25
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.d.ts +3 -0
- package/dist/botlit/BotmanorRoot.js +1 -2
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.d.ts +3 -0
- package/dist/botlit/BotmanorRootInner.js +9 -10
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
- package/dist/botlit/components/AgentApprovalPanel.js +49 -50
- package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
- package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
- package/dist/botlit/components/AiOperationsPanel.js +54 -55
- package/dist/botlit/components/AiOperationsPanel.js.map +1 -1
- package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
- package/dist/botlit/components/AssistantChannelPanel.js +12 -13
- package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
- package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
- package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
- package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
- package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
- package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
- package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
- package/dist/botlit/components/Badge.d.ts +9 -0
- package/dist/botlit/components/Badge.js +1 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/Button.d.ts +10 -0
- package/dist/botlit/components/Button.js +1 -2
- package/dist/botlit/components/Button.js.map +1 -1
- package/dist/botlit/components/Card.d.ts +16 -0
- package/dist/botlit/components/Card.js +1 -2
- package/dist/botlit/components/Card.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
- package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/EmptyState.d.ts +12 -0
- package/dist/botlit/components/EmptyState.js +1 -2
- package/dist/botlit/components/EmptyState.js.map +1 -1
- package/dist/botlit/components/ErrorState.d.ts +10 -0
- package/dist/botlit/components/ErrorState.js +5 -6
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/Input.d.ts +27 -0
- package/dist/botlit/components/Input.js +1 -2
- package/dist/botlit/components/Input.js.map +1 -1
- package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
- package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
- package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
- package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
- package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
- package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
- package/dist/botlit/components/PageLayout.d.ts +12 -0
- package/dist/botlit/components/PageLayout.js +1 -2
- package/dist/botlit/components/PageLayout.js.map +1 -1
- package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
- package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
- package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
- package/dist/botlit/components/RetentionStatusPanel.js +18 -19
- package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
- package/dist/botlit/components/RouteLoader.d.ts +23 -0
- package/dist/botlit/components/RouteLoader.js +1 -2
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
- package/dist/botlit/components/VersionHistoryPanel.js +23 -24
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
- package/dist/botlit/components/WorkspaceRequired.js +1 -2
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/components/index.d.ts +14 -0
- package/dist/botlit/hooks/index.d.ts +36 -0
- package/dist/botlit/hooks/index.js +15 -14
- package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
- package/dist/botlit/hooks/internal/mutationInput.js +1 -2
- package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useA2A.d.ts +104 -0
- package/dist/botlit/hooks/useA2A.js +45 -45
- package/dist/botlit/hooks/useA2A.js.map +1 -1
- package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
- package/dist/botlit/hooks/useAgentApprovals.js +38 -39
- package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +105 -0
- package/dist/botlit/hooks/useAgents.js +53 -54
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
- package/dist/botlit/hooks/useAiOperations.js +20 -19
- package/dist/botlit/hooks/useAiOperations.js.map +1 -1
- package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
- package/dist/botlit/hooks/useAssistantChannels.js +1 -2
- package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
- package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
- package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
- package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
- package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
- package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
- package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
- package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
- package/dist/botlit/hooks/useBotWorkflow.js +1 -2
- package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +68 -0
- package/dist/botlit/hooks/useBots.js +32 -33
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useBuckets.d.ts +57 -0
- package/dist/botlit/hooks/useBuckets.js +38 -39
- package/dist/botlit/hooks/useBuckets.js.map +1 -1
- package/dist/botlit/hooks/useChannels.d.ts +87 -0
- package/dist/botlit/hooks/useChannels.js +73 -73
- package/dist/botlit/hooks/useChannels.js.map +1 -1
- package/dist/botlit/hooks/useConversations.d.ts +42 -0
- package/dist/botlit/hooks/useConversations.js +1 -2
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +87 -0
- package/dist/botlit/hooks/useExecutions.js +37 -37
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
- package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
- package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
- package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
- package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
- package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
- package/dist/botlit/hooks/useLLMProviders.js +25 -26
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
- package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
- package/dist/botlit/hooks/useMCPServers.js +40 -38
- package/dist/botlit/hooks/useMCPServers.js.map +1 -1
- package/dist/botlit/hooks/usePolicies.d.ts +60 -0
- package/dist/botlit/hooks/usePolicies.js +49 -49
- package/dist/botlit/hooks/usePolicies.js.map +1 -1
- package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
- package/dist/botlit/hooks/usePromptTemplates.js +57 -57
- package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
- package/dist/botlit/hooks/useRetention.d.ts +26 -0
- package/dist/botlit/hooks/useRetention.js +3 -3
- package/dist/botlit/hooks/useRetention.js.map +1 -1
- package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
- package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
- package/dist/botlit/hooks/useSkills.d.ts +64 -0
- package/dist/botlit/hooks/useSkills.js +53 -53
- package/dist/botlit/hooks/useSkills.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +112 -0
- package/dist/botlit/hooks/useStore.js +55 -55
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
- package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
- package/dist/botlit/index.d.ts +16 -0
- package/dist/botlit/index.js +12 -11
- package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
- package/dist/botlit/pages/A2ARegistryPage.js +25 -26
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
- package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
- package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
- package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
- package/dist/botlit/pages/AgentBuilderPage.js +59 -60
- package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
- package/dist/botlit/pages/AgentDetailPage.js +83 -84
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
- package/dist/botlit/pages/AgentsListPage.js +71 -72
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
- package/dist/botlit/pages/AiOperationsPage.js +52 -53
- package/dist/botlit/pages/AiOperationsPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
- package/dist/botlit/pages/BotChannelsTab.js +120 -122
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
- package/dist/botlit/pages/BotDetailPage.js +353 -358
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
- package/dist/botlit/pages/BotWorkflowTab.js +20 -21
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.d.ts +2 -0
- package/dist/botlit/pages/BotsListPage.js +52 -53
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.d.ts +2 -0
- package/dist/botlit/pages/BucketsPage.js +260 -261
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
- package/dist/botlit/pages/ChannelDetailPage.js +97 -96
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
- package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
- package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
- package/dist/botlit/pages/ChannelsPage.js +44 -45
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.d.ts +1 -0
- package/dist/botlit/pages/ChatPage.js +10 -11
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
- package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
- package/dist/botlit/pages/DashboardPage.d.ts +2 -0
- package/dist/botlit/pages/DashboardPage.js +37 -38
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
- package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
- package/dist/botlit/pages/ExecutionsPage.js +72 -70
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
- package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
- package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
- package/dist/botlit/pages/MCPServersPage.js +54 -55
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
- package/dist/botlit/pages/PoliciesPage.js +25 -26
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
- package/dist/botlit/pages/PolicyDetailPage.js +257 -259
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
- package/dist/botlit/pages/PromptStudioPage.js +35 -35
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
- package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.d.ts +2 -0
- package/dist/botlit/pages/SettingsPage.js +124 -125
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
- package/dist/botlit/pages/SkillDetailPage.js +216 -217
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.d.ts +2 -0
- package/dist/botlit/pages/SkillsPage.js +24 -25
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
- package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.d.ts +2 -0
- package/dist/botlit/pages/StorePage.js +135 -136
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/pages/index.d.ts +39 -0
- package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
- package/dist/botlit/permissions/PermissionRequired.js +10 -11
- package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
- package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
- package/dist/botlit/permissions/botmanorPermissions.js +1 -2
- package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
- package/dist/botlit/permissions/index.d.ts +7 -0
- package/dist/botlit/permissions/index.js +4 -3
- package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
- package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
- package/dist/botlit/providers/BotlitProvider.js +3 -3
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.d.ts +85 -0
- package/dist/botlit/store/botlitStore.js +1 -2
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
- package/dist/botlit/store/renamedKeyStorage.js +1 -2
- package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
- package/dist/botlit/types/index.d.ts +1008 -0
- package/dist/botlit/utils/cn.d.ts +2 -0
- package/dist/botlit/utils/cn.js +1 -2
- package/dist/botlit/utils/cn.js.map +1 -1
- package/dist/botlit/utils/embedding-models.d.ts +9 -0
- package/dist/botlit/utils/embedding-models.js +1 -2
- package/dist/botlit/utils/embedding-models.js.map +1 -1
- package/dist/botlit/utils/errors.d.ts +19 -0
- package/dist/botlit/utils/errors.js +1 -2
- package/dist/botlit/utils/errors.js.map +1 -1
- package/dist/botlit/utils/formatters.d.ts +38 -0
- package/dist/botlit/utils/formatters.js +0 -1
- package/dist/botlit/utils/formatters.js.map +1 -1
- package/dist/botlit/utils/navigation.d.ts +19 -0
- package/dist/botlit/utils/navigation.js +1 -2
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/botlit/utils/policyConfig.d.ts +68 -0
- package/dist/botlit/utils/policyConfig.js +2 -3
- package/dist/botlit/utils/policyConfig.js.map +1 -1
- package/dist/botlit/utils/unions.d.ts +25 -0
- package/dist/botlit/utils/unions.js +1 -2
- package/dist/botlit/utils/unions.js.map +1 -1
- package/dist/dev/App.d.ts +2 -0
- package/dist/dev/main.d.ts +0 -0
- package/dist/generated/global-operations.d.ts +197 -0
- package/dist/generated/global-operations.js +1 -2
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.d.ts +27678 -0
- package/dist/generated/global-types.js +1 -2
- package/dist/generated/global-types.js.map +1 -1
- package/dist/generated/wspace-operations.d.ts +5489 -0
- package/dist/generated/wspace-operations.js +64 -60
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +152017 -0
- package/dist/generated/wspace-types.js +1 -2
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/shared/hooks/useTr.d.ts +16 -0
- package/dist/shared/hooks/useTr.js +1 -2
- package/dist/shared/hooks/useTr.js.map +1 -1
- package/dist/stories/Badge.stories.d.ts +11 -0
- package/dist/stories/Button.stories.d.ts +13 -0
- package/dist/stories/EmptyState.stories.d.ts +8 -0
- package/dist/stories/StatusBadge.stories.d.ts +9 -0
- package/dist/test/fixtures.d.ts +39 -0
- package/dist/test/happydom.d.ts +1 -0
- package/dist/test/renderPage.d.ts +18 -0
- package/dist/test/setup.d.ts +9 -0
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +1 -2
- package/package.json +87 -60
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentApprovalsPage.js","names":[],"sources":["../../../src/botlit/pages/AgentApprovalsPage.tsx"],"sourcesContent":["/**\n * Agent Activation Approvals Page (BOFF-9682)\n * @module botlit/pages\n *\n * Reviewer queue for the workspace: every pending request to take an agent\n * live, with approve / reject, the recent decisions, and the workspace switch\n * that makes review mandatory. Approving publishes the agent's draft and sets\n * it ACTIVE; a request whose agent changed after it was submitted is flagged\n * stale and cannot be approved.\n */\n\nimport { useMemo, useState, type FC } from 'react';\nimport { AlertTriangle, ArrowLeft, CheckCircle2, ShieldCheck, XCircle } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge } from '../components/Badge';\nimport { ErrorState } from '../components/ErrorState';\nimport { ApprovalDecisionDialog, approvalStatusVariant } from '../components/AgentApprovalPanel';\nimport { useAgents } from '../hooks/useAgents';\nimport {\n useAgentApprovalActions,\n useAgentApprovalRequests,\n useAgentApprovalSettings,\n type AgentApprovalRequestRecord,\n} from '../hooks/useAgentApprovals';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const AgentApprovalsPage: FC = () => {\n const t = useTr();\n const { navigateTo, currentUser } = useBotlit();\n const settings = useAgentApprovalSettings();\n const pendingRequests = useAgentApprovalRequests({ status: 'PENDING' });\n const allRequests = useAgentApprovalRequests({});\n const { data: agents } = useAgents();\n const { run, pending } = useAgentApprovalActions();\n const [dialog, setDialog] = useState<{\n kind: 'approve' | 'reject';\n request: AgentApprovalRequestRecord;\n } | null>(null);\n\n const agentNames = useMemo(\n () => new Map(agents.map((agent) => [agent.id, agent.name])),\n [agents]\n );\n const decided = allRequests.data.filter((request) => request.status !== 'PENDING').slice(0, 20);\n const required = settings.data?.requireActivationApproval === true;\n const who = (id?: string | null): string =>\n id && id === currentUser?.id ? t('botlit.agentApproval.you', 'you') : (id ?? '—');\n\n const refreshAll = async (): Promise<void> => {\n await Promise.all([pendingRequests.refetch(), allRequests.refetch()]);\n };\n\n const toggleRequired = async (): Promise<void> => {\n try {\n const next = await settings.update(!required);\n toast.success(\n next.requireActivationApproval\n ? t('botlit.agentApprovals.toast.enabled', 'Agents now need approval before going live')\n : t('botlit.agentApprovals.toast.disabled', 'Activation approval is now optional')\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentApprovals.toast.settingsError', 'Failed to update the setting')\n );\n }\n };\n\n const confirm = async (text: string): Promise<void> => {\n if (!dialog) return;\n try {\n if (dialog.kind === 'approve') {\n await run({ kind: 'approve', id: dialog.request.id, reason: text });\n toast.success(t('botlit.agentApproval.toast.approved', 'Approved — the agent is live'));\n } else {\n await run({ kind: 'reject', id: dialog.request.id, reason: text });\n toast.success(t('botlit.agentApproval.toast.rejected', 'Activation rejected'));\n }\n setDialog(null);\n await refreshAll();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentApproval.toast.error', 'Approval action failed')\n );\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>{t('botlit.agentApprovals.title', 'Agent approvals')}</span>\n </div>\n }\n description={t('botlit.agentApprovals.description', 'Review requests to take agents live')}\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<ShieldCheck size={18} />}>\n {t(\n 'botlit.agentApprovals.purpose',\n \"A reviewer checks an agent's prompt, model, tools and limits before it goes live. The person who requested activation cannot approve their own request, and every decision is kept in the history below.\"\n )}\n </PagePurpose>\n\n <Card data-testid=\"agent-approvals-settings\">\n <CardHeader className=\"flex flex-row items-start justify-between gap-4\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n {t(\n 'botlit.agentApprovals.settings.title',\n 'Require approval before agents go live'\n )}\n <Badge variant={required ? 'warning' : 'outline'}>\n {required\n ? t('botlit.agentApprovals.settings.on', 'On')\n : t('botlit.agentApprovals.settings.off', 'Off')}\n </Badge>\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentApprovals.settings.description',\n 'When on, activating an agent, publishing a new version, or editing the prompt, model or tools of a live agent needs an approved request. Rolling a live agent back to an earlier version stays available for emergencies.'\n )}\n </CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n className=\"shrink-0 whitespace-nowrap\"\n variant={required ? 'outline' : 'default'}\n isLoading={settings.saving}\n disabled={settings.loading || !settings.data}\n onClick={() => void toggleRequired()}\n >\n {required\n ? t('botlit.agentApprovals.settings.turnOff', 'Turn off')\n : t('botlit.agentApprovals.settings.turnOn', 'Turn on')}\n </Button>\n </BotmanorPermissionGate>\n </CardHeader>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.agentApprovals.pending.title', 'Waiting for review')}</CardTitle>\n </CardHeader>\n <CardContent>\n {pendingRequests.error ? (\n <ErrorState\n resource={t('botlit.agentApprovals.resource', 'activation requests')}\n error={pendingRequests.error}\n onRetry={() => void pendingRequests.refetch()}\n />\n ) : pendingRequests.loading && pendingRequests.data.length === 0 ? (\n <div className=\"h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : pendingRequests.data.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentApprovals.pending.empty', 'No agents are waiting for review.')}\n </p>\n ) : (\n <ul className=\"space-y-3\" data-testid=\"agent-approvals-pending\">\n {pendingRequests.data.map((request) => {\n const own = request.requestedById === currentUser?.id;\n return (\n <li\n key={request.id}\n className=\"p-4 border border-border-subtle rounded-lg space-y-2\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() => navigateTo(`agents/${request.agentId}`)}\n >\n {agentNames.get(request.agentId) ?? request.agentId}\n </button>\n <Badge variant=\"warning\">{request.status}</Badge>\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.agentApproval.requestedBy', 'Requested by')}{' '}\n {who(request.requestedById)} {formatRelativeTime(request.createdAt)}\n </span>\n </div>\n {request.requestNote && (\n <p className=\"text-sm break-words\">{request.requestNote}</p>\n )}\n {request.isStale && (\n <p className=\"flex items-center gap-2 text-sm text-status-warning-text\">\n <AlertTriangle size={14} />\n {t(\n 'botlit.agentApproval.stale',\n 'The agent changed after this request. Submit a new request so the reviewer sees the current configuration.'\n )}\n </p>\n )}\n {own ? (\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.agentApprovals.ownRequest',\n 'You requested this, so another reviewer has to decide it.'\n )}\n </p>\n ) : (\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n size=\"sm\"\n leftIcon={<CheckCircle2 size={14} />}\n disabled={request.isStale}\n onClick={() => setDialog({ kind: 'approve', request })}\n >\n {t('botlit.agentApproval.approveAction', 'Approve')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n leftIcon={<XCircle size={14} />}\n onClick={() => setDialog({ kind: 'reject', request })}\n >\n {t('botlit.agentApproval.rejectAction', 'Reject')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.agentApprovals.history.title', 'Recent decisions')}</CardTitle>\n </CardHeader>\n <CardContent>\n {decided.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentApprovals.history.empty', 'No decisions yet.')}\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid=\"agent-approvals-history\">\n {decided.map((request) => (\n <li\n key={request.id}\n className=\"p-3 border border-border-subtle rounded-lg text-sm space-y-1\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium\">\n {agentNames.get(request.agentId) ?? request.agentId}\n </span>\n <Badge variant={approvalStatusVariant(request.status)}>\n {request.status}\n </Badge>\n <span className=\"text-text-secondary\">\n {t('botlit.agentApproval.decidedBy', 'by')} {who(request.reviewerId)}{' '}\n {request.decidedAt ? formatRelativeTime(request.decidedAt) : ''}\n </span>\n </div>\n {request.decisionReason && (\n <p className=\"break-words\">{request.decisionReason}</p>\n )}\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n </div>\n\n <ApprovalDecisionDialog\n kind={dialog?.kind ?? null}\n loading={pending !== null}\n onClose={() => setDialog(null)}\n onConfirm={confirm}\n />\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentApprovalsPage.js","names":["AgentApprovalsPage","t","useTr","useBotlit","settings","useAgentApprovalSettings","pendingRequests","useAgentApprovalRequests","allRequests","agents","useAgents","useAgentApprovalActions","dialog","setDialog","useState","agentNames","useMemo","agent","decided","request","required","who","id","currentUser","refreshAll","toggleRequired","next","err","PageLayout","Button","navigateTo","ArrowLeft","PagePurpose","ShieldCheck","Card","CardHeader","CardTitle","Badge","CardDescription","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","CardContent","ErrorState","own","formatRelativeTime","AlertTriangle","CheckCircle2","XCircle","approvalStatusVariant","ApprovalDecisionDialog","pending","run","text","toast"],"sources":["../../../src/botlit/pages/AgentApprovalsPage.tsx"],"sourcesContent":["/**\n * Agent Activation Approvals Page (BOFF-9682)\n * @module botlit/pages\n *\n * Reviewer queue for the workspace: every pending request to take an agent\n * live, with approve / reject, the recent decisions, and the workspace switch\n * that makes review mandatory. Approving publishes the agent's draft and sets\n * it ACTIVE; a request whose agent changed after it was submitted is flagged\n * stale and cannot be approved.\n */\n\nimport { useMemo, useState, type FC } from 'react';\nimport { AlertTriangle, ArrowLeft, CheckCircle2, ShieldCheck, XCircle } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge } from '../components/Badge';\nimport { ErrorState } from '../components/ErrorState';\nimport { ApprovalDecisionDialog, approvalStatusVariant } from '../components/AgentApprovalPanel';\nimport { useAgents } from '../hooks/useAgents';\nimport {\n useAgentApprovalActions,\n useAgentApprovalRequests,\n useAgentApprovalSettings,\n type AgentApprovalRequestRecord,\n} from '../hooks/useAgentApprovals';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const AgentApprovalsPage: FC = () => {\n const t = useTr();\n const { navigateTo, currentUser } = useBotlit();\n const settings = useAgentApprovalSettings();\n const pendingRequests = useAgentApprovalRequests({ status: 'PENDING' });\n const allRequests = useAgentApprovalRequests({});\n const { data: agents } = useAgents();\n const { run, pending } = useAgentApprovalActions();\n const [dialog, setDialog] = useState<{\n kind: 'approve' | 'reject';\n request: AgentApprovalRequestRecord;\n } | null>(null);\n\n const agentNames = useMemo(\n () => new Map(agents.map((agent) => [agent.id, agent.name])),\n [agents]\n );\n const decided = allRequests.data.filter((request) => request.status !== 'PENDING').slice(0, 20);\n const required = settings.data?.requireActivationApproval === true;\n const who = (id?: string | null): string =>\n id && id === currentUser?.id ? t('botlit.agentApproval.you', 'you') : (id ?? '—');\n\n const refreshAll = async (): Promise<void> => {\n await Promise.all([pendingRequests.refetch(), allRequests.refetch()]);\n };\n\n const toggleRequired = async (): Promise<void> => {\n try {\n const next = await settings.update(!required);\n toast.success(\n next.requireActivationApproval\n ? t('botlit.agentApprovals.toast.enabled', 'Agents now need approval before going live')\n : t('botlit.agentApprovals.toast.disabled', 'Activation approval is now optional')\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentApprovals.toast.settingsError', 'Failed to update the setting')\n );\n }\n };\n\n const confirm = async (text: string): Promise<void> => {\n if (!dialog) return;\n try {\n if (dialog.kind === 'approve') {\n await run({ kind: 'approve', id: dialog.request.id, reason: text });\n toast.success(t('botlit.agentApproval.toast.approved', 'Approved — the agent is live'));\n } else {\n await run({ kind: 'reject', id: dialog.request.id, reason: text });\n toast.success(t('botlit.agentApproval.toast.rejected', 'Activation rejected'));\n }\n setDialog(null);\n await refreshAll();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentApproval.toast.error', 'Approval action failed')\n );\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>{t('botlit.agentApprovals.title', 'Agent approvals')}</span>\n </div>\n }\n description={t('botlit.agentApprovals.description', 'Review requests to take agents live')}\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<ShieldCheck size={18} />}>\n {t(\n 'botlit.agentApprovals.purpose',\n \"A reviewer checks an agent's prompt, model, tools and limits before it goes live. The person who requested activation cannot approve their own request, and every decision is kept in the history below.\"\n )}\n </PagePurpose>\n\n <Card data-testid=\"agent-approvals-settings\">\n <CardHeader className=\"flex flex-row items-start justify-between gap-4\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n {t(\n 'botlit.agentApprovals.settings.title',\n 'Require approval before agents go live'\n )}\n <Badge variant={required ? 'warning' : 'outline'}>\n {required\n ? t('botlit.agentApprovals.settings.on', 'On')\n : t('botlit.agentApprovals.settings.off', 'Off')}\n </Badge>\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentApprovals.settings.description',\n 'When on, activating an agent, publishing a new version, or editing the prompt, model or tools of a live agent needs an approved request. Rolling a live agent back to an earlier version stays available for emergencies.'\n )}\n </CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n className=\"shrink-0 whitespace-nowrap\"\n variant={required ? 'outline' : 'default'}\n isLoading={settings.saving}\n disabled={settings.loading || !settings.data}\n onClick={() => void toggleRequired()}\n >\n {required\n ? t('botlit.agentApprovals.settings.turnOff', 'Turn off')\n : t('botlit.agentApprovals.settings.turnOn', 'Turn on')}\n </Button>\n </BotmanorPermissionGate>\n </CardHeader>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.agentApprovals.pending.title', 'Waiting for review')}</CardTitle>\n </CardHeader>\n <CardContent>\n {pendingRequests.error ? (\n <ErrorState\n resource={t('botlit.agentApprovals.resource', 'activation requests')}\n error={pendingRequests.error}\n onRetry={() => void pendingRequests.refetch()}\n />\n ) : pendingRequests.loading && pendingRequests.data.length === 0 ? (\n <div className=\"h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : pendingRequests.data.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentApprovals.pending.empty', 'No agents are waiting for review.')}\n </p>\n ) : (\n <ul className=\"space-y-3\" data-testid=\"agent-approvals-pending\">\n {pendingRequests.data.map((request) => {\n const own = request.requestedById === currentUser?.id;\n return (\n <li\n key={request.id}\n className=\"p-4 border border-border-subtle rounded-lg space-y-2\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() => navigateTo(`agents/${request.agentId}`)}\n >\n {agentNames.get(request.agentId) ?? request.agentId}\n </button>\n <Badge variant=\"warning\">{request.status}</Badge>\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.agentApproval.requestedBy', 'Requested by')}{' '}\n {who(request.requestedById)} {formatRelativeTime(request.createdAt)}\n </span>\n </div>\n {request.requestNote && (\n <p className=\"text-sm break-words\">{request.requestNote}</p>\n )}\n {request.isStale && (\n <p className=\"flex items-center gap-2 text-sm text-status-warning-text\">\n <AlertTriangle size={14} />\n {t(\n 'botlit.agentApproval.stale',\n 'The agent changed after this request. Submit a new request so the reviewer sees the current configuration.'\n )}\n </p>\n )}\n {own ? (\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'botlit.agentApprovals.ownRequest',\n 'You requested this, so another reviewer has to decide it.'\n )}\n </p>\n ) : (\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n size=\"sm\"\n leftIcon={<CheckCircle2 size={14} />}\n disabled={request.isStale}\n onClick={() => setDialog({ kind: 'approve', request })}\n >\n {t('botlit.agentApproval.approveAction', 'Approve')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_APPROVE}>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n leftIcon={<XCircle size={14} />}\n onClick={() => setDialog({ kind: 'reject', request })}\n >\n {t('botlit.agentApproval.rejectAction', 'Reject')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('botlit.agentApprovals.history.title', 'Recent decisions')}</CardTitle>\n </CardHeader>\n <CardContent>\n {decided.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentApprovals.history.empty', 'No decisions yet.')}\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid=\"agent-approvals-history\">\n {decided.map((request) => (\n <li\n key={request.id}\n className=\"p-3 border border-border-subtle rounded-lg text-sm space-y-1\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium\">\n {agentNames.get(request.agentId) ?? request.agentId}\n </span>\n <Badge variant={approvalStatusVariant(request.status)}>\n {request.status}\n </Badge>\n <span className=\"text-text-secondary\">\n {t('botlit.agentApproval.decidedBy', 'by')} {who(request.reviewerId)}{' '}\n {request.decidedAt ? formatRelativeTime(request.decidedAt) : ''}\n </span>\n </div>\n {request.decisionReason && (\n <p className=\"break-words\">{request.decisionReason}</p>\n )}\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n </div>\n\n <ApprovalDecisionDialog\n kind={dialog?.kind ?? null}\n loading={pending !== null}\n onClose={() => setDialog(null)}\n onConfirm={confirm}\n />\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { toUnion as
|
|
11
|
-
import { configuredAnswerModels as
|
|
12
|
-
import { useEffect as
|
|
2
|
+
import { PageLayout as t } from "../components/PageLayout.js";
|
|
3
|
+
import { Card as n, CardContent as r, CardDescription as i, CardHeader as a, CardTitle as o } from "../components/Card.js";
|
|
4
|
+
import { Button as s } from "../components/Button.js";
|
|
5
|
+
import { FormField as c, Input as l, Textarea as u } from "../components/Input.js";
|
|
6
|
+
import { useAgent as d, useCreateAgent as f, useUpdateAgent as p } from "../hooks/useAgents.js";
|
|
7
|
+
import { useBots as m } from "../hooks/useBots.js";
|
|
8
|
+
import { useLLMModels as ee, useLLMProviders as te } from "../hooks/useLLMProviders.js";
|
|
9
|
+
import { cn as h } from "../utils/cn.js";
|
|
10
|
+
import { toUnion as g } from "../utils/unions.js";
|
|
11
|
+
import { configuredAnswerModels as ne } from "../utils/embedding-models.js";
|
|
12
|
+
import { useEffect as re, useState as _ } from "react";
|
|
13
13
|
import { PagePurpose as ie } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
15
|
-
import { useParams as
|
|
16
|
-
import { ArrowLeft as
|
|
15
|
+
import { useParams as b } from "react-router";
|
|
16
|
+
import { ArrowLeft as ae, Brain as oe, Save as x, Settings as se, Sparkles as S, Wrench as C } from "lucide-react";
|
|
17
17
|
import { toast as w } from "sonner";
|
|
18
|
-
|
|
18
|
+
// src/botlit/pages/AgentBuilderPage.tsx
|
|
19
19
|
var T = [
|
|
20
20
|
"MCP_TOOLS",
|
|
21
21
|
"RAG",
|
|
@@ -38,10 +38,10 @@ function D(e) {
|
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
function O(e) {
|
|
41
|
-
return
|
|
41
|
+
return g(e, E, "ASSISTANT");
|
|
42
42
|
}
|
|
43
43
|
var k = () => {
|
|
44
|
-
let { agentId:
|
|
44
|
+
let { agentId: g } = b(), { navigateTo: T, workspaceId: E } = e(), { data: k } = d(g), { data: A } = m(), { data: j, loading: ce, error: M, refetch: N } = te(), { data: P, loading: F, error: I, refetch: L } = ee(), R = ce || F, z = M || I, B = ne(P ?? [], j ?? []), [V, H] = f(), [U, W] = p(), G = !!g, [K, q] = _(0), [J, Y] = _({
|
|
45
45
|
name: "",
|
|
46
46
|
slug: "",
|
|
47
47
|
description: "",
|
|
@@ -55,7 +55,7 @@ var k = () => {
|
|
|
55
55
|
capabilities: ["MCP_TOOLS", "REASONING"],
|
|
56
56
|
llmModelId: ""
|
|
57
57
|
});
|
|
58
|
-
|
|
58
|
+
re(() => {
|
|
59
59
|
if (k) {
|
|
60
60
|
let e = k;
|
|
61
61
|
Y({
|
|
@@ -83,12 +83,12 @@ var k = () => {
|
|
|
83
83
|
{
|
|
84
84
|
id: 1,
|
|
85
85
|
label: "Prompt",
|
|
86
|
-
icon: /* @__PURE__ */ v(
|
|
86
|
+
icon: /* @__PURE__ */ v(oe, { size: 18 })
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
id: 2,
|
|
90
90
|
label: "LLM Model",
|
|
91
|
-
icon: /* @__PURE__ */ v(
|
|
91
|
+
icon: /* @__PURE__ */ v(se, { size: 18 })
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
id: 3,
|
|
@@ -161,8 +161,8 @@ var k = () => {
|
|
|
161
161
|
}
|
|
162
162
|
let e = J.slug || J.name.toLowerCase().replace(/\s+/g, "-");
|
|
163
163
|
try {
|
|
164
|
-
if (G &&
|
|
165
|
-
agentId:
|
|
164
|
+
if (G && g) await U({
|
|
165
|
+
agentId: g,
|
|
166
166
|
input: {
|
|
167
167
|
name: J.name,
|
|
168
168
|
slug: e,
|
|
@@ -174,7 +174,7 @@ var k = () => {
|
|
|
174
174
|
llmModelId: J.llmModelId || void 0,
|
|
175
175
|
type: O(J.type)
|
|
176
176
|
}
|
|
177
|
-
}), w.success(`Agent "${J.name}" updated successfully`), T(`agents/${
|
|
177
|
+
}), w.success(`Agent "${J.name}" updated successfully`), T(`agents/${g}`);
|
|
178
178
|
else {
|
|
179
179
|
if (!E) return;
|
|
180
180
|
let t = await V({
|
|
@@ -196,24 +196,24 @@ var k = () => {
|
|
|
196
196
|
w.error(t);
|
|
197
197
|
}
|
|
198
198
|
}, Q = H.loading, $ = W.loading;
|
|
199
|
-
return /* @__PURE__ */ y(
|
|
199
|
+
return /* @__PURE__ */ y(t, {
|
|
200
200
|
title: /* @__PURE__ */ y("div", {
|
|
201
201
|
className: "flex items-center gap-3",
|
|
202
|
-
children: [/* @__PURE__ */ v(
|
|
202
|
+
children: [/* @__PURE__ */ v(s, {
|
|
203
203
|
variant: "ghost",
|
|
204
204
|
size: "icon",
|
|
205
|
-
onClick: () => T(
|
|
206
|
-
children: /* @__PURE__ */ v(
|
|
205
|
+
onClick: () => T(g ? `agents/${g}` : "agents"),
|
|
206
|
+
children: /* @__PURE__ */ v(ae, { size: 20 })
|
|
207
207
|
}), /* @__PURE__ */ v("span", { children: G ? "Edit Agent" : "Create New Agent" })]
|
|
208
208
|
}),
|
|
209
209
|
actions: /* @__PURE__ */ y("div", {
|
|
210
210
|
className: "flex gap-2",
|
|
211
|
-
children: [/* @__PURE__ */ v(
|
|
211
|
+
children: [/* @__PURE__ */ v(s, {
|
|
212
212
|
variant: "outline",
|
|
213
|
-
onClick: () => T(
|
|
213
|
+
onClick: () => T(g ? `agents/${g}` : "agents"),
|
|
214
214
|
children: "Cancel"
|
|
215
|
-
}), /* @__PURE__ */ v(
|
|
216
|
-
leftIcon: /* @__PURE__ */ v(
|
|
215
|
+
}), /* @__PURE__ */ v(s, {
|
|
216
|
+
leftIcon: /* @__PURE__ */ v(x, { size: 16 }),
|
|
217
217
|
onClick: Z,
|
|
218
218
|
isLoading: Q || $,
|
|
219
219
|
disabled: !J.name || !J.systemPrompt,
|
|
@@ -232,7 +232,7 @@ var k = () => {
|
|
|
232
232
|
className: "flex items-center justify-between mb-8",
|
|
233
233
|
children: X.map((e) => /* @__PURE__ */ y("button", {
|
|
234
234
|
onClick: () => q(e.id),
|
|
235
|
-
className:
|
|
235
|
+
className: h("flex items-center gap-2 px-4 py-2 rounded-lg transition-colors", K === e.id ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:bg-accent"),
|
|
236
236
|
children: [e.icon, /* @__PURE__ */ v("span", {
|
|
237
237
|
className: "font-medium",
|
|
238
238
|
children: e.label
|
|
@@ -242,10 +242,10 @@ var k = () => {
|
|
|
242
242
|
/* @__PURE__ */ y("div", {
|
|
243
243
|
className: "space-y-6",
|
|
244
244
|
children: [
|
|
245
|
-
K === 0 && /* @__PURE__ */ y(
|
|
245
|
+
K === 0 && /* @__PURE__ */ y(n, {
|
|
246
246
|
treatment: "glass",
|
|
247
247
|
glow: !0,
|
|
248
|
-
children: [/* @__PURE__ */ y(
|
|
248
|
+
children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(o, { children: "Basic Information" }), /* @__PURE__ */ v(i, { children: "Set up the agent's identity and purpose" })] }), /* @__PURE__ */ y(r, {
|
|
249
249
|
className: "space-y-6",
|
|
250
250
|
children: [
|
|
251
251
|
/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
|
|
@@ -258,14 +258,14 @@ var k = () => {
|
|
|
258
258
|
...J,
|
|
259
259
|
avatar: e
|
|
260
260
|
}),
|
|
261
|
-
className:
|
|
261
|
+
className: h("text-3xl p-2 rounded-lg border-2 transition-colors", J.avatar === e ? "border-primary bg-action-primary-bg/10" : "border-border-subtle hover:border-primary/50"),
|
|
262
262
|
children: e
|
|
263
263
|
}, e))
|
|
264
264
|
})] }),
|
|
265
|
-
/* @__PURE__ */ v(
|
|
265
|
+
/* @__PURE__ */ v(c, {
|
|
266
266
|
label: "Agent Name",
|
|
267
267
|
required: !0,
|
|
268
|
-
children: /* @__PURE__ */ v(
|
|
268
|
+
children: /* @__PURE__ */ v(l, {
|
|
269
269
|
placeholder: "e.g., Customer Support Agent",
|
|
270
270
|
value: J.name,
|
|
271
271
|
onChange: (e) => Y({
|
|
@@ -274,10 +274,10 @@ var k = () => {
|
|
|
274
274
|
})
|
|
275
275
|
})
|
|
276
276
|
}),
|
|
277
|
-
/* @__PURE__ */ v(
|
|
277
|
+
/* @__PURE__ */ v(c, {
|
|
278
278
|
label: "Slug",
|
|
279
279
|
description: "URL-friendly identifier",
|
|
280
|
-
children: /* @__PURE__ */ v(
|
|
280
|
+
children: /* @__PURE__ */ v(l, {
|
|
281
281
|
placeholder: "customer-support-agent",
|
|
282
282
|
value: J.slug,
|
|
283
283
|
onChange: (e) => Y({
|
|
@@ -286,9 +286,9 @@ var k = () => {
|
|
|
286
286
|
})
|
|
287
287
|
})
|
|
288
288
|
}),
|
|
289
|
-
/* @__PURE__ */ v(
|
|
289
|
+
/* @__PURE__ */ v(c, {
|
|
290
290
|
label: "Description",
|
|
291
|
-
children: /* @__PURE__ */ v(
|
|
291
|
+
children: /* @__PURE__ */ v(u, {
|
|
292
292
|
placeholder: "Describe what this agent does...",
|
|
293
293
|
value: J.description,
|
|
294
294
|
onChange: (e) => Y({
|
|
@@ -322,16 +322,16 @@ var k = () => {
|
|
|
322
322
|
]
|
|
323
323
|
})]
|
|
324
324
|
}),
|
|
325
|
-
K === 1 && /* @__PURE__ */ y(
|
|
325
|
+
K === 1 && /* @__PURE__ */ y(n, {
|
|
326
326
|
treatment: "glass",
|
|
327
327
|
glow: !0,
|
|
328
|
-
children: [/* @__PURE__ */ y(
|
|
328
|
+
children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(o, { children: "Prompt Configuration" }), /* @__PURE__ */ v(i, { children: "Define how the agent communicates and behaves" })] }), /* @__PURE__ */ y(r, {
|
|
329
329
|
className: "space-y-6",
|
|
330
|
-
children: [/* @__PURE__ */ v(
|
|
330
|
+
children: [/* @__PURE__ */ v(c, {
|
|
331
331
|
label: "System Prompt",
|
|
332
332
|
required: !0,
|
|
333
333
|
description: "The core instructions that define the agent's behavior",
|
|
334
|
-
children: /* @__PURE__ */ v(
|
|
334
|
+
children: /* @__PURE__ */ v(u, {
|
|
335
335
|
placeholder: "You are a helpful assistant...",
|
|
336
336
|
value: J.systemPrompt,
|
|
337
337
|
onChange: (e) => Y({
|
|
@@ -343,10 +343,10 @@ var k = () => {
|
|
|
343
343
|
})
|
|
344
344
|
}), /* @__PURE__ */ y("div", {
|
|
345
345
|
className: "grid grid-cols-2 gap-4",
|
|
346
|
-
children: [/* @__PURE__ */ v(
|
|
346
|
+
children: [/* @__PURE__ */ v(c, {
|
|
347
347
|
label: "Temperature",
|
|
348
348
|
description: "Controls randomness (0-2)",
|
|
349
|
-
children: /* @__PURE__ */ v(
|
|
349
|
+
children: /* @__PURE__ */ v(l, {
|
|
350
350
|
type: "number",
|
|
351
351
|
step: "0.1",
|
|
352
352
|
min: "0",
|
|
@@ -357,10 +357,10 @@ var k = () => {
|
|
|
357
357
|
temperature: e.target.value
|
|
358
358
|
})
|
|
359
359
|
})
|
|
360
|
-
}), /* @__PURE__ */ v(
|
|
360
|
+
}), /* @__PURE__ */ v(c, {
|
|
361
361
|
label: "Max Tokens",
|
|
362
362
|
description: "Maximum response length",
|
|
363
|
-
children: /* @__PURE__ */ v(
|
|
363
|
+
children: /* @__PURE__ */ v(l, {
|
|
364
364
|
type: "number",
|
|
365
365
|
step: "256",
|
|
366
366
|
min: "1",
|
|
@@ -374,13 +374,13 @@ var k = () => {
|
|
|
374
374
|
})]
|
|
375
375
|
})]
|
|
376
376
|
}),
|
|
377
|
-
K === 2 && /* @__PURE__ */ y(
|
|
377
|
+
K === 2 && /* @__PURE__ */ y(n, {
|
|
378
378
|
treatment: "glass",
|
|
379
379
|
glow: !0,
|
|
380
|
-
children: [/* @__PURE__ */ y(
|
|
380
|
+
children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(o, { children: "LLM Configuration" }), /* @__PURE__ */ v(i, { children: "Select the LLM model for this agent" })] }), /* @__PURE__ */ y(r, {
|
|
381
381
|
className: "space-y-6",
|
|
382
382
|
children: [
|
|
383
|
-
/* @__PURE__ */ y(
|
|
383
|
+
/* @__PURE__ */ y(c, {
|
|
384
384
|
label: "LLM Model",
|
|
385
385
|
description: "Select a model for this agent",
|
|
386
386
|
children: [
|
|
@@ -390,7 +390,7 @@ var k = () => {
|
|
|
390
390
|
}),
|
|
391
391
|
z && /* @__PURE__ */ y("div", {
|
|
392
392
|
role: "alert",
|
|
393
|
-
children: [/* @__PURE__ */ v("p", { children: "Could not load answer models." }), /* @__PURE__ */ v(
|
|
393
|
+
children: [/* @__PURE__ */ v("p", { children: "Could not load answer models." }), /* @__PURE__ */ v(s, {
|
|
394
394
|
variant: "secondary",
|
|
395
395
|
onClick: () => {
|
|
396
396
|
L(), N();
|
|
@@ -457,13 +457,13 @@ var k = () => {
|
|
|
457
457
|
}),
|
|
458
458
|
K === 3 && /* @__PURE__ */ v("div", {
|
|
459
459
|
className: "space-y-6",
|
|
460
|
-
children: /* @__PURE__ */ y(
|
|
460
|
+
children: /* @__PURE__ */ y(n, {
|
|
461
461
|
treatment: "glass",
|
|
462
462
|
glow: !0,
|
|
463
|
-
children: [/* @__PURE__ */ y(
|
|
463
|
+
children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y(o, {
|
|
464
464
|
className: "flex items-center gap-2",
|
|
465
465
|
children: [/* @__PURE__ */ v(C, { size: 18 }), "Tools & Knowledge"]
|
|
466
|
-
}), /* @__PURE__ */ v(
|
|
466
|
+
}), /* @__PURE__ */ v(i, { children: "Configure tools and knowledge bases for this agent" })] }), /* @__PURE__ */ v(r, { children: /* @__PURE__ */ y("div", {
|
|
467
467
|
className: "text-center py-12 text-text-secondary",
|
|
468
468
|
children: [
|
|
469
469
|
/* @__PURE__ */ v(C, { className: "h-10 w-10 mx-auto mb-3 opacity-50" }),
|
|
@@ -481,16 +481,16 @@ var k = () => {
|
|
|
481
481
|
}),
|
|
482
482
|
/* @__PURE__ */ y("div", {
|
|
483
483
|
className: "flex justify-between pt-6",
|
|
484
|
-
children: [/* @__PURE__ */ v(
|
|
484
|
+
children: [/* @__PURE__ */ v(s, {
|
|
485
485
|
variant: "outline",
|
|
486
486
|
onClick: () => q(Math.max(0, K - 1)),
|
|
487
487
|
disabled: K === 0,
|
|
488
488
|
children: "Previous"
|
|
489
|
-
}), K < X.length - 1 ? /* @__PURE__ */ v(
|
|
489
|
+
}), K < X.length - 1 ? /* @__PURE__ */ v(s, {
|
|
490
490
|
onClick: () => q(K + 1),
|
|
491
491
|
children: "Next"
|
|
492
|
-
}) : /* @__PURE__ */ v(
|
|
493
|
-
leftIcon: /* @__PURE__ */ v(
|
|
492
|
+
}) : /* @__PURE__ */ v(s, {
|
|
493
|
+
leftIcon: /* @__PURE__ */ v(x, { size: 16 }),
|
|
494
494
|
onClick: Z,
|
|
495
495
|
isLoading: Q || $,
|
|
496
496
|
disabled: !J.name || !J.systemPrompt,
|
|
@@ -503,7 +503,6 @@ var k = () => {
|
|
|
503
503
|
}), A && A.length > 0 && null]
|
|
504
504
|
});
|
|
505
505
|
};
|
|
506
|
-
//#endregion
|
|
507
506
|
export { k as AgentBuilderPage };
|
|
508
507
|
|
|
509
508
|
//# sourceMappingURL=AgentBuilderPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentBuilderPage.js","names":[],"sources":["../../../src/botlit/pages/AgentBuilderPage.tsx"],"sourcesContent":["/**\n * Agent Builder Page\n * @module botlit/pages\n *\n * Creates/edits agents with real GraphQL BotmanorAgent type:\n * - systemPrompt (string), temperature, maxTokens\n * - capabilities (enum array: MCP_TOOLS, RAG, REASONING, etc.)\n * - llmModelId (reference to LLM model)\n * - type (ASSISTANT, ANALYST, AUTOMATION, SPECIALIST)\n */\n\nimport type { FC } from 'react';\nimport { useState, useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { ArrowLeft, Save, Brain, Wrench, Settings, Sparkles } from 'lucide-react';\nimport { PagePurpose } 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 { Input, Textarea, FormField } from '../components/Input';\nimport { useAgent, useCreateAgent, useUpdateAgent } from '../hooks/useAgents';\nimport { useBots } from '../hooks/useBots';\nimport { useLLMProviders, useLLMModels } from '../hooks/useLLMProviders';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\nimport { configuredAnswerModels } from '../utils/embedding-models';\n\n/** `BotmanorAgentCapability` values the builder offers. */\nconst AGENT_CAPABILITIES = [\n 'MCP_TOOLS',\n 'RAG',\n 'REASONING',\n 'MULTIMODAL',\n 'MEMORY',\n 'CODE_EXECUTION',\n 'A2A',\n 'WEB_BROWSING',\n] as const;\ntype AgentCapability = (typeof AGENT_CAPABILITIES)[number];\n\n/** `BotmanorAgentType` values the builder offers. */\nconst AGENT_TYPES = ['ASSISTANT', 'ANALYST', 'AUTOMATION', 'SPECIALIST'] as const;\n\n/** Drops any capability the schema does not declare rather than guessing one. */\nfunction toCapabilities(values: string[]): AgentCapability[] {\n return values.flatMap((value) => {\n const match = AGENT_CAPABILITIES.find((capability) => capability === value);\n return match ? [match] : [];\n });\n}\n\nfunction toAgentType(value: string): (typeof AGENT_TYPES)[number] {\n return toUnion(value, AGENT_TYPES, 'ASSISTANT');\n}\n\ninterface FormDataType {\n name: string;\n slug: string;\n description: string;\n avatar: string;\n tags: string[];\n // Flat fields matching real GraphQL API\n systemPrompt: string;\n temperature: string;\n maxTokens: string;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId: string;\n}\n\nexport const AgentBuilderPage: FC = () => {\n const { agentId } = useParams();\n const { navigateTo, workspaceId } = useBotlit();\n const { data: existingAgent } = useAgent(agentId);\n const { data: bots } = useBots();\n const {\n data: providers,\n loading: providersLoading,\n error: providersError,\n refetch: refetchProviders,\n } = useLLMProviders();\n const {\n data: llmModels,\n loading: modelsLoading,\n error: modelsError,\n refetch: refetchModels,\n } = useLLMModels();\n const catalogLoading = providersLoading || modelsLoading;\n const catalogError = providersError || modelsError;\n const answerModels = configuredAnswerModels(llmModels ?? [], providers ?? []);\n const [createAgent, createAgentResult] = useCreateAgent();\n const [updateAgent, updateAgentResult] = useUpdateAgent();\n\n const isEditing = !!agentId;\n const [activeStep, setActiveStep] = useState(0);\n\n const [formData, setFormData] = useState<FormDataType>({\n name: '',\n slug: '',\n description: '',\n avatar: '🤖',\n tags: [],\n systemPrompt: 'You are a helpful AI assistant. Be concise, accurate, and friendly.',\n temperature: '0.7',\n maxTokens: '2048',\n type: 'ASSISTANT',\n status: 'DRAFT',\n capabilities: ['MCP_TOOLS', 'REASONING'],\n llmModelId: '',\n });\n\n // Update form when existing agent loads\n useEffect(() => {\n if (existingAgent) {\n const agent = existingAgent as {\n name: string;\n slug: string;\n description?: string;\n systemPrompt: string;\n temperature?: number;\n maxTokens?: number;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId?: string;\n tagIds?: string[];\n };\n setFormData({\n name: agent.name,\n slug: agent.slug,\n description: agent.description || '',\n avatar: '🤖',\n tags: agent.tagIds || [],\n systemPrompt: agent.systemPrompt || '',\n temperature: String(agent.temperature ?? 0.7),\n maxTokens: String(agent.maxTokens ?? 2048),\n type: agent.type || 'ASSISTANT',\n status: agent.status || 'DRAFT',\n capabilities: agent.capabilities || [],\n llmModelId: agent.llmModelId || '',\n });\n }\n }, [existingAgent]);\n\n const steps = [\n { id: 0, label: 'Basic Info', icon: <Sparkles size={18} /> },\n { id: 1, label: 'Prompt', icon: <Brain size={18} /> },\n { id: 2, label: 'LLM Model', icon: <Settings size={18} /> },\n { id: 3, label: 'Tools & Knowledge', icon: <Wrench size={18} /> },\n ];\n\n const avatars = ['🤖', '🧠', '💡', '🎯', '🔧', '📊', '🎧', '💼', '🔍', '⚡', '🌟', '🚀'];\n\n const allCapabilities: { key: AgentCapability; label: string; description: string }[] = [\n { key: 'MCP_TOOLS', label: 'MCP Tools', description: 'Can use MCP tool servers' },\n { key: 'RAG', label: 'RAG', description: 'Retrieval-augmented generation' },\n { key: 'REASONING', label: 'Reasoning', description: 'Advanced reasoning' },\n { key: 'MULTIMODAL', label: 'Multimodal', description: 'Process images & media' },\n { key: 'MEMORY', label: 'Memory', description: 'Conversation memory' },\n { key: 'CODE_EXECUTION', label: 'Code Execution', description: 'Execute code' },\n { key: 'A2A', label: 'A2A', description: 'Agent-to-agent protocol' },\n { key: 'WEB_BROWSING', label: 'Web Browsing', description: 'Browse the web' },\n ];\n\n const toggleCapability = (cap: string) => {\n setFormData((prev) => ({\n ...prev,\n capabilities: prev.capabilities.includes(cap)\n ? prev.capabilities.filter((c) => c !== cap)\n : [...prev.capabilities, cap],\n }));\n };\n\n const handleSave = async () => {\n if (\n formData.llmModelId &&\n (catalogLoading ||\n catalogError ||\n !answerModels.some((model) => model.id === formData.llmModelId))\n ) {\n toast.error('Choose an active answer model from the available catalog.');\n return;\n }\n const slug = formData.slug || formData.name.toLowerCase().replace(/\\s+/g, '-');\n\n try {\n if (isEditing && agentId) {\n await updateAgent({\n agentId,\n input: {\n name: formData.name,\n slug,\n description: formData.description || undefined,\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n type: toAgentType(formData.type),\n },\n });\n toast.success(`Agent \"${formData.name}\" updated successfully`);\n navigateTo(`agents/${agentId}`);\n } else {\n if (!workspaceId) return;\n const agent = await createAgent({\n workspaceId,\n name: formData.name,\n slug,\n type: toAgentType(formData.type),\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n description: formData.description || undefined,\n });\n toast.success(`Agent \"${formData.name}\" created successfully`);\n if (agent?.id) navigateTo(`agents/${agent.id}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save agent';\n toast.error(message);\n }\n };\n\n const isCreating = createAgentResult.loading;\n const isUpdating = updateAgentResult.loading;\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n <ArrowLeft size={20} />\n </Button>\n <span>{isEditing ? 'Edit Agent' : 'Create New Agent'}</span>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n </div>\n }\n >\n <div className=\"max-w-4xl mx-auto\">\n <PagePurpose className=\"mb-6\" icon={<Sparkles size={18} />}>\n This guided builder walks you through everything an agent needs — its identity and system\n prompt, the model and parameters it runs on, and the tools and knowledge it can reach.\n Work through the steps, then create the agent and test it in chat. You can come back and\n edit any step later.\n </PagePurpose>\n\n {/* Steps */}\n <div className=\"flex items-center justify-between mb-8\">\n {steps.map((step) => (\n <button\n key={step.id}\n onClick={() => setActiveStep(step.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 rounded-lg transition-colors',\n activeStep === step.id\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent'\n )}\n >\n {step.icon}\n <span className=\"font-medium\">{step.label}</span>\n </button>\n ))}\n </div>\n\n {/* Step Content */}\n <div className=\"space-y-6\">\n {activeStep === 0 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n <CardDescription>Set up the agent's identity and purpose</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Avatar Selection */}\n <div>\n <label className=\"text-sm font-medium\">Avatar</label>\n <div className=\"flex gap-2 mt-2 flex-wrap\">\n {avatars.map((avatar) => (\n <button\n key={avatar}\n onClick={() => setFormData({ ...formData, avatar })}\n className={cn(\n 'text-3xl p-2 rounded-lg border-2 transition-colors',\n formData.avatar === avatar\n ? 'border-primary bg-action-primary-bg/10'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n {avatar}\n </button>\n ))}\n </div>\n </div>\n\n <FormField label=\"Agent Name\" required>\n <Input\n placeholder=\"e.g., Customer Support Agent\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Slug\" description=\"URL-friendly identifier\">\n <Input\n placeholder=\"customer-support-agent\"\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"Describe what this agent does...\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n {/* Capabilities */}\n <div>\n <label className=\"text-sm font-medium mb-2 block\">Capabilities</label>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {allCapabilities.map((cap) => (\n <label\n key={cap.key}\n className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-border-default mt-0.5\"\n checked={formData.capabilities.includes(cap.key)}\n onChange={() => toggleCapability(cap.key)}\n />\n <div>\n <p className=\"font-medium text-sm\">{cap.label}</p>\n <p className=\"text-xs text-text-secondary\">{cap.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 1 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Prompt Configuration</CardTitle>\n <CardDescription>Define how the agent communicates and behaves</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField\n label=\"System Prompt\"\n required\n description=\"The core instructions that define the agent's behavior\"\n >\n <Textarea\n placeholder=\"You are a helpful assistant...\"\n value={formData.systemPrompt}\n onChange={(e) => setFormData({ ...formData, systemPrompt: e.target.value })}\n rows={8}\n className=\"font-mono text-sm\"\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Temperature\" description=\"Controls randomness (0-2)\">\n <Input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"2\"\n value={formData.temperature}\n onChange={(e) => setFormData({ ...formData, temperature: e.target.value })}\n />\n </FormField>\n <FormField label=\"Max Tokens\" description=\"Maximum response length\">\n <Input\n type=\"number\"\n step=\"256\"\n min=\"1\"\n value={formData.maxTokens}\n onChange={(e) => setFormData({ ...formData, maxTokens: e.target.value })}\n />\n </FormField>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 2 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>LLM Configuration</CardTitle>\n <CardDescription>Select the LLM model for this agent</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField label=\"LLM Model\" description=\"Select a model for this agent\">\n {catalogLoading && <p role=\"status\">Loading answer models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load answer models.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchModels();\n void refetchProviders();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n <select\n aria-label=\"LLM Model\"\n disabled={catalogLoading || Boolean(catalogError)}\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.llmModelId}\n onChange={(e) => setFormData({ ...formData, llmModelId: e.target.value })}\n >\n <option value=\"\">Select a model...</option>\n {answerModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.name} ({model.modelId})\n </option>\n ))}\n </select>\n </FormField>\n\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <h4 className=\"text-sm font-medium mb-2\">Available Providers</h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {providers?.map((provider: { id: string; name: string; type: string }) => (\n <div key={provider.id} className=\"text-sm\">\n <span className=\"font-medium\">{provider.name}</span>\n <span className=\"text-text-secondary ml-2\">({provider.type})</span>\n </div>\n ))}\n {!catalogLoading && !catalogError && !providers?.length && (\n <p className=\"text-sm text-text-secondary\">No providers configured</p>\n )}\n </div>\n </div>\n\n {!catalogLoading && !catalogError && !answerModels.length && (\n <p className=\"text-sm text-text-secondary\">\n No models available. Configure a provider and add models in Settings.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {activeStep === 3 && (\n <div className=\"space-y-6\">\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools & Knowledge\n </CardTitle>\n <CardDescription>\n Configure tools and knowledge bases for this agent\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-12 text-text-secondary\">\n <Wrench className=\"h-10 w-10 mx-auto mb-3 opacity-50\" />\n <p className=\"font-medium\">Tools & Knowledge coming soon</p>\n <p className=\"text-sm mt-2\">\n MCP tool connections and knowledge base bindings will be configurable here in\n a future update.\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between pt-6\">\n <Button\n variant=\"outline\"\n onClick={() => setActiveStep(Math.max(0, activeStep - 1))}\n disabled={activeStep === 0}\n >\n Previous\n </Button>\n {activeStep < steps.length - 1 ? (\n <Button onClick={() => setActiveStep(activeStep + 1)}>Next</Button>\n ) : (\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n )}\n </div>\n </div>\n </div>\n\n {/* Show bots dropdown if needed */}\n {bots && bots.length > 0 && null}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentBuilderPage.js","names":["Textarea","Textarea$1","AGENT_CAPABILITIES","AGENT_TYPES","toCapabilities","values","match","capability","value","toAgentType","toUnion","AgentBuilderPage","useParams","useBotlit","existingAgent","useAgent","agentId","bots","useBots","providers","providersLoading","providersError","refetchProviders","useLLMProviders","llmModels","modelsLoading","modelsError","refetchModels","useLLMModels","catalogLoading","catalogError","answerModels","configuredAnswerModels","createAgent","createAgentResult","useCreateAgent","updateAgent","updateAgentResult","useUpdateAgent","isEditing","activeStep","setActiveStep","useState","formData","setFormData","agent","steps","Sparkles","Brain","Settings","Wrench","avatars","allCapabilities","toggleCapability","prev","cap","c","handleSave","model","slug","toast","navigateTo","workspaceId","err","message","isCreating","isUpdating","PageLayout","Button","ArrowLeft","Save","PagePurpose","step","cn","Card","CardHeader","CardTitle","CardDescription","CardContent","avatar","FormField","Input","provider"],"sources":["../../../src/botlit/pages/AgentBuilderPage.tsx"],"sourcesContent":["/**\n * Agent Builder Page\n * @module botlit/pages\n *\n * Creates/edits agents with real GraphQL BotmanorAgent type:\n * - systemPrompt (string), temperature, maxTokens\n * - capabilities (enum array: MCP_TOOLS, RAG, REASONING, etc.)\n * - llmModelId (reference to LLM model)\n * - type (ASSISTANT, ANALYST, AUTOMATION, SPECIALIST)\n */\n\nimport type { FC } from 'react';\nimport { useState, useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { ArrowLeft, Save, Brain, Wrench, Settings, Sparkles } from 'lucide-react';\nimport { PagePurpose } 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 { Input, Textarea, FormField } from '../components/Input';\nimport { useAgent, useCreateAgent, useUpdateAgent } from '../hooks/useAgents';\nimport { useBots } from '../hooks/useBots';\nimport { useLLMProviders, useLLMModels } from '../hooks/useLLMProviders';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\nimport { configuredAnswerModels } from '../utils/embedding-models';\n\n/** `BotmanorAgentCapability` values the builder offers. */\nconst AGENT_CAPABILITIES = [\n 'MCP_TOOLS',\n 'RAG',\n 'REASONING',\n 'MULTIMODAL',\n 'MEMORY',\n 'CODE_EXECUTION',\n 'A2A',\n 'WEB_BROWSING',\n] as const;\ntype AgentCapability = (typeof AGENT_CAPABILITIES)[number];\n\n/** `BotmanorAgentType` values the builder offers. */\nconst AGENT_TYPES = ['ASSISTANT', 'ANALYST', 'AUTOMATION', 'SPECIALIST'] as const;\n\n/** Drops any capability the schema does not declare rather than guessing one. */\nfunction toCapabilities(values: string[]): AgentCapability[] {\n return values.flatMap((value) => {\n const match = AGENT_CAPABILITIES.find((capability) => capability === value);\n return match ? [match] : [];\n });\n}\n\nfunction toAgentType(value: string): (typeof AGENT_TYPES)[number] {\n return toUnion(value, AGENT_TYPES, 'ASSISTANT');\n}\n\ninterface FormDataType {\n name: string;\n slug: string;\n description: string;\n avatar: string;\n tags: string[];\n // Flat fields matching real GraphQL API\n systemPrompt: string;\n temperature: string;\n maxTokens: string;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId: string;\n}\n\nexport const AgentBuilderPage: FC = () => {\n const { agentId } = useParams();\n const { navigateTo, workspaceId } = useBotlit();\n const { data: existingAgent } = useAgent(agentId);\n const { data: bots } = useBots();\n const {\n data: providers,\n loading: providersLoading,\n error: providersError,\n refetch: refetchProviders,\n } = useLLMProviders();\n const {\n data: llmModels,\n loading: modelsLoading,\n error: modelsError,\n refetch: refetchModels,\n } = useLLMModels();\n const catalogLoading = providersLoading || modelsLoading;\n const catalogError = providersError || modelsError;\n const answerModels = configuredAnswerModels(llmModels ?? [], providers ?? []);\n const [createAgent, createAgentResult] = useCreateAgent();\n const [updateAgent, updateAgentResult] = useUpdateAgent();\n\n const isEditing = !!agentId;\n const [activeStep, setActiveStep] = useState(0);\n\n const [formData, setFormData] = useState<FormDataType>({\n name: '',\n slug: '',\n description: '',\n avatar: '🤖',\n tags: [],\n systemPrompt: 'You are a helpful AI assistant. Be concise, accurate, and friendly.',\n temperature: '0.7',\n maxTokens: '2048',\n type: 'ASSISTANT',\n status: 'DRAFT',\n capabilities: ['MCP_TOOLS', 'REASONING'],\n llmModelId: '',\n });\n\n // Update form when existing agent loads\n useEffect(() => {\n if (existingAgent) {\n const agent = existingAgent as {\n name: string;\n slug: string;\n description?: string;\n systemPrompt: string;\n temperature?: number;\n maxTokens?: number;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId?: string;\n tagIds?: string[];\n };\n setFormData({\n name: agent.name,\n slug: agent.slug,\n description: agent.description || '',\n avatar: '🤖',\n tags: agent.tagIds || [],\n systemPrompt: agent.systemPrompt || '',\n temperature: String(agent.temperature ?? 0.7),\n maxTokens: String(agent.maxTokens ?? 2048),\n type: agent.type || 'ASSISTANT',\n status: agent.status || 'DRAFT',\n capabilities: agent.capabilities || [],\n llmModelId: agent.llmModelId || '',\n });\n }\n }, [existingAgent]);\n\n const steps = [\n { id: 0, label: 'Basic Info', icon: <Sparkles size={18} /> },\n { id: 1, label: 'Prompt', icon: <Brain size={18} /> },\n { id: 2, label: 'LLM Model', icon: <Settings size={18} /> },\n { id: 3, label: 'Tools & Knowledge', icon: <Wrench size={18} /> },\n ];\n\n const avatars = ['🤖', '🧠', '💡', '🎯', '🔧', '📊', '🎧', '💼', '🔍', '⚡', '🌟', '🚀'];\n\n const allCapabilities: { key: AgentCapability; label: string; description: string }[] = [\n { key: 'MCP_TOOLS', label: 'MCP Tools', description: 'Can use MCP tool servers' },\n { key: 'RAG', label: 'RAG', description: 'Retrieval-augmented generation' },\n { key: 'REASONING', label: 'Reasoning', description: 'Advanced reasoning' },\n { key: 'MULTIMODAL', label: 'Multimodal', description: 'Process images & media' },\n { key: 'MEMORY', label: 'Memory', description: 'Conversation memory' },\n { key: 'CODE_EXECUTION', label: 'Code Execution', description: 'Execute code' },\n { key: 'A2A', label: 'A2A', description: 'Agent-to-agent protocol' },\n { key: 'WEB_BROWSING', label: 'Web Browsing', description: 'Browse the web' },\n ];\n\n const toggleCapability = (cap: string) => {\n setFormData((prev) => ({\n ...prev,\n capabilities: prev.capabilities.includes(cap)\n ? prev.capabilities.filter((c) => c !== cap)\n : [...prev.capabilities, cap],\n }));\n };\n\n const handleSave = async () => {\n if (\n formData.llmModelId &&\n (catalogLoading ||\n catalogError ||\n !answerModels.some((model) => model.id === formData.llmModelId))\n ) {\n toast.error('Choose an active answer model from the available catalog.');\n return;\n }\n const slug = formData.slug || formData.name.toLowerCase().replace(/\\s+/g, '-');\n\n try {\n if (isEditing && agentId) {\n await updateAgent({\n agentId,\n input: {\n name: formData.name,\n slug,\n description: formData.description || undefined,\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n type: toAgentType(formData.type),\n },\n });\n toast.success(`Agent \"${formData.name}\" updated successfully`);\n navigateTo(`agents/${agentId}`);\n } else {\n if (!workspaceId) return;\n const agent = await createAgent({\n workspaceId,\n name: formData.name,\n slug,\n type: toAgentType(formData.type),\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n description: formData.description || undefined,\n });\n toast.success(`Agent \"${formData.name}\" created successfully`);\n if (agent?.id) navigateTo(`agents/${agent.id}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save agent';\n toast.error(message);\n }\n };\n\n const isCreating = createAgentResult.loading;\n const isUpdating = updateAgentResult.loading;\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n <ArrowLeft size={20} />\n </Button>\n <span>{isEditing ? 'Edit Agent' : 'Create New Agent'}</span>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n </div>\n }\n >\n <div className=\"max-w-4xl mx-auto\">\n <PagePurpose className=\"mb-6\" icon={<Sparkles size={18} />}>\n This guided builder walks you through everything an agent needs — its identity and system\n prompt, the model and parameters it runs on, and the tools and knowledge it can reach.\n Work through the steps, then create the agent and test it in chat. You can come back and\n edit any step later.\n </PagePurpose>\n\n {/* Steps */}\n <div className=\"flex items-center justify-between mb-8\">\n {steps.map((step) => (\n <button\n key={step.id}\n onClick={() => setActiveStep(step.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 rounded-lg transition-colors',\n activeStep === step.id\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent'\n )}\n >\n {step.icon}\n <span className=\"font-medium\">{step.label}</span>\n </button>\n ))}\n </div>\n\n {/* Step Content */}\n <div className=\"space-y-6\">\n {activeStep === 0 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n <CardDescription>Set up the agent's identity and purpose</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Avatar Selection */}\n <div>\n <label className=\"text-sm font-medium\">Avatar</label>\n <div className=\"flex gap-2 mt-2 flex-wrap\">\n {avatars.map((avatar) => (\n <button\n key={avatar}\n onClick={() => setFormData({ ...formData, avatar })}\n className={cn(\n 'text-3xl p-2 rounded-lg border-2 transition-colors',\n formData.avatar === avatar\n ? 'border-primary bg-action-primary-bg/10'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n {avatar}\n </button>\n ))}\n </div>\n </div>\n\n <FormField label=\"Agent Name\" required>\n <Input\n placeholder=\"e.g., Customer Support Agent\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Slug\" description=\"URL-friendly identifier\">\n <Input\n placeholder=\"customer-support-agent\"\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"Describe what this agent does...\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n {/* Capabilities */}\n <div>\n <label className=\"text-sm font-medium mb-2 block\">Capabilities</label>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {allCapabilities.map((cap) => (\n <label\n key={cap.key}\n className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-border-default mt-0.5\"\n checked={formData.capabilities.includes(cap.key)}\n onChange={() => toggleCapability(cap.key)}\n />\n <div>\n <p className=\"font-medium text-sm\">{cap.label}</p>\n <p className=\"text-xs text-text-secondary\">{cap.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 1 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Prompt Configuration</CardTitle>\n <CardDescription>Define how the agent communicates and behaves</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField\n label=\"System Prompt\"\n required\n description=\"The core instructions that define the agent's behavior\"\n >\n <Textarea\n placeholder=\"You are a helpful assistant...\"\n value={formData.systemPrompt}\n onChange={(e) => setFormData({ ...formData, systemPrompt: e.target.value })}\n rows={8}\n className=\"font-mono text-sm\"\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Temperature\" description=\"Controls randomness (0-2)\">\n <Input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"2\"\n value={formData.temperature}\n onChange={(e) => setFormData({ ...formData, temperature: e.target.value })}\n />\n </FormField>\n <FormField label=\"Max Tokens\" description=\"Maximum response length\">\n <Input\n type=\"number\"\n step=\"256\"\n min=\"1\"\n value={formData.maxTokens}\n onChange={(e) => setFormData({ ...formData, maxTokens: e.target.value })}\n />\n </FormField>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 2 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>LLM Configuration</CardTitle>\n <CardDescription>Select the LLM model for this agent</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField label=\"LLM Model\" description=\"Select a model for this agent\">\n {catalogLoading && <p role=\"status\">Loading answer models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load answer models.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchModels();\n void refetchProviders();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n <select\n aria-label=\"LLM Model\"\n disabled={catalogLoading || Boolean(catalogError)}\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.llmModelId}\n onChange={(e) => setFormData({ ...formData, llmModelId: e.target.value })}\n >\n <option value=\"\">Select a model...</option>\n {answerModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.name} ({model.modelId})\n </option>\n ))}\n </select>\n </FormField>\n\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <h4 className=\"text-sm font-medium mb-2\">Available Providers</h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {providers?.map((provider: { id: string; name: string; type: string }) => (\n <div key={provider.id} className=\"text-sm\">\n <span className=\"font-medium\">{provider.name}</span>\n <span className=\"text-text-secondary ml-2\">({provider.type})</span>\n </div>\n ))}\n {!catalogLoading && !catalogError && !providers?.length && (\n <p className=\"text-sm text-text-secondary\">No providers configured</p>\n )}\n </div>\n </div>\n\n {!catalogLoading && !catalogError && !answerModels.length && (\n <p className=\"text-sm text-text-secondary\">\n No models available. Configure a provider and add models in Settings.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {activeStep === 3 && (\n <div className=\"space-y-6\">\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools & Knowledge\n </CardTitle>\n <CardDescription>\n Configure tools and knowledge bases for this agent\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-12 text-text-secondary\">\n <Wrench className=\"h-10 w-10 mx-auto mb-3 opacity-50\" />\n <p className=\"font-medium\">Tools & Knowledge coming soon</p>\n <p className=\"text-sm mt-2\">\n MCP tool connections and knowledge base bindings will be configurable here in\n a future update.\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between pt-6\">\n <Button\n variant=\"outline\"\n onClick={() => setActiveStep(Math.max(0, activeStep - 1))}\n disabled={activeStep === 0}\n >\n Previous\n </Button>\n {activeStep < steps.length - 1 ? (\n <Button onClick={() => setActiveStep(activeStep + 1)}>Next</Button>\n ) : (\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n )}\n </div>\n </div>\n </div>\n\n {/* Show bots dropdown if needed */}\n {bots && bots.length > 0 && null}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|