Change:
Apologies, this is a bit hard to replicate, so I'll do my best. Open a python jupyter notebook and do some work. Cut some code in the middle of a line in a cell. Go to a different cell and paste. The pasted code will be duplicated. I was able to replicate after restarting VS Code multiple times. Downgrading to 1.46 fixed the issue for me.
/duplicate of

Discussion:
} } <del> public $executeTask(value: TaskDTO): Promise<TaskExecutionDTO> { </del> <ins> // Passing in a TaskHandleDTO will cause the task to get re-resolved, which is important for tasks are coming from the core, // such as those gotten from a fetchTasks, since they can have missing configuration properties. public $executeTask(value: TaskHandleDTO | TaskDTO): Promise<TaskExecutionDTO> { </ins> return new Promise<TaskExecutionDTO>((resolve, reject) => { <del> const task = TaskDTO.to(value, this._workspaceContextServer, true)!; this._taskService.run(task).then(undefined, reason => { // eat the error, it has already been surfaced to the user and we don't care about it here }); const result: TaskExecutionDTO = { id: task._id, task: TaskDTO.from(task) }; resolve(result); </del> <ins> if (TaskHandleDTO.is(value)) { const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder)); if (workspaceFolder) { this._taskService.getTask(workspaceFolder, value.id, true).then((task: Task | undefined) => { if (!task) { reject(new Error('Task not found')); } else { this._taskService.run(task).then(undefined, reason => { // eat the error, it has already been surfaced to the user and we don't care about it here }); const result: TaskExecutionDTO = { id: value.id, task: TaskDTO.from(task) }; resolve(result); } }, (_error) => { reject(new Error('Task not found')); }); } else { reject(new Error('No workspace folder')); } } else { const task = TaskDTO.to(value, this._workspaceContextServer, true)!; this._taskService.run(task).then(undefined, reason => { // eat the error, it has already been surfaced to the user and we don't care about it here }); const result: TaskExecutionDTO = { id: task._id, task: TaskDTO.from(task) }; resolve(result); } </ins> }); } public $customExecutionComplete(id: string, result?: number): Promise<void> { return new Promise<void>((resolve, reject) => { this._taskService.getActiveTasks().then((tasks) => {

$unregisterTaskProvider(handle: number): Promise<void>; $fetchTasks(filter?: tasks.TaskFilterDTO): Promise<tasks.TaskDTO[]>; $getTaskExecution(value: tasks.TaskHandleDTO | tasks.TaskDTO): Promise<tasks.TaskExecutionDTO>; <del> $executeTask(task: tasks.TaskDTO): Promise<tasks.TaskExecutionDTO>; </del> <ins> $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise<tasks.TaskExecutionDTO>; </ins> $terminateTask(id: string): Promise<void>; $registerTaskSystem(scheme: string, info: tasks.TaskSystemInfoDTO): void; $customExecutionComplete(id: string, result?: number): Promise<void>;

// We have a preserved ID. So the task didn't change. if (tTask._id !== undefined) { // Always get the task execution first to prevent timing issues when retrieving it later <del> const executionDTO = await this._proxy.$getTaskExecution(TaskHandleDTO.from(tTask)); </del> <ins> const handleDto = TaskHandleDTO.from(tTask); const executionDTO = await this._proxy.$getTaskExecution(handleDto); </ins> if (executionDTO.task === undefined) { throw new Error('Task from execution DTO is undefined'); } const execution = await this.getTaskExecution(executionDTO, task); <del> this._proxy.$executeTask(executionDTO.task).catch(() => { /* The error here isn't actionable. */ }); </del> <ins> this._proxy.$executeTask(handleDto).catch(() => { /* The error here isn't actionable. */ }); </ins> return execution; } else { const dto = TaskDTO.from(task, extension);