Skip to content

Commit a1aebae

Browse files
committed
Add support for pinning API tool configurations in settings and the UI
1 parent 559cede commit a1aebae

6 files changed

Lines changed: 78 additions & 2 deletions

File tree

‎packages/vscode/package.json‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,10 @@
14971497
"isDefault": {
14981498
"type": "boolean",
14991499
"description": "Whether this is the default configuration for this tool."
1500+
},
1501+
"isPinned": {
1502+
"type": "boolean",
1503+
"description": "Whether this configuration is shown above the list."
15001504
}
15011505
},
15021506
"required": [
@@ -1542,6 +1546,10 @@
15421546
"below-only"
15431547
],
15441548
"description": "Placement of instructions relative to the code context."
1549+
},
1550+
"isPinned": {
1551+
"type": "boolean",
1552+
"description": "Whether this configuration is shown above the list."
15451553
}
15461554
},
15471555
"required": [
@@ -1587,6 +1595,10 @@
15871595
"maxConcurrency": {
15881596
"type": "number",
15891597
"description": "Maximum number of concurrent requests."
1598+
},
1599+
"isPinned": {
1600+
"type": "boolean",
1601+
"description": "Whether this configuration is shown above the list."
15901602
}
15911603
},
15921604
"required": [
@@ -1628,6 +1640,10 @@
16281640
"isDefault": {
16291641
"type": "boolean",
16301642
"description": "Whether this is the default configuration for this tool."
1643+
},
1644+
"isPinned": {
1645+
"type": "boolean",
1646+
"description": "Whether this configuration is shown above the list."
16311647
}
16321648
},
16331649
"required": [

‎packages/vscode/src/services/model-providers-manager.ts‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export type ToolConfig = {
2929
reasoning_effort?: ReasoningEffort
3030
max_concurrency?: number
3131
instructions_placement?: InstructionsPlacement
32+
is_pinned?: boolean
3233
}
3334

3435
export const get_tool_config_id = (config: ToolConfig): string => {
@@ -167,6 +168,7 @@ export class ModelProvidersManager {
167168
reasoningEffort?: ReasoningEffort
168169
maxConcurrency?: number
169170
instructionsPlacement?: InstructionsPlacement
171+
isPinned?: boolean
170172
}[]
171173
>(settings_key, [])
172174

@@ -180,7 +182,8 @@ export class ModelProvidersManager {
180182
temperature: sc.temperature ?? 1.0,
181183
reasoning_effort: sc.reasoningEffort,
182184
max_concurrency: sc.maxConcurrency,
183-
instructions_placement: sc.instructionsPlacement
185+
instructions_placement: sc.instructionsPlacement,
186+
is_pinned: sc.isPinned
184187
}
185188
})
186189
.filter((tc) => tc.provider_type)
@@ -213,6 +216,7 @@ export class ModelProvidersManager {
213216
new_config.maxConcurrency = c.max_concurrency
214217
if (c.instructions_placement !== undefined)
215218
new_config.instructionsPlacement = c.instructions_placement
219+
if (c.is_pinned) new_config.isPinned = c.is_pinned
216220
return new_config
217221
})
218222

