'use client' import * as React from 'react' import { useState } from 'react' import { Copy, RefreshCw, AlertTriangle, Check, Settings } from 'lucide-react' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@open-mercato/ui/primitives/dialog' import { Button } from '@open-mercato/ui/primitives/button' import { apiCall } from '@open-mercato/ui/backend/utils/apiCall' import { useT } from '@open-mercato/shared/lib/i18n/context' import { useDialogKeyHandler } from '@open-mercato/ui/hooks/useDialogKeyHandler' type Props = { open: boolean onOpenChange: (next: boolean) => void mcpUrl: string } type ApiKeyResponse = { id: string name: string keyPrefix: string secret?: string } export default function McpConfigDialog({ open, onOpenChange, mcpUrl }: Props) { const t = useT() const [apiKey, setApiKey] = useState(null) const [isGenerating, setIsGenerating] = useState(false) const [copiedConfig, setCopiedConfig] = useState(false) const [copiedKey, setCopiedKey] = useState(false) const [error, setError] = useState(null) const generateApiKey = async () => { setIsGenerating(true) setError(null) try { // Use the dedicated MCP-key endpoint so the key inherits the current // user's roles/ACL. A raw POST /api/api_keys/keys assigns no roles, which // produced a key with zero features (the MCP server then exposes only // `context_whoami`). const res = await apiCall('/api/ai_assistant/mcp-key', { method: 'POST', body: JSON.stringify({ name: `MCP Config - ${new Date().toLocaleDateString()}`, description: 'Generated from AI Assistant settings for MCP client', }), }) if (res.ok && res.result?.secret) { setApiKey(res.result.secret) } else { setError(t('ai_assistant.mcp.error.failed')) } } catch (err) { setError(err instanceof Error ? err.message : t('ai_assistant.mcp.error.failed')) } finally { setIsGenerating(false) } } const mcpConfig = { mcpServers: { 'open-mercato': { type: 'http', url: `${mcpUrl}/mcp`, headers: { 'x-api-key': apiKey || 'omk_xxxx.yyyy...', }, }, }, } const configJson = JSON.stringify(mcpConfig, null, 2) const copyConfig = async () => { await navigator.clipboard.writeText(configJson) setCopiedConfig(true) setTimeout(() => setCopiedConfig(false), 2000) } const copyKey = async () => { if (apiKey) { await navigator.clipboard.writeText(apiKey) setCopiedKey(true) setTimeout(() => setCopiedKey(false), 2000) } } const handleClose = () => { setApiKey(null) setError(null) setCopiedConfig(false) setCopiedKey(false) onOpenChange(false) } const handleKeyDown = useDialogKeyHandler({ onCancel: handleClose }) return ( {t('ai_assistant.mcp.title')} {t('ai_assistant.mcp.description')}
{/* Config JSON */}
              {configJson}
            
{/* API Key Section */}
{t('ai_assistant.mcp.apiKeyLabel')} {apiKey ? ( <> {apiKey.slice(0, 16)}... ) : ( {t('ai_assistant.mcp.notGenerated')} )}
{error && (
{error}
)} {apiKey && (

{t('ai_assistant.mcp.saveKeyWarning')}

)}
) }