import React from "react"; import { Button } from "@/src/components/ui/button"; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/src/components/ui/dialog"; import { type Prompt } from "@langfuse/shared"; import DiffViewer from "@/src/components/DiffViewer"; import { FileDiffIcon } from "lucide-react"; type PromptVersionDiffDialogProps = { isOpen: boolean; setIsOpen: (open: boolean) => void; leftPrompt: Prompt; rightPrompt: Prompt; }; // Create a word-based diff that preserves JSON structure const createSmartDiff = ( oldPrompt: Prompt, newPrompt: Prompt, ): { oldString: string; newString: string } => { if (oldPrompt.type === "text" || newPrompt.type === "text") { return { oldString: oldPrompt.type === "text" ? (oldPrompt.prompt as string) : JSON.stringify(oldPrompt.prompt, null, 2), newString: newPrompt.type === "text" ? (newPrompt.prompt as string) : JSON.stringify(newPrompt.prompt, null, 2), }; } const formatMessages = (messages: any[]) => JSON.stringify( messages.map((m) => Object.fromEntries( Object.entries(m).sort(([a], [b]) => a.localeCompare(b)), ), ), null, 2, ); return { oldString: formatMessages(oldPrompt.prompt as any[]), newString: formatMessages(newPrompt.prompt as any[]), }; }; export const PromptVersionDiffDialog: React.FC = ( props, ) => { const { leftPrompt, rightPrompt, isOpen, setIsOpen } = props; return ( { setIsOpen(open); }} > event.stopPropagation()} onPointerDownOutside={(e) => { setIsOpen(false); e.stopPropagation(); }} > Changes v{leftPrompt.version} → v{rightPrompt.version} Prompt {leftPrompt.name}

Content

Config

); };