Skip to content

Commit 9fad4a3

Browse files
committed
Add toggle for including selected files in prompts
- make the 'selected files' checkbox interactive - when checked - should not collect files for constructed messages across handlers ├── apps │ └── editor │ └── src │ ├── utils │ │ └── prompt-builder.ts │ └── views │ └── prompt │ ├── backend │ │ ├── message-handlers │ │ │ ├── handle-autofill.ts │ │ │ ├── handle-copy-prompt.ts │ │ │ ├── handle-make-api-call.ts │ │ │ ├── handle-preview-web-configuration.ts │ │ │ └── index.ts │ │ └── prompt-view-provider.ts │ ├── frontend │ │ ├── Main │ │ │ ├── Main.tsx │ │ │ └── MainView │ │ │ └── MainView.tsx │ │ ├── Prompt.tsx │ │ └── hooks │ │ └── use-prompt │ │ └── use-prompt.ts │ └── types │ └── messages.ts └── packages └── ui └── src └── components └── editor └── prompt └── TokenCounts └── TokenCounts.tsx
1 parent cb2642f commit 9fad4a3

11 files changed

Lines changed: 120 additions & 28 deletions

File tree

‎apps/editor/src/views/prompt/backend/message-handlers/handle-autofill.ts‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@ export const handle_autofill = async (params: {
5858

5959
const additional_paths: string[] = []
6060

61-
const collected = await FilesCollector.collect_files({
62-
workspace_provider: params.prompt_view_provider.workspace_provider,
63-
open_editors_provider: params.prompt_view_provider.open_editors_provider,
64-
additional_paths
65-
})
66-
const context_text = collected.other_files + collected.recent_files
61+
let context_text = ''
62+
if (params.prompt_view_provider.include_selected_files) {
63+
const collected = await FilesCollector.collect_files({
64+
workspace_provider: params.prompt_view_provider.workspace_provider,
65+
open_editors_provider: params.prompt_view_provider.open_editors_provider,
66+
additional_paths
67+
})
68+
context_text = collected.other_files + collected.recent_files
69+
}
6770

6871
const current_instructions = params.prompt_view_provider.current_instructions
6972

‎apps/editor/src/views/prompt/backend/message-handlers/handle-copy-prompt.ts‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ import { t } from '@/i18n'
1414
export const handle_copy_prompt = async (params: {
1515
prompt_view_provider: PromptViewProvider
1616
}): Promise<void> => {
17-
const collected = await FilesCollector.collect_files({
18-
workspace_provider: params.prompt_view_provider.workspace_provider,
19-
open_editors_provider: params.prompt_view_provider.open_editors_provider
20-
})
21-
const context_text = collected.other_files + collected.recent_files
17+
let context_text = ''
18+
if (params.prompt_view_provider.include_selected_files) {
19+
const collected = await FilesCollector.collect_files({
20+
workspace_provider: params.prompt_view_provider.workspace_provider,
21+
open_editors_provider: params.prompt_view_provider.open_editors_provider
22+
})
23+
context_text = collected.other_files + collected.recent_files
24+
}
2225

2326
const current_instructions = params.prompt_view_provider.current_instructions
2427

‎apps/editor/src/views/prompt/backend/message-handlers/handle-make-api-call.ts‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,21 @@ export const handle_make_api_call = async (
173173
workspace_provider: prompt_view_provider.workspace_provider
174174
})
175175

176-
const collected = await FilesCollector.collect_files({
177-
workspace_provider: prompt_view_provider.workspace_provider,
178-
open_editors_provider: prompt_view_provider.open_editors_provider
179-
})
180-
const collected_files = collected.other_files + collected.recent_files
176+
let collected_files = ''
177+
let other_files = ''
178+
let recent_files = ''
179+
180+
if (prompt_view_provider.include_selected_files) {
181+
const collected = await FilesCollector.collect_files({
182+
workspace_provider: prompt_view_provider.workspace_provider,
183+
open_editors_provider: prompt_view_provider.open_editors_provider
184+
})
185+
other_files = collected.other_files
186+
recent_files = collected.recent_files
187+
collected_files = other_files + recent_files
188+
}
181189

182-
if (!collected_files) {
190+
if (prompt_view_provider.include_selected_files && !collected_files) {
183191
prompt_view_provider.send_message({
184192
command: 'SHOW_AUTO_CLOSING_MODAL',
185193
title: t('views.prompt.handlers.make-api-call.context-cannot-be-empty'),
@@ -234,8 +242,8 @@ export const handle_make_api_call = async (
234242
default_system_instructions
235243

236244
const { part1, part2 } = PromptBuilder.build_prompt({
237-
other_files: collected.other_files,
238-
recent_files: collected.recent_files,
245+
other_files,
246+
recent_files,
239247
skill_definitions,
240248
system_instructions: formatted_system_instructions,
241249
user_instructions: processed_instructions,

‎apps/editor/src/views/prompt/backend/message-handlers/handle-preview-web-configuration.ts‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ export const handle_preview_web_configuration = async (
2020

2121
const current_instructions = prompt_view_provider.current_instructions
2222

23-
const collected = await FilesCollector.collect_files({
24-
workspace_provider: prompt_view_provider.workspace_provider,
25-
open_editors_provider: prompt_view_provider.open_editors_provider
26-
})
27-
const context_text = collected.other_files + collected.recent_files
23+
let context_text = ''
24+
if (prompt_view_provider.include_selected_files) {
25+
const collected = await FilesCollector.collect_files({
26+
workspace_provider: prompt_view_provider.workspace_provider,
27+
open_editors_provider: prompt_view_provider.open_editors_provider
28+
})
29+
context_text = collected.other_files + collected.recent_files
30+
}
2831

2932
const { instructions: processed_instructions, skill_definitions } =
3033
await replace_symbols({

‎apps/editor/src/views/prompt/backend/prompt-view-provider.ts‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ export class PromptViewProvider implements vscode.WebviewViewProvider {
140140
public api_edit_format: EditFormat
141141
public api_prompt_type: ApiPromptType
142142
public mode: Mode = MODE.WEB
143+
public include_selected_files: boolean = true
143144

144145
public get edit_format(): EditFormat {
145146
return this.mode == MODE.WEB ? this.web_edit_format : this.api_edit_format
@@ -343,6 +344,12 @@ export class PromptViewProvider implements vscode.WebviewViewProvider {
343344
'edit-files'
344345
)
345346

347+
this.include_selected_files =
348+
this.extension_context.workspaceState.get<boolean>(
349+
'codeWebChat.includeSelectedFiles',
350+
true
351+
)
352+
346353
this.extension_context.subscriptions.push(
347354
vscode.window.onDidChangeWindowState(async (e) => {
348355
if (e.focused) {
@@ -830,6 +837,21 @@ export class PromptViewProvider implements vscode.WebviewViewProvider {
830837
await handle_pick_tasks_workspace(this, message)
831838
} else if (message.command == 'GET_TOKEN_COUNT') {
832839
this.send_token_count()
840+
} else if (message.command == 'GET_INCLUDE_SELECTED_FILES') {
841+
this.send_message({
842+
command: 'INCLUDE_SELECTED_FILES',
843+
include: this.include_selected_files
844+
})
845+
} else if (message.command == 'TOGGLE_INCLUDE_SELECTED_FILES') {
846+
this.include_selected_files = message.include
847+
this.extension_context.workspaceState.update(
848+
'codeWebChat.includeSelectedFiles',
849+
message.include
850+
)
851+
this.send_message({
852+
command: 'INCLUDE_SELECTED_FILES',
853+
include: this.include_selected_files
854+
})
833855
}
834856
} catch (error: any) {
835857
Logger.error({

‎apps/editor/src/views/prompt/frontend/Main/Main.tsx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ type Props = {
7272
edit_instructions_token_count: number
7373
ask_instructions_token_count: number
7474
bottom_spacer_height?: number
75+
include_selected_files: boolean
76+
on_toggle_include_selected_files: (include: boolean) => void
7577
}
7678

7779
export const Main: React.FC<Props> = (props) => {
@@ -544,6 +546,8 @@ export const Main: React.FC<Props> = (props) => {
544546
on_tabs_reorder={props.on_tabs_reorder}
545547
voice_input_push_to_talk={props.voice_input_push_to_talk}
546548
bottom_spacer_height={props.bottom_spacer_height}
549+
include_selected_files={props.include_selected_files}
550+
on_toggle_include_selected_files={props.on_toggle_include_selected_files}
547551
/>
548552
)
549553
}

‎apps/editor/src/views/prompt/frontend/Main/MainView/MainView.tsx‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ type Props = {
116116
on_tabs_reorder: (new_order: number[]) => void
117117
voice_input_push_to_talk: boolean
118118
bottom_spacer_height?: number
119+
include_selected_files: boolean
120+
on_toggle_include_selected_files: (include: boolean) => void
119121
}
120122

121123
const chatbot_to_icon: Record<keyof typeof CHATBOTS, Icon.Variant> = {
@@ -402,6 +404,10 @@ export const MainView: React.FC<Props> = (props) => {
402404
: props.ask_instructions_token_count
403405
)
404406
}}
407+
include_selected_files={props.include_selected_files}
408+
on_toggle_include_selected_files={
409+
props.on_toggle_include_selected_files
410+
}
405411
translations={{
406412
selected_files: t('main.token-count.selected-files'),
407413
prompt: t('main.token-count.prompt')

‎apps/editor/src/views/prompt/frontend/Prompt.tsx‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export const Prompt = () => {
7575
is_modern_ui,
7676
selected_files_token_count,
7777
edit_instructions_token_count,
78-
ask_instructions_token_count
78+
ask_instructions_token_count,
79+
include_selected_files,
80+
handle_toggle_include_selected_files
7981
} = use_panel(vscode)
8082

8183
const {
@@ -354,6 +356,10 @@ export const Prompt = () => {
354356
selected_files_token_count={selected_files_token_count}
355357
edit_instructions_token_count={edit_instructions_token_count}
356358
ask_instructions_token_count={ask_instructions_token_count}
359+
include_selected_files={include_selected_files}
360+
on_toggle_include_selected_files={
361+
handle_toggle_include_selected_files
362+
}
357363
/>
358364
</div>
359365
<div

‎apps/editor/src/views/prompt/frontend/hooks/use-prompt/use-prompt.ts‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export const use_prompt = (vscode: any) => {
3131
useState<number>(0)
3232
const [ask_instructions_token_count, set_ask_instructions_token_count] =
3333
useState<number>(0)
34+
const [include_selected_files, set_include_selected_files] =
35+
useState<boolean>(true)
3436

3537
const {
3638
ask_about_context_instructions,
@@ -129,6 +131,8 @@ export const use_prompt = (vscode: any) => {
129131
set_ask_instructions_token_count(message.ask_instructions_token_count)
130132
} else if (message.command == 'IS_MODERN_UI') {
131133
set_is_modern_ui(message.is_modern_ui)
134+
} else if (message.command == 'INCLUDE_SELECTED_FILES') {
135+
set_include_selected_files(message.include)
132136
}
133137
}
134138
window.addEventListener('message', handle_message)
@@ -144,7 +148,8 @@ export const use_prompt = (vscode: any) => {
144148
{ command: 'GET_SETUP_PROGRESS' },
145149
{ command: 'GET_VOICE_INPUT_PUSH_TO_TALK' },
146150
{ command: 'GET_IS_MODERN_UI' },
147-
{ command: 'GET_TOKEN_COUNT' }
151+
{ command: 'GET_TOKEN_COUNT' },
152+
{ command: 'GET_INCLUDE_SELECTED_FILES' }
148153
]
149154
initial_messages.forEach((message) => post_message(vscode, message))
150155

@@ -203,6 +208,14 @@ export const use_prompt = (vscode: any) => {
203208
})
204209
}
205210

211+
const handle_toggle_include_selected_files = (include: boolean) => {
212+
set_include_selected_files(include)
213+
post_message(vscode, {
214+
command: 'TOGGLE_INCLUDE_SELECTED_FILES',
215+
include
216+
})
217+
}
218+
206219
const is_setup_complete = setup_progress
207220
? Object.values(setup_progress).every((v) => v)
208221
: true
@@ -245,6 +258,8 @@ export const use_prompt = (vscode: any) => {
245258
is_modern_ui,
246259
selected_files_token_count,
247260
edit_instructions_token_count,
248-
ask_instructions_token_count
261+
ask_instructions_token_count,
262+
include_selected_files,
263+
handle_toggle_include_selected_files
249264
}
250265
}

‎apps/editor/src/views/prompt/types/messages.ts‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,15 @@ export interface GetTokenCountMessage extends BaseMessage {
508508
command: 'GET_TOKEN_COUNT'
509509
}
510510

511+
export interface ToggleIncludeSelectedFilesMessage extends BaseMessage {
512+
command: 'TOGGLE_INCLUDE_SELECTED_FILES'
513+
include: boolean
514+
}
515+
516+
export interface GetIncludeSelectedFilesMessage extends BaseMessage {
517+
command: 'GET_INCLUDE_SELECTED_FILES'
518+
}
519+
511520
export type FrontendMessage =
512521
| GetInstructionsMessage
513522
| SaveInstructionsMessage
@@ -596,6 +605,8 @@ export type FrontendMessage =
596605
| PickTasksWorkspaceMessage
597606
| GetIsModernUiMessage
598607
| GetTokenCountMessage
608+
| ToggleIncludeSelectedFilesMessage
609+
| GetIncludeSelectedFilesMessage
599610

600611
// === FROM BACKEND TO FRONTEND ===
601612
export interface InstructionsMessage extends BaseMessage {
@@ -845,6 +856,11 @@ export interface IsModernUiMessage extends BaseMessage {
845856
is_modern_ui: boolean
846857
}
847858

859+
export interface IncludeSelectedFilesMessage extends BaseMessage {
860+
command: 'INCLUDE_SELECTED_FILES'
861+
include: boolean
862+
}
863+
848864
export type BackendMessage =
849865
| InstructionsMessage
850866
| FocusPromptFieldMessage
@@ -898,3 +914,4 @@ export type BackendMessage =
898914
| StartApiConfigurationCreationMessage
899915
| TasksWorkspacePickedMessage
900916
| IsModernUiMessage
917+
| IncludeSelectedFilesMessage

0 commit comments

Comments
 (0)