"use client"; import { useState } from "react"; import { usePreviewCompression, type Lane, type PreviewBatch } from "@/hooks/usePreviewCompression"; import { WaterfallInspector } from "./WaterfallInspector"; import { DiffPane } from "./DiffPane"; import { EncoderComparisonTable } from "./EncoderComparisonTable"; import { PlaygroundInput, LANE_ENGINES } from "./PlaygroundInput"; export interface PlayViewProps { text: string; onText: (t: string) => void; laneEngines?: readonly string[]; } function laneStatus(l: Lane): string { const rejected = l.run?.steps?.find((s) => s.rejected); if (rejected) return `⚠ rejeitado: ${rejected.rejectReason ?? ""}`; return l.error ? "⚠ erro" : l.run ? `−${l.run.savingsPercent}%` : "—"; } function resolveActiveDiff(batch: PreviewBatch | null, selectedLane: string | null) { const run = batch?.lanes.find((l) => l.engine === selectedLane)?.run ?? null; return run?.diff ?? batch?.combined?.diff ?? null; } function LaneList({ lanes, onSelect }: { lanes: Lane[]; onSelect: (e: string) => void }) { return ( <> {lanes.map((l) => ( ))} ); } export function PlayView({ text, onText, laneEngines = LANE_ENGINES }: PlayViewProps) { const [active, setActive] = useState(["rtk", "caveman"]); const [fuzzyDedup, setFuzzyDedup] = useState(false); const [selectedLane, setSelectedLane] = useState(null); const [fidelityGate, setFidelityGate] = useState(false); const { batch, loading, run } = usePreviewCompression(); const messages = [{ role: "user", content: text }]; const toggle = (e: string) => setActive((a) => (a.includes(e) ? a.filter((x) => x !== e) : [...a, e])); const onRun = () => run({ messages, laneEngines: [...laneEngines], activeEngines: orderByStack(active, laneEngines), fidelityGate, fuzzyDedup, }); const activeDiff = resolveActiveDiff(batch, selectedLane); return (
setFidelityGate((v) => !v)} fuzzyDedup={fuzzyDedup} onToggleFuzzy={() => setFuzzyDedup((v) => !v)} />
{batch?.combined && (
Fluxo combinado — {active.join(" → ")}
)}
Cada camada sozinha
{(() => { const cmp = batch?.lanes.find((l) => l.engine === "headroom")?.run?.encoderComparison ?? batch?.combined?.encoderComparison ?? null; return cmp ? : null; })()} {activeDiff && (
Diff — {selectedLane ?? "combinado"}
)}
); } function orderByStack(active: string[], order: readonly string[]): string[] { return order.filter((e) => active.includes(e)); }