Skip to main content

lean_ctx/core/config/
defaults.rs

1use std::collections::HashMap;
2
3#[allow(clippy::wildcard_imports)]
4use super::*;
5/// Default BM25 cache cap from config (also used by `bm25_index` heuristics).
6pub fn default_bm25_max_cache_mb() -> u64 {
7    serde_defaults::default_bm25_max_cache_mb()
8}
9
10/// Effective on-disk ceiling (MB) for the persisted BM25 index when nothing is
11/// explicitly configured (no `bm25_max_cache_mb`, no `max_disk_mb` budget).
12///
13/// Deliberately decoupled from the RAM `MemoryProfile` (64/128/512 MB): this is
14/// a *disk* file, and tying it to the profile silently refused persistence on
15/// large repos under Low/Balanced, forcing a cold rebuild on every call (the
16/// perpetual "index warming" of issue #249). 512 MB compressed covers
17/// essentially every real repo; RAM pressure is governed separately by the
18/// eviction orchestrator (which measures real heap).
19pub const DEFAULT_BM25_PERSIST_MB: u64 = 512;
20
21// Compile-time regression guard (#249): the default disk ceiling must stay well
22// above the old RAM-profile caps (64/128 MB) that starved large repos.
23const _: () = assert!(DEFAULT_BM25_PERSIST_MB >= 512);
24
25/// lean-ctx tools whose sole purpose is editing the user's source files. When
26/// `prefer_native_editor` is set (#454) these are hidden from `list_tools` and
27/// refused at dispatch so the host's native editor handles edits instead.
28///
29/// Deliberately narrow: only the dedicated edit tools are blocked — `ctx_edit`
30/// (str_replace) and `ctx_patch` (anchored, #1008). LSP refactor
31/// (`ctx_refactor`) also exposes read-only sub-actions (references/definition),
32/// so it is left available; users wanting it gone can add it to `disabled_tools`.
33pub const EDIT_TOOL_NAMES: &[&str] = &["ctx_edit", "ctx_patch"];
34
35/// Default locations for shell output capture.
36///
37/// `/private/tmp` is the canonical target behind macOS's `/tmp` symlink, while
38/// `temp_dir()` also covers per-user scratch directories such as `$TMPDIR`.
39pub(crate) fn default_shell_write_allow_paths() -> Vec<String> {
40    #[allow(unused_mut)]
41    let mut paths = vec![std::env::temp_dir().to_string_lossy().into_owned()];
42    #[cfg(unix)]
43    for path in ["/tmp", "/private/tmp", "/var/tmp"] {
44        if !paths.iter().any(|existing| existing == path) {
45            paths.push(path.to_string());
46        }
47    }
48    paths
49}
50impl Default for Config {
51    fn default() -> Self {
52        Self {
53            ultra_compact: false,
54            tee_mode: TeeMode::default(),
55            recovery_hints: RecoveryHints::default(),
56            output_density: OutputDensity::default(),
57            checkpoint_interval: 15,
58            excluded_commands: Vec::new(),
59            passthrough_urls: Vec::new(),
60            custom_aliases: Vec::new(),
61            preserve_compact_formats: serde_defaults::default_preserve_compact_formats(),
62            crush_verbatim_json: false,
63            slow_command_threshold_ms: 5000,
64            theme: serde_defaults::default_theme(),
65            telemetry: TelemetryConfig::default(),
66            cloud: CloudConfig::default(),
67            gain: GainConfig::default(),
68            cost: CostConfig::default(),
69            code_health: CodeHealthConfig::default(),
70            autonomy: AutonomyConfig::default(),
71            providers: ProvidersConfig::default(),
72            proxy: ProxyConfig::default(),
73            conversation: ConversationConfig::default(),
74            response_shaping: ResponseShapingConfig::default(),
75            ocla: OclaConfig::default(),
76            cache: CacheConfig::default(),
77            agents: AgentsConfig::default(),
78            proxy_enabled: None,
79            proxy_port: None,
80            proxy_timeout_ms: None,
81            proxy_require_token: false,
82            proxy_loopback_open: false,
83            proxy_bind_host: None,
84            proxy_allowed_hosts: Vec::new(),
85            proxy_max_rps: None,
86            dashboard_auth: true,
87            dashboard_cache_hit_rate: None,
88            buddy_enabled: serde_defaults::default_buddy_enabled(),
89            enable_wakeup_ctx: true,
90            redirect_exclude: Vec::new(),
91            disabled_tools: Vec::new(),
92            prefer_native_editor: false,
93            default_tool_categories: Vec::new(),
94            no_degrade: false,
95            delta_explicit: false,
96            profile: None,
97            config_profile: None,
98            profiles: std::collections::BTreeMap::new(),
99            tool_profile: None,
100            tools_enabled: Vec::new(),
101            persona: None,
102            loop_detection: LoopDetectionConfig::default(),
103            rules_scope: None,
104            rules_injection: None,
105            permission_inheritance: None,
106            extra_ignore_patterns: Vec::new(),
107            terse_agent: TerseAgent::default(),
108            compression_level: CompressionLevel::default(),
109            cognitive_mode: CognitiveMode::default(),
110            compression_aggressiveness: None,
111            archive: ArchiveConfig::default(),
112            memory: MemoryPolicy::default(),
113            allow_paths: Vec::new(),
114            allow_ide_config_dirs: None,
115            extra_roots: Vec::new(),
116            read_only_roots: Vec::new(),
117            allow_symlink_roots: Vec::new(),
118            content_defined_chunking: false,
119            minimal_overhead: true,
120            symbol_map_auto: false,
121            structure_first: true,
122            progressive_disclosure: true,
123            progressive_threshold_lines: serde_defaults::default_progressive_threshold_lines(),
124            progressive_signatures_max: serde_defaults::default_progressive_signatures_max(),
125            auto_mode_learning: false,
126            team_url: None,
127            team_token: None,
128            team_auto_push: false,
129            journal_enabled: true,
130            auto_capture: true,
131            search: crate::core::hybrid_search::HybridConfig::default(),
132            graph: GraphConfig::default(),
133            index: IndexConfig::default(),
134            skillify: SkillifyConfig::default(),
135            summaries: SummariesConfig::default(),
136            llm: crate::core::llm_enhance::LlmConfig::default(),
137            embedding: EmbeddingConfig::default(),
138            shell_hook_disabled: false,
139            shadow_mode: true,
140            hook_mode: None,
141            tool_surface: None,
142            debug_log: false,
143            shell_activation: ShellActivation::default(),
144            skip_agent_aliases: false,
145            read_redirect: ReadRedirect::default(),
146            read_dedup: ReadDedup::default(),
147            update_check_disabled: false,
148            updates: UpdatesConfig::default(),
149            context: ContextConfig::default(),
150            graph_index_max_files: serde_defaults::default_graph_index_max_files(),
151            bm25_max_cache_mb: serde_defaults::default_bm25_max_cache_mb(),
152            memory_profile: MemoryProfile::default(),
153            memory_cleanup: MemoryCleanup::default(),
154            max_ram_percent: serde_defaults::default_max_ram_percent(),
155            max_disk_mb: 0,
156            max_staleness_days: 0,
157            max_index_threads: 0,
158            savings_footer: SavingsFooter::default(),
159            compression_annotation: CompressionAnnotation::default(),
160            annotation_threshold_pct: serde_defaults::default_annotation_threshold_pct(),
161            turn_fresh_limit: serde_defaults::default_turn_fresh_limit(),
162            session_token_limit: serde_defaults::default_session_token_limit(),
163            project_root: None,
164            lsp: std::collections::HashMap::new(),
165            ide_paths: HashMap::new(),
166            model_context_windows: HashMap::new(),
167            response_verbosity: ResponseVerbosity::default(),
168            bypass_hints: None,
169            cache_policy: None,
170            cache_max_tokens: 0,
171            boundary_policy: crate::core::memory_boundary::BoundaryPolicy::default(),
172            secret_detection: SecretDetectionConfig::default(),
173            sensitivity: crate::core::sensitivity::SensitivityConfig::default(),
174            gateway: crate::core::mcp_catalog::GatewayConfig::default(),
175            gateway_server: GatewayServerConfig::default(),
176            enterprise: EnterpriseConfig::default(),
177            addons: crate::core::addons::AddonsConfig::default(),
178            allow_auto_reroot: false,
179            hook_binary: None,
180            path_jail: None,
181            sandbox_level: 0,
182            reference_results: false,
183            agent_token_budget: 0,
184            shell_allowlist: default_shell_allowlist(),
185            shell_allowlist_extra: Vec::new(),
186            shell_strict_mode: false,
187            shell_security: None,
188            shell_timeout_secs: None,
189            shell_heavy_timeout_secs: None,
190            shell_heavy_prefixes: Vec::new(),
191            shell_allow_writes: false,
192            write_allow_paths: Vec::new(),
193            shell_allow_inline_scripts: false,
194            setup: SetupConfig::default(),
195        }
196    }
197}