Skip to content

Commit 0855159

Browse files
committed
Setting for the max number of open tabs to include in context
1 parent 1cea41d commit 0855159

File tree

7 files changed

+45
-0
lines changed

7 files changed

+45
-0
lines changed

src/core/Cline.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3112,11 +3112,14 @@ export class Cline {
31123112
}
31133113

31143114
details += "\n\n# VSCode Open Tabs"
3115+
const { maxOpenTabsContext } = (await this.providerRef.deref()?.getState()) ?? {}
3116+
const maxTabs = maxOpenTabsContext ?? 20
31153117
const openTabs = vscode.window.tabGroups.all
31163118
.flatMap((group) => group.tabs)
31173119
.map((tab) => (tab.input as vscode.TabInputText)?.uri?.fsPath)
31183120
.filter(Boolean)
31193121
.map((absolutePath) => path.relative(cwd, absolutePath).toPosix())
3122+
.slice(0, maxTabs)
31203123
.join("\n")
31213124
if (openTabs) {
31223125
details += `\n${openTabs}`

src/core/webview/ClineProvider.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ type GlobalStateKey =
127127
| "requestyModelInfo"
128128
| "unboundModelInfo"
129129
| "modelTemperature"
130+
| "maxOpenTabsContext"
130131

131132
export const GlobalFileNames = {
132133
apiConversationHistory: "api_conversation_history.json",
@@ -1207,6 +1208,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
12071208
await this.updateGlobalState("screenshotQuality", message.value)
12081209
await this.postStateToWebview()
12091210
break
1211+
case "maxOpenTabsContext":
1212+
const tabCount = Math.min(Math.max(0, message.value ?? 20), 500)
1213+
await this.updateGlobalState("maxOpenTabsContext", tabCount)
1214+
await this.postStateToWebview()
1215+
break
12101216
case "enhancementApiConfigId":
12111217
await this.updateGlobalState("enhancementApiConfigId", message.text)
12121218
await this.postStateToWebview()
@@ -2378,6 +2384,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
23782384
enhancementApiConfigId,
23792385
autoApprovalEnabled,
23802386
experiments,
2387+
maxOpenTabsContext,
23812388
} = await this.getState()
23822389

23832390
const allowedCommands = vscode.workspace.getConfiguration("roo-cline").get<string[]>("allowedCommands") || []
@@ -2427,6 +2434,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
24272434
customModes: await this.customModesManager.getCustomModes(),
24282435
experiments: experiments ?? experimentDefault,
24292436
mcpServers: this.mcpHub?.getAllServers() ?? [],
2437+
maxOpenTabsContext: maxOpenTabsContext ?? 20,
24302438
}
24312439
}
24322440

@@ -2562,6 +2570,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
25622570
requestyModelId,
25632571
requestyModelInfo,
25642572
modelTemperature,
2573+
maxOpenTabsContext,
25652574
] = await Promise.all([
25662575
this.getGlobalState("apiProvider") as Promise<ApiProvider | undefined>,
25672576
this.getGlobalState("apiModelId") as Promise<string | undefined>,
@@ -2642,6 +2651,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
26422651
this.getGlobalState("requestyModelId") as Promise<string | undefined>,
26432652
this.getGlobalState("requestyModelInfo") as Promise<ModelInfo | undefined>,
26442653
this.getGlobalState("modelTemperature") as Promise<number | undefined>,
2654+
this.getGlobalState("maxOpenTabsContext") as Promise<number | undefined>,
26452655
])
26462656

26472657
let apiProvider: ApiProvider
@@ -2768,6 +2778,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
27682778
experiments: experiments ?? experimentDefault,
27692779
autoApprovalEnabled: autoApprovalEnabled ?? false,
27702780
customModes,
2781+
maxOpenTabsContext: maxOpenTabsContext ?? 20,
27712782
}
27722783
}
27732784

