1pub const DATA_DIR: &str = ".jdata";
7
8pub const AGENT_DIR: &str = "agent";
10
11pub const AGENT_LOG_DIR: &str = "logs";
13
14pub const AGENT_LOG_INFO: &str = "info.log";
16
17pub const AGENT_LOG_ERROR: &str = "error.log";
19
20pub const AGENT_DATA_DIR: &str = "data";
22
23pub const DATA_PATH_ENV: &str = "J_DATA_PATH";
25
26pub fn data_root() -> std::path::PathBuf {
28 if let Ok(p) = std::env::var(DATA_PATH_ENV) {
29 std::path::PathBuf::from(p)
30 } else {
31 dirs::home_dir()
32 .unwrap_or_else(|| std::path::PathBuf::from("."))
33 .join(DATA_DIR)
34 }
35}
36
37pub const TOOL_OUTPUT_SUMMARY_MAX_LEN: usize = 60;
43
44pub const INPUT_BUFFER_MAX_LEN: usize = 16384;
46
47pub const SHELL_DEFAULT_TIMEOUT_SECS: u64 = 120;
51
52pub const SHELL_MAX_TIMEOUT_SECS: u64 = 600;
54
55pub const SHELL_POLL_INTERVAL_MS: u64 = 50;
57
58pub const SHELL_AUTO_BG_SECS: u64 = 30;
61
62pub const SHELL_INTERACTIVE_SILENCE_SECS: u64 = 180;
66
67pub const WEB_REQUEST_TIMEOUT_SECS: u64 = 15;
71
72pub const WEB_RESPONSE_MAX_BYTES: usize = 1024 * 1024;
74
75pub const WEB_RESPONSE_DEFAULT_MAX_CHARS: usize = 50000;
77
78pub const WEB_SEARCH_MAX_COUNT: usize = 10;
80
81pub const WEB_SEARCH_DEFAULT_COUNT: usize = 5;
83
84pub const WEB_SEARCH_HIGHLIGHTS_MAX_CHARS: usize = 4000;
86
87pub const TODO_NAG_INTERVAL_ROUNDS: u32 = 15;
91
92pub const DEFAULT_MAX_HISTORY_MESSAGES: usize = 100;
94
95pub const DEFAULT_MAX_CONTEXT_TOKENS: usize = 0;
97
98pub const DEFAULT_MAX_TOOL_ROUNDS: usize = 1000;
100
101pub const MICRO_COMPACT_BYTES_THRESHOLD: usize = 800;
105
106pub const COMPACT_TOKEN_THRESHOLD: usize = 256 * 800;
108
109pub const COMPACT_KEEP_RECENT: usize = 10;
111
112pub const COMPACT_KEEP_RECENT_USER_MESSAGES: usize = 5;
114
115pub const COMPACT_SKILL_TOKEN_BUDGET: usize = 25_000;
117
118pub const COMPACT_SKILL_PER_SKILL_TOKEN_BUDGET: usize = 5_000;
120
121pub const WINDOW_KEEP_RECENT_MULTIPLIER: usize = 2;
123
124pub const WINDOW_QUOTA_USER: f32 = 0.35;
127pub const WINDOW_QUOTA_ASST_TEXT: f32 = 0.25;
128pub const WINDOW_QUOTA_TOOL_GROUP: f32 = 0.40;
129
130pub const MESSAGE_PREVIEW_MAX_LEN: usize = 50;
134
135pub const CLASSIFY_TRUNCATE_LEN: usize = 50;
139
140pub const CLASSIFY_TITLE_TRUNCATE_LEN: usize = 30;
142
143pub const CLASSIFY_SIZE_THRESHOLD_BYTES: usize = 1024;
145
146pub const CLASSIFY_SIZE_THRESHOLD_CHARS: usize = 100;
148
149pub const API_ERROR_BODY_MAX_LEN: usize = 500;
153
154pub const CONFIRM_MSG_MAX_LINES: usize = 10;
156
157pub const TOOL_ARG_PREVIEW_MAX_CHARS: usize = 60;
159
160pub const ERROR_RESULT_MAX_LINES: usize = 20;
162
163pub const NORMAL_RESULT_MAX_LINES: usize = 100;
165
166pub const AGENT_RESULT_MAX_LINES: usize = 30;
168
169pub const AGENT_CALL_PROMPT_MAX_LINES: usize = 15;
171
172pub const BASH_OUTPUT_MAX_LINES: usize = 100;
174
175pub const THINKING_PULSE_PERIOD_MS: u64 = 1500;
177
178pub const THINKING_PULSE_MIN_FACTOR: f64 = 0.3;
180
181pub const PAGE_SCROLL_LINES: usize = 10;
185
186pub const FINE_SCROLL_LINES: usize = 3;
188
189pub const TOOL_INTERACT_MAX_OPTIONS: usize = 3;
191
192pub const HOOK_DEFAULT_TIMEOUT_SECS: u64 = 10;
196
197pub const HOOK_DEFAULT_LLM_TIMEOUT_SECS: u64 = 30;
199
200pub const HOOK_LLM_MAX_TOKENS: u64 = 2048;
202pub const HOOK_LLM_TEMPERATURE: f32 = 0.0;
204
205pub const BG_TASK_DEFAULT_TIMEOUT_MS: u64 = 30_000;
209
210pub const BG_TASK_MAX_TIMEOUT_MS: u64 = 600_000;
212
213pub const BG_TASK_CMD_DISPLAY_MAX_CHARS: usize = 77;
215
216pub const GLOB_DEFAULT_LIMIT: usize = 100;
220
221pub const DRAG_DEFAULT_DURATION_MS: u64 = 500;
225
226pub const COMPACT_SUMMARY_MAX_TOKENS: u32 = 20000;
230
231pub const COMPACT_TRUNCATE_MAX_CHARS: usize = 80_000;
233
234pub const BROWSER_TEXT_MAX_CHARS: usize = 50_000;
238
239pub const BROWSER_SNAPSHOT_MAX_ELEMENTS: usize = 50;
241
242#[cfg(not(feature = "browser_cdp"))]
244pub const BROWSER_LITE_MAX_LINKS: usize = 50;
245
246#[cfg(not(feature = "browser_cdp"))]
248pub const BROWSER_LITE_MAX_FORMS: usize = 20;
249
250#[cfg(not(feature = "browser_cdp"))]
252pub const BROWSER_LITE_TEXT_PREVIEW_MAX_CHARS: usize = 500;
253
254pub const AX_TREE_OUTPUT_MAX_CHARS: usize = 20_000;
258
259pub const APP_FOCUS_WAIT_MS: u64 = 300;
261
262pub const MOUSE_DOUBLE_CLICK_WAIT_MS: u64 = 50;
264
265pub const WORKTREE_NAME_MAX_LEN: usize = 64;
271
272pub const ARCHIVE_NAME_MAX_LEN: usize = 50;
276
277pub const HOOK_PROMPT_PREVIEW_MAX_LEN: usize = 80;
281
282pub const INPUT_THREAD_PAUSE_WAIT_MS: u64 = 50;
286
287pub const INPUT_THREAD_POLL_MS: u64 = 50;
289
290pub const INPUT_THREAD_PAUSE_SETTLE_MS: u64 = 120;
292pub const INPUT_THREAD_RETRY_SLEEP_MS: u64 = 10;
294
295pub const TUI_LOADING_POLL_MS: u64 = 100;
299
300pub const TUI_IDLE_POLL_MS: u64 = 500;
302
303pub const KEY_PRESS_DELAY_MS: u64 = 10;
307
308#[cfg(not(feature = "browser_cdp"))]
312pub const BROWSER_LITE_HTTP_TIMEOUT_SECS: u64 = 15;
313
314#[cfg(not(feature = "browser_cdp"))]
316pub const BROWSER_LITE_MAX_REDIRECTS: usize = 10;
317
318pub const HOOK_LOG_DESC_MAX_LEN: usize = 60;
322
323pub const TEAMMATE_LOG_RESULT_MAX_CHARS: usize = 200;
327
328pub const TEAMMATE_PROMPT_PREVIEW_MAX_CHARS: usize = 100;
330
331pub const CONFIG_FIELDS: &[&str] = &["name", "api_base", "api_key", "model", "supports_vision"];
333
334pub const CONFIG_GLOBAL_FIELDS_TAB: &[&str] = &[
336 "system_prompt",
337 "agent_md",
338 "style",
339 "max_history_messages",
340 "max_context_tokens",
341 "max_tool_rounds",
342 "tool_confirm_timeout",
343 "theme",
344 "auto_restore_session",
345 "thinking_style",
346 "flat_bubble",
347 "compact_enabled",
348 "compact_token_threshold",
349 "compact_keep_recent",
350 "compact_exempt_tools",
351];
352
353pub const TOAST_DURATION_SECS: u64 = 4;