'use client' /** * AICommandPanel - 戰情室右側 AI 指揮面板 * ========================================== * Phase 1: OpenClaw + HITL 授權卡片整合 * * Features: * - OpenClaw AI 視覺化 (頂部) * - 待授權卡片列表 (底部) * - **Phase 15: SSE 即時更新** (取代輪詢) * - Nothing.tech 純白極簡風格 * * i18n: 100% next-intl */ import { useTranslations } from 'next-intl' import { cn } from '@/lib/utils' import { OpenClawPanel } from './openclaw-panel' import { ApprovalCard } from '@/components/approval/approval-card' import { useApprovalStore, usePendingApprovals, toFrontendApproval, } from '@/stores/approval.store' import { useApprovalSSE } from '@/hooks/useApprovalSSE' import { ShieldCheck, Bell } from 'lucide-react' // ============================================================================= // Props // ============================================================================= interface AICommandPanelProps { className?: string } // ============================================================================= // Component // ============================================================================= export function AICommandPanel({ className }: AICommandPanelProps) { const _t = useTranslations() const tApproval = useTranslations('approval') // Store const { fetchPending, signApproval, rejectApproval } = useApprovalStore() const pendingApprovals = usePendingApprovals() // Phase 15: SSE 即時更新 (取代輪詢) useApprovalSSE({ autoConnect: true }) // Handle approval const handleApprove = async (id: string) => { await signApproval(id, 'demo-user', 'War Room User', 'Approved via Command Center') await fetchPending() } // Handle rejection const handleReject = async (id: string) => { await rejectApproval(id, 'demo-user', 'War Room User', 'Rejected via Command Center') await fetchPending() } return (
{/* OpenClaw AI Section */} {/* Pending Approvals Section */} {pendingApprovals.length > 0 && (
{/* Header */}
{tApproval('pendingApprovals')}
{pendingApprovals.length}
{/* Approval Cards */}
{pendingApprovals.map((approval) => { const frontendApproval = toFrontendApproval(approval) return ( ) })}
)} {/* Empty State - No pending approvals */} {pendingApprovals.length === 0 && (

{tApproval('noApprovals')}

)}
) } export default AICommandPanel