src/core/webview/__tests__/ClineProvider.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ describe("ClineProvider", () => {
351351
mode: defaultModeSlug,
352352
customModes: [],
353353
experiments: experimentDefault,
354+
maxOpenTabsContext: 20,
354355
}
355356

356357
const message: ExtensionMessage = {

src/shared/ExtensionMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ export interface ExtensionState {
128128
autoApprovalEnabled?: boolean
129129
customModes: ModeConfig[]
130130
toolRequirements?: Record<string, boolean> // Map of tool names to their requirements (e.g. {"apply_diff": true} if diffEnabled)
131+
maxOpenTabsContext: number // Maximum number of VSCode open tabs to include in context (0-500)
131132
}
132133

133134
export interface ClineMessage {

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export interface WebviewMessage {
9292
| "openCustomModesSettings"
9393
| "checkpointDiff"
9494
| "checkpointRestore"
95+
| "maxOpenTabsContext"
9596
text?: string
9697
disabled?: boolean
9798
askResponse?: ClineAskResponse

webview-ui/src/components/settings/SettingsView.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
6363
setExperimentEnabled,
6464
alwaysAllowModeSwitch,
6565
setAlwaysAllowModeSwitch,
66+
maxOpenTabsContext,
67+
setMaxOpenTabsContext,
6668
} = useExtensionState()
6769
const [apiErrorMessage, setApiErrorMessage] = useState<string | undefined>(undefined)
6870
const [modelIdErrorMessage, setModelIdErrorMessage] = useState<string | undefined>(undefined)
@@ -104,6 +106,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
104106
vscode.postMessage({ type: "alwaysApproveResubmit", bool: alwaysApproveResubmit })
105107
vscode.postMessage({ type: "requestDelaySeconds", value: requestDelaySeconds })
106108
vscode.postMessage({ type: "rateLimitSeconds", value: rateLimitSeconds })
109+
vscode.postMessage({ type: "maxOpenTabsContext", value: maxOpenTabsContext })
107110
vscode.postMessage({ type: "currentApiConfigName", text: currentApiConfigName })
108111
vscode.postMessage({
109112
type: "upsertApiConfiguration",
@@ -626,6 +629,28 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
626629
</p>
627630
</div>
628631

632+
<div style={{ marginBottom: 15 }}>
633+
<div style={{ display: "flex", flexDirection: "column", gap: "5px" }}>
634+
<span style={{ fontWeight: "500" }}>Open tabs context limit</span>
635+
<div style={{ display: "flex", alignItems: "center", gap: "5px" }}>
636+
<input
637+
type="range"
638+
min="0"
639+
max="500"
640+
step="1"
641+
value={maxOpenTabsContext ?? 20}
642+
onChange={(e) => setMaxOpenTabsContext(parseInt(e.target.value))}
643+
style={{ ...sliderStyle }}
644+
/>
645+
<span style={{ ...sliderLabelStyle }}>{maxOpenTabsContext ?? 20}</span>
646+
</div>
647+
</div>
648+
<p style={{ fontSize: "12px", marginTop: "5px", color: "var(--vscode-descriptionForeground)" }}>
649+
Maximum number of VSCode open tabs to include in context. Higher values provide more context
650+
but increase token usage.
651+
</p>
652+
</div>
653+
629654
<div style={{ marginBottom: 15 }}>
630655
<VSCodeCheckbox
631656
checked={diffEnabled}

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export interface ExtensionStateContextType extends ExtensionState {
8282
handleInputChange: (field: keyof ApiConfiguration, softUpdate?: boolean) => (event: any) => void
8383
customModes: ModeConfig[]
8484
setCustomModes: (value: ModeConfig[]) => void
85+
setMaxOpenTabsContext: (value: number) => void
8586
}
8687

8788
export const ExtensionStateContext = createContext<ExtensionStateContextType | undefined>(undefined)
@@ -117,6 +118,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
117118
enhancementApiConfigId: "",
118119
autoApprovalEnabled: false,
119120
customModes: [],
121+
maxOpenTabsContext: 20,
120122
})
121123

122124
const [didHydrateState, setDidHydrateState] = useState(false)
@@ -350,6 +352,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
350352
setAutoApprovalEnabled: (value) => setState((prevState) => ({ ...prevState, autoApprovalEnabled: value })),
351353
handleInputChange,
352354
setCustomModes: (value) => setState((prevState) => ({ ...prevState, customModes: value })),
355+
setMaxOpenTabsContext: (value) => setState((prevState) => ({ ...prevState, maxOpenTabsContext: value })),
353356
}
354357

355358
return <ExtensionStateContext.Provider value={contextValue}>{children}</ExtensionStateContext.Provider>

0 commit comments

Comments
 (0)