fix: prevent duplicate history entries when edit_diagram tool is called (#64)

- Add handleExportWithoutHistory function for fetching current diagram state without saving to history
- Update onFetchChart to accept saveToHistory parameter (defaults to true)
- edit_diagram tool now fetches with saveToHistory=false since it only needs the current state
- Only the initial form submission saves to history as intended
This commit is contained in:
Dayuan Jiang
2025-12-03 21:58:48 +09:00
committed by GitHub
parent 110cccb09c
commit 39322c2793
2 changed files with 20 additions and 3 deletions

View File

@@ -27,18 +27,23 @@ export default function ChatPanel({
const {
loadDiagram: onDisplayChart,
handleExport: onExport,
handleExportWithoutHistory,
resolverRef,
chartXML,
clearDiagram,
} = useDiagram();
const onFetchChart = () => {
const onFetchChart = (saveToHistory = true) => {
return Promise.race([
new Promise<string>((resolve) => {
if (resolverRef && "current" in resolverRef) {
resolverRef.current = resolve;
}
if (saveToHistory) {
onExport();
} else {
handleExportWithoutHistory();
}
}),
new Promise<string>((_, reject) =>
setTimeout(
@@ -87,7 +92,8 @@ export default function ChatPanel({
let currentXml = "";
try {
currentXml = await onFetchChart();
// Fetch without saving to history - edit_diagram shouldn't create history entry
currentXml = await onFetchChart(false);
const { replaceXMLParts } = await import("@/lib/utils");
const editedXml = replaceXMLParts(currentXml, edits);

View File

@@ -10,6 +10,7 @@ interface DiagramContextType {
diagramHistory: { svg: string; xml: string }[];
loadDiagram: (chart: string) => void;
handleExport: () => void;
handleExportWithoutHistory: () => void;
resolverRef: React.Ref<((value: string) => void) | null>;
drawioRef: React.Ref<DrawIoEmbedRef | null>;
handleDiagramExport: (data: any) => void;
@@ -42,6 +43,15 @@ export function DiagramProvider({ children }: { children: React.ReactNode }) {
}
};
const handleExportWithoutHistory = () => {
if (drawioRef.current) {
// Export without saving to history (for edit_diagram fetching current state)
drawioRef.current.exportDiagram({
format: "xmlsvg",
});
}
};
const loadDiagram = (chart: string) => {
if (drawioRef.current) {
drawioRef.current.load({
@@ -124,6 +134,7 @@ export function DiagramProvider({ children }: { children: React.ReactNode }) {
diagramHistory,
loadDiagram,
handleExport,
handleExportWithoutHistory,
resolverRef,
drawioRef,
handleDiagramExport,