Skip to content

Commit 7bfa18d

Browse files
committed
fix(ui): defer auto-reformat to queueMicrotask — editing inside onDidChangeModelContent crashes Monaco
1 parent e5fcf2c commit 7bfa18d

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

‎ui/src/core/page-components/agent-detail/modals/edit-control/json-editor-view.tsx‎

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,8 @@ export const JsonEditorView = ({
366366

367367
const text = editor.getValue();
368368

369-
// Immediate reformat for multi-line edits (e.g., code actions like "Wrap in AND").
370-
// Only triggers when a single change spans multiple lines — normal typing
371-
// is single-line and won't match, avoiding cursor-jump issues.
369+
// Deferred reformat for multi-line edits (e.g., code actions like "Wrap in AND").
370+
// Must use queueMicrotask — editing inside onDidChangeModelContent crashes Monaco.
372371
const isMultiLineEdit =
373372
!e.isUndoing &&
374373
!e.isRedoing &&
@@ -377,13 +376,15 @@ export const JsonEditorView = ({
377376
e.changes[0].range.endLineNumber >
378377
e.changes[0].range.startLineNumber);
379378
if (isMultiLineEdit) {
380-
const formatted = tryFormat(text);
381-
if (formatted && formatted !== text) {
382-
isProgrammaticEdit = true;
383-
replaceAllContent(editor, formatted, 'auto-reformat');
384-
handleJsonChange(formatted);
385-
return;
386-
}
379+
queueMicrotask(() => {
380+
const current = editor.getValue();
381+
const formatted = tryFormat(current);
382+
if (formatted && formatted !== current) {
383+
isProgrammaticEdit = true;
384+
replaceAllContent(editor, formatted, 'auto-reformat');
385+
handleJsonChange(formatted);
386+
}
387+
});
387388
}
388389

389390
// Debounced hints

0 commit comments

Comments
 (0)