import React, { useState } from 'react'; import { Badge, Button, MaturityBadge, Modal, useToast } from '../../shared/ui'; import { Sparkles, Bot, Send, CheckCircle2, AlertTriangle, FileText, ExternalLink, Terminal, } from 'lucide-react'; import { ulid } from '../../shared/lib/ulid'; interface AiAgent { id: string; name: string; role: string; description: string; tools: string[]; status: 'active' | 'busy' | 'idle'; tasksCompleted: number; } const AI_AGENTS: AiAgent[] = [ { id: 'orch', name: 'Главный Оркестратор', role: 'Orchestrator', description: 'Декомпозирует бизнес-цели и распределяет задачи между агентами-специалистами', tools: ['Task Delegator', 'Cross-module Context', 'Guardian Policy'], status: 'active', tasksCompleted: 342, }, { id: 'analyst', name: 'Бизнес-аналитик', role: 'BI & Financial Analyst', description: 'Анализирует чеки, food cost, маржинальность, динамику продаж и выявляет аномалии', tools: ['SQL Query', 'Revenue Forecast', 'ABC Matrix', 'Shift Audit'], status: 'active', tasksCompleted: 819, }, { id: 'marketer', name: 'Бизнес-маркетолог', role: 'Growth & Retention', description: 'Генерирует контент-планы, офферы для рассылок, анализирует сегменты клиентов в зоне риска', tools: ['Promo Engine', 'Telegram Bot Sender', 'Copywriter', 'Cohort Analysis'], status: 'active', tasksCompleted: 420, }, { id: 'warehouse_agent', name: 'Складской су-шеф', role: 'Supply Chain Agent', description: 'Мониторит критические остатки, сроки годности и формирует авто-заказы поставщикам', tools: ['Supplier Auto-Order', 'Waste Tracker', 'Inventory Audit'], status: 'active', tasksCompleted: 612, }, ]; const PRECONFIGURED_PROMPTS = [ { title: 'Food Cost и маржа за сегодня', agentId: 'analyst', prompt: 'Проанализируй Food Cost и маржинальность блюд текущей смены. Есть ли отклонения от нормы?', tools: ['ReadPosOrders()', 'CalculateFoodCostVariance()', 'AuditStopList()'], result: 'Анализ завершен: фактический Food Cost составил 29.4% (норма 30.0%). Позиция «Том Ям» показала маржу 68.5% из-за стабильных цен на тигровые креветки. Отклонений по граммовкам не зафиксировано.', artifactTitle: 'Отчет маржинальности смены #84', }, { title: 'Кампания возврата спящих гостей', agentId: 'marketer', prompt: 'Сформируй триггерную рассылку для гостей, не заказывавших более 30 дней. Предложи оффер с высокой конверсией.', tools: ['ScanInactiveCustomers()', 'DraftPromoOffer()', 'EstimateBudget()'], result: 'Сегмент «Спящие клиенты» насчитывает 248 контактов. Сформирован персонализированный оффер: «Сет Осенний со скидкой 20% + ролл Калифорния в подарок». Ожидаемый отклик: 18-22%.', artifactTitle: 'Проект кампании «Осенний возврат 2026»', }, { title: 'Контроль дефицита на складе', agentId: 'warehouse_agent', prompt: 'Проверь физические остатки ингредиентов с учетом броней на вечер. Какие позиции нужно заказать?', tools: ['AuditStockBalances()', 'CheckReservationBOM()', 'CreatePurchaseDraft()'], result: 'Критический остаток: «Сливочный сыр Cre действия» остался 4.2 кг при вечернем прогнозе 6.5 кг. Сформирован черновик закупки #PO-109 на 15 кг у поставщика «СибМолоко» со скидкой 5%.', artifactTitle: 'Черновик заявки поставщику #PO-109', }, { title: 'Аудит графика и переработок', agentId: 'orch', prompt: 'Проверь расписание смен сотрудников на текущую неделю. Есть ли нарушения нормативов ТК РФ?', tools: ['ReadEmployeeShifts()', 'CheckLaborRegulations()', 'SuggestScheduleOptimization()'], result: 'Выявлен 1 конфликт: сотрудник Артем Васильев назначен на смену 14 часов в пятницу (норма до 12 ч). Рекомендовано разделить смену с подменным официантом или сместить начало на 11:00.', artifactTitle: 'Акт проверки графиков ТК РФ', }, ]; interface ChatMessage { id: string; sender: 'user' | 'ai'; text: string; time: string; toolsUsed?: string[]; artifact?: { title: string; type: string }; } export const AiCenterModule: React.FC = () => { const { showToast } = useToast(); const [activeAgentId, setActiveAgentId] = useState('orch'); const [promptInput, setPromptInput] = useState(''); const [isProcessing, setIsProcessing] = useState(false); const [activeToolIndex, setActiveToolIndex] = useState(-1); const [currentToolsStep, setCurrentToolsStep] = useState([]); const [artifactModalData, setArtifactModalData] = useState<{ title: string; content: string } | null>(null); const [messages, setMessages] = useState([ { id: 'm-1', sender: 'ai', text: 'Здравствуйте! Я Главный Оркестратор Кроны. Моя команда специализированных агентов (Аналитик, Маркетолог, Складской су-шеф) готова помочь вам оптимизировать операционные процессы, найти точки роста выручки и предотвратить кассовые разрывы.', time: '12:00', }, ]); const activeAgent = AI_AGENTS.find((a) => a.id === activeAgentId) || AI_AGENTS[0]; const handleSelectPreconfigured = (p: typeof PRECONFIGURED_PROMPTS[0]) => { setActiveAgentId(p.agentId); runPromptFlow(p.prompt, p.tools, p.result, p.artifactTitle); }; const handleSendCustomPrompt = (e: React.FormEvent) => { e.preventDefault(); if (!promptInput.trim() || isProcessing) return; const userText = promptInput.trim(); setPromptInput(''); runPromptFlow( userText, ['ReadWorkspaceContext()', 'QueryDatabaseEngine()', 'SynthesizeBusinessStrategy()'], `Агент «${activeAgent.name}» проанализировал ваш запрос «${userText}». Все релевантные данные сверены с текущим состоянием касс, складов и CRM платформы. Предложен проект решения.`, `Аналитическая записка: ${userText.slice(0, 30)}...` ); }; const runPromptFlow = ( userText: string, tools: string[], resultText: string, artifactTitle: string ) => { const userMsg: ChatMessage = { id: `u-${ulid()}`, sender: 'user', text: userText, time: new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }), }; setMessages((prev) => [...prev, userMsg]); setIsProcessing(true); setCurrentToolsStep(tools); setActiveToolIndex(0); setTimeout(() => { setActiveToolIndex(1); }, 450); setTimeout(() => { setActiveToolIndex(2); }, 900); setTimeout(() => { setIsProcessing(false); setActiveToolIndex(-1); const aiMsg: ChatMessage = { id: `ai-${Date.now()}`, sender: 'ai', text: resultText, time: new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }), toolsUsed: tools, artifact: { title: artifactTitle, type: 'report' }, }; setMessages((prev) => [...prev, aiMsg]); showToast({ title: 'ИИ-задача выполнена', message: `Агент «${activeAgent.name}» завершил выполнение задачи`, type: 'success', }); }, 1350); }; return (
{/* ⚠️ DEMO ONLY & SIMULATED AI BANNER */}
Демонстрационный контур ИИ (Simulated AI Engine) ИИ-агенты симулируют автономное выполнение бизнес-сценариев, цепочки вызова инструментов (tool calls) и генерацию артефактов без реальных LLM API.
{/* Header */}

✦ Krona AI Center & Автономная бизнес-команда

Крона Модель v1.8 Flash

Специализированные агенты с прямым доступом к инструментам платформы, кассам и складским журналам

4 агента активны Задач за день: 2 195
{/* Pre-configured Prompts Row */}
Быстрые бизнес-запросы для руководства:
{PRECONFIGURED_PROMPTS.map((p, idx) => ( ))}
{/* Main AI Workspace Grid */}
{/* Left: AI Agents Roster */}
Команда ИИ-агентов
{AI_AGENTS.map((agent) => { const isSelected = agent.id === activeAgentId; return (
setActiveAgentId(agent.id)} className={`p-3 rounded-xl border transition-all cursor-pointer select-none space-y-2 ${ isSelected ? 'border-krona-gold bg-krona-gold/5 shadow-xs' : 'border-krona-border bg-krona-workspace hover:border-krona-border-strong' }`} >

{agent.name}

{agent.role}
Online

{agent.description}

Инструментов: {agent.tools.length} {agent.tasksCompleted} задач
); })}
{/* Right: Interactive Chat & Tool Calls Progress */}
{/* Active Agent Banner */}
Чат с агентом: {activeAgent.name} ({activeAgent.role})
Память контекста: Активна
{/* Messages Thread */}
{messages.map((msg) => (

{msg.text}

{/* Simulated tool calls badges */} {msg.toolsUsed && msg.toolsUsed.length > 0 && (
Выполненные шаги инструментов (Tool Calls):
{msg.toolsUsed.map((tool, idx) => ( {tool} ))}
)} {/* Clickable Artifact Output */} {msg.artifact && (
)}
{msg.time}
))} {/* Simulated Live Tool Call Progress */} {isProcessing && (
Агент «{activeAgent.name}» выполняет цепочку вызовов инструментов...
{currentToolsStep.map((tool, idx) => (
{idx < activeToolIndex ? ( ) : idx === activeToolIndex ? ( ) : ( )} {idx + 1}. {tool}
))}
)}
{/* Prompt input form */}
setPromptInput(e.target.value)} placeholder={`Спросите агента «${activeAgent.name}» (например: "Рассчитай Food Cost за вчера")...`} className="flex-1 bg-krona-surface border border-krona-border rounded-lg px-3 py-2 text-xs text-krona-primary placeholder:text-krona-secondary focus:outline-none focus:border-krona-green disabled:opacity-50" />
{/* Artifact Details Modal */} {artifactModalData && ( setArtifactModalData(null)} title={artifactModalData.title} subtitle="Сгенерированный артефакт ИИ-агента Кроны" maxWidth="md" footer={
} >
{artifactModalData.title} Verified AI Plan

{artifactModalData.content}

)}
); };