'use client'; import React from 'react'; import type { ChatMessage, ProcessArtifact, ProcessEvent, ProcessRun } from '@/types'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { MessageList } from '@/components/chat-workbench/MessageList'; import { ProcessLane } from '@/components/chat-workbench/ProcessLane'; import { ArtifactSidebar } from '@/components/chat-workbench/ArtifactSidebar'; export function ChatWorkbench({ messages, isThinking, messagesEndRef, messageViewportRef, processRuns, processEvents, processArtifacts, selectedRunId, onSelectRun, onCancelRun, }: { messages: ChatMessage[]; isThinking: boolean; messagesEndRef: React.RefObject; messageViewportRef: React.RefObject; processRuns: ProcessRun[]; processEvents: ProcessEvent[]; processArtifacts: ProcessArtifact[]; selectedRunId: string | null; onSelectRun: (runId: string) => void; onCancelRun: (runId: string) => void; }) { const selectedRun = processRuns.find((item) => item.run_id === selectedRunId) || processRuns[0] || null; const selectedRunEvents = selectedRun ? processEvents.filter((item) => item.run_id === selectedRun.run_id) : []; const selectedRunArtifacts = selectedRun ? processArtifacts.filter((item) => item.run_id === selectedRun.run_id) : []; const hasProcessLane = processRuns.length > 0; const hasResultsPanel = Boolean( selectedRun && ( selectedRun.summary || selectedRunEvents.length > 0 || selectedRunArtifacts.length > 0 ) ); const desktopColumns = hasProcessLane && hasResultsPanel ? 'lg:grid-cols-[minmax(0,1fr)_360px_360px]' : hasProcessLane ? 'lg:grid-cols-[minmax(0,1fr)_360px]' : hasResultsPanel ? 'lg:grid-cols-[minmax(0,1fr)_360px]' : 'lg:grid-cols-[minmax(0,1fr)]'; return ( <>
{hasProcessLane && (
)} {hasResultsPanel && (
)}
{!hasProcessLane && !hasResultsPanel ? ( ) : (
聊天 {hasProcessLane && 过程} {hasResultsPanel && 结果}
{hasProcessLane && ( )} {hasResultsPanel && ( )}
)}
); }