diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts index a4a893da030..23e61dc1aba 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.ts @@ -28,6 +28,7 @@ import { editorSelectionBackground } from '../../../../../platform/theme/common/ import { IUndoRedoService } from '../../../../../platform/undoRedo/common/undoRedo.js'; import { SaveReason } from '../../../../common/editor.js'; import { IResolvedTextFileEditorModel, stringToSnapshot } from '../../../../services/textfile/common/textfiles.js'; +import { INotebookService } from '../../../notebook/common/notebookService.js'; import { IChatAgentResult } from '../../common/chatAgents.js'; import { ChatEditKind, IModifiedFileEntry, WorkingSetEntryState } from '../../common/chatEditingService.js'; import { IChatService } from '../../common/chatService.js'; @@ -129,6 +130,7 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie @IEditorWorkerService private readonly _editorWorkerService: IEditorWorkerService, @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, @IFileService private readonly _fileService: IFileService, + @INotebookService private readonly _notebookService: INotebookService, ) { super(); if (kind === ChatEditKind.Created) { @@ -392,7 +394,14 @@ export class ChatEditingModifiedFileEntry extends Disposable implements IModifie if (this._allEditsAreFromUs) { // save the file after discarding so that the dirty indicator goes away // and so that an intermediate saved state gets reverted - await this.docFileEditorModel.save({ reason: SaveReason.EXPLICIT }); + if (this._notebookService.hasSupportedNotebooks(this.modifiedURI)) { + // For notebooks ignore the save participant, + // For Jupyter notebooks, the JSON must always have an ending newline + // However save participants will remove that trailing new line. + await this.docFileEditorModel.save({ reason: SaveReason.EXPLICIT, skipSaveParticipants: true }); + } else { + await this.docFileEditorModel.save({ reason: SaveReason.EXPLICIT }); + } } await this.collapse(transaction); } diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.ts index f5e2269f11b..f4bc102df31 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.ts @@ -12,6 +12,7 @@ import { IResolvedTextEditorModel, ITextModelService } from '../../../../../edit import { IFileService } from '../../../../../platform/files/common/files.js'; import { IUndoRedoService } from '../../../../../platform/undoRedo/common/undoRedo.js'; import { IResolvedTextFileEditorModel } from '../../../../services/textfile/common/textfiles.js'; +import { INotebookService } from '../../../notebook/common/notebookService.js'; import { ChatEditKind } from '../../common/chatEditingService.js'; import { IChatService } from '../../common/chatService.js'; import { ChatEditingModifiedFileEntry, IModifiedEntryTelemetryInfo } from './chatEditingModifiedFileEntry.js'; @@ -31,8 +32,9 @@ export class ChatEditingModifiedNotebookEntry extends ChatEditingModifiedFileEnt @IEditorWorkerService _editorWorkerService: IEditorWorkerService, @IUndoRedoService _undoRedoService: IUndoRedoService, @IFileService _fileService: IFileService, + @INotebookService _notebookService: INotebookService, ) { - super(resourceRef, _multiDiffEntryDelegate, _telemetryInfo, kind, initialContent, modelService, textModelService, languageService, _chatService, _editorWorkerService, _undoRedoService, _fileService); + super(resourceRef, _multiDiffEntryDelegate, _telemetryInfo, kind, initialContent, modelService, textModelService, languageService, _chatService, _editorWorkerService, _undoRedoService, _fileService, _notebookService); this.resolveTextFileEditorModel = resourceRef.object as IResolvedTextFileEditorModel; }