@@ -16,79 +16,104 @@ use crate::{AutoDumpFormat, Compact, Decimal, HttpConfig, ModelConfig, RetryConf
1616#[ setters( strip_option) ]
1717pub struct ForgeConfig {
1818 /// Retry settings applied at the system level to all IO operations.
19+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
1920 pub retry : Option < RetryConfig > ,
2021 /// Maximum number of lines returned by a single file search operation.
21- pub max_search_lines : usize ,
22+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
23+ pub max_search_lines : Option < usize > ,
2224 /// Maximum number of bytes returned by a single file search operation.
23- pub max_search_result_bytes : usize ,
25+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
26+ pub max_search_result_bytes : Option < usize > ,
2427 /// Maximum number of characters returned from a URL fetch.
25- pub max_fetch_chars : usize ,
28+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
29+ pub max_fetch_chars : Option < usize > ,
2630 /// Maximum number of lines captured from the leading portion of shell
2731 /// command output.
28- pub max_stdout_prefix_lines : usize ,
32+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
33+ pub max_stdout_prefix_lines : Option < usize > ,
2934 /// Maximum number of lines captured from the trailing portion of shell
3035 /// command output.
31- pub max_stdout_suffix_lines : usize ,
36+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
37+ pub max_stdout_suffix_lines : Option < usize > ,
3238 /// Maximum number of characters per line in shell command output.
33- pub max_stdout_line_chars : usize ,
39+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
40+ pub max_stdout_line_chars : Option < usize > ,
3441 /// Maximum number of characters per line when reading a file.
35- pub max_line_chars : usize ,
42+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
43+ pub max_line_chars : Option < usize > ,
3644 /// Maximum number of lines read from a file in a single operation.
37- pub max_read_lines : u64 ,
45+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
46+ pub max_read_lines : Option < u64 > ,
3847 /// Maximum number of files read in a single batch operation.
39- pub max_file_read_batch_size : usize ,
48+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
49+ pub max_file_read_batch_size : Option < usize > ,
4050 /// HTTP client settings including proxy, TLS, and timeout configuration.
51+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
4152 pub http : Option < HttpConfig > ,
4253 /// Maximum file size in bytes permitted for read operations.
43- pub max_file_size_bytes : u64 ,
54+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
55+ pub max_file_size_bytes : Option < u64 > ,
4456 /// Maximum image file size in bytes permitted for read operations.
45- pub max_image_size_bytes : u64 ,
57+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
58+ pub max_image_size_bytes : Option < u64 > ,
4659 /// Maximum time in seconds a single tool call may run before being
4760 /// cancelled.
48- pub tool_timeout_secs : u64 ,
61+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
62+ pub tool_timeout_secs : Option < u64 > ,
4963 /// Whether to automatically open HTML dump files in the browser after
5064 /// creation.
51- pub auto_open_dump : bool ,
65+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
66+ pub auto_open_dump : Option < bool > ,
5267 /// Directory where debug request files are written; disabled when absent.
68+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
5369 pub debug_requests : Option < PathBuf > ,
5470 /// Path to the conversation history file; defaults to the global history
5571 /// location when absent.
72+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
5673 pub custom_history_path : Option < PathBuf > ,
5774 /// Maximum number of conversations shown in the conversation list.
58- pub max_conversations : usize ,
75+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
76+ pub max_conversations : Option < usize > ,
5977 /// Maximum number of candidate results returned from the initial semantic
6078 /// search vector query.
61- pub max_sem_search_results : usize ,
79+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
80+ pub max_sem_search_results : Option < usize > ,
6281 /// Number of top results retained after re-ranking in semantic search.
63- pub sem_search_top_k : usize ,
82+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
83+ pub sem_search_top_k : Option < usize > ,
6484 /// Base URL of the Forge services API used for semantic search and
6585 /// indexing.
66- #[ dummy( expr = "\" https://example.com/api\" .to_string()" ) ]
67- pub services_url : String ,
86+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
87+ #[ dummy( expr = "Some(\" https://example.com/api\" .to_string())" ) ]
88+ pub services_url : Option < String > ,
6889 /// Maximum number of file extensions included in the agent system prompt.
69- pub max_extensions : usize ,
90+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
91+ pub max_extensions : Option < usize > ,
7092 /// Format used when automatically creating a session dump after task
7193 /// completion; disabled when absent.
94+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
7295 pub auto_dump : Option < AutoDumpFormat > ,
7396 /// Maximum number of files read concurrently during batch operations.
74- pub max_parallel_file_reads : usize ,
97+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
98+ pub max_parallel_file_reads : Option < usize > ,
7599 /// Time-to-live in seconds for the cached model API list.
76- pub model_cache_ttl_secs : u64 ,
100+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
101+ pub model_cache_ttl_secs : Option < u64 > ,
77102 /// Default model and provider configuration used when not overridden by
78- /// individual agents.
79- #[ serde( default ) ]
103+ /// individual agents.
104+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
80105 pub session : Option < ModelConfig > ,
81106 /// Model and provider configuration used for commit message generation.
82- #[ serde( default ) ]
107+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
83108 pub commit : Option < ModelConfig > ,
84109 /// Model and provider configuration used for shell command suggestion
85110 /// generation.
86- #[ serde( default ) ]
111+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
87112 pub suggest : Option < ModelConfig > ,
88113
89114 // --- Workflow fields ---
90115 /// Configuration for automatic Forge updates.
91- #[ serde( skip_serializing_if = "Option::is_none" ) ]
116+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
92117 pub updates : Option < Update > ,
93118
94119 /// Output randomness for all agents; lower values are deterministic, higher
@@ -127,11 +152,13 @@ pub struct ForgeConfig {
127152
128153 /// Whether restricted mode is active; when enabled, tool execution requires
129154 /// explicit permission grants.
130- pub restricted : bool ,
155+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
156+ pub restricted : Option < bool > ,
131157
132158 /// Whether tool use is supported in the current environment; when false,
133159 /// all tool calls are disabled.
134- pub tool_supported : bool ,
160+ #[ serde( default , skip_serializing_if = "Option::is_none" ) ]
161+ pub tool_supported : Option < bool > ,
135162}
136163
137164#[ cfg( test) ]
0 commit comments