@@ -253,6 +257,7 @@ export class ModelProvidersManager {
253257
isDefault?: boolean
254258
maxConcurrency?: number
255259
instructionsPlacement?: InstructionsPlacement
260+
isPinned?: boolean
256261
}[]
257262
>(settings_key, [])
258263
const default_config_from_settings = settings_configs.find(
@@ -271,7 +276,8 @@ export class ModelProvidersManager {
271276
reasoning_effort: default_config_from_settings.reasoningEffort,
272277
max_concurrency: default_config_from_settings.maxConcurrency,
273278
instructions_placement:
274-
default_config_from_settings.instructionsPlacement
279+
default_config_from_settings.instructionsPlacement,
280+
is_pinned: default_config_from_settings.isPinned
275281
}
276282
const validated_config = this._validate_tool_config(tool_config)
277283
if (validated_config) return validated_config

‎packages/vscode/src/views/panel/backend/panel-provider.ts‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import * as path from 'path'
33
import { WebSocketManager } from '@/services/websocket-manager'
44
import { FrontendMessage, BackendMessage } from '../types/messages'
55
import { WebsitesProvider } from '@/context/providers/websites-provider'
6+
import {
7+
ModelProvidersManager,
8+
get_tool_config_id
9+
} from '@/services/model-providers-manager'
610
import { OpenEditorsProvider } from '@/context/providers/open-editors-provider'
711
import { WorkspaceProvider } from '@/context/providers/workspace-provider'
812
import { token_count_emitter } from '@/context/context-initialization'
@@ -479,6 +483,35 @@ export class PanelProvider implements vscode.WebviewViewProvider {
479483
await handle_get_api_tool_configurations(this)
480484
} else if (message.command == 'REORDER_API_TOOL_CONFIGURATIONS') {
481485
await handle_reorder_api_tool_configurations(this, message)
486+
} else if (
487+
message.command == 'TOGGLE_PINNED_API_TOOL_CONFIGURATION'
488+
) {
489+
const { mode, configuration_id } = message
490+
const providers_manager = new ModelProvidersManager(this.context)
491+
let configs
492+
if (mode === 'edit-context') {
493+
configs = await providers_manager.get_edit_context_tool_configs()
494+
} else if (mode === 'code-completions') {
495+
configs =
496+
await providers_manager.get_code_completions_tool_configs()
497+
} else {
498+
return
499+
}
500+
501+
const config = configs.find(
502+
(c) => get_tool_config_id(c) === configuration_id
503+
)
504+
if (!config) return
505+
506+
config.is_pinned = !config.is_pinned
507+
508+
if (mode === 'edit-context') {
509+
await providers_manager.save_edit_context_tool_configs(configs)
510+
} else if (mode === 'code-completions') {
511+
await providers_manager.save_code_completions_tool_configs(
512+
configs
513+
)
514+
}
482515
} else if (message.command == 'SAVE_WEB_MODE') {
483516
await handle_save_mode_web(this, message.mode)
484517
} else if (message.command == 'GET_API_MODE') {

‎packages/vscode/src/views/panel/frontend/Main/Main.tsx‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,16 @@ export const Main: React.FC<Props> = (props) => {
418418
}
419419
}
420420

421+
const handle_toggle_pinned_configuration = (id: string) => {
422+
if (props.api_mode) {
423+
post_message(props.vscode, {
424+
command: 'TOGGLE_PINNED_API_TOOL_CONFIGURATION',
425+
mode: props.api_mode,
426+
configuration_id: id
427+
})
428+
}
429+
}
430+
421431
const handle_create_preset = () => {
422432
post_message(props.vscode, {
423433
command: 'CREATE_PRESET'
@@ -677,6 +687,7 @@ export const Main: React.FC<Props> = (props) => {
677687
configurations={configurations_for_current_mode || []}
678688
on_configuration_click={handle_configuration_click}
679689
on_configurations_reorder={handle_configurations_reorder}
690+
on_toggle_pinned_configuration={handle_toggle_pinned_configuration}
680691
on_manage_configurations={handle_manage_configurations}
681692
on_search_click={handle_search_click}
682693
on_at_sign_click={handle_at_sign_click}

‎packages/vscode/src/views/panel/frontend/Main/MainView/MainView.tsx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ type Props = {
4949
on_configurations_reorder: (
5050
reordered_configurations: UiConfigurations.Configuration[]
5151
) => void
52+
on_toggle_pinned_configuration: (id: string) => void
5253
on_manage_configurations: () => void
5354
has_active_editor: boolean
5455
has_active_selection: boolean
@@ -290,6 +291,7 @@ export const MainView: React.FC<Props> = (props) => {
290291
}))}
291292
on_configuration_click={props.on_configuration_click}
292293
on_reorder={props.on_configurations_reorder}
294+
on_toggle_pinned={props.on_toggle_pinned_configuration}
293295
selected_configuration_id={props.selected_configuration_id}
294296
on_manage_configurations={props.on_manage_configurations}
295297
is_collapsed={props.configurations_collapsed}

‎packages/vscode/src/views/panel/types/messages.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type ApiToolConfiguration = {
1818
reasoning_effort?: string
1919
instructions_placement?: InstructionsPlacement
2020
is_default?: boolean
21+
is_pinned?: boolean
2122
}
2223

2324
export type FileProgressStatus =
@@ -237,6 +238,12 @@ export interface ReorderApiToolConfigurationsMessage extends BaseMessage {
237238
configurations: ApiToolConfiguration[]
238239
}
239240

241+
export interface TogglePinnedApiToolConfigurationMessage extends BaseMessage {
242+
command: 'TOGGLE_PINNED_API_TOOL_CONFIGURATION'
243+
mode: ApiMode
244+
configuration_id: string
245+
}
246+
240247
export interface GetVersionMessage extends BaseMessage {
241248
command: 'GET_VERSION'
242249
}
@@ -385,6 +392,7 @@ export type FrontendMessage =
385392
| SaveApiModeMessage
386393
| GetApiToolConfigurationsMessage
387394
| ReorderApiToolConfigurationsMessage
395+
| TogglePinnedApiToolConfigurationMessage
388396
| SaveDonationsVisibilityMessage
389397
| GetVersionMessage
390398
| EditsReviewMessage

0 commit comments

Comments
 (0)