@burdenoff/microfe-botmanor 2026.1025.1 → 2026.1025.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":"PolicyDetailPage.js","names":[],"sources":["../../../src/botlit/pages/PolicyDetailPage.tsx"],"sourcesContent":["/**\n * Policy Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Shield,\n Settings,\n Save,\n AlertTriangle,\n Wrench,\n Database,\n FileText,\n DollarSign,\n Clock,\n Trash2,\n Edit,\n Power,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport { usePolicy, useCreatePolicy, useUpdatePolicy, useDeletePolicy } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\nimport type { PolicyType, Visibility, PolicyConfig } from '../types';\n\n/** Policy types the UI can render; the column itself is a free-form String. */\nconst POLICY_TYPES: PolicyType[] = [\n 'CONTENT',\n 'TOOL',\n 'DATA',\n 'RESPONSE',\n 'BUDGET',\n 'RATE_LIMIT',\n 'RETENTION',\n];\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\n/** Split a comma-separated form value into trimmed, non-empty entries. */\nfunction splitList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\ninterface PolicyDetailPageProps {\n isNew?: boolean;\n}\n\nconst PolicyTypeIcon: FC<{ type: PolicyType }> = ({ type }) => {\n const icons: Record<PolicyType, React.ReactElement> = {\n CONTENT: <AlertTriangle size={18} />,\n TOOL: <Wrench size={18} />,\n DATA: <Database size={18} />,\n RESPONSE: <FileText size={18} />,\n BUDGET: <DollarSign size={18} />,\n RATE_LIMIT: <Clock size={18} />,\n RETENTION: <Trash2 size={18} />,\n };\n return icons[type] || <Shield size={18} />;\n};\n\nconst PolicyTypeLabel: Record<PolicyType, string> = {\n CONTENT: 'Content Policy',\n TOOL: 'Tool Policy',\n DATA: 'Data Policy',\n RESPONSE: 'Response & Model Policy',\n BUDGET: 'Budget Policy',\n RATE_LIMIT: 'Rate Limit Policy',\n RETENTION: 'Retention Policy',\n};\n\nexport const PolicyDetailPage: FC<PolicyDetailPageProps> = ({ isNew }) => {\n const { policyId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: policy, loading } = usePolicy(isNew ? undefined : policyId);\n const { create: createPolicy, loading: createLoading } = useCreatePolicy();\n const { update: updatePolicy, loading: updateLoading } = useUpdatePolicy();\n const { remove: deletePolicy, loading: deleteLoading } = useDeletePolicy();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n type: 'CONTENT' as PolicyType,\n visibility: 'PRIVATE' as Visibility,\n });\n\n // Content Policy Config\n const [contentConfig, setContentConfig] = useState({\n jailbreakDetection: true,\n piiDetection: true,\n toxicityThreshold: 0.7,\n customPatterns: '',\n });\n\n // Tool Policy Config\n const [toolConfig, setToolConfig] = useState({\n allowedTools: '',\n deniedTools: '',\n maxCallsPerExecution: 10,\n timeoutSeconds: 30,\n });\n\n // Budget Policy Config\n const [budgetConfig, setBudgetConfig] = useState({\n maxTokensPerExecution: 10000,\n maxCostPerExecution: 1.0,\n allowEscalation: false,\n maxModelTier: 'gpt-4',\n });\n\n // Rate Limit Policy Config\n const [rateLimitConfig, setRateLimitConfig] = useState({\n requestsPerMinute: 60,\n requestsPerHour: 1000,\n tokensPerMinute: 100000,\n scope: 'app' as 'connector' | 'app' | 'agent' | 'user_group',\n });\n\n // Response Policy Config: the model-usage allowlist enforced at runtime.\n const [responseConfig, setResponseConfig] = useState({\n allowedModels: '',\n allowedProviders: '',\n });\n\n // New policies start as drafts unless the author chooses to enforce them now.\n const [activateOnCreate, setActivateOnCreate] = useState(false);\n\n // Retention Policy Config\n const [retentionConfig, setRetentionConfig] = useState({\n executionDataRetentionDays: 90,\n payloadSnapshotsEnabled: true,\n });\n\n const handleCreate = async () => {\n if (!formData.name) return;\n\n let config: PolicyConfig | undefined;\n switch (formData.type) {\n case 'CONTENT':\n config = {\n jailbreakDetection: contentConfig.jailbreakDetection,\n piiDetection: contentConfig.piiDetection,\n toxicityThreshold: contentConfig.toxicityThreshold,\n customPatterns: contentConfig.customPatterns.split('\\n').filter(Boolean),\n };\n break;\n case 'TOOL':\n config = {\n allowedTools: toolConfig.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n deniedTools: toolConfig.deniedTools\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n limits: {\n maxCallsPerExecution: toolConfig.maxCallsPerExecution,\n timeoutSeconds: toolConfig.timeoutSeconds,\n },\n };\n break;\n case 'BUDGET':\n config = {\n maxTokensPerExecution: budgetConfig.maxTokensPerExecution,\n maxCostPerExecution: budgetConfig.maxCostPerExecution,\n modelEscalationConstraints: {\n allowEscalation: budgetConfig.allowEscalation,\n maxModelTier: budgetConfig.maxModelTier,\n },\n };\n break;\n case 'RATE_LIMIT':\n config = {\n limits: {\n requestsPerMinute: rateLimitConfig.requestsPerMinute,\n requestsPerHour: rateLimitConfig.requestsPerHour,\n tokensPerMinute: rateLimitConfig.tokensPerMinute,\n },\n scope: rateLimitConfig.scope,\n };\n break;\n case 'RESPONSE': {\n const allowedModels = splitList(responseConfig.allowedModels);\n const allowedProviders = splitList(responseConfig.allowedProviders).map((provider) =>\n provider.toUpperCase()\n );\n config = {\n ...(allowedModels.length > 0 ? { allowedModels } : {}),\n ...(allowedProviders.length > 0 ? { allowedProviders } : {}),\n };\n break;\n }\n case 'RETENTION':\n config = {\n executionDataRetentionDays: retentionConfig.executionDataRetentionDays,\n payloadSnapshotsEnabled: retentionConfig.payloadSnapshotsEnabled,\n };\n break;\n }\n\n try {\n await createPolicy({\n name: formData.name,\n description: formData.description,\n type: formData.type,\n visibility: formData.visibility,\n status: activateOnCreate ? 'ACTIVE' : 'DRAFT',\n config: config as unknown as Record<string, unknown>,\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create policy');\n return;\n }\n toast.success(`Policy \"${formData.name}\" created`);\n navigateTo('policies');\n };\n\n const handleUpdate = async () => {\n if (!policyId || !formData.name) return;\n try {\n await updatePolicy({\n policyId,\n input: {\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update policy');\n return;\n }\n toast.success('Policy updated');\n setIsEditing(false);\n };\n\n const handleDelete = async () => {\n if (!policyId) return;\n try {\n await deletePolicy(policyId);\n if (isNative()) void nativeNotify('success');\n navigateTo('policies');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n };\n\n const isActive = policy?.status === 'ACTIVE';\n\n const handleToggleActive = async () => {\n if (!policyId) return;\n const nextStatus = isActive ? 'DRAFT' : 'ACTIVE';\n try {\n await updatePolicy({ policyId, input: { status: nextStatus } });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update policy');\n return;\n }\n toast.success(\n nextStatus === 'ACTIVE' ? 'Policy is now enforced' : 'Policy is no longer enforced'\n );\n };\n\n const startEditing = () => {\n if (!policy) return;\n setFormData({\n name: policy.name,\n description: policy.description || '',\n type: toUnion(policy.type, POLICY_TYPES, 'CONTENT'),\n visibility: toUnion(policy.visibility, VISIBILITIES, 'PRIVATE'),\n });\n setIsEditing(true);\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Policy\"\n description=\"Define guardrails and constraints for your AI agents\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('policies')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createLoading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Policy Name\" required>\n <Input\n placeholder=\"e.g., Production Content Policy\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What does this policy enforce?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Policy Type\" required>\n <select\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.type}\n onChange={(e) =>\n setFormData({ ...formData, type: e.target.value as PolicyType })\n }\n >\n <option value=\"CONTENT\">Content Policy</option>\n <option value=\"TOOL\">Tool Policy</option>\n <option value=\"DATA\">Data Policy</option>\n <option value=\"RESPONSE\">Response &amp; Model Policy</option>\n <option value=\"BUDGET\">Budget Policy</option>\n <option value=\"RATE_LIMIT\">Rate Limit Policy</option>\n <option value=\"RETENTION\">Retention Policy</option>\n </select>\n </FormField>\n\n <FormField label=\"Visibility\">\n <select\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n </CardContent>\n </Card>\n\n {/* Policy-specific configuration */}\n {formData.type === 'CONTENT' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <AlertTriangle size={18} />\n Content Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"jailbreak\"\n checked={contentConfig.jailbreakDetection}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, jailbreakDetection: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"jailbreak\" className=\"text-sm\">\n Jailbreak Detection\n </label>\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"pii\"\n checked={contentConfig.piiDetection}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, piiDetection: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"pii\" className=\"text-sm\">\n PII Detection\n </label>\n </div>\n </div>\n\n <FormField label=\"Toxicity Threshold\" description=\"0.0 to 1.0\">\n <Input\n type=\"number\"\n min={0}\n max={1}\n step={0.1}\n value={contentConfig.toxicityThreshold}\n onChange={(e) =>\n setContentConfig({\n ...contentConfig,\n toxicityThreshold: parseFloat(e.target.value),\n })\n }\n />\n </FormField>\n\n <FormField label=\"Custom Patterns\" description=\"One regex pattern per line\">\n <Textarea\n placeholder=\"Enter custom patterns...\"\n value={contentConfig.customPatterns}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, customPatterns: e.target.value })\n }\n rows={3}\n />\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'TOOL' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tool Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Allowed Tools\" description=\"Comma-separated tool IDs\">\n <Input\n placeholder=\"e.g., search, read_file, web_browse\"\n value={toolConfig.allowedTools}\n onChange={(e) => setToolConfig({ ...toolConfig, allowedTools: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Denied Tools\" description=\"Comma-separated tool IDs\">\n <Input\n placeholder=\"e.g., delete_file, execute_code\"\n value={toolConfig.deniedTools}\n onChange={(e) => setToolConfig({ ...toolConfig, deniedTools: e.target.value })}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Max Calls Per Execution\">\n <Input\n type=\"number\"\n min={1}\n value={toolConfig.maxCallsPerExecution}\n onChange={(e) =>\n setToolConfig({\n ...toolConfig,\n maxCallsPerExecution: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Timeout (seconds)\">\n <Input\n type=\"number\"\n min={1}\n value={toolConfig.timeoutSeconds}\n onChange={(e) =>\n setToolConfig({\n ...toolConfig,\n timeoutSeconds: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'BUDGET' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <DollarSign size={18} />\n Budget Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Max Tokens Per Execution\">\n <Input\n type=\"number\"\n min={100}\n value={budgetConfig.maxTokensPerExecution}\n onChange={(e) =>\n setBudgetConfig({\n ...budgetConfig,\n maxTokensPerExecution: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Max Cost Per Execution ($)\">\n <Input\n type=\"number\"\n min={0.01}\n step={0.01}\n value={budgetConfig.maxCostPerExecution}\n onChange={(e) =>\n setBudgetConfig({\n ...budgetConfig,\n maxCostPerExecution: parseFloat(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"escalation\"\n checked={budgetConfig.allowEscalation}\n onChange={(e) =>\n setBudgetConfig({ ...budgetConfig, allowEscalation: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"escalation\" className=\"text-sm\">\n Allow Model Escalation\n </label>\n </div>\n\n <FormField label=\"Max Model Tier\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={budgetConfig.maxModelTier}\n onChange={(e) =>\n setBudgetConfig({ ...budgetConfig, maxModelTier: e.target.value })\n }\n >\n <option value=\"gpt-3.5-turbo\">GPT-3.5 Turbo</option>\n <option value=\"gpt-4\">GPT-4</option>\n <option value=\"gpt-4-turbo\">GPT-4 Turbo</option>\n <option value=\"claude-3-sonnet\">Claude 3 Sonnet</option>\n <option value=\"claude-3-opus\">Claude 3 Opus</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'RATE_LIMIT' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Clock size={18} />\n Rate Limit Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-3 gap-4\">\n <FormField label=\"Requests / Minute\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.requestsPerMinute}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n requestsPerMinute: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Requests / Hour\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.requestsPerHour}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n requestsPerHour: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Tokens / Minute\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.tokensPerMinute}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n tokensPerMinute: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n\n <FormField label=\"Scope\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={rateLimitConfig.scope}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n scope: e.target.value as 'connector' | 'app' | 'agent' | 'user_group',\n })\n }\n >\n <option value=\"connector\">Per Connector</option>\n <option value=\"app\">Per Bot</option>\n <option value=\"agent\">Per Agent</option>\n <option value=\"user_group\">Per User Group</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'RESPONSE' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Model Usage Allowlist\n </CardTitle>\n <CardDescription>\n Agents in this workspace may only answer with models that match every active model\n policy. Leave both fields empty to allow all models.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField\n label=\"Allowed Models\"\n description=\"Comma-separated model IDs. End an entry with * to allow a prefix.\"\n >\n <Input\n placeholder=\"e.g., gpt-4o-mini, anthropic.claude-*\"\n value={responseConfig.allowedModels}\n onChange={(e) =>\n setResponseConfig({ ...responseConfig, allowedModels: e.target.value })\n }\n />\n </FormField>\n\n <FormField\n label=\"Allowed Providers\"\n description=\"Comma-separated provider types, e.g. OPENAI, ANTHROPIC, AWS_BEDROCK.\"\n >\n <Input\n placeholder=\"e.g., AWS_BEDROCK, ANTHROPIC\"\n value={responseConfig.allowedProviders}\n onChange={(e) =>\n setResponseConfig({ ...responseConfig, allowedProviders: e.target.value })\n }\n />\n </FormField>\n </CardContent>\n </Card>\n )}\n\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start gap-2\">\n <input\n type=\"checkbox\"\n id=\"activate-on-create\"\n checked={activateOnCreate}\n onChange={(e) => setActivateOnCreate(e.target.checked)}\n className=\"mt-1 h-4 w-4\"\n />\n <label htmlFor=\"activate-on-create\" className=\"text-sm\">\n <span className=\"font-medium\">Enforce immediately</span>\n <span className=\"block text-text-secondary\">\n Only active policies are enforced. Leave unchecked to save this policy as a\n draft and activate it later.\n </span>\n </label>\n </div>\n </CardContent>\n </Card>\n\n {formData.type === 'RETENTION' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Trash2 size={18} />\n Retention Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Execution Data Retention (days)\">\n <Input\n type=\"number\"\n min={1}\n value={retentionConfig.executionDataRetentionDays}\n onChange={(e) =>\n setRetentionConfig({\n ...retentionConfig,\n executionDataRetentionDays: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"snapshots\"\n checked={retentionConfig.payloadSnapshotsEnabled}\n onChange={(e) =>\n setRetentionConfig({\n ...retentionConfig,\n payloadSnapshotsEnabled: e.target.checked,\n })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"snapshots\" className=\"text-sm\">\n Enable Payload Snapshots\n </label>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!policy) {\n return (\n <PageLayout title=\"Policy Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Policy Not Found\"\n description=\"This policy doesn't exist.\"\n action={<Button onClick={() => navigateTo('policies')}>Back to Policies</Button>}\n />\n </PageLayout>\n );\n }\n\n const policyType = toUnion(policy.type, POLICY_TYPES, 'CONTENT');\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('policies')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <PolicyTypeIcon type={policyType} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{policy.name}</span>\n <StatusBadge status={policy.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{policy.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateLoading}\n disabled={!formData.name}\n >\n Save Changes\n </Button>\n </>\n ) : (\n <>\n <Button\n variant={isActive ? 'outline' : 'default'}\n leftIcon={<Power size={16} />}\n onClick={() => void handleToggleActive()}\n isLoading={updateLoading}\n >\n {isActive ? 'Deactivate' : 'Activate'}\n </Button>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteLoading}\n >\n Confirm Delete\n </Button>\n </div>\n ) : (\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Shield size={18} />}>\n This is a single guardrail and its rules. Review and tune exactly what it enforces — what\n content to block, which tools are allowed, the spend or rate limits it applies — then\n attach it to the agents and bots that should obey it. Policies are how you keep agents\n safe, compliant and within budget.\n </PagePurpose>\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Policy</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Policy Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n <p className=\"text-sm text-text-secondary\">\n Note: Policy type and configuration cannot be changed after creation.\n </p>\n </CardContent>\n </Card>\n )}\n\n {/* Overview */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <PolicyTypeIcon type={policyType} />\n </div>\n <p className=\"text-lg font-bold\">{PolicyTypeLabel[policyType]}</p>\n <p className=\"text-sm text-text-secondary\">Policy Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary capitalize\">\n {policy.visibility.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{policy.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatRelativeTime(policy.updatedAt)}\n </p>\n <p className=\"text-sm text-text-secondary\">Last Updated</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Configuration */}\n <Card>\n <CardHeader>\n <CardTitle>Configuration</CardTitle>\n <CardDescription>Current policy configuration</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-bg-sunken rounded-lg font-mono text-sm overflow-auto\">\n <pre>{JSON.stringify(policy.config, null, 2)}</pre>\n </div>\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(policy.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(policy.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {policy.tags.length > 0 ? (\n policy.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"PolicyDetailPage.js","names":[],"sources":["../../../src/botlit/pages/PolicyDetailPage.tsx"],"sourcesContent":["/**\n * Policy Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Shield,\n Settings,\n Save,\n AlertTriangle,\n Wrench,\n Database,\n FileText,\n DollarSign,\n Clock,\n Trash2,\n Edit,\n Power,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport { usePolicy, useCreatePolicy, useUpdatePolicy, useDeletePolicy } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\nimport type { PolicyType, Visibility, PolicyConfig } from '../types';\n\n/** Policy types the UI can render; the column itself is a free-form String. */\nconst POLICY_TYPES: PolicyType[] = [\n 'CONTENT',\n 'TOOL',\n 'DATA',\n 'RESPONSE',\n 'BUDGET',\n 'RATE_LIMIT',\n 'RETENTION',\n];\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\n/** Split a comma-separated form value into trimmed, non-empty entries. */\nfunction splitList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\ninterface PolicyDetailPageProps {\n isNew?: boolean;\n}\n\nconst PolicyTypeIcon: FC<{ type: PolicyType }> = ({ type }) => {\n const icons: Record<PolicyType, React.ReactElement> = {\n CONTENT: <AlertTriangle size={18} />,\n TOOL: <Wrench size={18} />,\n DATA: <Database size={18} />,\n RESPONSE: <FileText size={18} />,\n BUDGET: <DollarSign size={18} />,\n RATE_LIMIT: <Clock size={18} />,\n RETENTION: <Trash2 size={18} />,\n };\n return icons[type] || <Shield size={18} />;\n};\n\nconst PolicyTypeLabel: Record<PolicyType, string> = {\n CONTENT: 'Content Policy',\n TOOL: 'Tool Policy',\n DATA: 'Data Policy',\n RESPONSE: 'Response & Model Policy',\n BUDGET: 'Budget Policy',\n RATE_LIMIT: 'Rate Limit Policy',\n RETENTION: 'Retention Policy',\n};\n\nexport const PolicyDetailPage: FC<PolicyDetailPageProps> = ({ isNew }) => {\n const { policyId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: policy, loading, refetch: refetchPolicy } = usePolicy(isNew ? undefined : policyId);\n const { create: createPolicy, loading: createLoading } = useCreatePolicy();\n const { update: updatePolicy, loading: updateLoading } = useUpdatePolicy();\n const { remove: deletePolicy, loading: deleteLoading } = useDeletePolicy();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n type: 'CONTENT' as PolicyType,\n visibility: 'PRIVATE' as Visibility,\n });\n\n // Content Policy Config\n const [contentConfig, setContentConfig] = useState({\n jailbreakDetection: true,\n piiDetection: true,\n toxicityThreshold: 0.7,\n customPatterns: '',\n });\n\n // Tool Policy Config\n const [toolConfig, setToolConfig] = useState({\n allowedTools: '',\n deniedTools: '',\n maxCallsPerExecution: 10,\n timeoutSeconds: 30,\n });\n\n // Budget Policy Config\n const [budgetConfig, setBudgetConfig] = useState({\n maxTokensPerExecution: 10000,\n maxCostPerExecution: 1.0,\n allowEscalation: false,\n maxModelTier: 'gpt-4',\n });\n\n // Rate Limit Policy Config\n const [rateLimitConfig, setRateLimitConfig] = useState({\n requestsPerMinute: 60,\n requestsPerHour: 1000,\n tokensPerMinute: 100000,\n scope: 'app' as 'connector' | 'app' | 'agent' | 'user_group',\n });\n\n // Response Policy Config: the model-usage allowlist enforced at runtime.\n const [responseConfig, setResponseConfig] = useState({\n allowedModels: '',\n allowedProviders: '',\n });\n\n // New policies start as drafts unless the author chooses to enforce them now.\n const [activateOnCreate, setActivateOnCreate] = useState(false);\n\n // Retention Policy Config\n const [retentionConfig, setRetentionConfig] = useState({\n executionDataRetentionDays: 90,\n payloadSnapshotsEnabled: true,\n });\n\n const handleCreate = async () => {\n if (!formData.name) return;\n\n let config: PolicyConfig | undefined;\n switch (formData.type) {\n case 'CONTENT':\n config = {\n jailbreakDetection: contentConfig.jailbreakDetection,\n piiDetection: contentConfig.piiDetection,\n toxicityThreshold: contentConfig.toxicityThreshold,\n customPatterns: contentConfig.customPatterns.split('\\n').filter(Boolean),\n };\n break;\n case 'TOOL':\n config = {\n allowedTools: toolConfig.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n deniedTools: toolConfig.deniedTools\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n limits: {\n maxCallsPerExecution: toolConfig.maxCallsPerExecution,\n timeoutSeconds: toolConfig.timeoutSeconds,\n },\n };\n break;\n case 'BUDGET':\n config = {\n maxTokensPerExecution: budgetConfig.maxTokensPerExecution,\n maxCostPerExecution: budgetConfig.maxCostPerExecution,\n modelEscalationConstraints: {\n allowEscalation: budgetConfig.allowEscalation,\n maxModelTier: budgetConfig.maxModelTier,\n },\n };\n break;\n case 'RATE_LIMIT':\n config = {\n limits: {\n requestsPerMinute: rateLimitConfig.requestsPerMinute,\n requestsPerHour: rateLimitConfig.requestsPerHour,\n tokensPerMinute: rateLimitConfig.tokensPerMinute,\n },\n scope: rateLimitConfig.scope,\n };\n break;\n case 'RESPONSE': {\n const allowedModels = splitList(responseConfig.allowedModels);\n const allowedProviders = splitList(responseConfig.allowedProviders).map((provider) =>\n provider.toUpperCase()\n );\n config = {\n ...(allowedModels.length > 0 ? { allowedModels } : {}),\n ...(allowedProviders.length > 0 ? { allowedProviders } : {}),\n };\n break;\n }\n case 'RETENTION':\n config = {\n executionDataRetentionDays: retentionConfig.executionDataRetentionDays,\n payloadSnapshotsEnabled: retentionConfig.payloadSnapshotsEnabled,\n };\n break;\n }\n\n try {\n await createPolicy({\n name: formData.name,\n description: formData.description,\n type: formData.type,\n visibility: formData.visibility,\n status: activateOnCreate ? 'ACTIVE' : 'DRAFT',\n config: config as unknown as Record<string, unknown>,\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create policy');\n return;\n }\n toast.success(`Policy \"${formData.name}\" created`);\n navigateTo('policies');\n };\n\n const handleUpdate = async () => {\n if (!policyId || !formData.name) return;\n try {\n await updatePolicy({\n policyId,\n input: {\n name: formData.name,\n description: formData.description,\n visibility: formData.visibility,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update policy');\n return;\n }\n // The policy query is network-only local state, so re-read it to show the change.\n await refetchPolicy();\n toast.success('Policy updated');\n setIsEditing(false);\n };\n\n const handleDelete = async () => {\n if (!policyId) return;\n try {\n await deletePolicy(policyId);\n if (isNative()) void nativeNotify('success');\n navigateTo('policies');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n };\n\n const isActive = policy?.status === 'ACTIVE';\n\n const handleToggleActive = async () => {\n if (!policyId) return;\n const nextStatus = isActive ? 'DRAFT' : 'ACTIVE';\n try {\n await updatePolicy({ policyId, input: { status: nextStatus } });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update policy');\n return;\n }\n await refetchPolicy();\n toast.success(\n nextStatus === 'ACTIVE' ? 'Policy is now enforced' : 'Policy is no longer enforced'\n );\n };\n\n const startEditing = () => {\n if (!policy) return;\n setFormData({\n name: policy.name,\n description: policy.description || '',\n type: toUnion(policy.type, POLICY_TYPES, 'CONTENT'),\n visibility: toUnion(policy.visibility, VISIBILITIES, 'PRIVATE'),\n });\n setIsEditing(true);\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Policy\"\n description=\"Define guardrails and constraints for your AI agents\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('policies')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createLoading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Policy Name\" required>\n <Input\n placeholder=\"e.g., Production Content Policy\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What does this policy enforce?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Policy Type\" required>\n <select\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.type}\n onChange={(e) =>\n setFormData({ ...formData, type: e.target.value as PolicyType })\n }\n >\n <option value=\"CONTENT\">Content Policy</option>\n <option value=\"TOOL\">Tool Policy</option>\n <option value=\"DATA\">Data Policy</option>\n <option value=\"RESPONSE\">Response &amp; Model Policy</option>\n <option value=\"BUDGET\">Budget Policy</option>\n <option value=\"RATE_LIMIT\">Rate Limit Policy</option>\n <option value=\"RETENTION\">Retention Policy</option>\n </select>\n </FormField>\n\n <FormField label=\"Visibility\">\n <select\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n </CardContent>\n </Card>\n\n {/* Policy-specific configuration */}\n {formData.type === 'CONTENT' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <AlertTriangle size={18} />\n Content Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"jailbreak\"\n checked={contentConfig.jailbreakDetection}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, jailbreakDetection: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"jailbreak\" className=\"text-sm\">\n Jailbreak Detection\n </label>\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"pii\"\n checked={contentConfig.piiDetection}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, piiDetection: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"pii\" className=\"text-sm\">\n PII Detection\n </label>\n </div>\n </div>\n\n <FormField label=\"Toxicity Threshold\" description=\"0.0 to 1.0\">\n <Input\n type=\"number\"\n min={0}\n max={1}\n step={0.1}\n value={contentConfig.toxicityThreshold}\n onChange={(e) =>\n setContentConfig({\n ...contentConfig,\n toxicityThreshold: parseFloat(e.target.value),\n })\n }\n />\n </FormField>\n\n <FormField label=\"Custom Patterns\" description=\"One regex pattern per line\">\n <Textarea\n placeholder=\"Enter custom patterns...\"\n value={contentConfig.customPatterns}\n onChange={(e) =>\n setContentConfig({ ...contentConfig, customPatterns: e.target.value })\n }\n rows={3}\n />\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'TOOL' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tool Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Allowed Tools\" description=\"Comma-separated tool IDs\">\n <Input\n placeholder=\"e.g., search, read_file, web_browse\"\n value={toolConfig.allowedTools}\n onChange={(e) => setToolConfig({ ...toolConfig, allowedTools: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Denied Tools\" description=\"Comma-separated tool IDs\">\n <Input\n placeholder=\"e.g., delete_file, execute_code\"\n value={toolConfig.deniedTools}\n onChange={(e) => setToolConfig({ ...toolConfig, deniedTools: e.target.value })}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Max Calls Per Execution\">\n <Input\n type=\"number\"\n min={1}\n value={toolConfig.maxCallsPerExecution}\n onChange={(e) =>\n setToolConfig({\n ...toolConfig,\n maxCallsPerExecution: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Timeout (seconds)\">\n <Input\n type=\"number\"\n min={1}\n value={toolConfig.timeoutSeconds}\n onChange={(e) =>\n setToolConfig({\n ...toolConfig,\n timeoutSeconds: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'BUDGET' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <DollarSign size={18} />\n Budget Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Max Tokens Per Execution\">\n <Input\n type=\"number\"\n min={100}\n value={budgetConfig.maxTokensPerExecution}\n onChange={(e) =>\n setBudgetConfig({\n ...budgetConfig,\n maxTokensPerExecution: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Max Cost Per Execution ($)\">\n <Input\n type=\"number\"\n min={0.01}\n step={0.01}\n value={budgetConfig.maxCostPerExecution}\n onChange={(e) =>\n setBudgetConfig({\n ...budgetConfig,\n maxCostPerExecution: parseFloat(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"escalation\"\n checked={budgetConfig.allowEscalation}\n onChange={(e) =>\n setBudgetConfig({ ...budgetConfig, allowEscalation: e.target.checked })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"escalation\" className=\"text-sm\">\n Allow Model Escalation\n </label>\n </div>\n\n <FormField label=\"Max Model Tier\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={budgetConfig.maxModelTier}\n onChange={(e) =>\n setBudgetConfig({ ...budgetConfig, maxModelTier: e.target.value })\n }\n >\n <option value=\"gpt-3.5-turbo\">GPT-3.5 Turbo</option>\n <option value=\"gpt-4\">GPT-4</option>\n <option value=\"gpt-4-turbo\">GPT-4 Turbo</option>\n <option value=\"claude-3-sonnet\">Claude 3 Sonnet</option>\n <option value=\"claude-3-opus\">Claude 3 Opus</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'RATE_LIMIT' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Clock size={18} />\n Rate Limit Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-3 gap-4\">\n <FormField label=\"Requests / Minute\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.requestsPerMinute}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n requestsPerMinute: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Requests / Hour\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.requestsPerHour}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n requestsPerHour: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n <FormField label=\"Tokens / Minute\">\n <Input\n type=\"number\"\n min={1}\n value={rateLimitConfig.tokensPerMinute}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n tokensPerMinute: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n </div>\n\n <FormField label=\"Scope\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={rateLimitConfig.scope}\n onChange={(e) =>\n setRateLimitConfig({\n ...rateLimitConfig,\n scope: e.target.value as 'connector' | 'app' | 'agent' | 'user_group',\n })\n }\n >\n <option value=\"connector\">Per Connector</option>\n <option value=\"app\">Per Bot</option>\n <option value=\"agent\">Per Agent</option>\n <option value=\"user_group\">Per User Group</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {formData.type === 'RESPONSE' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Model Usage Allowlist\n </CardTitle>\n <CardDescription>\n Agents in this workspace may only answer with models that match every active model\n policy. Leave both fields empty to allow all models.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField\n label=\"Allowed Models\"\n description=\"Comma-separated model IDs. End an entry with * to allow a prefix.\"\n >\n <Input\n placeholder=\"e.g., gpt-4o-mini, anthropic.claude-*\"\n value={responseConfig.allowedModels}\n onChange={(e) =>\n setResponseConfig({ ...responseConfig, allowedModels: e.target.value })\n }\n />\n </FormField>\n\n <FormField\n label=\"Allowed Providers\"\n description=\"Comma-separated provider types, e.g. OPENAI, ANTHROPIC, AWS_BEDROCK.\"\n >\n <Input\n placeholder=\"e.g., AWS_BEDROCK, ANTHROPIC\"\n value={responseConfig.allowedProviders}\n onChange={(e) =>\n setResponseConfig({ ...responseConfig, allowedProviders: e.target.value })\n }\n />\n </FormField>\n </CardContent>\n </Card>\n )}\n\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start gap-2\">\n <input\n type=\"checkbox\"\n id=\"activate-on-create\"\n checked={activateOnCreate}\n onChange={(e) => setActivateOnCreate(e.target.checked)}\n className=\"mt-1 h-4 w-4\"\n />\n <label htmlFor=\"activate-on-create\" className=\"text-sm\">\n <span className=\"font-medium\">Enforce immediately</span>\n <span className=\"block text-text-secondary\">\n Only active policies are enforced. Leave unchecked to save this policy as a\n draft and activate it later.\n </span>\n </label>\n </div>\n </CardContent>\n </Card>\n\n {formData.type === 'RETENTION' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Trash2 size={18} />\n Retention Policy Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Execution Data Retention (days)\">\n <Input\n type=\"number\"\n min={1}\n value={retentionConfig.executionDataRetentionDays}\n onChange={(e) =>\n setRetentionConfig({\n ...retentionConfig,\n executionDataRetentionDays: parseInt(e.target.value),\n })\n }\n />\n </FormField>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"snapshots\"\n checked={retentionConfig.payloadSnapshotsEnabled}\n onChange={(e) =>\n setRetentionConfig({\n ...retentionConfig,\n payloadSnapshotsEnabled: e.target.checked,\n })\n }\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"snapshots\" className=\"text-sm\">\n Enable Payload Snapshots\n </label>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!policy) {\n return (\n <PageLayout title=\"Policy Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Policy Not Found\"\n description=\"This policy doesn't exist.\"\n action={<Button onClick={() => navigateTo('policies')}>Back to Policies</Button>}\n />\n </PageLayout>\n );\n }\n\n const policyType = toUnion(policy.type, POLICY_TYPES, 'CONTENT');\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('policies')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <PolicyTypeIcon type={policyType} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{policy.name}</span>\n <StatusBadge status={policy.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{policy.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateLoading}\n disabled={!formData.name}\n >\n Save Changes\n </Button>\n </>\n ) : (\n <>\n <Button\n variant={isActive ? 'outline' : 'default'}\n leftIcon={<Power size={16} />}\n onClick={() => void handleToggleActive()}\n isLoading={updateLoading}\n >\n {isActive ? 'Deactivate' : 'Activate'}\n </Button>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteLoading}\n >\n Confirm Delete\n </Button>\n </div>\n ) : (\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Shield size={18} />}>\n This is a single guardrail and its rules. Review and tune exactly what it enforces — what\n content to block, which tools are allowed, the spend or rate limits it applies — then\n attach it to the agents and bots that should obey it. Policies are how you keep agents\n safe, compliant and within budget.\n </PagePurpose>\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Policy</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Policy Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n <FormField label=\"Visibility\">\n <select\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n <p className=\"text-sm text-text-secondary\">\n Note: Policy type and configuration cannot be changed after creation.\n </p>\n </CardContent>\n </Card>\n )}\n\n {/* Overview */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <PolicyTypeIcon type={policyType} />\n </div>\n <p className=\"text-lg font-bold\">{PolicyTypeLabel[policyType]}</p>\n <p className=\"text-sm text-text-secondary\">Policy Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary capitalize\">\n {policy.visibility.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{policy.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatRelativeTime(policy.updatedAt)}\n </p>\n <p className=\"text-sm text-text-secondary\">Last Updated</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Configuration */}\n <Card>\n <CardHeader>\n <CardTitle>Configuration</CardTitle>\n <CardDescription>Current policy configuration</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-bg-sunken rounded-lg font-mono text-sm overflow-auto\">\n <pre>{JSON.stringify(policy.config, null, 2)}</pre>\n </div>\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(policy.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(policy.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {policy.tags.length > 0 ? (\n policy.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-botmanor",
3
- "version": "2026.1025.1",
3
+ "version": "2026.1025.3",
4
4
  "description": "Burdenoff BotManor Microfrontend - AI Agent platform interface for building, deploying and managing AI agents",
5
5
  "type": "module",
6
6
  "files": [