import { useState, useMemo } from 'react' import type { PromptEnvelope } from '../types/protocol' import { exportToOpenAIFormat } from '../utils/export' import { Code, Copy, Download, Check } from 'lucide-react' interface ProtocolPanelProps { envelope: PromptEnvelope } type Tab = 'openai' | 'raw' export default function ProtocolPanel({ envelope }: ProtocolPanelProps) { const [activeTab, setActiveTab] = useState('openai') const [copied, setCopied] = useState(false) const openaiFormat = useMemo(() => exportToOpenAIFormat(envelope), [envelope]) const rawProtocolJson = useMemo(() => JSON.stringify(envelope, null, 2), [envelope]) const displayedJson = activeTab === 'openai' ? JSON.stringify(openaiFormat, null, 2) : rawProtocolJson const downloadFilename = activeTab === 'openai' ? 'openai-export.json' : 'prompt-envelope.json' const handleCopy = async () => { await navigator.clipboard.writeText(displayedJson) setCopied(true) setTimeout(() => setCopied(false), 2000) } const handleDownload = () => { const blob = new Blob([displayedJson], { type: 'application/json' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = downloadFilename a.click() URL.revokeObjectURL(url) } /** 统计 envelope 中的 segment 数量 */ const segmentStats = useMemo(() => { const counts: Record = {} for (const msg of envelope.messages) { for (const seg of msg.segments) { counts[seg.kind] = (counts[seg.kind] || 0) + 1 } } return counts }, [envelope]) const totalSegments = Object.values(segmentStats).reduce((a, b) => a + b, 0) return (
{/* Header */}
Protocol View
{/* Tabs */}
{/* JSON Content */}
          {displayedJson}
        
{/* Footer stats */}
{activeTab === 'openai' ? ( <> model: {openaiFormat.model} {envelope.messages.length} 条协议消息 {openaiFormat.messages.length} OpenAI messages {openaiFormat.tools && {openaiFormat.tools.length} tools} ) : ( <> version: {envelope.version} {envelope.model && model: {envelope.model}} {envelope.messages.length} 条消息 {totalSegments} 个 segment {Object.keys(segmentStats).length} 种类型 )}
) }