@open-mercato/ai-assistant 0.6.2-develop.3406.1.2b403f40da → 0.6.2-develop.3446.1.bd060c6017

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.
Files changed (54) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +8 -1
  3. package/build.mjs +1 -0
  4. package/dist/frontend/components/AiChatButton.js +1 -1
  5. package/dist/frontend/components/AiChatButton.js.map +2 -2
  6. package/dist/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.js +16 -5
  7. package/dist/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.js.map +2 -2
  8. package/dist/modules/ai_assistant/ai-tools/meta-pack.js +58 -1
  9. package/dist/modules/ai_assistant/ai-tools/meta-pack.js.map +2 -2
  10. package/dist/modules/ai_assistant/api/ai/agents/route.js +2 -1
  11. package/dist/modules/ai_assistant/api/ai/agents/route.js.map +2 -2
  12. package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js.map +2 -2
  13. package/dist/modules/ai_assistant/i18n/de.json +7 -1
  14. package/dist/modules/ai_assistant/i18n/en.json +7 -1
  15. package/dist/modules/ai_assistant/i18n/es.json +7 -1
  16. package/dist/modules/ai_assistant/i18n/pl.json +7 -1
  17. package/dist/modules/ai_assistant/lib/agent-registry.js +26 -6
  18. package/dist/modules/ai_assistant/lib/agent-registry.js.map +2 -2
  19. package/dist/modules/ai_assistant/lib/agent-runtime.js +21 -8
  20. package/dist/modules/ai_assistant/lib/agent-runtime.js.map +3 -3
  21. package/dist/modules/ai_assistant/lib/ai-agent-definition.js.map +2 -2
  22. package/dist/modules/ai_assistant/lib/pending-action-types.js.map +2 -2
  23. package/dist/modules/ai_assistant/lib/prepare-mutation.js +16 -6
  24. package/dist/modules/ai_assistant/lib/prepare-mutation.js.map +2 -2
  25. package/dist/modules/ai_assistant/lib/task-plan-labels.js +95 -0
  26. package/dist/modules/ai_assistant/lib/task-plan-labels.js.map +7 -0
  27. package/dist/modules/ai_assistant/lib/task-plan-stream.js +349 -0
  28. package/dist/modules/ai_assistant/lib/task-plan-stream.js.map +7 -0
  29. package/dist/modules/ai_assistant/lib/tool-test-fixtures.js +3 -0
  30. package/dist/modules/ai_assistant/lib/tool-test-fixtures.js.map +2 -2
  31. package/package.json +6 -6
  32. package/src/frontend/components/AiChatButton.tsx +1 -1
  33. package/src/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.ts +20 -8
  34. package/src/modules/ai_assistant/ai-tools/__tests__/meta-pack.test.ts +60 -4
  35. package/src/modules/ai_assistant/ai-tools/meta-pack.ts +79 -2
  36. package/src/modules/ai_assistant/api/ai/agents/route.ts +2 -1
  37. package/src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx +1 -0
  38. package/src/modules/ai_assistant/i18n/de.json +7 -1
  39. package/src/modules/ai_assistant/i18n/en.json +7 -1
  40. package/src/modules/ai_assistant/i18n/es.json +7 -1
  41. package/src/modules/ai_assistant/i18n/pl.json +7 -1
  42. package/src/modules/ai_assistant/lib/__tests__/agent-registry.test.ts +60 -0
  43. package/src/modules/ai_assistant/lib/__tests__/ai-agent-definition.test.ts +4 -0
  44. package/src/modules/ai_assistant/lib/__tests__/prepare-mutation.test.ts +43 -0
  45. package/src/modules/ai_assistant/lib/__tests__/task-plan-stream.test.ts +375 -0
  46. package/src/modules/ai_assistant/lib/agent-registry.ts +36 -5
  47. package/src/modules/ai_assistant/lib/agent-runtime.ts +26 -8
  48. package/src/modules/ai_assistant/lib/ai-agent-definition.ts +14 -0
  49. package/src/modules/ai_assistant/lib/pending-action-types.ts +4 -1
  50. package/src/modules/ai_assistant/lib/prepare-mutation.ts +17 -5
  51. package/src/modules/ai_assistant/lib/task-plan-labels.ts +112 -0
  52. package/src/modules/ai_assistant/lib/task-plan-stream.ts +463 -0
  53. package/src/modules/ai_assistant/lib/tool-test-fixtures.ts +3 -0
  54. package/src/modules/ai_assistant/lib/types.ts +16 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n Bot,\n BookOpen,\n History,\n Image as ImageIcon,\n FileText,\n Loader2,\n Lock,\n Paperclip,\n RefreshCcw,\n Save,\n ShieldAlert,\n ShieldOff,\n Trash2,\n Wand2,\n Wrench,\n} from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Radio, RadioGroup } from '@open-mercato/ui/primitives/radio'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { StatusBadge, type StatusMap } from '@open-mercato/ui/primitives/status-badge'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@open-mercato/ui/primitives/tooltip'\nimport { EmptyState } from '@open-mercato/ui/backend/EmptyState'\nimport { apiCall, apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useAiShortcuts } from '@open-mercato/ui/ai'\n\n// The agent picker is deliberately duplicated between the playground and this\n// settings page. Duplicated markup is under the 50-line threshold, so extraction\n// stays deferred per the Step 4.6 brief.\n\ntype AgentTool = {\n name: string\n displayName: string\n isMutation: boolean\n registered: boolean\n}\n\ntype AgentSettings = {\n id: string\n moduleId: string\n label: string\n description: string\n systemPrompt: string\n executionMode: 'chat' | 'object'\n defaultProvider: string | null\n defaultModel: string | null\n defaultBaseUrl: string | null\n allowRuntimeModelOverride: boolean\n mutationPolicy: string\n readOnly: boolean\n maxSteps: number | null\n allowedTools: string[]\n tools: AgentTool[]\n requiredFeatures: string[]\n acceptedMediaTypes: string[]\n hasOutputSchema: boolean\n}\n\ntype AgentsResponse = {\n agents: AgentSettings[]\n total: number\n}\n\ntype ProviderConfig = {\n id: string\n name: string\n defaultModel: string\n configured: boolean\n defaultModels: Array<{ id: string; name: string }>\n}\n\ntype AgentResolution = {\n agentId: string\n moduleId: string\n allowRuntimeModelOverride: boolean\n codeDefaultProviderId: string | null\n codeDefaultModelId: string | null\n override: {\n providerId: string | null\n modelId: string | null\n baseURL: string | null\n updatedAt: string\n } | null\n runtimeOverrideAllowlist: {\n env: TenantAllowlist | null\n tenant: TenantAllowlist | null\n effective: EffectiveAllowlist\n envVarNames: {\n providers: string\n modelsByProvider: Record<string, string>\n }\n }\n providerId: string\n modelId: string\n baseURL: string | null\n source: string\n}\n\ntype TenantAllowlist = {\n allowedProviders: string[] | null\n allowedModelsByProvider: Record<string, string[]>\n}\n\ntype EffectiveAllowlist = {\n providers: string[] | null\n modelsByProvider: Record<string, string[]>\n hasRestrictions: boolean\n tenantOverridesActive: boolean\n}\n\ntype RuntimeSettingsResponse = {\n availableProviders: ProviderConfig[]\n agents: AgentResolution[]\n}\n\nconst PROMPT_SECTION_IDS = [\n 'role',\n 'scope',\n 'data',\n 'tools',\n 'attachments',\n 'mutationPolicy',\n 'responseStyle',\n 'overrides',\n] as const\n\ntype PromptSectionId = (typeof PROMPT_SECTION_IDS)[number]\n\nconst mutationPolicyStatusMap: StatusMap<string> = {\n 'read-only': 'neutral',\n 'confirm-required': 'warning',\n 'destructive-confirm-required': 'error',\n}\n\nconst executionModeStatusMap: StatusMap<'chat' | 'object'> = {\n chat: 'info',\n object: 'success',\n}\n\nconst mediaTypeIconMap: Record<string, React.ElementType> = {\n image: ImageIcon,\n pdf: FileText,\n file: Paperclip,\n}\n\nasync function fetchAgents(): Promise<AgentsResponse> {\n const { result, status } = await apiCallOrThrow<AgentsResponse>(\n '/api/ai_assistant/ai/agents',\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load agents' },\n )\n if (!result) throw new Error(`Failed to load agents (${status})`)\n return result\n}\n\nasync function fetchRuntimeSettings(): Promise<RuntimeSettingsResponse> {\n const { result, status } = await apiCallOrThrow<RuntimeSettingsResponse>(\n '/api/ai_assistant/settings',\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load runtime settings' },\n )\n if (!result) throw new Error(`Failed to load runtime settings (${status})`)\n return result\n}\n\ntype OverrideVersion = {\n id: string\n agentId: string\n version: number\n sections: Record<string, string>\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype OverrideResponse = {\n agentId: string\n override: OverrideVersion | null\n versions: OverrideVersion[]\n}\n\nasync function fetchOverride(agentId: string): Promise<OverrideResponse> {\n const { result, status } = await apiCallOrThrow<OverrideResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/prompt-override`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load prompt override' },\n )\n if (!result) throw new Error(`Failed to load prompt override (${status})`)\n return result\n}\n\ntype MutationPolicy = 'read-only' | 'confirm-required' | 'destructive-confirm-required'\n\nconst MUTATION_POLICY_OPTIONS: MutationPolicy[] = [\n 'read-only',\n 'destructive-confirm-required',\n 'confirm-required',\n]\n\n// Higher number = less restrictive. Mirrors\n// `lib/agent-policy.ts#POLICY_RESTRICTIVENESS` \u2014 UI must match the server's\n// escalation guard so disabled options line up with 400 responses.\nconst POLICY_RESTRICTIVENESS_UI: Record<MutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\ntype MutationPolicyOverrideRow = {\n id: string\n agentId: string\n mutationPolicy: MutationPolicy\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype MutationPolicyResponse = {\n agentId: string\n codeDeclared: MutationPolicy\n override: MutationPolicyOverrideRow | null\n}\n\nasync function fetchMutationPolicy(agentId: string): Promise<MutationPolicyResponse> {\n const { result, status } = await apiCallOrThrow<MutationPolicyResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/mutation-policy`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load mutation policy' },\n )\n if (!result) throw new Error(`Failed to load mutation policy (${status})`)\n return result\n}\n\nfunction SettingsLoading({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border border-border bg-background p-4 text-sm text-muted-foreground\"\n role=\"status\"\n >\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n <span>{message}</span>\n </div>\n )\n}\n\nfunction EmptyAgents() {\n const t = useT()\n return (\n <EmptyState\n icon={<Bot className=\"size-6\" aria-hidden />}\n title={t(\n 'ai_assistant.agents.empty.title',\n 'No AI agents are registered for your role yet.',\n )}\n description={t(\n 'ai_assistant.agents.empty.description',\n 'Declare agents inside `packages/<module>/src/modules/<module>/ai-agents.ts`, run `yarn generate`, and ensure the caller holds the agent\\'s required features.',\n )}\n >\n <div className=\"mt-2 inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <BookOpen className=\"size-3\" aria-hidden />\n <span>\n {t(\n 'ai_assistant.agents.empty.docLabel',\n 'See packages/ai-assistant/AGENTS.md for the agent definition reference.',\n )}\n </span>\n </div>\n </EmptyState>\n )\n}\n\nfunction PromptSectionEditor({\n sectionId,\n defaultText,\n overrideText,\n override,\n onToggleOverride,\n onOverrideChange,\n onSaveShortcut,\n}: {\n sectionId: PromptSectionId\n defaultText: string\n overrideText: string\n override: boolean\n onToggleOverride: (next: boolean) => void\n onOverrideChange: (next: string) => void\n onSaveShortcut: () => void\n}) {\n const t = useT()\n const sectionLabel = t(\n `ai_assistant.agents.prompt.sections.${sectionId}`,\n sectionId.charAt(0).toUpperCase() + sectionId.slice(1),\n )\n const textareaId = `ai-agent-prompt-${sectionId}`\n\n const textareaRef = React.useRef<HTMLTextAreaElement | null>(null)\n const { handleKeyDown } = useAiShortcuts({\n onSubmit: onSaveShortcut,\n onCancel: () => {\n textareaRef.current?.blur()\n },\n })\n\n return (\n <div\n className=\"flex flex-col gap-2 rounded-md border border-border bg-muted/20 p-3\"\n data-ai-agent-prompt-section={sectionId}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {sectionLabel}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {override\n ? t(\n 'ai_assistant.agents.prompt.overrideModeLabel',\n 'Override mode \u2014 replaces the default when persistence lands.',\n )\n : t(\n 'ai_assistant.agents.prompt.defaultModeLabel',\n 'Default \u2014 shipped with the agent definition.',\n )}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Label htmlFor={`${textareaId}-toggle`} className=\"text-xs\">\n {t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n </Label>\n <Switch\n id={`${textareaId}-toggle`}\n checked={override}\n onCheckedChange={(next: boolean) => onToggleOverride(next)}\n aria-label={t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n data-ai-agent-prompt-toggle={sectionId}\n />\n </div>\n </div>\n {override ? (\n <Textarea\n id={textareaId}\n ref={textareaRef}\n rows={4}\n value={overrideText}\n onChange={(event) => onOverrideChange(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"resize-y font-mono text-xs\"\n placeholder={t(\n 'ai_assistant.agents.prompt.overridePlaceholder',\n 'Write the replacement text for this section...',\n )}\n aria-label={`${sectionLabel} override`}\n data-ai-agent-prompt-override={sectionId}\n />\n ) : (\n <pre\n className=\"max-h-40 overflow-auto rounded border border-border bg-background p-2 text-xs font-mono whitespace-pre-wrap\"\n data-ai-agent-prompt-default={sectionId}\n >\n {defaultText}\n </pre>\n )}\n </div>\n )\n}\n\nfunction ToolRow({ tool }: { tool: AgentTool }) {\n const t = useT()\n return (\n <div\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-tool-row={tool.name}\n >\n <div className=\"flex items-start gap-2 min-w-0\">\n <Wrench className=\"mt-0.5 size-4 text-muted-foreground\" aria-hidden />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"truncate text-sm font-medium\">{tool.displayName}</span>\n <span className=\"truncate text-xs font-mono text-muted-foreground\">{tool.name}</span>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 flex-shrink-0\">\n {tool.isMutation ? (\n <StatusBadge variant=\"warning\" dot>\n {t('ai_assistant.agents.tools.mutationBadge', 'Mutation')}\n </StatusBadge>\n ) : (\n <StatusBadge variant=\"neutral\" dot>\n {t('ai_assistant.agents.tools.readBadge', 'Read')}\n </StatusBadge>\n )}\n {!tool.registered ? (\n <StatusBadge variant=\"error\" dot>\n {t('ai_assistant.agents.tools.missingBadge', 'Missing')}\n </StatusBadge>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-center gap-1\">\n <Label\n htmlFor={`ai-agent-tool-${tool.name}`}\n className=\"text-xs text-muted-foreground\"\n >\n {t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n </Label>\n <Switch\n id={`ai-agent-tool-${tool.name}`}\n checked\n disabled\n aria-label={t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n data-ai-agent-tool-switch={tool.name}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {t(\n 'ai_assistant.agents.tools.tooltipDisabled',\n 'Editable after Phase 3 lands mutation policy controls.',\n )}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n )\n}\n\nfunction AttachmentPolicyBadges({ mediaTypes }: { mediaTypes: string[] }) {\n const t = useT()\n if (!mediaTypes.length) {\n return (\n <Badge variant=\"neutral\">\n {t('ai_assistant.agents.attachments.noneBadge', 'No attachments accepted')}\n </Badge>\n )\n }\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {mediaTypes.map((mediaType) => {\n const Icon = mediaTypeIconMap[mediaType] ?? Paperclip\n return (\n <Badge\n key={mediaType}\n variant=\"info\"\n className=\"gap-1.5\"\n data-ai-agent-attachment-badge={mediaType}\n >\n <Icon className=\"size-3\" aria-hidden />\n <span className=\"font-mono text-xs\">{mediaType}</span>\n </Badge>\n )\n })}\n </div>\n )\n}\n\nfunction MutationPolicySection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n\n const query = useQuery<MutationPolicyResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n queryFn: () => fetchMutationPolicy(agent.id),\n retry: false,\n })\n\n const codeDeclared = (query.data?.codeDeclared ?? (agent.mutationPolicy as MutationPolicy))\n const currentOverride = query.data?.override ?? null\n\n const [selected, setSelected] = React.useState<MutationPolicy | null>(null)\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSavePolicyMutation } = useGuardedMutation({\n contextId: `ai-agent-mutation-policy-save-${agent.id}`,\n })\n const { runMutation: runClearPolicyMutation } = useGuardedMutation({\n contextId: `ai-agent-mutation-policy-clear-${agent.id}`,\n })\n\n React.useEffect(() => {\n setSelected(currentOverride?.mutationPolicy ?? null)\n setState({ kind: 'idle' })\n }, [agent.id, currentOverride?.mutationPolicy])\n\n const codeRank = POLICY_RESTRICTIVENESS_UI[codeDeclared] ?? 0\n const effectivePolicy: MutationPolicy = (() => {\n if (!currentOverride) return codeDeclared\n const overrideRank = POLICY_RESTRICTIVENESS_UI[currentOverride.mutationPolicy]\n return overrideRank < codeRank ? currentOverride.mutationPolicy : codeDeclared\n })()\n\n const hasChange = selected !== null && selected !== (currentOverride?.mutationPolicy ?? null)\n\n const save = React.useCallback(async () => {\n if (!selected || isSaving) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n await runSavePolicyMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n code?: string\n codeDeclared?: MutationPolicy\n requested?: MutationPolicy\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ mutationPolicy: selected }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n const message =\n payload.code === 'escalation_not_allowed'\n ? (payload.error ??\n t(\n 'ai_assistant.agents.mutation_policy.errors.escalationNotAllowed',\n 'Cannot upgrade beyond the agent\\'s declared policy \u2014 this is a code-level change.',\n ))\n : (payload.error ??\n `Failed to save mutation policy (${status}).`)\n throw new Error(message)\n }\n },\n context: {},\n })\n const successMessage = t(\n 'ai_assistant.agents.mutation_policy.savedMessage',\n 'Mutation policy override saved.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, queryClient, runSavePolicyMutation, selected, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n await runClearPolicyMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'DELETE',\n credentials: 'include',\n },\n )\n const payload = result ?? {}\n if (!ok) {\n throw new Error(payload.error ?? `Failed to clear override (${status}).`)\n }\n },\n context: {},\n })\n const successMessage = t(\n 'ai_assistant.agents.mutation_policy.clearedMessage',\n 'Mutation policy override cleared; agent is using its code-declared policy.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, t])\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-mutation-policy={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <ShieldAlert className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.mutation_policy.title', 'Mutation policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.subtitle',\n 'Downgrade this agent\\'s mutation capability per tenant. Upgrading beyond the code-declared policy is blocked by the server.',\n )}\n </p>\n </div>\n </div>\n <StatusBadge\n variant={mutationPolicyStatusMap[effectivePolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-effective\n >\n {effectivePolicy}\n </StatusBadge>\n </header>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.codeDeclared', 'Code-declared')}\n </span>\n <div className=\"mt-1 flex flex-wrap items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[codeDeclared] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-code-declared\n >\n {codeDeclared}\n </StatusBadge>\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n <span className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.codeDeclaredHint',\n 'Compiled into the agent definition.',\n )}\n </span>\n </div>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.tenantOverride', 'Tenant override')}\n </span>\n <div className=\"mt-1\">\n {currentOverride ? (\n <StatusBadge\n variant={mutationPolicyStatusMap[currentOverride.mutationPolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-override-current\n >\n {currentOverride.mutationPolicy}\n </StatusBadge>\n ) : (\n <span\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-mutation-policy-override-empty\n >\n {t(\n 'ai_assistant.agents.mutation_policy.noOverride',\n 'No override \u2014 using code-declared policy.',\n )}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <Alert\n variant=\"info\"\n icon={<ShieldAlert aria-hidden=\"true\" />}\n data-ai-agent-mutation-policy-notice\n >\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeTitle',\n 'Downgrade only \u2014 escalation is a code change',\n )}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeBody',\n 'Overrides can only make the policy more restrictive. Options more permissive than the code-declared policy are disabled and rejected server-side.',\n )}\n </AlertDescription>\n </Alert>\n\n {query.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.mutation_policy.loading',\n 'Loading mutation policy...',\n )}\n />\n ) : query.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-load-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.loadErrorTitle',\n 'Failed to load mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>\n {query.error instanceof Error ? query.error.message : String(query.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <RadioGroup\n value={selected ?? ''}\n onValueChange={(value) => {\n setSelected(value as MutationPolicy)\n }}\n className=\"flex flex-col gap-2\"\n aria-label={t(\n 'ai_assistant.agents.mutation_policy.pickerLabel',\n 'Mutation policy override',\n )}\n data-ai-agent-mutation-policy-picker\n >\n {MUTATION_POLICY_OPTIONS.map((option) => {\n const optionRank = POLICY_RESTRICTIVENESS_UI[option]\n const wouldEscalate = optionRank > codeRank\n const isSelected = selected === option\n return (\n <Tooltip key={option}>\n <TooltipTrigger asChild>\n <div\n className={`flex items-start gap-3 rounded-md border px-3 py-2 text-sm cursor-pointer transition-colors ${\n wouldEscalate\n ? 'border-border bg-muted/30 cursor-not-allowed opacity-60'\n : isSelected\n ? 'border-accent-indigo bg-accent-indigo/5'\n : 'border-border bg-background hover:bg-muted/40'\n }`}\n onClick={() => {\n if (wouldEscalate) return\n setSelected(option)\n }}\n data-ai-agent-mutation-policy-option={option}\n data-ai-agent-mutation-policy-option-disabled={wouldEscalate ? 'true' : 'false'}\n >\n <Radio\n value={option}\n disabled={wouldEscalate}\n className=\"mt-0.5\"\n aria-disabled={wouldEscalate}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"flex items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[option] ?? 'neutral'}\n dot\n >\n {option}\n </StatusBadge>\n {wouldEscalate ? (\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n ) : null}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {t(\n `ai_assistant.agents.mutation_policy.options.${option}`,\n option,\n )}\n </span>\n </div>\n </div>\n </TooltipTrigger>\n {wouldEscalate ? (\n <TooltipContent>\n {t(\n 'ai_assistant.agents.mutation_policy.escalationTooltip',\n \"Cannot be set above the agent's declared policy \u2014 this is a code-level change.\",\n )}\n </TooltipContent>\n ) : null}\n </Tooltip>\n )\n })}\n </RadioGroup>\n )}\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-mutation-policy-state=\"success\">\n <AlertTitle>\n {t('ai_assistant.agents.mutation_policy.savedTitle', 'Mutation policy updated')}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-state=\"error\">\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.errorTitle',\n 'Failed to update mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={isClearing || isSaving || !currentOverride}\n data-ai-agent-mutation-policy-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={isSaving || isClearing || !hasChange || selected === null}\n data-ai-agent-mutation-policy-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.save', 'Save override')}</span>\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\nfunction AgentModelOverrideSection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n const settingsQuery = useQuery<RuntimeSettingsResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n queryFn: fetchRuntimeSettings,\n retry: false,\n })\n\n const agentResolution = settingsQuery.data?.agents.find((entry) => entry.agentId === agent.id) ?? null\n const configuredProviders = React.useMemo(\n () => (settingsQuery.data?.availableProviders ?? []).filter((provider) => provider.configured),\n [settingsQuery.data?.availableProviders],\n )\n\n const [selectedProviderId, setSelectedProviderId] = React.useState('')\n const [selectedModelId, setSelectedModelId] = React.useState('')\n const [allowedProviders, setAllowedProviders] = React.useState<string[] | null>(null)\n const [allowedModelsByProvider, setAllowedModelsByProvider] = React.useState<Record<string, string[]>>({})\n const [allowlistDirty, setAllowlistDirty] = React.useState(false)\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [isSavingAllowlist, setIsSavingAllowlist] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSaveModelOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-save-${agent.id}`,\n })\n const { runMutation: runClearModelOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-clear-${agent.id}`,\n })\n const { runMutation: runSaveModelAllowlistMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-allowlist-${agent.id}`,\n })\n\n React.useEffect(() => {\n const override = agentResolution?.override\n setSelectedProviderId(override?.providerId ?? '')\n setSelectedModelId(override?.modelId ?? '')\n setAllowedProviders(agentResolution?.runtimeOverrideAllowlist.tenant?.allowedProviders ?? null)\n setAllowedModelsByProvider({\n ...(agentResolution?.runtimeOverrideAllowlist.tenant?.allowedModelsByProvider ?? {}),\n })\n setAllowlistDirty(false)\n setState({ kind: 'idle' })\n }, [\n agent.id,\n agentResolution?.override?.modelId,\n agentResolution?.override?.providerId,\n agentResolution?.runtimeOverrideAllowlist.tenant,\n ])\n\n const selectedProvider = configuredProviders.find((provider) => provider.id === selectedProviderId)\n const isProviderAllowedForPicker = React.useCallback(\n (providerId: string) => {\n if (allowedProviders === null) return true\n return allowedProviders.includes(providerId)\n },\n [allowedProviders],\n )\n const isModelAllowedForPicker = React.useCallback(\n (providerId: string, modelId: string) => {\n const list = allowedModelsByProvider[providerId]\n if (list === undefined) return true\n return list.includes(modelId)\n },\n [allowedModelsByProvider],\n )\n const hasChange =\n selectedProviderId.length > 0 &&\n selectedModelId.length > 0 &&\n (\n selectedProviderId !== (agentResolution?.override?.providerId ?? '') ||\n selectedModelId !== (agentResolution?.override?.modelId ?? '')\n )\n\n const save = React.useCallback(async () => {\n if (isSaving || !selectedProviderId || !selectedModelId) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n await runSaveModelOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string; code?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n agentId: agent.id,\n providerId: selectedProviderId,\n modelId: selectedModelId,\n }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to save model override (${status}).`)\n }\n },\n context: {},\n })\n const successMessage = t('ai_assistant.agents.model_override.saved', 'Model override saved.')\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, queryClient, runSaveModelOverrideMutation, selectedModelId, selectedProviderId, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n await runClearModelOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ agentId: agent.id }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to clear model override (${status}).`)\n }\n },\n context: {},\n })\n setSelectedProviderId('')\n setSelectedModelId('')\n const successMessage = t(\n 'ai_assistant.agents.model_override.cleared',\n 'Model override cleared; the agent is using the normal resolution chain.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, runClearModelOverrideMutation, t])\n\n const toggleAllowedProvider = React.useCallback(\n (providerId: string, next: boolean) => {\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n setAllowedProviders((current) => {\n if (next) {\n return current === null ? [providerId] : Array.from(new Set([...current, providerId]))\n }\n const baseline = current === null\n ? configuredProviders.map((provider) => provider.id)\n : current\n return baseline.filter((id) => id !== providerId)\n })\n },\n [configuredProviders],\n )\n\n const toggleAllowedModel = React.useCallback(\n (providerId: string, modelId: string, next: boolean) => {\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n const provider = configuredProviders.find((entry) => entry.id === providerId)\n const allModelIds = provider?.defaultModels.map((model) => model.id) ?? []\n setAllowedModelsByProvider((current) => {\n const existing = current[providerId]\n const baseline = existing === undefined ? allModelIds : existing\n const nextModels = next\n ? Array.from(new Set([...baseline, modelId]))\n : baseline.filter((id) => id !== modelId)\n return { ...current, [providerId]: nextModels }\n })\n },\n [configuredProviders],\n )\n\n const resetAllowlistDraft = React.useCallback(() => {\n setAllowedProviders(null)\n setAllowedModelsByProvider({})\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n }, [])\n\n const saveAllowlist = React.useCallback(async () => {\n if (isSavingAllowlist) return\n setIsSavingAllowlist(true)\n setState({ kind: 'idle' })\n try {\n await runSaveModelAllowlistMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n agentId: agent.id,\n allowedOverrideProviders: allowedProviders,\n allowedOverrideModelsByProvider: allowedModelsByProvider,\n }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to save chat override allowlist (${status}).`)\n }\n },\n context: {},\n })\n setAllowlistDirty(false)\n const successMessage = t(\n 'ai_assistant.agents.model_override.allowlistSaved',\n 'Chat override choices saved.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSavingAllowlist(false)\n }\n }, [agent.id, allowedModelsByProvider, allowedProviders, isSavingAllowlist, queryClient, runSaveModelAllowlistMutation, t])\n\n const busy = isSaving || isClearing || isSavingAllowlist\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-model-override={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.model_override.title', 'Provider and model')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.subtitle',\n 'Override the default provider and model for this tenant and agent.',\n )}\n </p>\n </div>\n </div>\n {agentResolution ? (\n <StatusBadge\n variant=\"info\"\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-model-override-effective\n >\n {agentResolution.providerId} / {agentResolution.modelId}\n </StatusBadge>\n ) : null}\n </header>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.model_override.codeDefault', 'Code-declared default')}\n </span>\n <p className=\"mt-1 break-all font-mono text-xs\">\n {agent.defaultProvider ?? t('ai_assistant.agents.model_override.anyProvider', 'first configured')}\n {' / '}\n {agent.defaultModel ?? t('ai_assistant.agents.model_override.providerDefault', 'provider default')}\n </p>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.model_override.tenantOverride', 'Tenant override')}\n </span>\n <p className=\"mt-1 break-all font-mono text-xs text-muted-foreground\">\n {agentResolution?.override\n ? `${agentResolution.override.providerId ?? '\u2014'} / ${agentResolution.override.modelId ?? '\u2014'}`\n : t('ai_assistant.agents.model_override.noOverride', 'No per-agent override')}\n </p>\n </div>\n </div>\n\n {settingsQuery.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.model_override.loading',\n 'Loading provider catalog...',\n )}\n />\n ) : settingsQuery.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-model-override-load-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.model_override.loadErrorTitle',\n 'Failed to load provider catalog',\n )}\n </AlertTitle>\n <AlertDescription>\n {settingsQuery.error instanceof Error\n ? settingsQuery.error.message\n : String(settingsQuery.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Label htmlFor={`ai-agent-model-provider-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.model_override.provider', 'Provider')}\n </Label>\n <Select\n value={selectedProviderId}\n onValueChange={(value) => {\n setSelectedProviderId(value)\n setSelectedModelId('')\n setState({ kind: 'idle' })\n }}\n disabled={busy || configuredProviders.length === 0}\n >\n <SelectTrigger\n id={`ai-agent-model-provider-${agent.id}`}\n className=\"w-full min-w-0\"\n data-ai-agent-model-provider-select\n >\n <SelectValue\n placeholder={t(\n 'ai_assistant.agents.model_override.selectProvider',\n 'Select provider',\n )}\n />\n </SelectTrigger>\n <SelectContent>\n {configuredProviders.map((provider) => (\n <SelectItem key={provider.id} value={provider.id}>\n {provider.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Label htmlFor={`ai-agent-model-model-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.model_override.model', 'Model')}\n </Label>\n <Select\n value={selectedModelId}\n onValueChange={(value) => {\n setSelectedModelId(value)\n setState({ kind: 'idle' })\n }}\n disabled={busy || !selectedProvider}\n >\n <SelectTrigger\n id={`ai-agent-model-model-${agent.id}`}\n className=\"w-full min-w-0\"\n data-ai-agent-model-select\n >\n <SelectValue\n placeholder={t(\n 'ai_assistant.agents.model_override.selectModel',\n 'Select model',\n )}\n />\n </SelectTrigger>\n <SelectContent>\n {(selectedProvider?.defaultModels ?? []).map((model) => (\n <SelectItem key={model.id} value={model.id}>\n {model.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n {agent.allowRuntimeModelOverride ? (\n <div className=\"rounded-md border border-border bg-muted/20 p-3\" data-ai-agent-model-picker-allowlist>\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"text-sm font-semibold\">\n {t(\n 'ai_assistant.agents.model_override.allowlistTitle',\n 'Chat override choices',\n )}\n </h4>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.allowlistHelp',\n 'Limit which provider/model overrides users can pick in the chat footer for this agent.',\n )}\n </p>\n {agentResolution?.runtimeOverrideAllowlist.env ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n <code className=\"font-mono text-xs\">\n {agentResolution.runtimeOverrideAllowlist.envVarNames.providers}\n </code>\n {' '}\n {t(\n 'ai_assistant.agents.model_override.envAlsoNarrows',\n 'also narrows this list from env.',\n )}\n </p>\n ) : null}\n </div>\n <StatusBadge\n variant={agentResolution?.runtimeOverrideAllowlist.tenant ? 'info' : 'neutral'}\n dot\n >\n {agentResolution?.runtimeOverrideAllowlist.tenant\n ? t('ai_assistant.agents.model_override.allowlistCustom', 'custom')\n : t('ai_assistant.agents.model_override.allowlistInherited', 'inherited')}\n </StatusBadge>\n </div>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n {configuredProviders.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.allowlistEmpty',\n 'No configured providers are available for chat overrides.',\n )}\n </p>\n ) : (\n configuredProviders.map((provider) => {\n const providerEnabled = isProviderAllowedForPicker(provider.id)\n return (\n <div key={provider.id} className=\"rounded-md border border-border bg-background p-3\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={`ai-agent-picker-provider-${agent.id}-${provider.id}`}\n checked={providerEnabled}\n onCheckedChange={(value) =>\n toggleAllowedProvider(provider.id, value === true)\n }\n />\n <Label\n htmlFor={`ai-agent-picker-provider-${agent.id}-${provider.id}`}\n className=\"text-sm font-medium\"\n >\n {provider.name}\n </Label>\n </div>\n {providerEnabled ? (\n <div className=\"mt-2 grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-2\">\n {provider.defaultModels.map((model) => (\n <label\n key={model.id}\n className=\"flex min-w-0 items-center gap-2 text-xs\"\n >\n <Checkbox\n checked={isModelAllowedForPicker(provider.id, model.id)}\n onCheckedChange={(value) =>\n toggleAllowedModel(provider.id, model.id, value === true)\n }\n />\n <span className=\"truncate font-mono\">{model.id}</span>\n {model.id === provider.defaultModel ? (\n <Badge variant=\"outline\" className=\"text-overline\">\n {t('ai_assistant.agents.model_override.defaultBadge', 'default')}\n </Badge>\n ) : null}\n </label>\n ))}\n </div>\n ) : null}\n </div>\n )\n })\n )}\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={resetAllowlistDraft}\n disabled={busy}\n >\n {t('ai_assistant.agents.model_override.allowlistReset', 'Inherit')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void saveAllowlist()}\n disabled={busy || !allowlistDirty}\n data-ai-agent-model-allowlist-save\n >\n {isSavingAllowlist ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.allowlistSave', 'Save choices')}</span>\n </Button>\n </div>\n </div>\n ) : null}\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-model-override-state=\"success\">\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-model-override-state=\"error\">\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={busy || !agentResolution?.override}\n data-ai-agent-model-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={busy || !hasChange}\n data-ai-agent-model-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.save', 'Save override')}</span>\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\ntype LoopOverrideRow = {\n id: string\n agentId: string | null\n loopDisabled: boolean | null\n loopMaxSteps: number | null\n loopMaxToolCalls: number | null\n loopMaxWallClockMs: number | null\n loopMaxTokens: number | null\n loopStopWhenJson: unknown[] | null\n loopActiveToolsJson: string[] | null\n updatedAt: string\n}\n\ntype LoopOverrideResponse = {\n agentId: string\n override: LoopOverrideRow | null\n}\n\nasync function fetchLoopOverride(agentId: string): Promise<LoopOverrideResponse> {\n const { result, status } = await apiCallOrThrow<LoopOverrideResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/loop-override`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load loop override' },\n )\n if (!result) throw new Error(`Failed to load loop override (${status})`)\n return result\n}\n\nfunction LoopPolicySection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n\n const query = useQuery<LoopOverrideResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n queryFn: () => fetchLoopOverride(agent.id),\n retry: false,\n })\n\n const currentOverride = query.data?.override ?? null\n\n const [loopDisabled, setLoopDisabled] = React.useState<boolean>(false)\n const [maxSteps, setMaxSteps] = React.useState<string>('')\n const [maxToolCalls, setMaxToolCalls] = React.useState<string>('')\n const [maxWallClockMs, setMaxWallClockMs] = React.useState<string>('')\n const [maxTokens, setMaxTokens] = React.useState<string>('')\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n\n React.useEffect(() => {\n setLoopDisabled(currentOverride?.loopDisabled ?? false)\n setMaxSteps(currentOverride?.loopMaxSteps != null ? String(currentOverride.loopMaxSteps) : '')\n setMaxToolCalls(\n currentOverride?.loopMaxToolCalls != null ? String(currentOverride.loopMaxToolCalls) : '',\n )\n setMaxWallClockMs(\n currentOverride?.loopMaxWallClockMs != null\n ? String(currentOverride.loopMaxWallClockMs)\n : '',\n )\n setMaxTokens(\n currentOverride?.loopMaxTokens != null ? String(currentOverride.loopMaxTokens) : '',\n )\n setState({ kind: 'idle' })\n }, [\n agent.id,\n currentOverride?.loopDisabled,\n currentOverride?.loopMaxSteps,\n currentOverride?.loopMaxToolCalls,\n currentOverride?.loopMaxWallClockMs,\n currentOverride?.loopMaxTokens,\n ])\n\n const toNullableInt = (value: string): number | null => {\n const trimmed = value.trim()\n if (trimmed === '') return null\n const parsed = parseInt(trimmed, 10)\n return isNaN(parsed) ? null : parsed\n }\n\n const save = React.useCallback(async () => {\n if (isSaving) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n code?: string\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/loop-override`,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n loopDisabled: loopDisabled || null,\n loopMaxSteps: toNullableInt(maxSteps),\n loopMaxToolCalls: toNullableInt(maxToolCalls),\n loopMaxWallClockMs: toNullableInt(maxWallClockMs),\n loopMaxTokens: toNullableInt(maxTokens),\n }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n setState({\n kind: 'error',\n message: payload.error ?? `Failed to save loop policy (${status}).`,\n })\n return\n }\n setState({\n kind: 'success',\n message: t('ai_assistant.agents.loop_policy.savedMessage', 'Loop policy override saved.'),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, loopDisabled, maxSteps, maxToolCalls, maxWallClockMs, maxTokens, queryClient, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{ ok?: boolean; error?: string }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/loop-override`,\n { method: 'DELETE', credentials: 'include' },\n )\n const payload = result ?? {}\n if (!ok) {\n setState({\n kind: 'error',\n message: payload.error ?? `Failed to clear loop override (${status}).`,\n })\n return\n }\n setState({\n kind: 'success',\n message: t(\n 'ai_assistant.agents.loop_policy.clearedMessage',\n 'Loop policy override cleared; agent is using its declared defaults.',\n ),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, t])\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-loop-policy={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex items-center gap-2\">\n <ShieldOff className=\"size-4 text-muted-foreground\" aria-hidden />\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.loop_policy.title', 'Loop policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.loop_policy.subtitle',\n 'Set per-tenant budget limits or disable the agentic loop for this agent.',\n )}\n </p>\n </div>\n </div>\n {currentOverride?.loopDisabled ? (\n <Badge variant=\"destructive\" data-ai-agent-loop-disabled-badge>\n {t('ai_assistant.agents.loop_policy.disabledBadge', 'Loop disabled')}\n </Badge>\n ) : null}\n </header>\n\n <div className=\"mt-3 flex flex-col gap-4\">\n {query.isLoading ? (\n <SettingsLoading\n message={t('ai_assistant.agents.loop_policy.loading', 'Loading loop policy...')}\n />\n ) : query.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-loop-policy-load-error>\n <AlertTitle>\n {t('ai_assistant.agents.loop_policy.loadErrorTitle', 'Failed to load loop policy')}\n </AlertTitle>\n <AlertDescription>\n {query.error instanceof Error ? query.error.message : String(query.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <>\n <div className=\"flex items-center justify-between gap-3 rounded-md border border-border px-3 py-2\">\n <div>\n <span className=\"text-sm font-medium\">\n {t('ai_assistant.agents.loop_policy.killSwitchLabel', 'Kill switch')}\n </span>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.loop_policy.killSwitchDescription',\n 'When enabled, the agent runs as a single model call with no tool loop.',\n )}\n </p>\n </div>\n <Switch\n checked={loopDisabled}\n onCheckedChange={(next: boolean) => setLoopDisabled(next)}\n aria-label={t('ai_assistant.agents.loop_policy.killSwitchLabel', 'Kill switch')}\n data-ai-agent-loop-kill-switch\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-steps-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxStepsLabel', 'Max steps')}\n </Label>\n <Input\n id={`loop-max-steps-${agent.id}`}\n type=\"number\"\n min={1}\n max={1000}\n value={maxSteps}\n onChange={(event) => setMaxSteps(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-steps\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-tool-calls-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxToolCallsLabel', 'Max tool calls')}\n </Label>\n <Input\n id={`loop-max-tool-calls-${agent.id}`}\n type=\"number\"\n min={1}\n max={10000}\n value={maxToolCalls}\n onChange={(event) => setMaxToolCalls(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-tool-calls\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-wall-clock-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxWallClockMsLabel', 'Max wall-clock (ms)')}\n </Label>\n <Input\n id={`loop-max-wall-clock-${agent.id}`}\n type=\"number\"\n min={100}\n max={3600000}\n value={maxWallClockMs}\n onChange={(event) => setMaxWallClockMs(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-wall-clock-ms\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-tokens-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxTokensLabel', 'Max tokens')}\n </Label>\n <Input\n id={`loop-max-tokens-${agent.id}`}\n type=\"number\"\n min={1}\n max={10000000}\n value={maxTokens}\n onChange={(event) => setMaxTokens(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-tokens\n />\n </div>\n </div>\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-loop-policy-state=\"success\">\n <AlertTitle>\n {t('ai_assistant.agents.loop_policy.savedTitle', 'Loop policy updated')}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-loop-policy-state=\"error\">\n <AlertTitle>\n {t(\n 'ai_assistant.agents.loop_policy.errorTitle',\n 'Failed to update loop policy',\n )}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={isClearing || isSaving || !currentOverride}\n data-ai-agent-loop-policy-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.loop_policy.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={isSaving || isClearing}\n data-ai-agent-loop-policy-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.loop_policy.save', 'Save override')}</span>\n </Button>\n </div>\n </>\n )}\n </div>\n </section>\n )\n}\n\nfunction AgentDetailPanel({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n const [overrideFlags, setOverrideFlags] = React.useState<Record<PromptSectionId, boolean>>(() => ({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }))\n const [overrideDrafts, setOverrideDrafts] = React.useState<Record<PromptSectionId, string>>(() => ({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }))\n const [isSaving, setIsSaving] = React.useState(false)\n const [saveState, setSaveState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string; version: number }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSavePromptOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-prompt-override-save-${agent.id}`,\n })\n\n const overrideQuery = useQuery<OverrideResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n queryFn: () => fetchOverride(agent.id),\n retry: false,\n })\n\n // Reset override state whenever the selected agent changes.\n React.useEffect(() => {\n setOverrideFlags({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n })\n setOverrideDrafts({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n })\n setSaveState({ kind: 'idle' })\n }, [agent.id])\n\n // Hydrate drafts when the latest override lands.\n React.useEffect(() => {\n const latest = overrideQuery.data?.override\n if (!latest) return\n const nextFlags: Record<PromptSectionId, boolean> = {\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }\n const nextDrafts: Record<PromptSectionId, string> = {\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }\n for (const [rawKey, value] of Object.entries(latest.sections ?? {})) {\n if (typeof value !== 'string') continue\n const key = rawKey as PromptSectionId\n if (PROMPT_SECTION_IDS.includes(key)) {\n nextFlags[key] = true\n nextDrafts[key] = value\n }\n }\n setOverrideFlags(nextFlags)\n setOverrideDrafts(nextDrafts)\n }, [overrideQuery.data?.override])\n\n const activeOverrides = React.useMemo(() => {\n const payload: Record<string, string> = {}\n for (const section of PROMPT_SECTION_IDS) {\n if (overrideFlags[section]) {\n payload[section] = overrideDrafts[section]\n }\n }\n return payload\n }, [overrideDrafts, overrideFlags])\n\n const hasAnyOverride = Object.keys(activeOverrides).length > 0\n\n const handleSave = React.useCallback(async () => {\n if (isSaving) return\n setIsSaving(true)\n setSaveState({ kind: 'idle' })\n try {\n const payload = await runSavePromptOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n pending?: boolean\n version?: number\n updatedAt?: string\n message?: string\n error?: string\n code?: string\n reservedKeys?: string[]\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/prompt-override`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n // Send both keys so a pre-Step-5.3 server still accepts the payload.\n sections: activeOverrides,\n overrides: activeOverrides,\n }),\n },\n )\n const body = result ?? {}\n if (!ok) {\n const message =\n body.code === 'reserved_key'\n ? t(\n 'ai_assistant.agents.override.errors.reservedKey',\n 'Prompt overrides cannot modify policy fields (mutationPolicy, readOnly, allowedTools, acceptedMediaTypes). Remove those sections and retry.',\n )\n : (body.error ?? `Failed to save overrides (${status}).`)\n throw new Error(message)\n }\n return body\n },\n context: {},\n })\n if (payload.ok === true && typeof payload.version === 'number') {\n const successMessage = t(\n 'ai_assistant.agents.override.savedMessage',\n 'Prompt override saved.',\n )\n setSaveState({\n kind: 'success',\n version: payload.version,\n message: successMessage,\n })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n })\n return\n }\n // Legacy placeholder response: surfaces the Step-4.5 wording for BC.\n const legacyMessage =\n payload.message ??\n t(\n 'ai_assistant.agents.prompt.pendingMessage',\n 'Prompt overrides accepted.',\n )\n setSaveState({\n kind: 'success',\n version: 0,\n message: legacyMessage,\n })\n flash(legacyMessage, 'success')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setSaveState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [activeOverrides, agent.id, isSaving, queryClient, runSavePromptOverrideMutation, t])\n\n return (\n <div className=\"flex flex-col gap-4\" data-ai-agent-detail={agent.id}>\n <section className=\"rounded-lg border border-border bg-background p-4\">\n <h2 className=\"text-xl font-semibold\">{agent.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{agent.description}</p>\n <dl className=\"mt-4 grid grid-cols-[repeat(auto-fit,minmax(min(100%,9rem),1fr))] gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.module', 'Module')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-xs\">{agent.moduleId}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.id', 'Agent id')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-xs\">{agent.id}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.executionMode', 'Execution mode')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge variant={executionModeStatusMap[agent.executionMode]}>\n {agent.executionMode}\n </StatusBadge>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.mutationPolicy', 'Mutation policy')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge\n variant={mutationPolicyStatusMap[agent.mutationPolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n >\n {agent.mutationPolicy}\n </StatusBadge>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.readOnly', 'Read-only')}\n </dt>\n <dd className=\"mt-1 text-xs\">\n {agent.readOnly\n ? t('ai_assistant.agents.meta.readOnlyYes', 'Yes')\n : t('ai_assistant.agents.meta.readOnlyNo', 'No')}\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.maxSteps', 'Max steps')}\n </dt>\n <dd className=\"mt-1 font-mono text-xs\">\n {agent.maxSteps ?? t('ai_assistant.agents.meta.unlimited', 'Unlimited')}\n </dd>\n </div>\n </dl>\n </section>\n\n <AgentModelOverrideSection agent={agent} />\n\n <MutationPolicySection agent={agent} />\n\n <LoopPolicySection agent={agent} />\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-prompt-editor={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.prompt.title', 'Prompt sections')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.prompt.subtitle',\n 'Toggle any section to write an additive override. Saving stores a new tenant-scoped version; built-in section text is always preserved.',\n )}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void handleSave()}\n disabled={isSaving || !hasAnyOverride}\n data-ai-agent-prompt-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.prompt.save', 'Save overrides')}</span>\n </Button>\n </header>\n <div className=\"mt-3\">\n <Alert\n variant=\"info\"\n icon={<Wand2 aria-hidden=\"true\" />}\n data-ai-agent-prompt-notice\n >\n <AlertTitle>\n {t('ai_assistant.agents.override.noticeTitle', 'Prompt overrides are additive')}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.override.noticeBody',\n 'Overrides append to the built-in sections \u2014 they never remove or replace shipped text. Saved versions are tenant-scoped and auditable from the history panel below.',\n )}\n </AlertDescription>\n </Alert>\n </div>\n {saveState.kind === 'success' ? (\n <Alert variant=\"success\" className=\"mt-3\" data-ai-agent-prompt-state=\"success\">\n <AlertTitle>\n {saveState.version > 0\n ? t('ai_assistant.agents.override.savedTitle', 'Prompt override saved')\n : t('ai_assistant.agents.prompt.pendingTitle', 'Overrides accepted')}\n </AlertTitle>\n <AlertDescription>\n {saveState.version > 0\n ? `${saveState.message} ${t('ai_assistant.agents.override.versionLabel', 'Version')} ${saveState.version}.`\n : saveState.message}\n </AlertDescription>\n </Alert>\n ) : null}\n {saveState.kind === 'error' ? (\n <Alert variant=\"destructive\" className=\"mt-3\" data-ai-agent-prompt-state=\"error\">\n <AlertTitle>\n {t('ai_assistant.agents.override.errorTitle', 'Failed to save prompt override')}\n </AlertTitle>\n <AlertDescription>{saveState.message}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"mt-3 flex flex-col gap-3\">\n <div>\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.prompt.fullSystemPromptLabel', 'Full system prompt (default)')}\n </span>\n <pre className=\"mt-2 max-h-40 overflow-auto rounded border border-border bg-muted/30 p-2 text-xs font-mono whitespace-pre-wrap\">\n {agent.systemPrompt}\n </pre>\n </div>\n {PROMPT_SECTION_IDS.map((sectionId) => (\n <PromptSectionEditor\n key={sectionId}\n sectionId={sectionId}\n defaultText={\n sectionId === 'role'\n ? agent.systemPrompt\n : t(\n 'ai_assistant.agents.prompt.defaultSectionPlaceholder',\n 'No default copy declared for this section \u2014 the agent ships a single systemPrompt. Override to inject additional text once Step 5.3 lands.',\n )\n }\n overrideText={overrideDrafts[sectionId]}\n override={overrideFlags[sectionId]}\n onToggleOverride={(next) => {\n setOverrideFlags((prev) => ({ ...prev, [sectionId]: next }))\n if (next) {\n setOverrideDrafts((prev) => {\n if (prev[sectionId]) return prev\n const defaultText =\n sectionId === 'role'\n ? agent.systemPrompt\n : ''\n return { ...prev, [sectionId]: defaultText }\n })\n }\n }}\n onOverrideChange={(next) =>\n setOverrideDrafts((prev) => ({ ...prev, [sectionId]: next }))\n }\n onSaveShortcut={() => void handleSave()}\n />\n ))}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-tools-list={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.tools.title', 'Allowed tools')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.subtitle',\n 'Read-only surface in Phase 2. Editing the per-tool toggle and mutation policy lands in Step 5.4 / Phase 3.',\n )}\n </p>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {agent.tools.length}\n </Badge>\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {agent.tools.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.emptyBody',\n 'This agent declares no tools in its allowedTools whitelist.',\n )}\n </p>\n ) : (\n agent.tools.map((tool) => <ToolRow key={tool.name} tool={tool} />)\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-override-history={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <History className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.override.history.title', 'Prompt override history')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.override.history.subtitle',\n 'Newest first. Each save creates a new version scoped to the current tenant.',\n )}\n </p>\n </div>\n </div>\n {overrideQuery.data ? (\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {overrideQuery.data.versions.length}\n </Badge>\n ) : null}\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {overrideQuery.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.override.history.loading',\n 'Loading override history...',\n )}\n />\n ) : overrideQuery.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-override-history-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.override.history.errorTitle',\n 'Failed to load override history',\n )}\n </AlertTitle>\n <AlertDescription>\n {overrideQuery.error instanceof Error\n ? overrideQuery.error.message\n : String(overrideQuery.error)}\n </AlertDescription>\n </Alert>\n ) : (overrideQuery.data?.versions ?? []).length === 0 ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-override-history-empty\n >\n {t(\n 'ai_assistant.agents.override.history.empty',\n 'No prompt overrides have been saved for this agent yet.',\n )}\n </p>\n ) : (\n (overrideQuery.data?.versions ?? []).slice(0, 5).map((entry) => (\n <div\n key={entry.id}\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-override-history-row={entry.version}\n >\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-xs font-semibold\">\n {t('ai_assistant.agents.override.versionLabel', 'Version')} {entry.version}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {new Date(entry.updatedAt).toLocaleString()}\n </span>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {Object.keys(entry.sections ?? {}).length}{' '}\n {t('ai_assistant.agents.override.history.sectionsLabel', 'sections')}\n </Badge>\n </div>\n ))\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-attachments={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.attachments.title', 'Attachment policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.attachments.subtitle',\n 'Accepted media types the agent declares. Read-only in Phase 2.',\n )}\n </p>\n </div>\n </header>\n <div className=\"mt-3\">\n <AttachmentPolicyBadges mediaTypes={agent.acceptedMediaTypes} />\n </div>\n </section>\n </div>\n )\n}\n\nexport function AiAgentSettingsPageClient() {\n const t = useT()\n const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null)\n\n const { data, isLoading, isError, error, refetch, isFetching } = useQuery<AgentsResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'agents'],\n queryFn: fetchAgents,\n })\n\n const agents = React.useMemo<AgentSettings[]>(() => data?.agents ?? [], [data])\n\n React.useEffect(() => {\n if (!agents.length) {\n if (selectedAgentId !== null) setSelectedAgentId(null)\n return\n }\n if (!selectedAgentId || !agents.some((agent) => agent.id === selectedAgentId)) {\n setSelectedAgentId(agents[0].id)\n }\n }, [agents, selectedAgentId])\n\n const selectedAgent = React.useMemo<AgentSettings | null>(() => {\n if (!selectedAgentId) return null\n return agents.find((agent) => agent.id === selectedAgentId) ?? null\n }, [agents, selectedAgentId])\n\n if (isLoading) {\n return (\n <SettingsLoading\n message={t('ai_assistant.agents.loadingAgents', 'Loading AI agents...')}\n />\n )\n }\n\n if (isError) {\n return (\n <Alert variant=\"destructive\" data-ai-agent-settings-error>\n <AlertTitle>\n {t('ai_assistant.agents.loadErrorTitle', 'Failed to load AI agents')}\n </AlertTitle>\n <AlertDescription>\n <span>{error instanceof Error ? error.message : String(error)}</span>\n <div className=\"mt-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n void refetch()\n }}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n <span>{t('ai_assistant.agents.retry', 'Retry')}</span>\n </Button>\n </div>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!agents.length) {\n return <EmptyAgents />\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex min-w-0 flex-col gap-4\" data-ai-agent-settings>\n <header className=\"flex min-w-0 flex-col gap-1\">\n <h1 className=\"text-2xl font-bold tracking-tight\">\n {t('ai_assistant.agents.title', 'AI Agents')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t(\n 'ai_assistant.agents.subtitle',\n 'Inspect every registered agent and manage tenant-scoped additive prompt-section overrides.',\n )}\n </p>\n </header>\n\n <section\n className=\"flex flex-col gap-3 rounded-lg border border-border bg-background p-3\"\n data-ai-agent-settings-picker-wrap\n >\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div className=\"flex min-w-[min(100%,16rem)] flex-1 flex-col gap-2\">\n <Label htmlFor=\"ai-agent-settings-picker\">\n {t('ai_assistant.agents.agentPickerLabel', 'Agent')}\n </Label>\n <Select\n value={selectedAgentId ?? ''}\n onValueChange={(value) => setSelectedAgentId(value)}\n >\n <SelectTrigger\n id=\"ai-agent-settings-picker\"\n data-ai-agent-settings-picker\n className=\"w-full min-w-0\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {agents.map((agent) => (\n <SelectItem key={agent.id} value={agent.id}>\n {agent.label} ({agent.id})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-2 sm:flex-shrink-0\">\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n void refetch()\n }}\n aria-label={t('ai_assistant.agents.refresh', 'Refresh agents')}\n disabled={isFetching}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n </IconButton>\n </div>\n </div>\n </section>\n\n {selectedAgent ? <AgentDetailPanel agent={selectedAgent} /> : null}\n </div>\n </TooltipProvider>\n )\n}\n\nexport default AiAgentSettingsPageClient\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n Bot,\n BookOpen,\n History,\n Image as ImageIcon,\n FileText,\n Loader2,\n Lock,\n Paperclip,\n RefreshCcw,\n Save,\n ShieldAlert,\n ShieldOff,\n Trash2,\n Wand2,\n Wrench,\n} from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Radio, RadioGroup } from '@open-mercato/ui/primitives/radio'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { StatusBadge, type StatusMap } from '@open-mercato/ui/primitives/status-badge'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@open-mercato/ui/primitives/tooltip'\nimport { EmptyState } from '@open-mercato/ui/backend/EmptyState'\nimport { apiCall, apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useAiShortcuts } from '@open-mercato/ui/ai'\n\n// The agent picker is deliberately duplicated between the playground and this\n// settings page. Duplicated markup is under the 50-line threshold, so extraction\n// stays deferred per the Step 4.6 brief.\n\ntype AgentTool = {\n name: string\n displayName: string\n isMutation: boolean\n registered: boolean\n}\n\ntype AgentSettings = {\n id: string\n moduleId: string\n label: string\n description: string\n systemPrompt: string\n executionMode: 'chat' | 'object'\n defaultProvider: string | null\n defaultModel: string | null\n defaultBaseUrl: string | null\n allowRuntimeModelOverride: boolean\n mutationPolicy: string\n readOnly: boolean\n maxSteps: number | null\n taskPlan?: { enabled?: boolean }\n allowedTools: string[]\n tools: AgentTool[]\n requiredFeatures: string[]\n acceptedMediaTypes: string[]\n hasOutputSchema: boolean\n}\n\ntype AgentsResponse = {\n agents: AgentSettings[]\n total: number\n}\n\ntype ProviderConfig = {\n id: string\n name: string\n defaultModel: string\n configured: boolean\n defaultModels: Array<{ id: string; name: string }>\n}\n\ntype AgentResolution = {\n agentId: string\n moduleId: string\n allowRuntimeModelOverride: boolean\n codeDefaultProviderId: string | null\n codeDefaultModelId: string | null\n override: {\n providerId: string | null\n modelId: string | null\n baseURL: string | null\n updatedAt: string\n } | null\n runtimeOverrideAllowlist: {\n env: TenantAllowlist | null\n tenant: TenantAllowlist | null\n effective: EffectiveAllowlist\n envVarNames: {\n providers: string\n modelsByProvider: Record<string, string>\n }\n }\n providerId: string\n modelId: string\n baseURL: string | null\n source: string\n}\n\ntype TenantAllowlist = {\n allowedProviders: string[] | null\n allowedModelsByProvider: Record<string, string[]>\n}\n\ntype EffectiveAllowlist = {\n providers: string[] | null\n modelsByProvider: Record<string, string[]>\n hasRestrictions: boolean\n tenantOverridesActive: boolean\n}\n\ntype RuntimeSettingsResponse = {\n availableProviders: ProviderConfig[]\n agents: AgentResolution[]\n}\n\nconst PROMPT_SECTION_IDS = [\n 'role',\n 'scope',\n 'data',\n 'tools',\n 'attachments',\n 'mutationPolicy',\n 'responseStyle',\n 'overrides',\n] as const\n\ntype PromptSectionId = (typeof PROMPT_SECTION_IDS)[number]\n\nconst mutationPolicyStatusMap: StatusMap<string> = {\n 'read-only': 'neutral',\n 'confirm-required': 'warning',\n 'destructive-confirm-required': 'error',\n}\n\nconst executionModeStatusMap: StatusMap<'chat' | 'object'> = {\n chat: 'info',\n object: 'success',\n}\n\nconst mediaTypeIconMap: Record<string, React.ElementType> = {\n image: ImageIcon,\n pdf: FileText,\n file: Paperclip,\n}\n\nasync function fetchAgents(): Promise<AgentsResponse> {\n const { result, status } = await apiCallOrThrow<AgentsResponse>(\n '/api/ai_assistant/ai/agents',\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load agents' },\n )\n if (!result) throw new Error(`Failed to load agents (${status})`)\n return result\n}\n\nasync function fetchRuntimeSettings(): Promise<RuntimeSettingsResponse> {\n const { result, status } = await apiCallOrThrow<RuntimeSettingsResponse>(\n '/api/ai_assistant/settings',\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load runtime settings' },\n )\n if (!result) throw new Error(`Failed to load runtime settings (${status})`)\n return result\n}\n\ntype OverrideVersion = {\n id: string\n agentId: string\n version: number\n sections: Record<string, string>\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype OverrideResponse = {\n agentId: string\n override: OverrideVersion | null\n versions: OverrideVersion[]\n}\n\nasync function fetchOverride(agentId: string): Promise<OverrideResponse> {\n const { result, status } = await apiCallOrThrow<OverrideResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/prompt-override`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load prompt override' },\n )\n if (!result) throw new Error(`Failed to load prompt override (${status})`)\n return result\n}\n\ntype MutationPolicy = 'read-only' | 'confirm-required' | 'destructive-confirm-required'\n\nconst MUTATION_POLICY_OPTIONS: MutationPolicy[] = [\n 'read-only',\n 'destructive-confirm-required',\n 'confirm-required',\n]\n\n// Higher number = less restrictive. Mirrors\n// `lib/agent-policy.ts#POLICY_RESTRICTIVENESS` \u2014 UI must match the server's\n// escalation guard so disabled options line up with 400 responses.\nconst POLICY_RESTRICTIVENESS_UI: Record<MutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\ntype MutationPolicyOverrideRow = {\n id: string\n agentId: string\n mutationPolicy: MutationPolicy\n notes: string | null\n createdByUserId: string | null\n createdAt: string\n updatedAt: string\n}\n\ntype MutationPolicyResponse = {\n agentId: string\n codeDeclared: MutationPolicy\n override: MutationPolicyOverrideRow | null\n}\n\nasync function fetchMutationPolicy(agentId: string): Promise<MutationPolicyResponse> {\n const { result, status } = await apiCallOrThrow<MutationPolicyResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/mutation-policy`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load mutation policy' },\n )\n if (!result) throw new Error(`Failed to load mutation policy (${status})`)\n return result\n}\n\nfunction SettingsLoading({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border border-border bg-background p-4 text-sm text-muted-foreground\"\n role=\"status\"\n >\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n <span>{message}</span>\n </div>\n )\n}\n\nfunction EmptyAgents() {\n const t = useT()\n return (\n <EmptyState\n icon={<Bot className=\"size-6\" aria-hidden />}\n title={t(\n 'ai_assistant.agents.empty.title',\n 'No AI agents are registered for your role yet.',\n )}\n description={t(\n 'ai_assistant.agents.empty.description',\n 'Declare agents inside `packages/<module>/src/modules/<module>/ai-agents.ts`, run `yarn generate`, and ensure the caller holds the agent\\'s required features.',\n )}\n >\n <div className=\"mt-2 inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <BookOpen className=\"size-3\" aria-hidden />\n <span>\n {t(\n 'ai_assistant.agents.empty.docLabel',\n 'See packages/ai-assistant/AGENTS.md for the agent definition reference.',\n )}\n </span>\n </div>\n </EmptyState>\n )\n}\n\nfunction PromptSectionEditor({\n sectionId,\n defaultText,\n overrideText,\n override,\n onToggleOverride,\n onOverrideChange,\n onSaveShortcut,\n}: {\n sectionId: PromptSectionId\n defaultText: string\n overrideText: string\n override: boolean\n onToggleOverride: (next: boolean) => void\n onOverrideChange: (next: string) => void\n onSaveShortcut: () => void\n}) {\n const t = useT()\n const sectionLabel = t(\n `ai_assistant.agents.prompt.sections.${sectionId}`,\n sectionId.charAt(0).toUpperCase() + sectionId.slice(1),\n )\n const textareaId = `ai-agent-prompt-${sectionId}`\n\n const textareaRef = React.useRef<HTMLTextAreaElement | null>(null)\n const { handleKeyDown } = useAiShortcuts({\n onSubmit: onSaveShortcut,\n onCancel: () => {\n textareaRef.current?.blur()\n },\n })\n\n return (\n <div\n className=\"flex flex-col gap-2 rounded-md border border-border bg-muted/20 p-3\"\n data-ai-agent-prompt-section={sectionId}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {sectionLabel}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {override\n ? t(\n 'ai_assistant.agents.prompt.overrideModeLabel',\n 'Override mode \u2014 replaces the default when persistence lands.',\n )\n : t(\n 'ai_assistant.agents.prompt.defaultModeLabel',\n 'Default \u2014 shipped with the agent definition.',\n )}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Label htmlFor={`${textareaId}-toggle`} className=\"text-xs\">\n {t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n </Label>\n <Switch\n id={`${textareaId}-toggle`}\n checked={override}\n onCheckedChange={(next: boolean) => onToggleOverride(next)}\n aria-label={t('ai_assistant.agents.prompt.toggleOverride', 'Override')}\n data-ai-agent-prompt-toggle={sectionId}\n />\n </div>\n </div>\n {override ? (\n <Textarea\n id={textareaId}\n ref={textareaRef}\n rows={4}\n value={overrideText}\n onChange={(event) => onOverrideChange(event.target.value)}\n onKeyDown={handleKeyDown}\n className=\"resize-y font-mono text-xs\"\n placeholder={t(\n 'ai_assistant.agents.prompt.overridePlaceholder',\n 'Write the replacement text for this section...',\n )}\n aria-label={`${sectionLabel} override`}\n data-ai-agent-prompt-override={sectionId}\n />\n ) : (\n <pre\n className=\"max-h-40 overflow-auto rounded border border-border bg-background p-2 text-xs font-mono whitespace-pre-wrap\"\n data-ai-agent-prompt-default={sectionId}\n >\n {defaultText}\n </pre>\n )}\n </div>\n )\n}\n\nfunction ToolRow({ tool }: { tool: AgentTool }) {\n const t = useT()\n return (\n <div\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-tool-row={tool.name}\n >\n <div className=\"flex items-start gap-2 min-w-0\">\n <Wrench className=\"mt-0.5 size-4 text-muted-foreground\" aria-hidden />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"truncate text-sm font-medium\">{tool.displayName}</span>\n <span className=\"truncate text-xs font-mono text-muted-foreground\">{tool.name}</span>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 flex-shrink-0\">\n {tool.isMutation ? (\n <StatusBadge variant=\"warning\" dot>\n {t('ai_assistant.agents.tools.mutationBadge', 'Mutation')}\n </StatusBadge>\n ) : (\n <StatusBadge variant=\"neutral\" dot>\n {t('ai_assistant.agents.tools.readBadge', 'Read')}\n </StatusBadge>\n )}\n {!tool.registered ? (\n <StatusBadge variant=\"error\" dot>\n {t('ai_assistant.agents.tools.missingBadge', 'Missing')}\n </StatusBadge>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-center gap-1\">\n <Label\n htmlFor={`ai-agent-tool-${tool.name}`}\n className=\"text-xs text-muted-foreground\"\n >\n {t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n </Label>\n <Switch\n id={`ai-agent-tool-${tool.name}`}\n checked\n disabled\n aria-label={t('ai_assistant.agents.tools.enabledLabel', 'Enabled')}\n data-ai-agent-tool-switch={tool.name}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {t(\n 'ai_assistant.agents.tools.tooltipDisabled',\n 'Editable after Phase 3 lands mutation policy controls.',\n )}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n )\n}\n\nfunction AttachmentPolicyBadges({ mediaTypes }: { mediaTypes: string[] }) {\n const t = useT()\n if (!mediaTypes.length) {\n return (\n <Badge variant=\"neutral\">\n {t('ai_assistant.agents.attachments.noneBadge', 'No attachments accepted')}\n </Badge>\n )\n }\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {mediaTypes.map((mediaType) => {\n const Icon = mediaTypeIconMap[mediaType] ?? Paperclip\n return (\n <Badge\n key={mediaType}\n variant=\"info\"\n className=\"gap-1.5\"\n data-ai-agent-attachment-badge={mediaType}\n >\n <Icon className=\"size-3\" aria-hidden />\n <span className=\"font-mono text-xs\">{mediaType}</span>\n </Badge>\n )\n })}\n </div>\n )\n}\n\nfunction MutationPolicySection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n\n const query = useQuery<MutationPolicyResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n queryFn: () => fetchMutationPolicy(agent.id),\n retry: false,\n })\n\n const codeDeclared = (query.data?.codeDeclared ?? (agent.mutationPolicy as MutationPolicy))\n const currentOverride = query.data?.override ?? null\n\n const [selected, setSelected] = React.useState<MutationPolicy | null>(null)\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSavePolicyMutation } = useGuardedMutation({\n contextId: `ai-agent-mutation-policy-save-${agent.id}`,\n })\n const { runMutation: runClearPolicyMutation } = useGuardedMutation({\n contextId: `ai-agent-mutation-policy-clear-${agent.id}`,\n })\n\n React.useEffect(() => {\n setSelected(currentOverride?.mutationPolicy ?? null)\n setState({ kind: 'idle' })\n }, [agent.id, currentOverride?.mutationPolicy])\n\n const codeRank = POLICY_RESTRICTIVENESS_UI[codeDeclared] ?? 0\n const effectivePolicy: MutationPolicy = (() => {\n if (!currentOverride) return codeDeclared\n const overrideRank = POLICY_RESTRICTIVENESS_UI[currentOverride.mutationPolicy]\n return overrideRank < codeRank ? currentOverride.mutationPolicy : codeDeclared\n })()\n\n const hasChange = selected !== null && selected !== (currentOverride?.mutationPolicy ?? null)\n\n const save = React.useCallback(async () => {\n if (!selected || isSaving) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n await runSavePolicyMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n code?: string\n codeDeclared?: MutationPolicy\n requested?: MutationPolicy\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ mutationPolicy: selected }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n const message =\n payload.code === 'escalation_not_allowed'\n ? (payload.error ??\n t(\n 'ai_assistant.agents.mutation_policy.errors.escalationNotAllowed',\n 'Cannot upgrade beyond the agent\\'s declared policy \u2014 this is a code-level change.',\n ))\n : (payload.error ??\n `Failed to save mutation policy (${status}).`)\n throw new Error(message)\n }\n },\n context: {},\n })\n const successMessage = t(\n 'ai_assistant.agents.mutation_policy.savedMessage',\n 'Mutation policy override saved.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, queryClient, runSavePolicyMutation, selected, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n await runClearPolicyMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/mutation-policy`,\n {\n method: 'DELETE',\n credentials: 'include',\n },\n )\n const payload = result ?? {}\n if (!ok) {\n throw new Error(payload.error ?? `Failed to clear override (${status}).`)\n }\n },\n context: {},\n })\n const successMessage = t(\n 'ai_assistant.agents.mutation_policy.clearedMessage',\n 'Mutation policy override cleared; agent is using its code-declared policy.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'mutation_policy', agent.id],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, t])\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-mutation-policy={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <ShieldAlert className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.mutation_policy.title', 'Mutation policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.subtitle',\n 'Downgrade this agent\\'s mutation capability per tenant. Upgrading beyond the code-declared policy is blocked by the server.',\n )}\n </p>\n </div>\n </div>\n <StatusBadge\n variant={mutationPolicyStatusMap[effectivePolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-effective\n >\n {effectivePolicy}\n </StatusBadge>\n </header>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.codeDeclared', 'Code-declared')}\n </span>\n <div className=\"mt-1 flex flex-wrap items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[codeDeclared] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-code-declared\n >\n {codeDeclared}\n </StatusBadge>\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n <span className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.mutation_policy.codeDeclaredHint',\n 'Compiled into the agent definition.',\n )}\n </span>\n </div>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.mutation_policy.tenantOverride', 'Tenant override')}\n </span>\n <div className=\"mt-1\">\n {currentOverride ? (\n <StatusBadge\n variant={mutationPolicyStatusMap[currentOverride.mutationPolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-mutation-policy-override-current\n >\n {currentOverride.mutationPolicy}\n </StatusBadge>\n ) : (\n <span\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-mutation-policy-override-empty\n >\n {t(\n 'ai_assistant.agents.mutation_policy.noOverride',\n 'No override \u2014 using code-declared policy.',\n )}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <Alert\n variant=\"info\"\n icon={<ShieldAlert aria-hidden=\"true\" />}\n data-ai-agent-mutation-policy-notice\n >\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeTitle',\n 'Downgrade only \u2014 escalation is a code change',\n )}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.mutation_policy.noticeBody',\n 'Overrides can only make the policy more restrictive. Options more permissive than the code-declared policy are disabled and rejected server-side.',\n )}\n </AlertDescription>\n </Alert>\n\n {query.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.mutation_policy.loading',\n 'Loading mutation policy...',\n )}\n />\n ) : query.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-load-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.loadErrorTitle',\n 'Failed to load mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>\n {query.error instanceof Error ? query.error.message : String(query.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <RadioGroup\n value={selected ?? ''}\n onValueChange={(value) => {\n setSelected(value as MutationPolicy)\n }}\n className=\"flex flex-col gap-2\"\n aria-label={t(\n 'ai_assistant.agents.mutation_policy.pickerLabel',\n 'Mutation policy override',\n )}\n data-ai-agent-mutation-policy-picker\n >\n {MUTATION_POLICY_OPTIONS.map((option) => {\n const optionRank = POLICY_RESTRICTIVENESS_UI[option]\n const wouldEscalate = optionRank > codeRank\n const isSelected = selected === option\n return (\n <Tooltip key={option}>\n <TooltipTrigger asChild>\n <div\n className={`flex items-start gap-3 rounded-md border px-3 py-2 text-sm cursor-pointer transition-colors ${\n wouldEscalate\n ? 'border-border bg-muted/30 cursor-not-allowed opacity-60'\n : isSelected\n ? 'border-accent-indigo bg-accent-indigo/5'\n : 'border-border bg-background hover:bg-muted/40'\n }`}\n onClick={() => {\n if (wouldEscalate) return\n setSelected(option)\n }}\n data-ai-agent-mutation-policy-option={option}\n data-ai-agent-mutation-policy-option-disabled={wouldEscalate ? 'true' : 'false'}\n >\n <Radio\n value={option}\n disabled={wouldEscalate}\n className=\"mt-0.5\"\n aria-disabled={wouldEscalate}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"flex items-center gap-2\">\n <StatusBadge\n variant={mutationPolicyStatusMap[option] ?? 'neutral'}\n dot\n >\n {option}\n </StatusBadge>\n {wouldEscalate ? (\n <Lock className=\"size-3 text-muted-foreground\" aria-hidden />\n ) : null}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {t(\n `ai_assistant.agents.mutation_policy.options.${option}`,\n option,\n )}\n </span>\n </div>\n </div>\n </TooltipTrigger>\n {wouldEscalate ? (\n <TooltipContent>\n {t(\n 'ai_assistant.agents.mutation_policy.escalationTooltip',\n \"Cannot be set above the agent's declared policy \u2014 this is a code-level change.\",\n )}\n </TooltipContent>\n ) : null}\n </Tooltip>\n )\n })}\n </RadioGroup>\n )}\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-mutation-policy-state=\"success\">\n <AlertTitle>\n {t('ai_assistant.agents.mutation_policy.savedTitle', 'Mutation policy updated')}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-mutation-policy-state=\"error\">\n <AlertTitle>\n {t(\n 'ai_assistant.agents.mutation_policy.errorTitle',\n 'Failed to update mutation policy',\n )}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={isClearing || isSaving || !currentOverride}\n data-ai-agent-mutation-policy-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={isSaving || isClearing || !hasChange || selected === null}\n data-ai-agent-mutation-policy-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.mutation_policy.save', 'Save override')}</span>\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\nfunction AgentModelOverrideSection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n const settingsQuery = useQuery<RuntimeSettingsResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n queryFn: fetchRuntimeSettings,\n retry: false,\n })\n\n const agentResolution = settingsQuery.data?.agents.find((entry) => entry.agentId === agent.id) ?? null\n const configuredProviders = React.useMemo(\n () => (settingsQuery.data?.availableProviders ?? []).filter((provider) => provider.configured),\n [settingsQuery.data?.availableProviders],\n )\n\n const [selectedProviderId, setSelectedProviderId] = React.useState('')\n const [selectedModelId, setSelectedModelId] = React.useState('')\n const [allowedProviders, setAllowedProviders] = React.useState<string[] | null>(null)\n const [allowedModelsByProvider, setAllowedModelsByProvider] = React.useState<Record<string, string[]>>({})\n const [allowlistDirty, setAllowlistDirty] = React.useState(false)\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [isSavingAllowlist, setIsSavingAllowlist] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSaveModelOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-save-${agent.id}`,\n })\n const { runMutation: runClearModelOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-clear-${agent.id}`,\n })\n const { runMutation: runSaveModelAllowlistMutation } = useGuardedMutation({\n contextId: `ai-agent-model-override-allowlist-${agent.id}`,\n })\n\n React.useEffect(() => {\n const override = agentResolution?.override\n setSelectedProviderId(override?.providerId ?? '')\n setSelectedModelId(override?.modelId ?? '')\n setAllowedProviders(agentResolution?.runtimeOverrideAllowlist.tenant?.allowedProviders ?? null)\n setAllowedModelsByProvider({\n ...(agentResolution?.runtimeOverrideAllowlist.tenant?.allowedModelsByProvider ?? {}),\n })\n setAllowlistDirty(false)\n setState({ kind: 'idle' })\n }, [\n agent.id,\n agentResolution?.override?.modelId,\n agentResolution?.override?.providerId,\n agentResolution?.runtimeOverrideAllowlist.tenant,\n ])\n\n const selectedProvider = configuredProviders.find((provider) => provider.id === selectedProviderId)\n const isProviderAllowedForPicker = React.useCallback(\n (providerId: string) => {\n if (allowedProviders === null) return true\n return allowedProviders.includes(providerId)\n },\n [allowedProviders],\n )\n const isModelAllowedForPicker = React.useCallback(\n (providerId: string, modelId: string) => {\n const list = allowedModelsByProvider[providerId]\n if (list === undefined) return true\n return list.includes(modelId)\n },\n [allowedModelsByProvider],\n )\n const hasChange =\n selectedProviderId.length > 0 &&\n selectedModelId.length > 0 &&\n (\n selectedProviderId !== (agentResolution?.override?.providerId ?? '') ||\n selectedModelId !== (agentResolution?.override?.modelId ?? '')\n )\n\n const save = React.useCallback(async () => {\n if (isSaving || !selectedProviderId || !selectedModelId) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n await runSaveModelOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string; code?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n agentId: agent.id,\n providerId: selectedProviderId,\n modelId: selectedModelId,\n }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to save model override (${status}).`)\n }\n },\n context: {},\n })\n const successMessage = t('ai_assistant.agents.model_override.saved', 'Model override saved.')\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, queryClient, runSaveModelOverrideMutation, selectedModelId, selectedProviderId, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n await runClearModelOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ agentId: agent.id }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to clear model override (${status}).`)\n }\n },\n context: {},\n })\n setSelectedProviderId('')\n setSelectedModelId('')\n const successMessage = t(\n 'ai_assistant.agents.model_override.cleared',\n 'Model override cleared; the agent is using the normal resolution chain.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, runClearModelOverrideMutation, t])\n\n const toggleAllowedProvider = React.useCallback(\n (providerId: string, next: boolean) => {\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n setAllowedProviders((current) => {\n if (next) {\n return current === null ? [providerId] : Array.from(new Set([...current, providerId]))\n }\n const baseline = current === null\n ? configuredProviders.map((provider) => provider.id)\n : current\n return baseline.filter((id) => id !== providerId)\n })\n },\n [configuredProviders],\n )\n\n const toggleAllowedModel = React.useCallback(\n (providerId: string, modelId: string, next: boolean) => {\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n const provider = configuredProviders.find((entry) => entry.id === providerId)\n const allModelIds = provider?.defaultModels.map((model) => model.id) ?? []\n setAllowedModelsByProvider((current) => {\n const existing = current[providerId]\n const baseline = existing === undefined ? allModelIds : existing\n const nextModels = next\n ? Array.from(new Set([...baseline, modelId]))\n : baseline.filter((id) => id !== modelId)\n return { ...current, [providerId]: nextModels }\n })\n },\n [configuredProviders],\n )\n\n const resetAllowlistDraft = React.useCallback(() => {\n setAllowedProviders(null)\n setAllowedModelsByProvider({})\n setAllowlistDirty(true)\n setState({ kind: 'idle' })\n }, [])\n\n const saveAllowlist = React.useCallback(async () => {\n if (isSavingAllowlist) return\n setIsSavingAllowlist(true)\n setState({ kind: 'idle' })\n try {\n await runSaveModelAllowlistMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{ error?: string }>(\n '/api/ai_assistant/settings',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n agentId: agent.id,\n allowedOverrideProviders: allowedProviders,\n allowedOverrideModelsByProvider: allowedModelsByProvider,\n }),\n },\n )\n if (!ok) {\n throw new Error(result?.error ?? `Failed to save chat override allowlist (${status}).`)\n }\n },\n context: {},\n })\n setAllowlistDirty(false)\n const successMessage = t(\n 'ai_assistant.agents.model_override.allowlistSaved',\n 'Chat override choices saved.',\n )\n setState({ kind: 'success', message: successMessage })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'runtime_settings'],\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSavingAllowlist(false)\n }\n }, [agent.id, allowedModelsByProvider, allowedProviders, isSavingAllowlist, queryClient, runSaveModelAllowlistMutation, t])\n\n const busy = isSaving || isClearing || isSavingAllowlist\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-model-override={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.model_override.title', 'Provider and model')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.subtitle',\n 'Override the default provider and model for this tenant and agent.',\n )}\n </p>\n </div>\n </div>\n {agentResolution ? (\n <StatusBadge\n variant=\"info\"\n dot\n className=\"max-w-full whitespace-normal break-all\"\n data-ai-agent-model-override-effective\n >\n {agentResolution.providerId} / {agentResolution.modelId}\n </StatusBadge>\n ) : null}\n </header>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.model_override.codeDefault', 'Code-declared default')}\n </span>\n <p className=\"mt-1 break-all font-mono text-xs\">\n {agent.defaultProvider ?? t('ai_assistant.agents.model_override.anyProvider', 'first configured')}\n {' / '}\n {agent.defaultModel ?? t('ai_assistant.agents.model_override.providerDefault', 'provider default')}\n </p>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.model_override.tenantOverride', 'Tenant override')}\n </span>\n <p className=\"mt-1 break-all font-mono text-xs text-muted-foreground\">\n {agentResolution?.override\n ? `${agentResolution.override.providerId ?? '\u2014'} / ${agentResolution.override.modelId ?? '\u2014'}`\n : t('ai_assistant.agents.model_override.noOverride', 'No per-agent override')}\n </p>\n </div>\n </div>\n\n {settingsQuery.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.model_override.loading',\n 'Loading provider catalog...',\n )}\n />\n ) : settingsQuery.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-model-override-load-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.model_override.loadErrorTitle',\n 'Failed to load provider catalog',\n )}\n </AlertTitle>\n <AlertDescription>\n {settingsQuery.error instanceof Error\n ? settingsQuery.error.message\n : String(settingsQuery.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <div className=\"grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-3\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Label htmlFor={`ai-agent-model-provider-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.model_override.provider', 'Provider')}\n </Label>\n <Select\n value={selectedProviderId}\n onValueChange={(value) => {\n setSelectedProviderId(value)\n setSelectedModelId('')\n setState({ kind: 'idle' })\n }}\n disabled={busy || configuredProviders.length === 0}\n >\n <SelectTrigger\n id={`ai-agent-model-provider-${agent.id}`}\n className=\"w-full min-w-0\"\n data-ai-agent-model-provider-select\n >\n <SelectValue\n placeholder={t(\n 'ai_assistant.agents.model_override.selectProvider',\n 'Select provider',\n )}\n />\n </SelectTrigger>\n <SelectContent>\n {configuredProviders.map((provider) => (\n <SelectItem key={provider.id} value={provider.id}>\n {provider.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Label htmlFor={`ai-agent-model-model-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.model_override.model', 'Model')}\n </Label>\n <Select\n value={selectedModelId}\n onValueChange={(value) => {\n setSelectedModelId(value)\n setState({ kind: 'idle' })\n }}\n disabled={busy || !selectedProvider}\n >\n <SelectTrigger\n id={`ai-agent-model-model-${agent.id}`}\n className=\"w-full min-w-0\"\n data-ai-agent-model-select\n >\n <SelectValue\n placeholder={t(\n 'ai_assistant.agents.model_override.selectModel',\n 'Select model',\n )}\n />\n </SelectTrigger>\n <SelectContent>\n {(selectedProvider?.defaultModels ?? []).map((model) => (\n <SelectItem key={model.id} value={model.id}>\n {model.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n {agent.allowRuntimeModelOverride ? (\n <div className=\"rounded-md border border-border bg-muted/20 p-3\" data-ai-agent-model-picker-allowlist>\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"text-sm font-semibold\">\n {t(\n 'ai_assistant.agents.model_override.allowlistTitle',\n 'Chat override choices',\n )}\n </h4>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.allowlistHelp',\n 'Limit which provider/model overrides users can pick in the chat footer for this agent.',\n )}\n </p>\n {agentResolution?.runtimeOverrideAllowlist.env ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n <code className=\"font-mono text-xs\">\n {agentResolution.runtimeOverrideAllowlist.envVarNames.providers}\n </code>\n {' '}\n {t(\n 'ai_assistant.agents.model_override.envAlsoNarrows',\n 'also narrows this list from env.',\n )}\n </p>\n ) : null}\n </div>\n <StatusBadge\n variant={agentResolution?.runtimeOverrideAllowlist.tenant ? 'info' : 'neutral'}\n dot\n >\n {agentResolution?.runtimeOverrideAllowlist.tenant\n ? t('ai_assistant.agents.model_override.allowlistCustom', 'custom')\n : t('ai_assistant.agents.model_override.allowlistInherited', 'inherited')}\n </StatusBadge>\n </div>\n\n <div className=\"mt-3 flex flex-col gap-3\">\n {configuredProviders.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.model_override.allowlistEmpty',\n 'No configured providers are available for chat overrides.',\n )}\n </p>\n ) : (\n configuredProviders.map((provider) => {\n const providerEnabled = isProviderAllowedForPicker(provider.id)\n return (\n <div key={provider.id} className=\"rounded-md border border-border bg-background p-3\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={`ai-agent-picker-provider-${agent.id}-${provider.id}`}\n checked={providerEnabled}\n onCheckedChange={(value) =>\n toggleAllowedProvider(provider.id, value === true)\n }\n />\n <Label\n htmlFor={`ai-agent-picker-provider-${agent.id}-${provider.id}`}\n className=\"text-sm font-medium\"\n >\n {provider.name}\n </Label>\n </div>\n {providerEnabled ? (\n <div className=\"mt-2 grid grid-cols-[repeat(auto-fit,minmax(min(100%,12rem),1fr))] gap-2\">\n {provider.defaultModels.map((model) => (\n <label\n key={model.id}\n className=\"flex min-w-0 items-center gap-2 text-xs\"\n >\n <Checkbox\n checked={isModelAllowedForPicker(provider.id, model.id)}\n onCheckedChange={(value) =>\n toggleAllowedModel(provider.id, model.id, value === true)\n }\n />\n <span className=\"truncate font-mono\">{model.id}</span>\n {model.id === provider.defaultModel ? (\n <Badge variant=\"outline\" className=\"text-overline\">\n {t('ai_assistant.agents.model_override.defaultBadge', 'default')}\n </Badge>\n ) : null}\n </label>\n ))}\n </div>\n ) : null}\n </div>\n )\n })\n )}\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={resetAllowlistDraft}\n disabled={busy}\n >\n {t('ai_assistant.agents.model_override.allowlistReset', 'Inherit')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void saveAllowlist()}\n disabled={busy || !allowlistDirty}\n data-ai-agent-model-allowlist-save\n >\n {isSavingAllowlist ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.allowlistSave', 'Save choices')}</span>\n </Button>\n </div>\n </div>\n ) : null}\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-model-override-state=\"success\">\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-model-override-state=\"error\">\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={busy || !agentResolution?.override}\n data-ai-agent-model-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={busy || !hasChange}\n data-ai-agent-model-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.model_override.save', 'Save override')}</span>\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\ntype LoopOverrideRow = {\n id: string\n agentId: string | null\n loopDisabled: boolean | null\n loopMaxSteps: number | null\n loopMaxToolCalls: number | null\n loopMaxWallClockMs: number | null\n loopMaxTokens: number | null\n loopStopWhenJson: unknown[] | null\n loopActiveToolsJson: string[] | null\n updatedAt: string\n}\n\ntype LoopOverrideResponse = {\n agentId: string\n override: LoopOverrideRow | null\n}\n\nasync function fetchLoopOverride(agentId: string): Promise<LoopOverrideResponse> {\n const { result, status } = await apiCallOrThrow<LoopOverrideResponse>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agentId)}/loop-override`,\n { method: 'GET', credentials: 'include' },\n { errorMessage: 'Failed to load loop override' },\n )\n if (!result) throw new Error(`Failed to load loop override (${status})`)\n return result\n}\n\nfunction LoopPolicySection({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n\n const query = useQuery<LoopOverrideResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n queryFn: () => fetchLoopOverride(agent.id),\n retry: false,\n })\n\n const currentOverride = query.data?.override ?? null\n\n const [loopDisabled, setLoopDisabled] = React.useState<boolean>(false)\n const [maxSteps, setMaxSteps] = React.useState<string>('')\n const [maxToolCalls, setMaxToolCalls] = React.useState<string>('')\n const [maxWallClockMs, setMaxWallClockMs] = React.useState<string>('')\n const [maxTokens, setMaxTokens] = React.useState<string>('')\n const [isSaving, setIsSaving] = React.useState(false)\n const [isClearing, setIsClearing] = React.useState(false)\n const [state, setState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n\n React.useEffect(() => {\n setLoopDisabled(currentOverride?.loopDisabled ?? false)\n setMaxSteps(currentOverride?.loopMaxSteps != null ? String(currentOverride.loopMaxSteps) : '')\n setMaxToolCalls(\n currentOverride?.loopMaxToolCalls != null ? String(currentOverride.loopMaxToolCalls) : '',\n )\n setMaxWallClockMs(\n currentOverride?.loopMaxWallClockMs != null\n ? String(currentOverride.loopMaxWallClockMs)\n : '',\n )\n setMaxTokens(\n currentOverride?.loopMaxTokens != null ? String(currentOverride.loopMaxTokens) : '',\n )\n setState({ kind: 'idle' })\n }, [\n agent.id,\n currentOverride?.loopDisabled,\n currentOverride?.loopMaxSteps,\n currentOverride?.loopMaxToolCalls,\n currentOverride?.loopMaxWallClockMs,\n currentOverride?.loopMaxTokens,\n ])\n\n const toNullableInt = (value: string): number | null => {\n const trimmed = value.trim()\n if (trimmed === '') return null\n const parsed = parseInt(trimmed, 10)\n return isNaN(parsed) ? null : parsed\n }\n\n const save = React.useCallback(async () => {\n if (isSaving) return\n setIsSaving(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n error?: string\n code?: string\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/loop-override`,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n loopDisabled: loopDisabled || null,\n loopMaxSteps: toNullableInt(maxSteps),\n loopMaxToolCalls: toNullableInt(maxToolCalls),\n loopMaxWallClockMs: toNullableInt(maxWallClockMs),\n loopMaxTokens: toNullableInt(maxTokens),\n }),\n },\n )\n const payload = result ?? {}\n if (!ok) {\n setState({\n kind: 'error',\n message: payload.error ?? `Failed to save loop policy (${status}).`,\n })\n return\n }\n setState({\n kind: 'success',\n message: t('ai_assistant.agents.loop_policy.savedMessage', 'Loop policy override saved.'),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsSaving(false)\n }\n }, [agent.id, isSaving, loopDisabled, maxSteps, maxToolCalls, maxWallClockMs, maxTokens, queryClient, t])\n\n const clear = React.useCallback(async () => {\n if (isClearing) return\n setIsClearing(true)\n setState({ kind: 'idle' })\n try {\n const { ok, status, result } = await apiCall<{ ok?: boolean; error?: string }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/loop-override`,\n { method: 'DELETE', credentials: 'include' },\n )\n const payload = result ?? {}\n if (!ok) {\n setState({\n kind: 'error',\n message: payload.error ?? `Failed to clear loop override (${status}).`,\n })\n return\n }\n setState({\n kind: 'success',\n message: t(\n 'ai_assistant.agents.loop_policy.clearedMessage',\n 'Loop policy override cleared; agent is using its declared defaults.',\n ),\n })\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'loop_override', agent.id],\n })\n } catch (err) {\n setState({\n kind: 'error',\n message: err instanceof Error ? err.message : String(err),\n })\n } finally {\n setIsClearing(false)\n }\n }, [agent.id, isClearing, queryClient, t])\n\n return (\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-loop-policy={agent.id}\n >\n <header className=\"flex items-center justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex items-center gap-2\">\n <ShieldOff className=\"size-4 text-muted-foreground\" aria-hidden />\n <div>\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.loop_policy.title', 'Loop policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.loop_policy.subtitle',\n 'Set per-tenant budget limits or disable the agentic loop for this agent.',\n )}\n </p>\n </div>\n </div>\n {currentOverride?.loopDisabled ? (\n <Badge variant=\"destructive\" data-ai-agent-loop-disabled-badge>\n {t('ai_assistant.agents.loop_policy.disabledBadge', 'Loop disabled')}\n </Badge>\n ) : null}\n </header>\n\n <div className=\"mt-3 flex flex-col gap-4\">\n {query.isLoading ? (\n <SettingsLoading\n message={t('ai_assistant.agents.loop_policy.loading', 'Loading loop policy...')}\n />\n ) : query.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-loop-policy-load-error>\n <AlertTitle>\n {t('ai_assistant.agents.loop_policy.loadErrorTitle', 'Failed to load loop policy')}\n </AlertTitle>\n <AlertDescription>\n {query.error instanceof Error ? query.error.message : String(query.error)}\n </AlertDescription>\n </Alert>\n ) : (\n <>\n <div className=\"flex items-center justify-between gap-3 rounded-md border border-border px-3 py-2\">\n <div>\n <span className=\"text-sm font-medium\">\n {t('ai_assistant.agents.loop_policy.killSwitchLabel', 'Kill switch')}\n </span>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.loop_policy.killSwitchDescription',\n 'When enabled, the agent runs as a single model call with no tool loop.',\n )}\n </p>\n </div>\n <Switch\n checked={loopDisabled}\n onCheckedChange={(next: boolean) => setLoopDisabled(next)}\n aria-label={t('ai_assistant.agents.loop_policy.killSwitchLabel', 'Kill switch')}\n data-ai-agent-loop-kill-switch\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-steps-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxStepsLabel', 'Max steps')}\n </Label>\n <Input\n id={`loop-max-steps-${agent.id}`}\n type=\"number\"\n min={1}\n max={1000}\n value={maxSteps}\n onChange={(event) => setMaxSteps(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-steps\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-tool-calls-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxToolCallsLabel', 'Max tool calls')}\n </Label>\n <Input\n id={`loop-max-tool-calls-${agent.id}`}\n type=\"number\"\n min={1}\n max={10000}\n value={maxToolCalls}\n onChange={(event) => setMaxToolCalls(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-tool-calls\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-wall-clock-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxWallClockMsLabel', 'Max wall-clock (ms)')}\n </Label>\n <Input\n id={`loop-max-wall-clock-${agent.id}`}\n type=\"number\"\n min={100}\n max={3600000}\n value={maxWallClockMs}\n onChange={(event) => setMaxWallClockMs(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-wall-clock-ms\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={`loop-max-tokens-${agent.id}`} className=\"text-xs\">\n {t('ai_assistant.agents.loop_policy.maxTokensLabel', 'Max tokens')}\n </Label>\n <Input\n id={`loop-max-tokens-${agent.id}`}\n type=\"number\"\n min={1}\n max={10000000}\n value={maxTokens}\n onChange={(event) => setMaxTokens(event.target.value)}\n placeholder={t('ai_assistant.agents.loop_policy.noOverridePlaceholder', 'No override')}\n className=\"h-8 text-sm\"\n data-ai-agent-loop-max-tokens\n />\n </div>\n </div>\n\n {state.kind === 'success' ? (\n <Alert variant=\"success\" data-ai-agent-loop-policy-state=\"success\">\n <AlertTitle>\n {t('ai_assistant.agents.loop_policy.savedTitle', 'Loop policy updated')}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n {state.kind === 'error' ? (\n <Alert variant=\"destructive\" data-ai-agent-loop-policy-state=\"error\">\n <AlertTitle>\n {t(\n 'ai_assistant.agents.loop_policy.errorTitle',\n 'Failed to update loop policy',\n )}\n </AlertTitle>\n <AlertDescription>{state.message}</AlertDescription>\n </Alert>\n ) : null}\n\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void clear()}\n disabled={isClearing || isSaving || !currentOverride}\n data-ai-agent-loop-policy-clear\n >\n {isClearing ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Trash2 className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.loop_policy.clear', 'Clear override')}</span>\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void save()}\n disabled={isSaving || isClearing}\n data-ai-agent-loop-policy-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.loop_policy.save', 'Save override')}</span>\n </Button>\n </div>\n </>\n )}\n </div>\n </section>\n )\n}\n\nfunction AgentDetailPanel({ agent }: { agent: AgentSettings }) {\n const t = useT()\n const queryClient = useQueryClient()\n const [overrideFlags, setOverrideFlags] = React.useState<Record<PromptSectionId, boolean>>(() => ({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }))\n const [overrideDrafts, setOverrideDrafts] = React.useState<Record<PromptSectionId, string>>(() => ({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }))\n const [isSaving, setIsSaving] = React.useState(false)\n const [saveState, setSaveState] = React.useState<\n | { kind: 'idle' }\n | { kind: 'success'; message: string; version: number }\n | { kind: 'error'; message: string }\n >({ kind: 'idle' })\n const { runMutation: runSavePromptOverrideMutation } = useGuardedMutation({\n contextId: `ai-agent-prompt-override-save-${agent.id}`,\n })\n\n const overrideQuery = useQuery<OverrideResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n queryFn: () => fetchOverride(agent.id),\n retry: false,\n })\n\n // Reset override state whenever the selected agent changes.\n React.useEffect(() => {\n setOverrideFlags({\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n })\n setOverrideDrafts({\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n })\n setSaveState({ kind: 'idle' })\n }, [agent.id])\n\n // Hydrate drafts when the latest override lands.\n React.useEffect(() => {\n const latest = overrideQuery.data?.override\n if (!latest) return\n const nextFlags: Record<PromptSectionId, boolean> = {\n role: false,\n scope: false,\n data: false,\n tools: false,\n attachments: false,\n mutationPolicy: false,\n responseStyle: false,\n overrides: false,\n }\n const nextDrafts: Record<PromptSectionId, string> = {\n role: '',\n scope: '',\n data: '',\n tools: '',\n attachments: '',\n mutationPolicy: '',\n responseStyle: '',\n overrides: '',\n }\n for (const [rawKey, value] of Object.entries(latest.sections ?? {})) {\n if (typeof value !== 'string') continue\n const key = rawKey as PromptSectionId\n if (PROMPT_SECTION_IDS.includes(key)) {\n nextFlags[key] = true\n nextDrafts[key] = value\n }\n }\n setOverrideFlags(nextFlags)\n setOverrideDrafts(nextDrafts)\n }, [overrideQuery.data?.override])\n\n const activeOverrides = React.useMemo(() => {\n const payload: Record<string, string> = {}\n for (const section of PROMPT_SECTION_IDS) {\n if (overrideFlags[section]) {\n payload[section] = overrideDrafts[section]\n }\n }\n return payload\n }, [overrideDrafts, overrideFlags])\n\n const hasAnyOverride = Object.keys(activeOverrides).length > 0\n\n const handleSave = React.useCallback(async () => {\n if (isSaving) return\n setIsSaving(true)\n setSaveState({ kind: 'idle' })\n try {\n const payload = await runSavePromptOverrideMutation({\n operation: async () => {\n const { ok, status, result } = await apiCall<{\n ok?: boolean\n pending?: boolean\n version?: number\n updatedAt?: string\n message?: string\n error?: string\n code?: string\n reservedKeys?: string[]\n }>(\n `/api/ai_assistant/ai/agents/${encodeURIComponent(agent.id)}/prompt-override`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({\n // Send both keys so a pre-Step-5.3 server still accepts the payload.\n sections: activeOverrides,\n overrides: activeOverrides,\n }),\n },\n )\n const body = result ?? {}\n if (!ok) {\n const message =\n body.code === 'reserved_key'\n ? t(\n 'ai_assistant.agents.override.errors.reservedKey',\n 'Prompt overrides cannot modify policy fields (mutationPolicy, readOnly, allowedTools, acceptedMediaTypes). Remove those sections and retry.',\n )\n : (body.error ?? `Failed to save overrides (${status}).`)\n throw new Error(message)\n }\n return body\n },\n context: {},\n })\n if (payload.ok === true && typeof payload.version === 'number') {\n const successMessage = t(\n 'ai_assistant.agents.override.savedMessage',\n 'Prompt override saved.',\n )\n setSaveState({\n kind: 'success',\n version: payload.version,\n message: successMessage,\n })\n flash(successMessage, 'success')\n await queryClient.invalidateQueries({\n queryKey: ['ai_assistant', 'agent_settings', 'override', agent.id],\n })\n return\n }\n // Legacy placeholder response: surfaces the Step-4.5 wording for BC.\n const legacyMessage =\n payload.message ??\n t(\n 'ai_assistant.agents.prompt.pendingMessage',\n 'Prompt overrides accepted.',\n )\n setSaveState({\n kind: 'success',\n version: 0,\n message: legacyMessage,\n })\n flash(legacyMessage, 'success')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setSaveState({ kind: 'error', message })\n flash(message, 'error')\n } finally {\n setIsSaving(false)\n }\n }, [activeOverrides, agent.id, isSaving, queryClient, runSavePromptOverrideMutation, t])\n\n return (\n <div className=\"flex flex-col gap-4\" data-ai-agent-detail={agent.id}>\n <section className=\"rounded-lg border border-border bg-background p-4\">\n <h2 className=\"text-xl font-semibold\">{agent.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{agent.description}</p>\n <dl className=\"mt-4 grid grid-cols-[repeat(auto-fit,minmax(min(100%,9rem),1fr))] gap-3 text-sm\">\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.module', 'Module')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-xs\">{agent.moduleId}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.id', 'Agent id')}\n </dt>\n <dd className=\"mt-1 break-all font-mono text-xs\">{agent.id}</dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.executionMode', 'Execution mode')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge variant={executionModeStatusMap[agent.executionMode]}>\n {agent.executionMode}\n </StatusBadge>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.mutationPolicy', 'Mutation policy')}\n </dt>\n <dd className=\"mt-1\">\n <StatusBadge\n variant={mutationPolicyStatusMap[agent.mutationPolicy] ?? 'neutral'}\n dot\n className=\"max-w-full whitespace-normal break-all\"\n >\n {agent.mutationPolicy}\n </StatusBadge>\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.readOnly', 'Read-only')}\n </dt>\n <dd className=\"mt-1 text-xs\">\n {agent.readOnly\n ? t('ai_assistant.agents.meta.readOnlyYes', 'Yes')\n : t('ai_assistant.agents.meta.readOnlyNo', 'No')}\n </dd>\n </div>\n <div className=\"min-w-0\">\n <dt className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.meta.maxSteps', 'Max steps')}\n </dt>\n <dd className=\"mt-1 font-mono text-xs\">\n {agent.maxSteps ?? t('ai_assistant.agents.meta.unlimited', 'Unlimited')}\n </dd>\n </div>\n </dl>\n </section>\n\n <AgentModelOverrideSection agent={agent} />\n\n <MutationPolicySection agent={agent} />\n\n <LoopPolicySection agent={agent} />\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-prompt-editor={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.prompt.title', 'Prompt sections')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.prompt.subtitle',\n 'Toggle any section to write an additive override. Saving stores a new tenant-scoped version; built-in section text is always preserved.',\n )}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void handleSave()}\n disabled={isSaving || !hasAnyOverride}\n data-ai-agent-prompt-save\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Save className=\"size-4\" aria-hidden />\n )}\n <span>{t('ai_assistant.agents.prompt.save', 'Save overrides')}</span>\n </Button>\n </header>\n <div className=\"mt-3\">\n <Alert\n variant=\"info\"\n icon={<Wand2 aria-hidden=\"true\" />}\n data-ai-agent-prompt-notice\n >\n <AlertTitle>\n {t('ai_assistant.agents.override.noticeTitle', 'Prompt overrides are additive')}\n </AlertTitle>\n <AlertDescription>\n {t(\n 'ai_assistant.agents.override.noticeBody',\n 'Overrides append to the built-in sections \u2014 they never remove or replace shipped text. Saved versions are tenant-scoped and auditable from the history panel below.',\n )}\n </AlertDescription>\n </Alert>\n </div>\n {saveState.kind === 'success' ? (\n <Alert variant=\"success\" className=\"mt-3\" data-ai-agent-prompt-state=\"success\">\n <AlertTitle>\n {saveState.version > 0\n ? t('ai_assistant.agents.override.savedTitle', 'Prompt override saved')\n : t('ai_assistant.agents.prompt.pendingTitle', 'Overrides accepted')}\n </AlertTitle>\n <AlertDescription>\n {saveState.version > 0\n ? `${saveState.message} ${t('ai_assistant.agents.override.versionLabel', 'Version')} ${saveState.version}.`\n : saveState.message}\n </AlertDescription>\n </Alert>\n ) : null}\n {saveState.kind === 'error' ? (\n <Alert variant=\"destructive\" className=\"mt-3\" data-ai-agent-prompt-state=\"error\">\n <AlertTitle>\n {t('ai_assistant.agents.override.errorTitle', 'Failed to save prompt override')}\n </AlertTitle>\n <AlertDescription>{saveState.message}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"mt-3 flex flex-col gap-3\">\n <div>\n <span className=\"text-overline font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('ai_assistant.agents.prompt.fullSystemPromptLabel', 'Full system prompt (default)')}\n </span>\n <pre className=\"mt-2 max-h-40 overflow-auto rounded border border-border bg-muted/30 p-2 text-xs font-mono whitespace-pre-wrap\">\n {agent.systemPrompt}\n </pre>\n </div>\n {PROMPT_SECTION_IDS.map((sectionId) => (\n <PromptSectionEditor\n key={sectionId}\n sectionId={sectionId}\n defaultText={\n sectionId === 'role'\n ? agent.systemPrompt\n : t(\n 'ai_assistant.agents.prompt.defaultSectionPlaceholder',\n 'No default copy declared for this section \u2014 the agent ships a single systemPrompt. Override to inject additional text once Step 5.3 lands.',\n )\n }\n overrideText={overrideDrafts[sectionId]}\n override={overrideFlags[sectionId]}\n onToggleOverride={(next) => {\n setOverrideFlags((prev) => ({ ...prev, [sectionId]: next }))\n if (next) {\n setOverrideDrafts((prev) => {\n if (prev[sectionId]) return prev\n const defaultText =\n sectionId === 'role'\n ? agent.systemPrompt\n : ''\n return { ...prev, [sectionId]: defaultText }\n })\n }\n }}\n onOverrideChange={(next) =>\n setOverrideDrafts((prev) => ({ ...prev, [sectionId]: next }))\n }\n onSaveShortcut={() => void handleSave()}\n />\n ))}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-tools-list={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.tools.title', 'Allowed tools')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.subtitle',\n 'Read-only surface in Phase 2. Editing the per-tool toggle and mutation policy lands in Step 5.4 / Phase 3.',\n )}\n </p>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {agent.tools.length}\n </Badge>\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {agent.tools.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.tools.emptyBody',\n 'This agent declares no tools in its allowedTools whitelist.',\n )}\n </p>\n ) : (\n agent.tools.map((tool) => <ToolRow key={tool.name} tool={tool} />)\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-override-history={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <History className=\"size-4 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.override.history.title', 'Prompt override history')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.override.history.subtitle',\n 'Newest first. Each save creates a new version scoped to the current tenant.',\n )}\n </p>\n </div>\n </div>\n {overrideQuery.data ? (\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {overrideQuery.data.versions.length}\n </Badge>\n ) : null}\n </header>\n <div className=\"mt-3 flex flex-col gap-2\">\n {overrideQuery.isLoading ? (\n <SettingsLoading\n message={t(\n 'ai_assistant.agents.override.history.loading',\n 'Loading override history...',\n )}\n />\n ) : overrideQuery.isError ? (\n <Alert variant=\"destructive\" data-ai-agent-override-history-error>\n <AlertTitle>\n {t(\n 'ai_assistant.agents.override.history.errorTitle',\n 'Failed to load override history',\n )}\n </AlertTitle>\n <AlertDescription>\n {overrideQuery.error instanceof Error\n ? overrideQuery.error.message\n : String(overrideQuery.error)}\n </AlertDescription>\n </Alert>\n ) : (overrideQuery.data?.versions ?? []).length === 0 ? (\n <p\n className=\"text-xs text-muted-foreground\"\n data-ai-agent-override-history-empty\n >\n {t(\n 'ai_assistant.agents.override.history.empty',\n 'No prompt overrides have been saved for this agent yet.',\n )}\n </p>\n ) : (\n (overrideQuery.data?.versions ?? []).slice(0, 5).map((entry) => (\n <div\n key={entry.id}\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\"\n data-ai-agent-override-history-row={entry.version}\n >\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-xs font-semibold\">\n {t('ai_assistant.agents.override.versionLabel', 'Version')} {entry.version}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {new Date(entry.updatedAt).toLocaleString()}\n </span>\n </div>\n <Badge variant=\"neutral\" className=\"font-mono text-xs\">\n {Object.keys(entry.sections ?? {}).length}{' '}\n {t('ai_assistant.agents.override.history.sectionsLabel', 'sections')}\n </Badge>\n </div>\n ))\n )}\n </div>\n </section>\n\n <section\n className=\"rounded-lg border border-border bg-background p-4\"\n data-ai-agent-attachments={agent.id}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border pb-3\">\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold\">\n {t('ai_assistant.agents.attachments.title', 'Attachment policy')}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ai_assistant.agents.attachments.subtitle',\n 'Accepted media types the agent declares. Read-only in Phase 2.',\n )}\n </p>\n </div>\n </header>\n <div className=\"mt-3\">\n <AttachmentPolicyBadges mediaTypes={agent.acceptedMediaTypes} />\n </div>\n </section>\n </div>\n )\n}\n\nexport function AiAgentSettingsPageClient() {\n const t = useT()\n const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>(null)\n\n const { data, isLoading, isError, error, refetch, isFetching } = useQuery<AgentsResponse>({\n queryKey: ['ai_assistant', 'agent_settings', 'agents'],\n queryFn: fetchAgents,\n })\n\n const agents = React.useMemo<AgentSettings[]>(() => data?.agents ?? [], [data])\n\n React.useEffect(() => {\n if (!agents.length) {\n if (selectedAgentId !== null) setSelectedAgentId(null)\n return\n }\n if (!selectedAgentId || !agents.some((agent) => agent.id === selectedAgentId)) {\n setSelectedAgentId(agents[0].id)\n }\n }, [agents, selectedAgentId])\n\n const selectedAgent = React.useMemo<AgentSettings | null>(() => {\n if (!selectedAgentId) return null\n return agents.find((agent) => agent.id === selectedAgentId) ?? null\n }, [agents, selectedAgentId])\n\n if (isLoading) {\n return (\n <SettingsLoading\n message={t('ai_assistant.agents.loadingAgents', 'Loading AI agents...')}\n />\n )\n }\n\n if (isError) {\n return (\n <Alert variant=\"destructive\" data-ai-agent-settings-error>\n <AlertTitle>\n {t('ai_assistant.agents.loadErrorTitle', 'Failed to load AI agents')}\n </AlertTitle>\n <AlertDescription>\n <span>{error instanceof Error ? error.message : String(error)}</span>\n <div className=\"mt-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n void refetch()\n }}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n <span>{t('ai_assistant.agents.retry', 'Retry')}</span>\n </Button>\n </div>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!agents.length) {\n return <EmptyAgents />\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex min-w-0 flex-col gap-4\" data-ai-agent-settings>\n <header className=\"flex min-w-0 flex-col gap-1\">\n <h1 className=\"text-2xl font-bold tracking-tight\">\n {t('ai_assistant.agents.title', 'AI Agents')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t(\n 'ai_assistant.agents.subtitle',\n 'Inspect every registered agent and manage tenant-scoped additive prompt-section overrides.',\n )}\n </p>\n </header>\n\n <section\n className=\"flex flex-col gap-3 rounded-lg border border-border bg-background p-3\"\n data-ai-agent-settings-picker-wrap\n >\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div className=\"flex min-w-[min(100%,16rem)] flex-1 flex-col gap-2\">\n <Label htmlFor=\"ai-agent-settings-picker\">\n {t('ai_assistant.agents.agentPickerLabel', 'Agent')}\n </Label>\n <Select\n value={selectedAgentId ?? ''}\n onValueChange={(value) => setSelectedAgentId(value)}\n >\n <SelectTrigger\n id=\"ai-agent-settings-picker\"\n data-ai-agent-settings-picker\n className=\"w-full min-w-0\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {agents.map((agent) => (\n <SelectItem key={agent.id} value={agent.id}>\n {agent.label} ({agent.id})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-2 sm:flex-shrink-0\">\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n void refetch()\n }}\n aria-label={t('ai_assistant.agents.refresh', 'Refresh agents')}\n disabled={isFetching}\n >\n <RefreshCcw className=\"size-4\" aria-hidden />\n </IconButton>\n </div>\n </div>\n </section>\n\n {selectedAgent ? <AgentDetailPanel agent={selectedAgent} /> : null}\n </div>\n </TooltipProvider>\n )\n}\n\nexport default AiAgentSettingsPageClient\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }