Skip to main content

j_agent/
constants.rs

1//! j-cli-core 核心常量
2//!
3//! 与 j-cli 的 constants.rs 共享的常量定义。
4
5/// 用户数据根目录名
6pub const DATA_DIR: &str = ".jdata";
7
8/// Agent 子目录
9pub const AGENT_DIR: &str = "agent";
10
11/// Agent 日志子目录
12pub const AGENT_LOG_DIR: &str = "logs";
13
14/// 信息日志文件名
15pub const AGENT_LOG_INFO: &str = "info.log";
16
17/// 错误日志文件名
18pub const AGENT_LOG_ERROR: &str = "error.log";
19
20/// Agent 数据子目录
21pub const AGENT_DATA_DIR: &str = "data";
22
23/// 默认数据路径环境变量
24pub const DATA_PATH_ENV: &str = "J_DATA_PATH";
25
26/// 获取数据根目录路径
27pub 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
37// ========== Chat 模块常量 ==========
38
39// ========== 工具执行相关 ==========
40
41/// 工具输出摘要最大长度(字符数)
42pub const TOOL_OUTPUT_SUMMARY_MAX_LEN: usize = 60;
43
44/// 输入缓冲区最大长度
45pub const INPUT_BUFFER_MAX_LEN: usize = 16384;
46
47// ========== Shell 工具 ==========
48
49/// Shell 命令默认超时时间(秒)
50pub const SHELL_DEFAULT_TIMEOUT_SECS: u64 = 120;
51
52/// Shell 命令最大超时时间(秒)
53pub const SHELL_MAX_TIMEOUT_SECS: u64 = 600;
54
55/// Shell 命令轮询间隔(毫秒)
56pub const SHELL_POLL_INTERVAL_MS: u64 = 50;
57
58/// 前台 Shell 命令自动升级为后台任务的阈值(秒)
59/// 超过此时间未结束,自动 adopt 到 BackgroundManager 并返回 task_id
60pub const SHELL_AUTO_BG_SECS: u64 = 30;
61
62/// 自动升级前的"疑似交互式"静默阈值(秒)
63/// 进程最近这么久都没有任何 stdout/stderr 输出,视为可能在等待交互输入,不升级
64/// 设为 180s 以避免误杀构建类命令(cargo build --release、docker build 等编译阶段可能数分钟无输出)
65pub const SHELL_INTERACTIVE_SILENCE_SECS: u64 = 180;
66
67// ========== Web 请求相关 ==========
68
69/// Web 请求默认超时时间(秒)
70pub const WEB_REQUEST_TIMEOUT_SECS: u64 = 15;
71
72/// Web 响应最大字节数(1MB)
73pub const WEB_RESPONSE_MAX_BYTES: usize = 1024 * 1024;
74
75/// Web 响应默认最大字符数
76pub const WEB_RESPONSE_DEFAULT_MAX_CHARS: usize = 50000;
77
78/// Web 搜索结果数量上限
79pub const WEB_SEARCH_MAX_COUNT: usize = 10;
80
81/// Web 搜索默认结果数量
82pub const WEB_SEARCH_DEFAULT_COUNT: usize = 5;
83
84/// Web 搜索摘要最大字符数
85pub const WEB_SEARCH_HIGHLIGHTS_MAX_CHARS: usize = 4000;
86
87// ========== Agent 相关 ==========
88
89/// Todo 提醒间隔轮数
90pub const TODO_NAG_INTERVAL_ROUNDS: u32 = 15;
91
92/// 默认历史消息数量限制
93pub const DEFAULT_MAX_HISTORY_MESSAGES: usize = 100;
94
95/// 默认上下文 token 预算(0 = 不限制,否则单位为 K tokens,如 100 = 100K tokens)
96pub const DEFAULT_MAX_CONTEXT_TOKENS: usize = 0;
97
98/// 默认工具调用最大轮数
99pub const DEFAULT_MAX_TOOL_ROUNDS: usize = 1000;
100
101// ========== Compact 相关 ==========
102
103/// Micro compact 字节数阈值
104pub const MICRO_COMPACT_BYTES_THRESHOLD: usize = 800;
105
106/// Compact token 阈值(256 * 800)
107pub const COMPACT_TOKEN_THRESHOLD: usize = 256 * 800;
108
109/// Compact 保留最近消息数(micro_compact 保留的 tool result 数量)
110pub const COMPACT_KEEP_RECENT: usize = 10;
111
112/// Auto compact 后保留最近几条 user 消息原文(不限于未回复的)
113pub const COMPACT_KEEP_RECENT_USER_MESSAGES: usize = 5;
114
115/// Auto compact 后技能附件总 token 预算(~25K tokens)
116pub const COMPACT_SKILL_TOKEN_BUDGET: usize = 25_000;
117
118/// Auto compact 后单个技能的 token 预算(~5K tokens,保留头部使用说明)
119pub const COMPACT_SKILL_PER_SKILL_TOKEN_BUDGET: usize = 5_000;
120
121/// Window 时间保底系数:最近 keep_recent * 此系数 个 unit 无条件保留
122pub const WINDOW_KEEP_RECENT_MULTIPLIER: usize = 2;
123
124/// Window 各优先级 tier 的预算配额比例(User / AssistantText / ToolGroup)
125/// 三者之和应为 1.0;System 无配额(始终保留)
126pub 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
130// ========== 存储相关 ==========
131
132/// 消息预览最大长度
133pub const MESSAGE_PREVIEW_MAX_LEN: usize = 50;
134
135// ========== 分类工具 ==========
136
137/// 分类文本截断长度
138pub const CLASSIFY_TRUNCATE_LEN: usize = 50;
139
140/// 分类标题截断长度
141pub const CLASSIFY_TITLE_TRUNCATE_LEN: usize = 30;
142
143/// 分类文件大小阈值(字节)
144pub const CLASSIFY_SIZE_THRESHOLD_BYTES: usize = 1024;
145
146/// 分类文件大小阈值(字符)
147pub const CLASSIFY_SIZE_THRESHOLD_CHARS: usize = 100;
148
149// ========== 渲染相关 ==========
150
151/// API 错误 body 截断最大长度(字符数)
152pub const API_ERROR_BODY_MAX_LEN: usize = 500;
153
154/// 确认消息最大显示行数
155pub const CONFIRM_MSG_MAX_LINES: usize = 10;
156
157/// 工具参数预览最大字符数
158pub const TOOL_ARG_PREVIEW_MAX_CHARS: usize = 60;
159
160/// 错误结果最大显示行数
161pub const ERROR_RESULT_MAX_LINES: usize = 20;
162
163/// 正常结果最大显示行数
164pub const NORMAL_RESULT_MAX_LINES: usize = 100;
165
166/// Agent 结果最大显示行数
167pub const AGENT_RESULT_MAX_LINES: usize = 30;
168
169/// Agent tool call request 展开模式下 prompt 最大显示行数
170pub const AGENT_CALL_PROMPT_MAX_LINES: usize = 15;
171
172/// Bash 输出最大显示行数
173pub const BASH_OUTPUT_MAX_LINES: usize = 100;
174
175/// 思考脉冲周期(毫秒)
176pub const THINKING_PULSE_PERIOD_MS: u64 = 1500;
177
178/// 思考脉冲最低亮度因子
179pub const THINKING_PULSE_MIN_FACTOR: f64 = 0.3;
180
181// ========== UI 交互相关 ==========
182
183/// 分页滚动行数
184pub const PAGE_SCROLL_LINES: usize = 10;
185
186/// 精细滚动行数
187pub const FINE_SCROLL_LINES: usize = 3;
188
189/// 工具交互选项上限
190pub const TOOL_INTERACT_MAX_OPTIONS: usize = 3;
191
192// ========== Hook 相关 ==========
193
194/// Shell hook 默认超时(秒)
195pub const HOOK_DEFAULT_TIMEOUT_SECS: u64 = 10;
196
197/// LLM hook 默认超时(秒)
198pub const HOOK_DEFAULT_LLM_TIMEOUT_SECS: u64 = 30;
199
200/// LLM hook 最大生成 token 数
201pub const HOOK_LLM_MAX_TOKENS: u64 = 2048;
202/// LLM hook 默认温度值(0.0 = 确定性输出)
203pub const HOOK_LLM_TEMPERATURE: f32 = 0.0;
204
205// ========== 后台任务相关 ==========
206
207/// 后台任务默认超时(毫秒)
208pub const BG_TASK_DEFAULT_TIMEOUT_MS: u64 = 30_000;
209
210/// 后台任务最大超时(毫秒,10 分钟)
211pub const BG_TASK_MAX_TIMEOUT_MS: u64 = 600_000;
212
213/// 后台任务命令显示截断长度
214pub const BG_TASK_CMD_DISPLAY_MAX_CHARS: usize = 77;
215
216// ========== Glob 工具 ==========
217
218/// Glob 默认返回数量限制
219pub const GLOB_DEFAULT_LIMIT: usize = 100;
220
221// ========== Computer Use 工具 ==========
222
223/// 拖拽操作默认持续时间(毫秒)
224pub const DRAG_DEFAULT_DURATION_MS: u64 = 500;
225
226// ========== Compact 相关(续)==========
227
228/// Compact 摘要最大 token 数
229pub const COMPACT_SUMMARY_MAX_TOKENS: u32 = 20000;
230
231/// Compact 截断字符数(80K 字符)
232pub const COMPACT_TRUNCATE_MAX_CHARS: usize = 80_000;
233
234// ========== Browser 工具 ==========
235
236/// 浏览器页面正文最大字符数
237pub const BROWSER_TEXT_MAX_CHARS: usize = 50_000;
238
239/// 浏览器快照元素最大数量
240pub const BROWSER_SNAPSHOT_MAX_ELEMENTS: usize = 50;
241
242/// 浏览器 Lite 模式链接最大数量
243#[cfg(not(feature = "browser_cdp"))]
244pub const BROWSER_LITE_MAX_LINKS: usize = 50;
245
246/// 浏览器 Lite 模式表单最大数量
247#[cfg(not(feature = "browser_cdp"))]
248pub const BROWSER_LITE_MAX_FORMS: usize = 20;
249
250/// 浏览器 Lite 模式文本预览截断长度
251#[cfg(not(feature = "browser_cdp"))]
252pub const BROWSER_LITE_TEXT_PREVIEW_MAX_CHARS: usize = 500;
253
254// ========== Computer Use 工具 ==========
255
256/// 无障碍树输出最大字符数
257pub const AX_TREE_OUTPUT_MAX_CHARS: usize = 20_000;
258
259/// 应用聚焦等待时间(毫秒)
260pub const APP_FOCUS_WAIT_MS: u64 = 300;
261
262/// 鼠标双击间隔等待时间(毫秒)
263pub const MOUSE_DOUBLE_CLICK_WAIT_MS: u64 = 50;
264
265// ========== Agent Team ==========
266
267// ========== Worktree ==========
268
269/// Worktree 名称最大长度
270pub const WORKTREE_NAME_MAX_LEN: usize = 64;
271
272// ========== Archive ==========
273
274/// 归档名称最大长度
275pub const ARCHIVE_NAME_MAX_LEN: usize = 50;
276
277// ========== Hook 相关(续)==========
278
279/// Hook prompt 预览最大长度
280pub const HOOK_PROMPT_PREVIEW_MAX_LEN: usize = 80;
281
282// ========== TUI 输入线程 ==========
283
284/// 输入线程暂停等待时间(毫秒)
285pub const INPUT_THREAD_PAUSE_WAIT_MS: u64 = 50;
286
287/// 输入线程 poll 超时(毫秒)
288pub const INPUT_THREAD_POLL_MS: u64 = 50;
289
290/// 输入线程暂停后等待时间(毫秒,确保线程退出当前 poll 周期)
291pub const INPUT_THREAD_PAUSE_SETTLE_MS: u64 = 120;
292/// 输入线程读取/poll 出错后重试休眠间隔(毫秒)
293pub const INPUT_THREAD_RETRY_SLEEP_MS: u64 = 10;
294
295// ========== TUI 主循环 ==========
296
297/// TUI 主循环加载中轮询超时(毫秒)
298pub const TUI_LOADING_POLL_MS: u64 = 100;
299
300/// TUI 主循环空闲轮询超时(毫秒)
301pub const TUI_IDLE_POLL_MS: u64 = 500;
302
303// ========== Computer Use 输入事件 ==========
304
305/// 按键按下-释放间隔延迟(毫秒)
306pub const KEY_PRESS_DELAY_MS: u64 = 10;
307
308// ========== Browser Lite 模式 ==========
309
310/// Browser Lite HTTP 请求超时(秒)
311#[cfg(not(feature = "browser_cdp"))]
312pub const BROWSER_LITE_HTTP_TIMEOUT_SECS: u64 = 15;
313
314/// Browser Lite HTTP 最大重定向次数
315#[cfg(not(feature = "browser_cdp"))]
316pub const BROWSER_LITE_MAX_REDIRECTS: usize = 10;
317
318// ========== Hook 日志 ==========
319
320/// Hook 日志描述截断最大长度
321pub const HOOK_LOG_DESC_MAX_LEN: usize = 60;
322
323// ========== Teammate 创建 ==========
324
325/// Teammate 日志结果截断最大长度
326pub const TEAMMATE_LOG_RESULT_MAX_CHARS: usize = 200;
327
328/// Teammate prompt 预览截断最大长度
329pub const TEAMMATE_PROMPT_PREVIEW_MAX_CHARS: usize = 100;
330
331/// 配置字段列表
332pub const CONFIG_FIELDS: &[&str] = &["name", "api_base", "api_key", "model", "supports_vision"];
333
334/// 全局配置字段(Tab 分页版,去掉 tools_enabled 和 skills_enabled)
335pub 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
353/// Toast 通知显示时长(秒)
354pub const TOAST_DURATION_SECS: u64 = 4;