@@ -17,32 +17,30 @@ import {
1717 ModelProvidersManager ,
1818 get_tool_config_id
1919} from '@/services/model-providers-manager'
20+ import {
21+ create_temporary_checkpoint ,
22+ delete_checkpoint ,
23+ promote_temporary_checkpoint
24+ } from '@/commands/checkpoints-command'
2025import { apply_git_patch } from './handlers/diff-handler'
2126import { PROVIDERS } from '@shared/constants/providers'
2227import { LAST_SELECTED_INTELLIGENT_UPDATE_CONFIG_ID_STATE_KEY } from '@/constants/state-keys'
2328import { Diff } from './utils/clipboard-parser/extract-diff-patches'
2429import { ViewProvider } from '@/views/panel/backend/panel-provider'
2530import { review , code_review_promise_resolve } from './utils/review'
2631import { dictionary } from '@shared/constants/dictionary'
32+ import { WorkspaceProvider } from '@/context/providers/workspace-provider'
2733
2834let ongoing_review_cleanup_promise : Promise < void > | null = null
2935
3036const check_if_all_files_new = async (
3137 files : ClipboardFile [ ]
3238) : Promise < boolean > => {
33- if (
34- ! vscode . workspace . workspaceFolders ||
35- vscode . workspace . workspaceFolders . length == 0
36- ) {
37- return false
38- }
39-
4039 const workspace_map = new Map < string , string > ( )
41- vscode . workspace . workspaceFolders . forEach ( ( folder ) => {
40+ vscode . workspace . workspaceFolders ! . forEach ( ( folder ) => {
4241 workspace_map . set ( folder . name , folder . uri . fsPath )
4342 } )
44-
45- const default_workspace = vscode . workspace . workspaceFolders [ 0 ] . uri . fsPath
43+ const default_workspace = vscode . workspace . workspaceFolders ! [ 0 ] . uri . fsPath
4644
4745 for ( const file of files ) {
4846 let workspace_root = default_workspace
@@ -333,7 +331,8 @@ const handle_code_review_and_cleanup = async (params: {
333331
334332export const apply_chat_response_command = (
335333 context : vscode . ExtensionContext ,
336- view_provider : ViewProvider
334+ view_provider : ViewProvider ,
335+ workspace_provider : WorkspaceProvider
337336) => {
338337 const update_undo_and_apply_button_state = (
339338 states : OriginalFileState [ ] | null ,
@@ -382,20 +381,11 @@ export const apply_chat_response_command = (
382381 position : { line : number ; character : number }
383382 }
384383 } ) => {
385- if ( args ?. raw_instructions ) {
386- Logger . info ( {
387- function_name : 'apply_chat_response_command' ,
388- message : 'Received raw instructions' ,
389- data : { raw_instructions : args . raw_instructions }
390- } )
391- }
392-
393- if ( args ?. edit_format ) {
394- Logger . info ( {
395- function_name : 'apply_chat_response_command' ,
396- message : 'Received edit format' ,
397- data : { edit_format : args . edit_format }
398- } )
384+ if ( ! vscode . workspace . workspaceFolders ?. length ) {
385+ vscode . window . showErrorMessage (
386+ dictionary . error_message . NO_WORKSPACE_FOLDER_OPEN
387+ )
388+ return
399389 }
400390
401391 if ( code_review_promise_resolve ) {
@@ -416,6 +406,10 @@ export const apply_chat_response_command = (
416406 }
417407 }
418408
409+ const temp_checkpoint = await create_temporary_checkpoint (
410+ workspace_provider
411+ )
412+
419413 type ReviewData = {
420414 original_states : OriginalFileState [ ]
421415 chat_response : string
@@ -452,21 +446,12 @@ export const apply_chat_response_command = (
452446 clipboard_content . code_completion
453447 ) {
454448 const completion = clipboard_content . code_completion
455- if (
456- ! vscode . workspace . workspaceFolders ||
457- vscode . workspace . workspaceFolders . length == 0
458- ) {
459- vscode . window . showErrorMessage (
460- dictionary . error_message . NO_WORKSPACE_FOLDER_OPEN
461- )
462- return null
463- }
464449 const workspace_map = new Map < string , string > ( )
465- vscode . workspace . workspaceFolders . forEach ( ( folder ) => {
450+ vscode . workspace . workspaceFolders ! . forEach ( ( folder ) => {
466451 workspace_map . set ( folder . name , folder . uri . fsPath )
467452 } )
468453 const default_workspace =
469- vscode . workspace . workspaceFolders [ 0 ] . uri . fsPath
454+ vscode . workspace . workspaceFolders ! [ 0 ] . uri . fsPath
470455 let workspace_root = default_workspace
471456 if (
472457 completion . workspace_name &&
@@ -536,13 +521,6 @@ export const apply_chat_response_command = (
536521 }
537522
538523 if ( clipboard_content . type == 'patches' && clipboard_content . patches ) {
539- if ( ! vscode . workspace . workspaceFolders ?. length ) {
540- vscode . window . showErrorMessage (
541- dictionary . error_message . NO_WORKSPACE_FOLDER_OPEN
542- )
543- return null
544- }
545-
546524 const rename_map = new Map < string , string > ( )
547525 clipboard_content . patches . forEach ( ( patch ) => {
548526 if ( patch . new_file_path && patch . file_path ) {
@@ -562,12 +540,12 @@ export const apply_chat_response_command = (
562540 }
563541
564542 const workspace_map = new Map < string , string > ( )
565- vscode . workspace . workspaceFolders . forEach ( ( folder ) => {
543+ vscode . workspace . workspaceFolders ! . forEach ( ( folder ) => {
566544 workspace_map . set ( folder . name , folder . uri . fsPath )
567545 } )
568546
569547 const default_workspace =
570- vscode . workspace . workspaceFolders [ 0 ] . uri . fsPath
548+ vscode . workspace . workspaceFolders ! [ 0 ] . uri . fsPath
571549
572550 let success_count = 0
573551 let failure_count = 0
@@ -900,15 +878,37 @@ export const apply_chat_response_command = (
900878 }
901879 } ) ( )
902880
903- if ( review_data ) {
904- await handle_code_review_and_cleanup ( {
905- original_states : review_data . original_states ,
906- chat_response : review_data . chat_response ,
907- view_provider,
908- update_undo_and_apply_button_state,
909- original_editor_state : args ?. original_editor_state ,
910- raw_instructions : args ?. raw_instructions
911- } )
881+ let checkpoint_promoted = false
882+
883+ try {
884+ if ( review_data ) {
885+ const changes_accepted = await handle_code_review_and_cleanup ( {
886+ original_states : review_data . original_states ,
887+ chat_response : review_data . chat_response ,
888+ view_provider,
889+ update_undo_and_apply_button_state,
890+ original_editor_state : args ?. original_editor_state ,
891+ raw_instructions : args ?. raw_instructions
892+ } )
893+
894+ if ( changes_accepted ) {
895+ await promote_temporary_checkpoint ( {
896+ context,
897+ temp_checkpoint,
898+ title : 'Before approve changes' ,
899+ description : args ?. raw_instructions
900+ } )
901+ checkpoint_promoted = true
902+ }
903+ }
904+ } finally {
905+ if ( ! checkpoint_promoted ) {
906+ await delete_checkpoint ( {
907+ context,
908+ checkpoint_to_delete : temp_checkpoint ,
909+ options : { skip_undo_prompt : true }
910+ } )
911+ }
912912 }
913913 }
914914 )
0 commit comments