@@ -4,12 +4,14 @@ import { PanelProvider } from '@/views/panel/backend/panel-provider'
44import { OriginalFileState } from '@/commands/apply-chat-response-command/types/original-file-state'
55import { setup_workspace_listeners } from './workspace-listener'
66import { prepare_files_from_original_states } from './file-preparer'
7+ import { parse_response } from '../clipboard-parser/clipboard-parser'
78import {
89 create_temp_files_with_original_content ,
910 cleanup_temp_files
1011} from './temp-file-manager'
1112import { close_review_diff_editors , show_diff_with_actions } from './vscode-ui'
1213import { PreparedFile , ReviewableFile } from './types'
14+ import { ItemInPreview } from '@shared/types/file-in-preview'
1315
1416export { code_review_promise_resolve } from './vscode-ui'
1517export { toggle_file_review_state } from './workspace-listener'
@@ -18,6 +20,7 @@ export const preview = async (params: {
1820 original_states : OriginalFileState [ ]
1921 panel_provider : PanelProvider
2022 raw_instructions ?: string
23+ chat_response : string
2124} ) : Promise < {
2225 accepted_files : ReviewableFile [ ]
2326 rejected_states : OriginalFileState [ ]
@@ -49,10 +52,60 @@ export const preview = async (params: {
4952 workspace_map
5053 } )
5154
55+ const is_single_root_folder_workspace =
56+ ( vscode . workspace . workspaceFolders ?. length ?? 0 ) <= 1
57+
58+ const clipboard_items = parse_response ( {
59+ response : params . chat_response ,
60+ is_single_root_folder_workspace
61+ } )
62+
63+ const items_for_preview : ItemInPreview [ ] = [ ]
64+
65+ if ( clipboard_items . length > 0 ) {
66+ const prepared_files_map = new Map < string , PreparedFile > ( )
67+ for ( const pf of prepared_files ) {
68+ const key = `${ pf . reviewable_file . workspace_name || '' } :${
69+ pf . reviewable_file . file_path
70+ } `
71+ prepared_files_map . set ( key , pf )
72+ }
73+
74+ for ( const item of clipboard_items ) {
75+ if ( item . type == 'text' ) {
76+ items_for_preview . push ( { type : 'text' , content : item . content } )
77+ } else if (
78+ item . type == 'file' ||
79+ item . type == 'diff' ||
80+ item . type == 'completion'
81+ ) {
82+ const key = `${ item . workspace_name || '' } :${ item . file_path } `
83+ const prepared_file = prepared_files_map . get ( key )
84+ if ( prepared_file ) {
85+ items_for_preview . push ( prepared_file . reviewable_file )
86+ prepared_files_map . delete ( key )
87+ }
88+ if ( item . type == 'diff' && item . new_file_path ) {
89+ const new_key = `${ item . workspace_name || '' } :${ item . new_file_path } `
90+ const new_prepared_file = prepared_files_map . get ( new_key )
91+ if ( new_prepared_file ) {
92+ items_for_preview . push ( new_prepared_file . reviewable_file )
93+ prepared_files_map . delete ( new_key )
94+ }
95+ }
96+ }
97+ }
98+ items_for_preview . push (
99+ ...[ ...prepared_files_map . values ( ) ] . map ( ( pf ) => pf . reviewable_file )
100+ )
101+ } else {
102+ items_for_preview . push ( ...prepared_files . map ( ( p ) => p . reviewable_file ) )
103+ }
104+
52105 if ( params . panel_provider ) {
53106 params . panel_provider . send_message ( {
54107 command : 'RESPONSE_PREVIEW_STARTED' ,
55- items : [ ... prepared_files . map ( ( p ) => p . reviewable_file ) ] ,
108+ items : items_for_preview ,
56109 raw_instructions : params . raw_instructions
57110 } )
58111 }
0 commit comments