feat: 多层上下文压缩 + 多级权限管理系统

权限管理:
- PermissionTypes: 权限行为/模式/规则/决策/选择类型系统
- PermissionSettings: 用户级/项目级/会话级权限持久化(settings.json)
- PermissionRuleEngine: 多层规则引擎(deny→allow→readOnly→mode→dangerous→ASK)
- DangerousPatterns: 危险shell命令检测(rm -rf, eval, exec等)
- ReplSession: Y/A/N/D四选项权限确认UI
- ConfigCommand: permission-mode/list/reset子命令
- AgentLoop: 集成规则引擎,PermissionChoice回调

上下文压缩:
- TokenTracker: 上下文窗口监控(93%自动压缩/82%警告/98%阻塞)
- MicroCompact: 微压缩,裁剪旧tool_result(无API调用)
- SessionMemoryCompact: Session Memory压缩,AI摘要旧消息保留近期段
- FullCompact: 全量压缩+PTL重试(按API Round逐步丢弃)
- AutoCompactManager: 压缩编排器(micro→session→full),含熔断机制
- CompactCommand: 改造为委托FullCompact
- StatusLine: token使用百分比+颜色告警(绿→黄→红→闪烁)
- AppConfig: 注册PermissionSettings/RuleEngine/AutoCompactManager Bean

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
liuzh
2026-04-02 23:05:37 +08:00
co-authored by Copilot
parent c989d3b451
commit 730551cb3f
16 changed files with 1759 additions and 127 deletions
@@ -84,10 +84,25 @@ public class StatusLine {
// 模型名
sb.append(" ").append(modelName);
// Token 用量
// Token 用量 + 上下文窗口占比
sb.append(" │ ↑").append(TokenTracker.formatTokens(inputTokens));
sb.append("").append(TokenTracker.formatTokens(outputTokens));
// 上下文窗口使用百分比(带颜色)
double usagePct = tokenTracker.getUsagePercentage();
if (usagePct > 0) {
String pctStr = String.format(" %.0f%%", usagePct * 100);
var warningState = tokenTracker.getTokenWarningState();
sb.append(AnsiStyle.RESET); // 先重置再着色
sb.append(switch (warningState) {
case NORMAL -> AnsiStyle.DIM + AnsiStyle.GREEN + pctStr;
case WARNING -> AnsiStyle.BOLD + AnsiStyle.YELLOW + pctStr;
case ERROR -> AnsiStyle.BOLD + AnsiStyle.RED + pctStr;
case BLOCKING -> AnsiStyle.BOLD + AnsiStyle.RED + "" + pctStr;
});
sb.append(AnsiStyle.RESET).append(AnsiStyle.DIM);
}
// 费用
if (cost > 0) {
sb.append(String.format(" $%.4f", cost));