feat: expand settingDefaults to include ALL settings with defaults

IMPORTANT: Every setting with a default value is now in settingDefaults.
This enables clearDefaultSettings() to properly clear ALL default values
from storage on every startup, ensuring defaults are never persisted.

Added settings:
- Auto-approval: autoApprovalEnabled, alwaysAllowReadOnly, alwaysAllowWrite,
  alwaysAllowBrowser, alwaysAllowMcp, alwaysAllowModeSwitch, alwaysAllowSubtasks,
  alwaysAllowExecute, requestDelaySeconds, followupAutoApproveTimeoutMs, etc.
- Terminal: terminalShellIntegrationDisabled, terminalCommandDelay,
  terminalPowershellCounter, terminalZsh*, terminalCompressProgressBar
- Other: diagnosticsEnabled, historyPreviewCollapsed, hasOpenedModeSelector,
  enableMcpServerCreation, rateLimitSeconds

Removed settings:
- diffEnabled, fuzzyMatchThreshold (removed from schema)

Updated test expectations to match new comprehensive defaults list.
This commit is contained in:
Hannes Rudolph 2026-01-23 18:43:30 -07:00
parent 28ab2e77f2
commit 9a82299c48
2 changed files with 105 additions and 29 deletions

View file

@ -1,9 +1,29 @@
import { describe, expect, it } from "vitest"
import { settingDefaults, getSettingWithDefault } from "../defaults.js"
import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS } from "../global-settings.js"
import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS, DEFAULT_WRITE_DELAY_MS } from "../global-settings.js"
describe("settingDefaults", () => {
it("should have all expected default values", () => {
// Auto-approval settings (all default to false for safety)
expect(settingDefaults.autoApprovalEnabled).toBe(false)
expect(settingDefaults.alwaysAllowReadOnly).toBe(false)
expect(settingDefaults.alwaysAllowReadOnlyOutsideWorkspace).toBe(false)
expect(settingDefaults.alwaysAllowWrite).toBe(false)
expect(settingDefaults.alwaysAllowWriteOutsideWorkspace).toBe(false)
expect(settingDefaults.alwaysAllowWriteProtected).toBe(false)
expect(settingDefaults.alwaysAllowBrowser).toBe(false)
expect(settingDefaults.alwaysAllowMcp).toBe(false)
expect(settingDefaults.alwaysAllowModeSwitch).toBe(false)
expect(settingDefaults.alwaysAllowSubtasks).toBe(false)
expect(settingDefaults.alwaysAllowExecute).toBe(false)
expect(settingDefaults.alwaysAllowFollowupQuestions).toBe(false)
expect(settingDefaults.requestDelaySeconds).toBe(0)
expect(settingDefaults.followupAutoApproveTimeoutMs).toBe(0)
expect(settingDefaults.commandExecutionTimeout).toBe(0)
expect(settingDefaults.preventCompletionWithOpenTodos).toBe(false)
expect(settingDefaults.autoCondenseContext).toBe(false)
expect(settingDefaults.autoCondenseContextPercent).toBe(50)
// Browser settings
expect(settingDefaults.browserToolEnabled).toBe(true)
expect(settingDefaults.browserViewportSize).toBe("900x600")
@ -16,10 +36,6 @@ describe("settingDefaults", () => {
expect(settingDefaults.ttsEnabled).toBe(true)
expect(settingDefaults.ttsSpeed).toBe(1.0)
// Diff/Editor settings
expect(settingDefaults.diffEnabled).toBe(true)
expect(settingDefaults.fuzzyMatchThreshold).toBe(1.0)
// Checkpoint settings
expect(settingDefaults.enableCheckpoints).toBe(false)
expect(settingDefaults.checkpointTimeout).toBe(DEFAULT_CHECKPOINT_TIMEOUT_SECONDS)
@ -28,6 +44,14 @@ describe("settingDefaults", () => {
expect(settingDefaults.terminalOutputLineLimit).toBe(500)
expect(settingDefaults.terminalOutputCharacterLimit).toBe(50_000)
expect(settingDefaults.terminalShellIntegrationTimeout).toBe(30_000)
expect(settingDefaults.terminalShellIntegrationDisabled).toBe(false)
expect(settingDefaults.terminalCommandDelay).toBe(0)
expect(settingDefaults.terminalPowershellCounter).toBe(false)
expect(settingDefaults.terminalZshClearEolMark).toBe(false)
expect(settingDefaults.terminalZshOhMy).toBe(false)
expect(settingDefaults.terminalZshP10k).toBe(false)
expect(settingDefaults.terminalZdotdir).toBe(false)
expect(settingDefaults.terminalCompressProgressBar).toBe(false)
// Context management settings
expect(settingDefaults.maxOpenTabsContext).toBe(20)
@ -40,18 +64,19 @@ describe("settingDefaults", () => {
expect(settingDefaults.maxConcurrentFileReads).toBe(5)
// Diagnostic settings
expect(settingDefaults.diagnosticsEnabled).toBe(false)
expect(settingDefaults.includeDiagnosticMessages).toBe(true)
expect(settingDefaults.maxDiagnosticMessages).toBe(50)
// Auto-approval settings
expect(settingDefaults.alwaysAllowFollowupQuestions).toBe(false)
expect(settingDefaults.writeDelayMs).toBe(DEFAULT_WRITE_DELAY_MS)
// Prompt enhancement settings
expect(settingDefaults.includeTaskHistoryInEnhance).toBe(true)
// UI settings
expect(settingDefaults.reasoningBlockCollapsed).toBe(true)
expect(settingDefaults.historyPreviewCollapsed).toBe(false)
expect(settingDefaults.enterBehavior).toBe("send")
expect(settingDefaults.hasOpenedModeSelector).toBe(false)
// Environment details settings
expect(settingDefaults.includeCurrentTime).toBe(true)
@ -63,6 +88,24 @@ describe("settingDefaults", () => {
// MCP settings
expect(settingDefaults.mcpEnabled).toBe(true)
expect(settingDefaults.enableMcpServerCreation).toBe(false)
// Rate limiting
expect(settingDefaults.rateLimitSeconds).toBe(0)
// Indexing settings
expect(settingDefaults.codebaseIndexEnabled).toBe(false)
expect(settingDefaults.codebaseIndexQdrantUrl).toBe("http://localhost:6333")
expect(settingDefaults.codebaseIndexEmbedderProvider).toBe("openai")
expect(settingDefaults.codebaseIndexEmbedderBaseUrl).toBe("")
expect(settingDefaults.codebaseIndexEmbedderModelId).toBe("")
expect(settingDefaults.codebaseIndexEmbedderModelDimension).toBe(1536)
expect(settingDefaults.codebaseIndexOpenAiCompatibleBaseUrl).toBe("")
expect(settingDefaults.codebaseIndexBedrockRegion).toBe("us-east-1")
expect(settingDefaults.codebaseIndexBedrockProfile).toBe("")
expect(settingDefaults.codebaseIndexSearchMaxResults).toBe(100)
expect(settingDefaults.codebaseIndexSearchMinScore).toBe(0.4)
expect(settingDefaults.codebaseIndexOpenRouterSpecificProvider).toBe("")
})
it("should be immutable (readonly)", () => {

View file

@ -12,7 +12,7 @@
* - On read: apply defaults using `value ?? settingDefaults.settingName`
*/
import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS } from "./global-settings.js"
import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS, DEFAULT_WRITE_DELAY_MS } from "./global-settings.js"
/**
* Default values for all settings that can be reset to default.
@ -20,34 +20,63 @@ import { DEFAULT_CHECKPOINT_TIMEOUT_SECONDS } from "./global-settings.js"
* These values are the source of truth for defaults throughout the application.
* When a setting is undefined in storage, these defaults should be applied
* at consumption time.
*
* IMPORTANT: Every setting that has a default value MUST be listed here.
* The clearDefaultSettings() function uses this registry to remove default
* values from storage on every startup.
*/
export const settingDefaults = {
// Browser settings
// ===== Auto-approval settings =====
// All auto-approval settings default to false for safety
autoApprovalEnabled: false,
alwaysAllowReadOnly: false,
alwaysAllowReadOnlyOutsideWorkspace: false,
alwaysAllowWrite: false,
alwaysAllowWriteOutsideWorkspace: false,
alwaysAllowWriteProtected: false,
alwaysAllowBrowser: false,
alwaysAllowMcp: false,
alwaysAllowModeSwitch: false,
alwaysAllowSubtasks: false,
alwaysAllowExecute: false,
alwaysAllowFollowupQuestions: false,
requestDelaySeconds: 0,
followupAutoApproveTimeoutMs: 0,
commandExecutionTimeout: 0,
preventCompletionWithOpenTodos: false,
autoCondenseContext: false,
autoCondenseContextPercent: 50,
// ===== Browser settings =====
browserToolEnabled: true,
browserViewportSize: "900x600",
remoteBrowserEnabled: false,
screenshotQuality: 75,
// Audio/TTS settings
// ===== Audio/TTS settings =====
soundEnabled: true,
soundVolume: 0.5,
ttsEnabled: true,
ttsSpeed: 1.0,
// Diff/Editor settings
diffEnabled: true,
fuzzyMatchThreshold: 1.0,
// Checkpoint settings
// ===== Checkpoint settings =====
enableCheckpoints: false,
checkpointTimeout: DEFAULT_CHECKPOINT_TIMEOUT_SECONDS,
// Terminal settings
// ===== Terminal settings =====
terminalOutputLineLimit: 500,
terminalOutputCharacterLimit: 50_000,
terminalShellIntegrationTimeout: 30_000,
terminalShellIntegrationDisabled: false,
terminalCommandDelay: 0,
terminalPowershellCounter: false,
terminalZshClearEolMark: false,
terminalZshOhMy: false,
terminalZshP10k: false,
terminalZdotdir: false,
terminalCompressProgressBar: false,
// Context management settings
// ===== Context management settings =====
maxOpenTabsContext: 20,
maxWorkspaceFiles: 200,
showRooIgnoredFiles: false,
@ -57,33 +86,37 @@ export const settingDefaults = {
maxTotalImageSize: 20,
maxConcurrentFileReads: 5,
// Diagnostic settings
// ===== Diagnostic settings =====
diagnosticsEnabled: false,
includeDiagnosticMessages: true,
maxDiagnosticMessages: 50,
writeDelayMs: 1000,
writeDelayMs: DEFAULT_WRITE_DELAY_MS,
// Auto-approval settings
alwaysAllowFollowupQuestions: false,
// Prompt enhancement settings
// ===== Prompt enhancement settings =====
includeTaskHistoryInEnhance: true,
// UI settings
// ===== UI settings =====
reasoningBlockCollapsed: true,
historyPreviewCollapsed: false,
enterBehavior: "send" as const,
hasOpenedModeSelector: false,
// Environment details settings
// ===== Environment details settings =====
includeCurrentTime: true,
includeCurrentCost: true,
maxGitStatusFiles: 0,
// Language settings
// ===== Language settings =====
language: "en" as const,
// MCP settings
// ===== MCP settings =====
mcpEnabled: true,
enableMcpServerCreation: false,
// Indexing settings
// ===== Rate limiting =====
rateLimitSeconds: 0,
// ===== Indexing settings =====
codebaseIndexEnabled: false,
codebaseIndexQdrantUrl: "http://localhost:6333",
codebaseIndexEmbedderProvider: "openai" as const,