mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-10-06 02:47:56 +00:00
Merge pull request #1650 from RooVetGit/context_management
Context management
This commit is contained in:
commit
7165d7f602
14 changed files with 253 additions and 79 deletions
|
|
@ -3501,7 +3501,7 @@ export class Cline extends EventEmitter<ClineEvents> {
|
|||
async getEnvironmentDetails(includeFileDetails: boolean = false) {
|
||||
let details = ""
|
||||
|
||||
const { terminalOutputLineLimit } = (await this.providerRef.deref()?.getState()) ?? {}
|
||||
const { terminalOutputLineLimit, maxWorkspaceFiles } = (await this.providerRef.deref()?.getState()) ?? {}
|
||||
|
||||
// It could be useful for cline to know if the user went from one or no file to another between messages, so we always include this context
|
||||
details += "\n\n# VSCode Visible Files"
|
||||
|
|
@ -3509,6 +3509,7 @@ export class Cline extends EventEmitter<ClineEvents> {
|
|||
?.map((editor) => editor.document?.uri?.fsPath)
|
||||
.filter(Boolean)
|
||||
.map((absolutePath) => path.relative(cwd, absolutePath))
|
||||
.slice(0, maxWorkspaceFiles ?? 200)
|
||||
|
||||
// Filter paths through rooIgnoreController
|
||||
const allowedVisibleFiles = this.rooIgnoreController
|
||||
|
|
@ -3715,7 +3716,8 @@ export class Cline extends EventEmitter<ClineEvents> {
|
|||
// don't want to immediately access desktop since it would show permission popup
|
||||
details += "(Desktop files not shown automatically. Use list_files to explore if needed.)"
|
||||
} else {
|
||||
const [files, didHitLimit] = await listFiles(cwd, true, 200)
|
||||
const maxFiles = maxWorkspaceFiles ?? 200
|
||||
const [files, didHitLimit] = await listFiles(cwd, true, maxFiles)
|
||||
const { showRooIgnoredFiles } = (await this.providerRef.deref()?.getState()) ?? {}
|
||||
const result = formatResponse.formatFilesList(
|
||||
cwd,
|
||||
|
|
|
|||
|
|
@ -1518,6 +1518,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|||
await this.updateGlobalState("maxOpenTabsContext", tabCount)
|
||||
await this.postStateToWebview()
|
||||
break
|
||||
case "maxWorkspaceFiles":
|
||||
const fileCount = Math.min(Math.max(0, message.value ?? 200), 500)
|
||||
await this.updateGlobalState("maxWorkspaceFiles", fileCount)
|
||||
await this.postStateToWebview()
|
||||
break
|
||||
case "browserToolEnabled":
|
||||
await this.updateGlobalState("browserToolEnabled", message.bool ?? true)
|
||||
await this.postStateToWebview()
|
||||
|
|
@ -2297,6 +2302,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|||
autoApprovalEnabled,
|
||||
experiments,
|
||||
maxOpenTabsContext,
|
||||
maxWorkspaceFiles,
|
||||
browserToolEnabled,
|
||||
telemetrySetting,
|
||||
showRooIgnoredFiles,
|
||||
|
|
@ -2359,6 +2365,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|||
experiments: experiments ?? experimentDefault,
|
||||
mcpServers: this.mcpHub?.getAllServers() ?? [],
|
||||
maxOpenTabsContext: maxOpenTabsContext ?? 20,
|
||||
maxWorkspaceFiles: maxWorkspaceFiles ?? 200,
|
||||
cwd,
|
||||
browserToolEnabled: browserToolEnabled ?? true,
|
||||
telemetrySetting,
|
||||
|
|
@ -2516,6 +2523,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|||
autoApprovalEnabled: stateValues.autoApprovalEnabled ?? false,
|
||||
customModes,
|
||||
maxOpenTabsContext: stateValues.maxOpenTabsContext ?? 20,
|
||||
maxWorkspaceFiles: stateValues.maxWorkspaceFiles ?? 200,
|
||||
openRouterUseMiddleOutTransform: stateValues.openRouterUseMiddleOutTransform ?? true,
|
||||
browserToolEnabled: stateValues.browserToolEnabled ?? true,
|
||||
telemetrySetting: stateValues.telemetrySetting || "unset",
|
||||
|
|
|
|||
|
|
@ -448,6 +448,7 @@ describe("ClineProvider", () => {
|
|||
customModes: [],
|
||||
experiments: experimentDefault,
|
||||
maxOpenTabsContext: 20,
|
||||
maxWorkspaceFiles: 200,
|
||||
browserToolEnabled: true,
|
||||
telemetrySetting: "unset",
|
||||
showRooIgnoredFiles: true,
|
||||
|
|
@ -794,6 +795,17 @@ describe("ClineProvider", () => {
|
|||
expect(state.customModePrompts).toEqual({})
|
||||
})
|
||||
|
||||
test("handles maxWorkspaceFiles message", async () => {
|
||||
await provider.resolveWebviewView(mockWebviewView)
|
||||
const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as jest.Mock).mock.calls[0][0]
|
||||
|
||||
await messageHandler({ type: "maxWorkspaceFiles", value: 300 })
|
||||
|
||||
expect(mockContextProxy.updateGlobalState).toHaveBeenCalledWith("maxWorkspaceFiles", 300)
|
||||
expect(mockContext.globalState.update).toHaveBeenCalledWith("maxWorkspaceFiles", 300)
|
||||
expect(mockPostMessage).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
test.only("uses mode-specific custom instructions in Cline initialization", async () => {
|
||||
// Setup mock state
|
||||
const modeCustomInstructions = "Code mode instructions"
|
||||
|
|
|
|||
1
src/exports/roo-code.d.ts
vendored
1
src/exports/roo-code.d.ts
vendored
|
|
@ -211,6 +211,7 @@ export type GlobalStateKey =
|
|||
| "modelMaxTokens"
|
||||
| "mistralCodestralUrl"
|
||||
| "maxOpenTabsContext"
|
||||
| "maxWorkspaceFiles"
|
||||
| "browserToolEnabled"
|
||||
| "lmStudioSpeculativeDecodingEnabled"
|
||||
| "lmStudioDraftModelId"
|
||||
|
|
|
|||
|
|
@ -147,6 +147,7 @@ export interface ExtensionState {
|
|||
customModes: ModeConfig[]
|
||||
toolRequirements?: Record<string, boolean> // Map of tool names to their requirements (e.g. {"apply_diff": true} if diffEnabled)
|
||||
maxOpenTabsContext: number // Maximum number of VSCode open tabs to include in context (0-500)
|
||||
maxWorkspaceFiles: number // Maximum number of files to include in current working directory details (0-500)
|
||||
cwd?: string // Current working directory
|
||||
telemetrySetting: TelemetrySetting
|
||||
telemetryKey?: string
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ export interface WebviewMessage {
|
|||
| "checkpointRestore"
|
||||
| "deleteMcpServer"
|
||||
| "maxOpenTabsContext"
|
||||
| "maxWorkspaceFiles"
|
||||
| "humanRelayResponse"
|
||||
| "humanRelayCancel"
|
||||
| "browserToolEnabled"
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ export const GLOBAL_STATE_KEYS = [
|
|||
"telemetrySetting",
|
||||
"showRooIgnoredFiles",
|
||||
"remoteBrowserEnabled",
|
||||
"maxWorkspaceFiles",
|
||||
] as const
|
||||
|
||||
type CheckGlobalStateKeysExhaustiveness =
|
||||
|
|
|
|||
|
|
@ -4,3 +4,4 @@ export const Check = () => React.createElement("div")
|
|||
export const ChevronsUpDown = () => React.createElement("div")
|
||||
export const Loader = () => React.createElement("div")
|
||||
export const X = () => React.createElement("div")
|
||||
export const Database = (props: any) => React.createElement("span", { "data-testid": "database-icon", ...props })
|
||||
|
|
|
|||
|
|
@ -13,29 +13,16 @@ import { Section } from "./Section"
|
|||
|
||||
type AdvancedSettingsProps = HTMLAttributes<HTMLDivElement> & {
|
||||
rateLimitSeconds: number
|
||||
terminalOutputLineLimit?: number
|
||||
maxOpenTabsContext: number
|
||||
diffEnabled?: boolean
|
||||
fuzzyMatchThreshold?: number
|
||||
showRooIgnoredFiles?: boolean
|
||||
setCachedStateField: SetCachedStateField<
|
||||
| "rateLimitSeconds"
|
||||
| "terminalOutputLineLimit"
|
||||
| "maxOpenTabsContext"
|
||||
| "diffEnabled"
|
||||
| "fuzzyMatchThreshold"
|
||||
| "showRooIgnoredFiles"
|
||||
>
|
||||
setCachedStateField: SetCachedStateField<"rateLimitSeconds" | "diffEnabled" | "fuzzyMatchThreshold">
|
||||
experiments: Record<ExperimentId, boolean>
|
||||
setExperimentEnabled: SetExperimentEnabled
|
||||
}
|
||||
export const AdvancedSettings = ({
|
||||
rateLimitSeconds,
|
||||
terminalOutputLineLimit,
|
||||
maxOpenTabsContext,
|
||||
diffEnabled,
|
||||
fuzzyMatchThreshold,
|
||||
showRooIgnoredFiles,
|
||||
setCachedStateField,
|
||||
experiments,
|
||||
setExperimentEnabled,
|
||||
|
|
@ -71,52 +58,6 @@ export const AdvancedSettings = ({
|
|||
<p className="text-vscode-descriptionForeground text-sm mt-0">Minimum time between API requests.</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<span className="font-medium">Terminal output limit</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<input
|
||||
type="range"
|
||||
min="100"
|
||||
max="5000"
|
||||
step="100"
|
||||
value={terminalOutputLineLimit ?? 500}
|
||||
onChange={(e) =>
|
||||
setCachedStateField("terminalOutputLineLimit", parseInt(e.target.value))
|
||||
}
|
||||
className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
|
||||
/>
|
||||
<span style={{ ...sliderLabelStyle }}>{terminalOutputLineLimit ?? 500}</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
Maximum number of lines to include in terminal output when executing commands. When exceeded
|
||||
lines will be removed from the middle, saving tokens.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<span className="font-medium">Open tabs context limit</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="500"
|
||||
step="1"
|
||||
value={maxOpenTabsContext ?? 20}
|
||||
onChange={(e) => setCachedStateField("maxOpenTabsContext", parseInt(e.target.value))}
|
||||
className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
|
||||
/>
|
||||
<span style={{ ...sliderLabelStyle }}>{maxOpenTabsContext ?? 20}</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
Maximum number of VSCode open tabs to include in context. Higher values provide more context but
|
||||
increase token usage.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<VSCodeCheckbox
|
||||
checked={diffEnabled}
|
||||
|
|
@ -203,20 +144,6 @@ export const AdvancedSettings = ({
|
|||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<VSCodeCheckbox
|
||||
checked={showRooIgnoredFiles}
|
||||
onChange={(e: any) => {
|
||||
setCachedStateField("showRooIgnoredFiles", e.target.checked)
|
||||
}}>
|
||||
<span className="font-medium">Show .rooignore'd files in lists and searches</span>
|
||||
</VSCodeCheckbox>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
When enabled, files matching patterns in .rooignore will be shown in lists with a lock symbol.
|
||||
When disabled, these files will be completely hidden from file lists and searches.
|
||||
</p>
|
||||
</div>
|
||||
</Section>
|
||||
</div>
|
||||
)
|
||||
|
|
|
|||
129
webview-ui/src/components/settings/ContextManagementSettings.tsx
Normal file
129
webview-ui/src/components/settings/ContextManagementSettings.tsx
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
import { HTMLAttributes } from "react"
|
||||
import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
|
||||
import { Database } from "lucide-react"
|
||||
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
import { SetCachedStateField } from "./types"
|
||||
import { sliderLabelStyle } from "./styles"
|
||||
import { SectionHeader } from "./SectionHeader"
|
||||
import { Section } from "./Section"
|
||||
|
||||
type ContextManagementSettingsProps = HTMLAttributes<HTMLDivElement> & {
|
||||
terminalOutputLineLimit?: number
|
||||
maxOpenTabsContext: number
|
||||
maxWorkspaceFiles: number
|
||||
showRooIgnoredFiles?: boolean
|
||||
setCachedStateField: SetCachedStateField<
|
||||
"terminalOutputLineLimit" | "maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles"
|
||||
>
|
||||
}
|
||||
|
||||
export const ContextManagementSettings = ({
|
||||
terminalOutputLineLimit,
|
||||
maxOpenTabsContext,
|
||||
maxWorkspaceFiles,
|
||||
showRooIgnoredFiles,
|
||||
setCachedStateField,
|
||||
className,
|
||||
...props
|
||||
}: ContextManagementSettingsProps) => {
|
||||
return (
|
||||
<div className={cn("flex flex-col gap-2", className)} {...props}>
|
||||
<SectionHeader description="Control what information is included in the AI's context window, affecting token usage and response quality">
|
||||
<div className="flex items-center gap-2">
|
||||
<Database className="w-4" />
|
||||
<div>Context Management</div>
|
||||
</div>
|
||||
</SectionHeader>
|
||||
|
||||
<Section>
|
||||
<div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<span className="font-medium">Terminal output limit</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<input
|
||||
type="range"
|
||||
min="100"
|
||||
max="5000"
|
||||
step="100"
|
||||
value={terminalOutputLineLimit ?? 500}
|
||||
onChange={(e) =>
|
||||
setCachedStateField("terminalOutputLineLimit", parseInt(e.target.value))
|
||||
}
|
||||
className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
|
||||
data-testid="terminal-output-limit-slider"
|
||||
/>
|
||||
<span style={{ ...sliderLabelStyle }}>{terminalOutputLineLimit ?? 500}</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
Maximum number of lines to include in terminal output when executing commands. When exceeded
|
||||
lines will be removed from the middle, saving tokens.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<span className="font-medium">Open tabs context limit</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="500"
|
||||
step="1"
|
||||
value={maxOpenTabsContext ?? 20}
|
||||
onChange={(e) => setCachedStateField("maxOpenTabsContext", parseInt(e.target.value))}
|
||||
className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
|
||||
data-testid="open-tabs-limit-slider"
|
||||
/>
|
||||
<span style={{ ...sliderLabelStyle }}>{maxOpenTabsContext ?? 20}</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
Maximum number of VSCode open tabs to include in context. Higher values provide more context but
|
||||
increase token usage.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<span className="font-medium">Workspace files context limit</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="500"
|
||||
step="1"
|
||||
value={maxWorkspaceFiles ?? 200}
|
||||
onChange={(e) => setCachedStateField("maxWorkspaceFiles", parseInt(e.target.value))}
|
||||
className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
|
||||
data-testid="workspace-files-limit-slider"
|
||||
/>
|
||||
<span style={{ ...sliderLabelStyle }}>{maxWorkspaceFiles ?? 200}</span>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
Maximum number of files to include in current working directory details. Higher values provide
|
||||
more context but increase token usage.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<VSCodeCheckbox
|
||||
checked={showRooIgnoredFiles}
|
||||
onChange={(e: any) => {
|
||||
setCachedStateField("showRooIgnoredFiles", e.target.checked)
|
||||
}}
|
||||
data-testid="show-rooignored-files-checkbox">
|
||||
<span className="font-medium">Show .rooignore'd files in lists and searches</span>
|
||||
</VSCodeCheckbox>
|
||||
<p className="text-vscode-descriptionForeground text-sm mt-0">
|
||||
When enabled, files matching patterns in .rooignore will be shown in lists with a lock symbol.
|
||||
When disabled, these files will be completely hidden from file lists and searches.
|
||||
</p>
|
||||
</div>
|
||||
</Section>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
@ -11,6 +11,7 @@ import {
|
|||
AlertTriangle,
|
||||
} from "lucide-react"
|
||||
|
||||
import { Database } from "lucide-react"
|
||||
import { ExperimentId } from "../../../../src/shared/experiments"
|
||||
import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
|
||||
import { ApiConfiguration } from "../../../../src/shared/api"
|
||||
|
|
@ -39,6 +40,7 @@ import { AutoApproveSettings } from "./AutoApproveSettings"
|
|||
import { BrowserSettings } from "./BrowserSettings"
|
||||
import { CheckpointSettings } from "./CheckpointSettings"
|
||||
import { NotificationSettings } from "./NotificationSettings"
|
||||
import { ContextManagementSettings } from "./ContextManagementSettings"
|
||||
import { AdvancedSettings } from "./AdvancedSettings"
|
||||
import { SettingsFooter } from "./SettingsFooter"
|
||||
import { Section } from "./Section"
|
||||
|
|
@ -83,6 +85,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
experiments,
|
||||
fuzzyMatchThreshold,
|
||||
maxOpenTabsContext,
|
||||
maxWorkspaceFiles,
|
||||
mcpEnabled,
|
||||
rateLimitSeconds,
|
||||
requestDelaySeconds,
|
||||
|
|
@ -194,6 +197,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
vscode.postMessage({ type: "requestDelaySeconds", value: requestDelaySeconds })
|
||||
vscode.postMessage({ type: "rateLimitSeconds", value: rateLimitSeconds })
|
||||
vscode.postMessage({ type: "maxOpenTabsContext", value: maxOpenTabsContext })
|
||||
vscode.postMessage({ type: "maxWorkspaceFiles", value: maxWorkspaceFiles ?? 200 })
|
||||
vscode.postMessage({ type: "showRooIgnoredFiles", bool: showRooIgnoredFiles })
|
||||
vscode.postMessage({ type: "currentApiConfigName", text: currentApiConfigName })
|
||||
vscode.postMessage({ type: "updateExperimental", values: experiments })
|
||||
|
|
@ -230,6 +234,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
const browserRef = useRef<HTMLDivElement>(null)
|
||||
const checkpointRef = useRef<HTMLDivElement>(null)
|
||||
const notificationsRef = useRef<HTMLDivElement>(null)
|
||||
const contextRef = useRef<HTMLDivElement>(null)
|
||||
const advancedRef = useRef<HTMLDivElement>(null)
|
||||
const experimentalRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
|
|
@ -242,6 +247,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
{ id: "browser", icon: SquareMousePointer, ref: browserRef },
|
||||
{ id: "checkpoint", icon: GitBranch, ref: checkpointRef },
|
||||
{ id: "notifications", icon: Bell, ref: notificationsRef },
|
||||
{ id: "context", icon: Database, ref: contextRef },
|
||||
{ id: "advanced", icon: Cog, ref: advancedRef },
|
||||
{ id: "experimental", icon: FlaskConical, ref: experimentalRef },
|
||||
],
|
||||
|
|
@ -255,6 +261,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
{ ref: browserRef, id: "browser" },
|
||||
{ ref: checkpointRef, id: "checkpoint" },
|
||||
{ ref: notificationsRef, id: "notifications" },
|
||||
{ ref: contextRef, id: "context" },
|
||||
{ ref: advancedRef, id: "advanced" },
|
||||
{ ref: experimentalRef, id: "experimental" },
|
||||
]
|
||||
|
|
@ -401,14 +408,21 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
|
|||
/>
|
||||
</div>
|
||||
|
||||
<div ref={contextRef}>
|
||||
<ContextManagementSettings
|
||||
terminalOutputLineLimit={terminalOutputLineLimit}
|
||||
maxOpenTabsContext={maxOpenTabsContext}
|
||||
maxWorkspaceFiles={maxWorkspaceFiles ?? 200}
|
||||
showRooIgnoredFiles={showRooIgnoredFiles}
|
||||
setCachedStateField={setCachedStateField}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div ref={advancedRef}>
|
||||
<AdvancedSettings
|
||||
rateLimitSeconds={rateLimitSeconds}
|
||||
terminalOutputLineLimit={terminalOutputLineLimit}
|
||||
maxOpenTabsContext={maxOpenTabsContext}
|
||||
diffEnabled={diffEnabled}
|
||||
fuzzyMatchThreshold={fuzzyMatchThreshold}
|
||||
showRooIgnoredFiles={showRooIgnoredFiles}
|
||||
setCachedStateField={setCachedStateField}
|
||||
setExperimentEnabled={setExperimentEnabled}
|
||||
experiments={experiments}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
import { render, screen, fireEvent } from "@testing-library/react"
|
||||
import { ContextManagementSettings } from "../ContextManagementSettings"
|
||||
|
||||
describe("ContextManagementSettings", () => {
|
||||
const defaultProps = {
|
||||
terminalOutputLineLimit: 500,
|
||||
maxOpenTabsContext: 20,
|
||||
maxWorkspaceFiles: 200,
|
||||
showRooIgnoredFiles: false,
|
||||
setCachedStateField: jest.fn(),
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("renders all controls", () => {
|
||||
render(<ContextManagementSettings {...defaultProps} />)
|
||||
|
||||
// Terminal output limit
|
||||
expect(screen.getByText("Terminal output limit")).toBeInTheDocument()
|
||||
expect(screen.getByTestId("terminal-output-limit-slider")).toHaveValue("500")
|
||||
|
||||
// Open tabs context limit
|
||||
expect(screen.getByText("Open tabs context limit")).toBeInTheDocument()
|
||||
expect(screen.getByTestId("open-tabs-limit-slider")).toHaveValue("20")
|
||||
|
||||
// Workspace files limit
|
||||
expect(screen.getByText("Workspace files context limit")).toBeInTheDocument()
|
||||
expect(screen.getByTestId("workspace-files-limit-slider")).toHaveValue("200")
|
||||
|
||||
// Show .rooignore'd files
|
||||
expect(screen.getByText("Show .rooignore'd files in lists and searches")).toBeInTheDocument()
|
||||
expect(screen.getByTestId("show-rooignored-files-checkbox")).not.toBeChecked()
|
||||
})
|
||||
|
||||
it("updates terminal output limit", () => {
|
||||
render(<ContextManagementSettings {...defaultProps} />)
|
||||
|
||||
const slider = screen.getByTestId("terminal-output-limit-slider")
|
||||
fireEvent.change(slider, { target: { value: "1000" } })
|
||||
|
||||
expect(defaultProps.setCachedStateField).toHaveBeenCalledWith("terminalOutputLineLimit", 1000)
|
||||
})
|
||||
|
||||
it("updates open tabs context limit", () => {
|
||||
render(<ContextManagementSettings {...defaultProps} />)
|
||||
|
||||
const slider = screen.getByTestId("open-tabs-limit-slider")
|
||||
fireEvent.change(slider, { target: { value: "50" } })
|
||||
|
||||
expect(defaultProps.setCachedStateField).toHaveBeenCalledWith("maxOpenTabsContext", 50)
|
||||
})
|
||||
|
||||
it("updates workspace files contextlimit", () => {
|
||||
render(<ContextManagementSettings {...defaultProps} />)
|
||||
|
||||
const slider = screen.getByTestId("workspace-files-limit-slider")
|
||||
fireEvent.change(slider, { target: { value: "50" } })
|
||||
|
||||
expect(defaultProps.setCachedStateField).toHaveBeenCalledWith("maxWorkspaceFiles", 50)
|
||||
})
|
||||
|
||||
it("updates show rooignored files setting", () => {
|
||||
render(<ContextManagementSettings {...defaultProps} />)
|
||||
|
||||
const checkbox = screen.getByTestId("show-rooignored-files-checkbox")
|
||||
fireEvent.click(checkbox)
|
||||
|
||||
expect(defaultProps.setCachedStateField).toHaveBeenCalledWith("showRooIgnoredFiles", true)
|
||||
})
|
||||
})
|
||||
|
|
@ -69,6 +69,8 @@ export interface ExtensionStateContextType extends ExtensionState {
|
|||
customModes: ModeConfig[]
|
||||
setCustomModes: (value: ModeConfig[]) => void
|
||||
setMaxOpenTabsContext: (value: number) => void
|
||||
maxWorkspaceFiles: number
|
||||
setMaxWorkspaceFiles: (value: number) => void
|
||||
setTelemetrySetting: (value: TelemetrySetting) => void
|
||||
remoteBrowserEnabled?: boolean
|
||||
setRemoteBrowserEnabled: (value: boolean) => void
|
||||
|
|
@ -137,6 +139,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
|
|||
autoApprovalEnabled: false,
|
||||
customModes: [],
|
||||
maxOpenTabsContext: 20,
|
||||
maxWorkspaceFiles: 200,
|
||||
cwd: "",
|
||||
browserToolEnabled: true,
|
||||
telemetrySetting: "unset",
|
||||
|
|
@ -280,6 +283,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
|
|||
setAutoApprovalEnabled: (value) => setState((prevState) => ({ ...prevState, autoApprovalEnabled: value })),
|
||||
setCustomModes: (value) => setState((prevState) => ({ ...prevState, customModes: value })),
|
||||
setMaxOpenTabsContext: (value) => setState((prevState) => ({ ...prevState, maxOpenTabsContext: value })),
|
||||
setMaxWorkspaceFiles: (value) => setState((prevState) => ({ ...prevState, maxWorkspaceFiles: value })),
|
||||
setBrowserToolEnabled: (value) => setState((prevState) => ({ ...prevState, browserToolEnabled: value })),
|
||||
setTelemetrySetting: (value) => setState((prevState) => ({ ...prevState, telemetrySetting: value })),
|
||||
setShowRooIgnoredFiles: (value) => setState((prevState) => ({ ...prevState, showRooIgnoredFiles: value })),
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ describe("mergeExtensionState", () => {
|
|||
experiments: {} as Record<ExperimentId, boolean>,
|
||||
customModes: [],
|
||||
maxOpenTabsContext: 20,
|
||||
maxWorkspaceFiles: 100,
|
||||
apiConfiguration: { providerId: "openrouter" } as ApiConfiguration,
|
||||
telemetrySetting: "unset",
|
||||
showRooIgnoredFiles: true,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue