ZhikunCode 系统架构

Enterprise-Grade AI-Powered Web IDE — Architecture Reference

下列规模统计保留 2026-08-09 快照;能力与流程按 2026-09-16 工作区核对。

Java 68.8% React 25.0% Python + CLI 6.0% 134,826 Product Lines 863 Git-Tracked Files · ea0170c
01

项目总览面板

ZhikunCode · Web IDE · 浏览器 + 后端服务 + 分析服务
Java 后端主源码
93,118 行 / 622 文件
Java 测试代码
40,974 行 / 208 文件
React 前端
33,642 行 / 209 文件
Python 服务与 CLI
8,066 行 / 32 文件
技术概览
项目名称ZhikunCode
产品形态AI-Powered Web IDE
产品源代码863 个 Git 跟踪文件 · ea0170c / 2026-08-09(不统计本地忽略文件)
测试规模Java + Python / 226 文件;前端 E2E 24 specs
后端框架Spring Boot 3.4 + Java 21
前端框架React 18.3 + Vite 5.4 + Zustand 4.5
分析服务FastAPI + uvicorn + tree-sitter
UI 工具链Tailwind 3.4 + Monaco 0.52 + xterm.js 5.5
可视化Mermaid 11.14 + 15个自定义图表组件
代码量分布
Java 主源码
93,118 Java 测试
40,974 React 前端
33,642 Python + CLI
8,066
02

三端分离架构总览

核心通信链路
React 前端 响应式工作台 Project 选择 · Run steering · 结构化工具卡片 · STOMP 重连 Java 后端 622 文件 · Spring Boot 3.4 Port 8080 · Agent Loop · Permission · MCP · Tools Python 分析服务 32 文件 · FastAPI + CLI Port 8000 · 7 能力域 · tree-sitter LLM API MCP Servers Docker 沙箱 文件系统 REST API + WebSocket/STOMP Vite Proxy → :8000
▸ 三端分离架构全景插画
React 前端 响应式工作台 Zustand 共享组件 15 可视化 dispatch 557 363 dispatch.ts · stompClient.ts REST + WS/STOMP HTTP Proxy Java 后端 622 文件 · Spring Boot 3.4 Agent Engine Permission 统一授权 + 最终复检 Tool System 40+ 内置 · 动态扩展 MCP Protocol 4传输 (main) LLM Provider 26文件 Agent 委派 5 类 Agent Bash Security 6层AST Context Mgmt 6层压缩 :8080 Python 分析服务 32 文件 · 服务 + CLI Analyzers Services 7 能力域 tree-sitter :8000 LLM APIs MCP Servers Docker 沙箱 文件系统 Java React Python 通信链路 外部服务
▶ 5条通信链路详情
02.5

全链路数据流 — 从用户输入到流式响应

dispatch.ts → STOMP/WS → QueryEngine 8步循环 → 流式工具执行 → Zustand 实时更新

基于源码验证的端到端请求闭环:用户消息经 STOMP 发送至后端 Agent Loop,LLM 流式响应与工具执行结果通过 WebSocket 实时推送回前端 Zustand Store。

REACT 前端 JAVA 后端 (Agent Loop) 结果回流 用户输入 ChatInput → handleSubmit() stompClient.ts sendUserMessage('/app/chat') STOMP over SockJS · 心跳10s · 指数退避重连 dispatch.ts 按 type 分发到 Zustand Store 40+ 消息类型 · 序列号校验 · 跨Store协调 Store 文件 messageStore · sessionStore · activityStore ... UI 实时渲染(共享组件) WebSocketController /app/chat → handleChat() · REST API QueryEngine.queryLoop() — 8步循环 ① 压缩级联检查 ContextCascade · MicroCompact ② 创建执行会话 StreamingToolExecutor.newSession() ③ LLM 流式 API 调用 provider.streamChat() · ApiRetry ④ 收集流式响应 StreamCollector → AssistantMessage ⑤ 工具并行执行 Virtual Thread · 即时启动有序返回 ⑤½ 自纠错检测 SelfCorrectionLoop · shouldAbort ⑥ 终止/继续判定 TerminationStrategy · 策略模式 ⑦ 工具摘要注入 ToolResultSummarizer · 截断/清理 ⑧ 状态更新 → 回Step① 回写 QueryLoopState ToolExecutionPipeline — 9阶段 Schema验证 → PreHook → 冻结输入/授权 → Gateway复检执行 → PostHook → contextModifier ⚡ 流式触发: StreamCollector 在 BlockStop 事件时即时启动工具执行 (不等待完整响应) LLM API (Claude/GPT) LlmProviderRegistry · 多模型支持 Python 分析服务 (:8000) HTTP Proxy · FastAPI · tree-sitter · 7能力域 STOMP 流式推送 /user/queue/messages stream_delta · tool_result · message_complete STOMP /app/chat streamChat() HTTP Proxy handler.push() WS /user/queue/messages → parseMessage() → dispatch() stompClient.ts dispatch.ts QueryEngine 8步循环 StreamingToolExecutor ToolExecutionPipeline 9阶段 Python + CLI
02b

全局数据流与模块依赖全景图

User (Browser) REACT FRONTEND 共享组件 Zustand dispatch.ts stompClient.ts 14 Viz JAVA BACKEND (93,118 lines / 622 files) Agent Loop engine/ · Agent Loop与上下文编排 Permission Analyzer · Grant · Gateway Bash Security 6-layer AST Tool System 40+内置工具 · MCP/插件动态扩展 LLM Provider 26文件 MCP Protocol 30文件(main) Agent 委派 5类 Agent · 受控协作 Context Mgmt 6层压缩 Memory BM25+LLM Skill 三类来源加载 Security 黑名单+审计 Sandbox Docker隔离 PYTHON SERVICE + CLI (8,066 lines / 32 files) Analyzers 7 能力域 · 条件 Router Services · 浏览器、Git、文件与复杂度分析 REST + WS Vite Proxy LLM APIs MCP Servers Docker Engine File System Browser (CDP) Legend: Frontend → Backend Frontend → Python Internal Dependency External Service Call
03

Agent Loop — 8步循环引擎

engine/ · QueryEngine.java · Agent Loop 与 Run 编排
1
压缩级联 ContextCascade
AutoCompact 状态回写 · 上下文窗口管理 · 触发条件: token数 > 阈值
2
创建流式执行会话 StreamingToolExecutor.newSession
初始化工具执行上下文 · 并行通道就绪
3
API 调用 + 模型降级 LlmProvider.streamChat
流式收集 · 完整响应验证后提交工具 · 413两级压缩 + 条件性媒体恢复 · 模型降级链
4
收集 API 响应 StreamCollector.buildAssistantMessage
流式chunk聚合 · 工具调用提取 · thinking块处理
5
消费工具结果 并行执行,异步等待
StreamingToolExecutor 调度 → 每个调用进入统一授权/Gateway → 结果按序收集
6
继续/终止判定
end_turn 信号检测 · max_tokens 恢复机制 · StopHook 自定义拦截
7
工具摘要注入 ToolResultSummarizer
长结果截断摘要 · LLM辅助压缩 · 上下文预算控制
8
状态更新 → 回到 Step 1 LOOP
消息历史追加 · 统计更新 · 压缩指标评估 · 循环继续
▸ Agent Loop 8步循环引擎
QueryEngine.java — 8步循环 · 流式工具执行 1 压缩级联 ContextCascade AutoCompact·上下文窗口 2 创建流式会话 StreamingToolExecutor 初始化工具执行上下文 3 API调用+降级 LlmProvider.streamChat 流式执行·413恢复·降级链 ModelTierService N级降级链 · 冷却管理 · 健康探测 4 收集API响应 StreamCollector chunk聚合·工具调用提取 5 消费工具结果 并行执行·异步等待 并发调度→逐调用授权/Gateway→按序收集 6 继续/终止判定 end_turn·max_tokens StopHook自定义拦截 7 工具摘要注入 ToolResultSummarizer LLM压缩·预算控制 8 状态更新 消息历史追加 统计更新·回到Step1 LOOP Step 6 判定分支 继续循环 有工具调用 → Step7 → Step1 返回结果 end_turn信号 → 输出给用户 错误恢复 max_tokens → 截断 → 重试 核心步骤 LLM API调用 执行/循环 判定节点 循环路径 分支决策 终止评估:空最终回复最多恢复一次;仍为空或触及限制按终止原因结束,不视为成功。
▶ 引擎关键特性
流式工具执行

完整响应验证后执行 · 工具参数实时预览

413两级压缩 + 条件性媒体恢复

两级压缩 → 条件性媒体恢复 → 耗尽后报错终止

事务边界

独立事务语义 · 失败不影响历史

自纠错检测 — 错误感知与自动恢复

▸ Step 5.5 Self-Correction Detection · SelfCorrectionLoop.java MAX_ATTEMPTS_DEFAULT=3 / MAX_ATTEMPTS_SWE_BENCH=7(场景动态选择)
QueryEngine.java L540-585 → SelfCorrectionLoop.java · 错误检测 → 修复指令生成 → 重试/中止 ① Feature Flag 检查 SELF_CORRECTION_LOOP QueryEngine.java:540 ② 查找 Bash 工具输出 遍历 AssistantMessage 仅处理 name=="Bash" :553 ③ shouldAbort() 检查 错误数↑ | 新文件 | 新类型 SelfCorrectionLoop:145-179 修复引入新错误 → 立即中止 ABORT: resetAttempts ④ detectAndPrepareCorrection() 编译错误优先 → 测试失败次之 SelfCorrectionLoop:68-129 attempts >= MAX_ATTEMPTS(DEFAULT=3 / SWE_BENCH=7)→ 放弃 CompileErrorParser Java/TS/Python 编译错误识别 优先级 HIGH · SelfCorrectionLoop:86 TestFailureParser JUnit/Jest/Pytest 失败识别 优先级 LOW · SelfCorrectionLoop:105 CorrectionInstruction 生成 instruction ≤ 800 tokens truncateToTokenLimit :246 Token 限制 MAX_INSTRUCTION_TOKENS=800 MAX_STACK_TRACE_LINES=3 重试循环 · QueryEngine.java:566-579 注入纠错 UserMessage correction.instruction() QueryEngine:572-575 incrementAttempts attempts++ (max 3) QueryEngine:577 保存 previousToolOutput 供下轮 shouldAbort 对比 QueryEngine:578 继续 Agent Loop LLM 基于指令重新修复 → Step 1 (下轮循环) 重试循环 (≤3次) — 下轮再次进入 Step 5.5 检查 ✓ 成功: 无错误检出 → 正常继续 Step 6 ✗ 中止: 新错误引入 → resetAttempts :561 ⚠ 超限: attempts≥3 → 放弃修复,继续循环 :72 SelfCorrectionLoop shouldAbort() · isPersistentError() engine/correction/ · 错误检测与修复决策

Run 控制与运行中 Steering

▶ RunExecutionRegistry + RunControlService 运行中输入CAS 终态
1
注册活跃执行
QueryEngine 启动 Run 时向 RunExecutionRegistry 注册 runId、sessionId 与 AbortContext;Registry 只维护当前进程内的活跃映射和取消上下文。
2
运行中输入与 Steering 回执
前端向 /app/run-input 发送 requestId/text,服务端按已认证 Session 查找活跃 Run 并进入内存队列;客户端事件统一为 queued / applied / rejected。
3
取消、进程终止与 checkpoint 分工
AbortContext 提供协作式取消,ManagedProcessRunner 负责超时后的梯度终止;CheckpointService 独立保存子 Agent checkpoint,不属于 Registry 输入队列。
4
CAS 单一终态
RunControlService 通过 compare-and-set 只接受一个 COMPLETED / FAILED / CANCELLED / INTERRUPTED 终态,迟到回调不能覆盖权威结果。
WebSocket / RESTsteer · cancel · resumeSession-bound requestId/text RunExecutionRegistryactive run · steering queuein-memory · cancellation QueryEngineturn boundary 消费输入applied/rejected Run 事件 RunControlServiceCAS terminal state完成 / 失败 / 取消 / 中断 重连恢复完整 Session 消息、最新 Run snapshot/event sequence、活跃工具状态与待处理持久交互
04

统一权限分析、授权与执行准入

authorization/ · V015 Durable Interaction · V019 Permission Grant · V020 Project
▶ STAGE 1: 统一授权与执行主链 11 个职责边界
1
Schema / Tool / PreToolUse
输入补全后执行 Hook;Hook 改写输入时重新执行完整 Schema 与 Tool 校验
2
冻结规范输入
FrozenToolInput · canonical JSON · inputHash
3
Subject + Operation Analyzer
从 Run ancestry 解析 root identity,再按显式 toolName → analyzerId 选择 Analyzer
4
OperationDescriptor + invariant
effect/resource/environment/network/risk;拒绝非法资源字符与敏感继承环境
5
只收紧 Security Hook
只读取冻结输入和已生成事实;可以拒绝,但不能修改输入或扩大授权
6
SAFE_INTERNAL / Grant
精确 SAFE_INTERNAL 由内建策略放行,否则匹配 scope、profile、Analyzer 版本与约束
7
权限模式裁决
DEFAULT / PLAN / ACCEPT_EDITS / DONT_ASK / AUTO_APPROVE;自动批准只替代人工确认,不绕过硬拒绝、安全 Hook、SSRF 防护或部署沙箱。
8
Durable Interaction v3
optionId / descriptorHash / scopeOptions / expectedVersion / deliveryGeneration;ACK 只确认投递,用户决定由数据库 CAS 产生唯一终态
9
声明输出规划
planOutputs() 在 Gateway 前生成无副作用的产物声明;工具并发/work lease 由上游 StreamingToolExecutor 管理
10
最终动态与 Grant 复检
仅在路径、符号链接、风险或授权约束发生安全退化,或 Grant 撤销/过期时拒绝;无害环境变化不得误拒绝
11
ToolExecutionGateway
短事务提交 execution_admitted/tool_started 与声明输出,事务外调用冻结输入对应的 Tool.call()
▶ Grant 能力与继承矩阵 策略参考
A
高风险与复杂 Shell
只允许 ONCE,不创建可复用 Grant
B
Guarded exact Bash
只支持 RUN / SESSION,不支持 WORKSPACE
C
受约束文件能力
安全读与 typed edit 可按约束支持 WORKSPACE
D
未知 MCP / 动态 Tool
GenericMcpAnalyzer · exact ONCE
E
子代理受控继承
root session/root run + DIRECT_ONLY/ROOT_AND_DESCENDANTS
▶ 权限模式与授权范围 5 模式 · ONCE决策 + 3持久Grant范围
✓
授权结果与作用域
权限模式:DEFAULT PLAN ACCEPT_EDITS DONT_ASK AUTO_APPROVE
授权范围:ONCE(一次性决策,不持久化) RUN SESSION WORKSPACE (后三者为持久 Grant 范围)
核心组件: AuthorizationService · OperationAnalyzerRegistry · PermissionGrantRepository · DurableInteractionService · ToolExecutionGateway
证据边界 源码、测试与运行交叉核验
✓
架构事实来源
权限模式、Grant 范围、Project 边界和执行前复检以当前提交中的枚举、服务实现、数据库迁移与自动化测试为权威依据。
↻
运行证据边界
运行日志仅用于内部交叉核验关联上下文、工具链和恢复路径;不公开任务内容、路径、会话标识、时间窗口或运行统计,也不将未覆盖能力标记为日志已验证。
▸ 统一授权与执行准入全景流程
AuthorizationService · OperationAnalyzerRegistry · ToolExecutionGateway 校验/Hook → 冻结输入 → root subject + Analyzer → 只收紧安全 Hook → 授权 → Gateway 复检与执行 STAGE 1: 输入冻结与授权事实 OperationDescriptor 由 Analyzer 基于冻结输入生成 VALIDATION / POLICY DENY WAITING INTERACTION Schema 校验 参数补全与重验 Tool.validateInput() PreToolUse Hook 可改输入 / 可拒绝 改写后完整重验 FrozenToolInput canonical JSON + inputHash 执行输入由冻结字节重建 Subject + Analyzer root identity / analyzerFor() 核心工具漏配即失败 OperationDescriptor operationHash effect/resource/risk + invariant Security Hook 只可收紧 / 可拒绝 基于冻结事实执行 SAFE_INTERNAL 命中即 POLICY ALLOW 未命中才继续 Grant 初次 Grant 匹配 命中即 GRANT ALLOW root/scope/profile/constraint Mode / Interaction v3 options + deliveryGeneration ACK ≠ decision · V015 CAS AuthorizedOperation ALLOW source policy/grant/user Declared Outputs planOutputs() 无副作用预声明 动态环境复检 analyzer.recheck() 仅安全事实退化时拒绝 准入短事务 Grant 最终复检 + 预声明 execution_admitted 提交 Tool Gateway 唯一生产入口 事务外 Tool.call(冻结输入) → DENY → ASK 授权通过 → 执行准入 Analyzer 约束、invariant 与最终动态复检始终生效,Grant 不能扩大边界 以下为授权策略参考矩阵,不表示后续运行时阶段 REFERENCE A: Grant 与作用域 受约束复用,不保存 HIGH/复杂 Shell RUN / SESSION Guarded exact Bash / exact file SESSION / WORKSPACE 受约束文件 read/edit capability 匹配 → ALLOW 未匹配 → 模式或交互裁决 REFERENCE B: 模式、Scope 与继承 5 种权限模式 · 授权范围见 REFERENCE A 无 Grant → 按模式裁决 SAFE file read 可按模式放行 DEFAULT 用户确认 PLAN 只读放行 ACCEPT_EDITS 编辑放行 DONT_ASK 仅 SAFE file read AUTO_APPROVE 硬拒绝仍生效 ROOT_AND_DESC 子代理受控继承 DIRECT_ONLY RUN 不跨 actor 子代理通过 root session/root run 身份直接匹配 Grant 不经过第二套冒泡授权权威 最终结果: AuthorizedOperation / DENY / WAITING_INTERACTION

Grant、权限模式与持久交互

▸ AuthorizationService 裁决与 V015/V019 数据权威
AuthorizationService · PermissionGrantRepository · DurableInteractionService SAFE_INTERNAL → Grant → mode → Durable Interaction;任一允许分支生成 AuthorizedOperation authorizePrepared(Tool, FrozenToolInput, PreparedOperation) root session/root run + operationHash + effect/resource/risk SAFE_INTERNAL exact effect? → POLICY ALLOW YES NO 受约束 Permission Grant 命中? → AuthorizedOperation HIT scope/profile/constraint/analyzerVersion MISS 未命中 Grant → 应用 PermissionMode Mode 阶段(无需用户交互) PLAN / DONT_ASK ACCEPT_EDITS 安全读取/受控编辑可按模式放行;需交互操作不得静默放行 ALLOW(记录授权来源) 模式明确允许 DEFAULT 或需显式确认 Durable Interaction(需要用户决策) optionId + expectedVersion deliveryGeneration + ACK 服务端提供 decision/scope options;同事务 CAS 终态并按需创建 Grant ALLOW(ONCE 或 Grant) ANSWERED allow DENY / EXPIRED DENIED / EXPIRED / UNDELIVERABLE 交互超时 → EXPIRED · DONT_ASK → 结构化拒绝 V015 interaction_requests · CAS 单一交互权威 V019 permission_grants · 约束、过期与撤销

V020 Project 工作空间信任边界

▶ Project 授权、Session 工作目录与路径归一化 V020Fail Closed
1
选择并持久授权 Project
直连本机且显式启用时可使用原生目录选择器;远程、反向代理和生产部署只浏览配置的 allowed roots。服务端保存可查询、切换和撤销的 V020 Project 记录。
2
绑定 Session 默认相对路径根
服务端解析真实、规范化绝对路径并拒绝根目录、符号链接别名、身份重绑定及规范化失败;Session 只接受 projectId,客户端任意 workingDirectory 会被拒绝。
3
越界重新进入授权链
Project 内普通文件读取或编辑是否自动允许取决于权限模式和 Grant;Project 外资源重新经过 Analyzer、AuthorizationService 与 Gateway 最终复检。
4
边界说明
Project 是持久、可撤销的信任范围和默认相对路径根,不是通用 OS 沙箱;Bash、敏感文件和高风险操作始终受独立安全控制。
Project Selection本机 picker / 远程 allowed roots不信任客户端 cwd 字符串 Path Normalizationreal / canonical path符号链接与别名复检 V020 Project Recordpersistent · revocableSession root binding Authorization + Gateway普通文件读写 / 越界复检硬拒绝 / Hook / Sandbox 不变 任意 cwd / 根目录 / 未授权根 / 别名或重绑定 / 规范化失败 → 拒绝绑定
05

Bash 安全模块 — 6层 AST 解析

tool/bash/ · 语义分析、分类、路径和执行前复检
AST 解析架构 (递归下降)
parseProgram()
└─ parseStatements(terminator)
└─ parseAndOr()
└─ parsePipeline()
└─ parseCommand()
├─ parseSimpleCommand()
├─ parseIf / While / For
├─ parseFunction
└─ subshell / compound
核心组件
BashParserCore递归下降解析器
BashCommandClassifier命令分类引擎
BashLexer词法分析器
BashSecurityAnalyzerAST 安全扫描
PathValidator路径安全校验
SedValidatorsed 命令校验
HeredocExtractorheredoc 提取
安全分析结果模式: Simple(commands) TooComplex(reason) ParseUnavailable

Bash 安全模块 AST 解析流水线 — 6层纵深防御 · 17文件

Bash Command Input BashTool.java → 安全执行入口 L1 词法分析 Lexer BashLexer.java BashToken.java BashTokenType.java L2 语法分析 Parser → AST BashParserCore.java BashParser.java 递归下降解析 L3 AST遍历 — 节点分析 + 命令识别 BashAstNode.java ParseForSecurityResult.java HeredocExtractor L4 风险评分 — 危险命令检测 BashSecurityAnalyzer.java BashCommandClassifier.java L5 路径验证 + 命令校验 PathValidator SedValidator ShellStateManager L6 沙箱隔离执行 SandboxManager SandboxConfig Docker容器隔离 危险命令示例 rm -rf / chmod 777 /etc/passwd curl | bash dd if=/dev/zero of=/dev/sda export PATH="" mkfs.ext4 /dev/sda :(){ :|:& };: → DENY / ASK 安全分析结果 Simple → ALLOW TooComplex → ASK ParseUnavailable → DENY 覆盖 CWE 风险指标 CWE-78 命令注入 CWE-94 代码执行 CWE-22 路径穿越 CWE-73 文件劫持 沙箱决策分支 低风险 直接执行 中风险 用户确认 高风险 Sandbox SandboxManager Docker隔离 tool/bash 语义分析 | sandbox 容器隔离 | security Hook与敏感路径保护

Docker 沙箱隔离 — 容器级安全边界 — SandboxManager.java · SandboxConfig.java

Docker 沙箱隔离架构 — SandboxManager + SandboxConfig + ToolExecutionGateway 主机环境 (Host OS) 主机文件系统 /app/data → 持久化数据 (SQLite) ${WORKSPACE_PATH} → 用户代码项目 docker-compose.yml volumes 定义 Docker Daemon docker info → 可用性检测 (缓存) 资源限制 (deploy.resources) memory limit: 4g (docker-compose) memory reservation: 1g 沙箱命令限制: -m 512m (SandboxConfig) SandboxConfig.java:24 memoryLimit SandboxConfig.java:12-57 enabled = false (默认关闭) image = ai-code-assistant-sandbox:latest timeoutSeconds = 300 networkEnabled = false mountMode = "ro" (只读) @ConfigurationProperties(prefix="sandbox") Docker 容器安全边界 (docker run --rm --read-only) 只读根文件系统 (--read-only) / → 只读 (容器根) /workspace → ${mountMode} 挂载 (默认 ro) /tmp → tmpfs rw,noexec,nosuid,size=100m SandboxManager.java:157-160 buildSandboxedProcess() 网络隔离 (--network=none) 默认: 完全禁用网络 networkEnabled=false → --network=none 阻断: curl, wget, nc, ncat, telnet SandboxManager.java:167-169 + :108-110 seccomp 系统调用过滤 --security-opt seccomp=${seccompProfile} SandboxManager.java:172-175 null=Docker默认配置 超时控制 (双重保护) timeout 300s (命令内嵌) + waitFor() SandboxManager.java:178,226-229 destroyForcibly() 命令沙箱路由 — shouldUseSandbox() :91-135 破坏性命令 → 强制沙箱: rm, rmdir, mv, chmod, chown, mkfs, dd, format, fdisk, parted 网络命令 → 强制沙箱: curl, wget, nc, ncat, telnet sudo 包装检测: 解包 sudo 前缀后再匹配首命令令牌 条件: isSandboxingEnabled() = config.enabled && isDockerAvailable() AuthorizationService — 沙箱不扩大授权边界 finalDynamicRecheck() → ToolExecutionGateway.execute() 顺序: Analyzer/Grant/Interaction → Gateway 复检与准入事务 → BashTool.call() 沙箱仅是 BashTool 内部的可选执行隔离;不会为文件或 Bash 操作自动授权 Docker 不可用或未启用时不改变 AuthorizationService 的风险、作用域与交互裁决 安全边界: sandboxManager.isSandboxingEnabled() 只选择执行路径,不是授权来源 docker run sandbox/ | 隔离层: read-only FS + network=none + seccomp + mem 512m + timeout 300s | 非root用户: zhikun
06

LLM 多提供商架构

llm/ · Provider注册、能力目录、重试与降级
▶ Provider 抽象层
LlmProviderRegistry — 提供商注册中心
├── AnthropicProvider → Claude 系列
└── OpenAiCompatibleProvider
├── OpenAI GPT
├── 通义千问 (Qwen)
├── DeepSeek 直连(deepseek-flash / V4.1 Flash 原生视觉)
├── Moonshot / Kimi
├── 智谱 GLM-5.3
├── ZenMux:Anthropic → Chat Completions;OpenAI / Google / xAI → Responses
└── Ollama 本地部署
模型别名:
light → qwen3.8-max-0902
standard → qwen3.8-max-0902
premium → qwen3.8-max-0902
百炼 Token Plan → qwen3.8-max / qwen3.8-flash / deepseek-v4-pro-0813 / deepseek-v4-flash-0731 / deepseek-v4.1-flash(独立 Provider;服务端 app.model.default 为 V4.1 Flash;前端初始偏好为千问,配置与选择优先)
主对话跟随用户选择;Agent 优先使用显式 model,其次继承父查询模型,最后由 premium 别名兜底;Agent 型 Task 沿用继承与兜底规则。快速查询用 LLM_FAST_MODEL,摘要用独立的 LLM_COMPACT_MODEL,图片兜底用 LLM_VISION_FALLBACK_MODEL;快速查询与图片兜底默认 deepseek-v4.1-flash(百炼),摘要默认 deepseek-flash(DeepSeek 官方直连)。两款默认模型的流式请求与压缩摘要均发送 thinking=enabled、reasoning_effort="max"(DeepSeek 官方直连的非流式快速查询不注入 thinking)。
▶ 辅助组件
ModelRegistry
模型配置注册
MessageParamConverter
消息参数转换
ThinkingBudgetCalculator
thinking预算
LlmErrorClassifier
错误分类
RetryPolicy
重试策略
ApiKeyRotationManager
密钥轮换管理

ZenMux Responses — 推理、工具调用与跨轮状态闭环

▶ 精确模型路由 → 无服务端会话请求 → SSE 终态门禁 → 原始状态续轮 内部状态公开脱敏
1
仅四个精确模型进入 /responses
openai/gpt-5.6-sol、openai/gpt-6-astra、google/gemini-3.8-flash、x-ai/grok-4.6。Opus/Fable 与同步调用仍走 Chat Completions。
2
请求不依赖 ZenMux 服务端会话
store:false,不发送 previous_response_id/conversation;请求 encrypted reasoning、并行工具调用与显式输出预算。
3
成功终态后才执行工具
并行函数调用按输出项分桶;只有 response.completed 才交给工具执行器。失败、错误或无终态 EOF 均失败关闭;无函数调用的 max-output incomplete 可恢复。
4
完整输出保存在内部状态块
provider_response_state 按原顺序保存 provider、精确模型、摘要和完整 response.output[];不新增数据库表。
5
同 provider + model 才权威回放
匹配时原始状态原子回放并独立计入 Token 预算;模型切换或 fallback 时忽略该状态,改用普通文本、thinking 与工具投影。
6
所有公开出口统一脱敏
PublicMessageProjection 覆盖 REST、WebSocket、分页恢复和 JSON/Markdown 导出;原始状态、签名与 encrypted_content 永不离开后端。
LLM 多提供商抽象层架构 LlmProvider 统一接口 chat() / streamChat() / getModels() AnthropicProvider Claude 系列 · 独立适配 sonnet-4-6 / haiku-4-5 OpenAiCompatibleProvider Chat Completions + ZenMux Responses OpenAI / ZenMux GPT direct · ZenMux C/R gateway 通义千问 Qwen 3.8-max-0902 · 3.8-max(百炼) DeepSeek v4 pro/flash · dated(百炼) Moonshot / Kimi kimi-k3 Ollama 本地 llama / qwen-local 智谱 GLM-5.3 glm-5.3 MiniMax-M3 thinking · prompt-cache ModelRegistry 模型配置注册中心 · 别名映射 LlmProviderRegistry ApiKeyRotation 密钥轮换 Anthropic 独立适配 OpenAI兼容层(Chat + Responses) 本地部署支持

模型降级与容错 — 多 Provider 自动切换

ModelTierService 多级模型降级链 ModelTierService.java:65 · ModelDegradationChain.java:28 · ApiRetryService.java:74 · ApiCircuitBreaker.java QueryEngine :303 调用 resolveModel() ModelTierService resolveModel(preferred, tierChain) 冷却检查 → 遍历降级链 → 选择最优可用 Effective Model cooldown=30min · recovery≥3次成功 ModelDegradationChain.DEGRADATION_CHAINS — 3条降级链 (MAX_DEPTH=3) Tier 0 主模型 Tier 1 Tier 2 claude-sonnet-4-6 deepseek-v4.1-flash deepseek-flash 跨厂商降级 qwen3.8-max-0902 deepseek-v4.1-flash deepseek-flash 百炼 → DeepSeek 直连 deepseek-v4.1-flash deepseek-flash qwen3.8-max-0902 直连 → 千问 注:未在表中的模型(Claude Haiku、GPT、Kimi、GLM 等)走 ModelTierService 默认策略,不触发降级链 LlmErrorClassifier 6类错误分类 → 触发降级 OVERLOADED 529/503 RATE_LIMITED 429 PROMPT_TOO_LONG 413 AUTH_FAILED 401/403 NETWORK_TIMEOUT UNKNOWN ● 可重试: OVERLOADED / RATE_LIMITED / TIMEOUT ✕ 不可重试: PROMPT_TOO_LONG / AUTH_FAILED 529 → triggerCooldown() → 模型降级链切换 分类基于 HTTP Status + 消息关键词匹配 ApiCircuitBreaker 状态机 3态熔断 · FAILURE_THRESHOLD=3 · RECOVERY=60s CLOSED ≥3 fails OPEN 60s后 HALF_OPEN 探测成功 探测失败 熔断 → 拒绝请求 → 快速失败(503) 半开 → 允许探测 → 成功恢复/失败重熔 密钥轮换 + 重试策略 ApiKeyRotationManager ModelAwareRetryPolicy ▸ Round-robin 轮换(ZenMux: PRIORITY_FAILOVER 主Key优先) Key₁ → Key₂ → Key₃ → ⟲ 循环 429限流 → 冷却60s → 自动跳过 全部冷却 → 选最早解冻Key ▸ ModelAwareRetryPolicy (指数退避+25%jitter) Claude: 5次 | base=60s | 遵循retry-after Qwen: 8次 | base=10s | 忽略retry-after DeepSeek: 6次 | base=20s | 遵循retry-after 恢复: 冷却30min → 健康探测(5min间隔) → 连续3次成功 → 移除冷却

Provider 的逗号分隔多 Key 配置支持轮换;OpenAiCompatibleProvider 对订阅额度错误标记 Key 冷却,ApiKeyRotationManager 跳过冷却 Key。全部冷却时返回最早恢复的 Key,不保证仍有可用额度;这与模型降级是不同机制。

API 密钥轮换 — ApiKeyRotationManager

API 密钥轮换机制 — Round-robin + 冷却跳过 ApiKeyRotationManager.java · ConcurrentHashMap<Key,Instant> 冷却表 · AtomicInteger 轮换索引 Key Pool 密钥池 :30 List<String> apiKeys Key₁ sk-abc1...*** ● 可用 Key₂ sk-def2...*** ⏳ 冷却中 Key₃ sk-ghi3...*** ● 可用 Key_N ...(可扩展) ⟲ Round-robin 轮换 :31 AtomicInteger currentIndex :72 getAndUpdate(i → (i+1) % size) :39 过滤 null/blank · :42 log key数量 getNextKey() 轮换流程 :59-90 · 冷却检查 → 轮换 → 降级选择 :60 apiKeys.isEmpty()? 非空 :63 size==1 → 直接返回 多Key :71 for(attempt=0; attempt<size) :76 cooldown==null || now.isAfter(cooldown) → 返回 全部冷却 :82 所有Key冷却! :83-89 stream().min(cooldownUntil) → 最早解冻 返回可用 Key 冷却管理 CooldownMap :32 ConcurrentHashMap<String, Instant> markRateLimited(key) :109 触发: HTTP 429 限流响应 :111 cooldownUntil.put(key, now+60s) DEFAULT_COOLDOWN = 60s :28 Duration.ofSeconds(60) clearCooldown(key) :128 cooldownUntil.remove(key) hasAvailableKey() :141 anyMatch → cooldown过期? 429! :113 log.warn("API key rate-limited, cooldown until {}: key={}...{}", until, key[0:8], "***")
06a

Token 预算与模型策略

▶ IncrementalCollapseManager 增量折叠
注解@Service @ConditionalOnProperty(name="context.cascade.incremental-collapse.enabled")
shouldCollapse()累计 turnCount,每10轮触发折叠
recordCollapse()记录折叠段元数据
状态管理会话级 ConcurrentHashMap · 30分钟超时自动清理
▶ ModelTierService 模型降级
注解@Service
resolveModel()选择最佳可用层级
triggerCooldown()API容量错误 → 冷却管理
reportSuccess()健康探测恢复(3次成功阈值)
冷却策略30分钟默认 · retry-after感知 · 短期重试豁免

WebSocket/STOMP 实时通信时序 — 前端↔后端双向通信全景 · 基于源码实证

STOMP over SockJS — UML 时序图 React 前端 stompClient.ts Spring WebSocket 层 WebSocketConfig STOMP Broker /topic + /queue 业务服务层 Controller 1 连接阶段 SockJS /ws 握手 new SockJS('/ws') → withSockJS() CONNECT Authorization: Bearer token + X-Session-Id StompAuthInterceptor 验证 CONNECTED SessionManager 注册 Principal↔SessionId 2 订阅阶段 SUBSCRIBE /user/queue/messages Broker 注册订阅 → 25种 ServerMessage 推送通道 SEND /app/bind-session 绑定 sessionId → SessionManager.bindSession() 3 用户消息 SEND /app/chat @MessageMapping("/chat") → QueryEngine sendUserMessage(text, attachments, references) 4 流式响应 push("stream_delta") MESSAGE /user/queue/messages stream_delta | thinking_delta | tool_use_start | tool_result ... tool_use_progress message_complete + cost_update + task_update 5 权限交互 permission_request → /user/queue/messages interactionId + optionId/scopeOptions + operationHash + deliveryGeneration SEND /app/interaction-received interactionId + deliveryGeneration → ACK 后启动 300s 决策窗口 用户决定: POST /api/interactions/{id}/decisions(protocol v3 + expectedVersion + optionId) 6 心跳检测 STOMP heartbeat 10s/10s + /app/ping → pong heartbeatScheduler (ws-heartbeat- 线程) 7 断线重连 指数退避 1s→2s→4s→8s→10s 重连 → SockJS /ws + CONNECT + bind-session session_restored → 完整消息/活动 + Run snapshot/event seq + 活跃工具 + 待处理交互 关键配置参数 端点: /ws (SockJS) 心跳: 10s/10s 重连: 1s→10s cap 超时: 10min 消息限: 128KB 缓冲: 1MB 发送超时: 30s Client→Server 12 @MessageMapping Server→Client 25种推送类型 线程池: 4~20 队列: 200 TTL清理: 5min 主要 Client→Server 端点 /app/chat /app/interaction-received /app/permission (v2拒绝) /app/interrupt /app/model /app/permission-mode /app/command /app/mcp /app/rewind /app/elicitation /app/ping /app/bind-session WebSocketController.java 后端 websocket/ 4文件 WebSocketConfig.java 前端 stompClient.ts dispatch.ts useWebSocket.ts

WebSocket/STOMP 实时通信 — 双向消息、结构化卡片与重连对账

▸ WebSocket/STOMP 实时通信协议栈 — 源码验证
LAYER 1 · CONNECTION WebSocketConfig.java:79 — registry.addEndpoint("/ws").withSockJS() Browser SockJS Fallback new SockJS('/ws') Spring STOMP Broker SimpleBroker /topic + /queue Transport: 128KB msg 1MB buf · 30s timeout LAYER 2 · STOMP FRAMES @stomp/stompjs · CONNECT headers: Authorization + X-Session-Id CONNECT Bearer + SessionId SUBSCRIBE /user/queue/messages SEND /app/* destinations MESSAGE Server → Client HEARTBEAT 10s in / 10s out ERROR onStompError Frontend · stompClient.ts #1 sendUserMessage() → /app/chat #2 acknowledgeInteraction() → /app/interaction-received #3 sendInterrupt() → /app/interrupt #4 sendSetModel() → /app/model #5 sendSetPermissionMode() → /app/permission-mode #6 sendSlashCommand() → /app/command #7 sendMcpOperation() → /app/mcp #8 sendRewindFiles() → /app/rewind #9 sendElicitationResponse() → /app/elicitation #10 sendPing() → /app/ping #11 bind-session (onConnect) → /app/bind-session SUBSCRIBE: /user/queue/messages → parseMessage() → dispatch() → Zustand Store L165: client.subscribe('/user/queue/messages', ...) Topic Routing · 双向消息流 Client → Server (SEND) Application prefix: /app /app/chat /app/interaction-received /app/interrupt /app/model /app/permission-mode /app/command /app/mcp /app/rewind /app/elicitation /app/ping /app/bind-session /app/permission(v2拒绝) /app/activity-save /app/activity-update Server → Client (MESSAGE) /user/queue/messages convertAndSendToUser() /topic/session/{id} convertAndSend() broadcast 受控消息类型白名单 (VALID_MESSAGE_TYPES) stream_delta · thinking_delta · tool_use_start · tool_result permission_request · cost_update · task_update · agent_spawn Backend · WebSocketController.java @MessageMapping 14 handlers /chat L464 → executeQuery() Virtual Thread /permission 协议 v2 → REST v3 错误 /interaction-received deliveryGeneration ACK /interrupt L801 → AgentLoop cancel /model L840 → sessionModels.put() /permission-mode L869 /command L888 → SlashCommand dispatch /mcp L991 → McpClientManager /rewind L1047 → file rollback /elicitation L1069 → ElicitationService /ping L1085 → sendPong() /bind-session L1094 → principal↔sessionId /activity-save L1185 /activity-update L1226 Server Push (messaging.convertAndSend*) SimpMessagingTemplate → /user/queue/messages SimpMessagingTemplate → /topic/session/{id} LAYER 4 · HEARTBEAT & RECONNECT Heartbeat 10s / 10s ws-heartbeat- scheduler 指数退避: 1s → 2s → 4s → 8s → 10s cap RECONNECT_TIMEOUT = 10min · stompClient.ts:107-109 CONNECT Auth Interceptor Bearer Token / Anonymous Principal Inbound Channel Pool core=4 max=20 queue=200
08

MCP 双向协议架构

mcp/ 30文件 (main/源码,含测试则34文件/)
McpClientManager · 4协议 Client/Server 双向支持 MCP 2024-11-05 规范 生命周期: connect→init→ready→close STDIO · SSE · HTTP · WebSocket
MCP 双向协议架构 · 4种传输层 MCP Client 消费外部工具 McpClientManager McpServerConnection McpToolAdapter McpPromptAdapter TokenEncryption · AES SseHealthChecker · 心跳检测 MCP Server 暴露自身工具 McpServerEntrypoint McpServerToolHandler McpApprovalService · 审批 传输协议层 STDIO SSE HTTP Streamable WebSocket ServerStdio mcp/ 30文件(main) Client 20文件 + Server 4文件 + Transport 6文件 ◀ Client → 外部MCP服务器 外部客户端 → Server ▶ 4种核心传输实现 + 4种扩展类型定义 SSE_IDE · WS_IDE · ZHIKUN_AI_PROXY Client端数据流 Server端数据流 双向传输通道
MCP 协议双向通信架构 · Client/Server · 4种传输 协议版本: MCP 2024-11-05 规范 外部 MCP Servers(被 Client 连接) ZhikunCode · MCP Client 连接外部 MCP Server,调用远程工具 McpClientManager Connection ToolAdapter Prompt Encrypt AES-GCM ZhikunCode · MCP Server 暴露本地工具给外部 MCP Client McpServerEntrypoint McpServerToolHandler McpApprovalService · 审批 ── 4种传输协议通道 ── ⬤ STDIO · 进程管道 ⬤ SSE · 服务端推送 ⬤ HTTP · Streamable ⬤ WebSocket · 全双工 连接生命周期管理 connect → initialize → ready → close 外部 MCP Clients(连接 Server) Client 数据流 Server 数据流 协议通道 生命周期流 MCP 2024-11-05 · McpClientManager 4协议
09

工具系统

40+ 内置工具 · MCP / 插件 / 平台条件工具动态扩展
▶ 工具分类树
文件操作
ReadFile
WriteFile
EditFile
ListDir
SearchFiles
执行 & 终端
BashTool → Sec §5
TaskCreateTool
NotebookEditTool
搜索 & 分析
GrepTool
GlobTool
CodeSearchTool
Agent & 协作
AgentTool
MemoryTool → §11
McpTool → §7
Web & Git
WebFetchTool
WebSearchTool
GitTool
共 51 个工具实现 · 工具提供 Schema/元数据,生产授权由 Analyzer + AuthorizationService + Gateway 统一负责
▸ 工具分类与执行管道全景
内置工具 × 5 层执行管道 工具分类树 — 40+ 内置工具 / 5类 · 动态扩展 核心执行 (8) BashTool PowerShellTool REPLTool TerminalCaptureTool 文件操作 (5) FileReadTool FileEditTool FileWriteTool GlobTool GrepTool 代码分析 (4) GitTool LspTool SnipTool SearchTool Web工具 (3) WebFetchTool WebSearchTool WebBrowserTool 任务监控 (3) MonitorTool CronTools + AgentTool, McpTool, MemoryTool, NotebookEditTool ... 执行管道 — 5层栈结构 L1 ToolRegistry 工具注册表 — 工具发现与注册 AbstractTool → Schema/元数据 + 注册;Analyzer 决定授权事实 L2 ToolExecutionPipeline 执行管道 — 核心编排引擎 参数校验 → 统一授权/Gateway → 执行调度 → 超时控制 L3 StreamingToolExecutor 流式执行器 — 大输出处理 流式输出 → 增量传输 → 内存控制 → 背压 L4 Hook / Callback 钩子层 — 前后置处理 onBefore → 日志/审计 → onAfter → 通知 L5 ToolResult 结果聚合 — 统一输出 格式化 → Snip截断 → JSON封装 → 返回Agent 注册 调用 tool/ 105+文件 ~ 核心执行×8 文件操作×5 代码分析×4 Web×3 监控×3 其他×18
▸ 工具执行 9 阶段管道 · ToolExecutionPipeline · StreamingToolExecutor · VirtualThread并发
ToolExecutionPipeline · 9 阶段执行闭环 · StreamingToolExecutor 并发模型 1 validateSchema JSON Schema V7 验证 networknt json-schema-validator validateSchema(tool, input) 失败: ToolInputValidationException 或降级为警告(non-strict) ToolExecutionPipeline.java L68 2 validateInput 工具自定义验证逻辑 tool.validateInput(ToolInput, ctx) 返回: ValidationResult { isValid, errorCode, errorMessage } 失败: ToolResult.error(...) 2.5 backfillObservableInput() 3 PreToolUse Hook HookRegistry → HookService hookService.executePreToolUse() matcher过滤 → handler执行 HookResult { proceed, message, modifiedInput, modifiedOutput } 拦截: proceed=false → 终止执行 HookService.java · HookRegistry 4 Permission Check 冻结输入 · Subject/Analyzer · Security Hook · 统一授权 AuthorizationService.authorizePrepared() ALLOW → 继续执行 DENY → 终止执行 INTERACTION → 等待数据库终态 ToolExecutionGateway 唯一生产执行入口 输出: AuthorizedOperation(policy/grant/user source) ━━━ PERMISSION GRANTED ━━━ 5 ToolExecutionGateway · 唯一 Tool.call() 入口 并发/VirtualThread 由上游 StreamingToolExecutor 管理 动态复检 → 短事务 Grant/ONCE/预声明/tool_started → 提交 → call() 上游 isConcurrencySafe()=true: 可并行调度,仍逐调用经过授权/Gateway 上游 isConcurrencySafe()=false: 独占调度,不改变权限裁决语义 失败恢复: attemptBashErrorRecovery() (Stage 5c) StreamingToolExecutor.java · 状态机: QUEUED→EXECUTING→COMPLETED→YIELDED 6 PostToolUse Hook PostHook链执行 hookService.executePostToolUse(toolName, output, sid) 可修改输出 / 拦截结果 敏感信息过滤: SensitiveDataFilter 返回: HookResult { modifiedOutput } HookService.java · SensitiveDataFilter 7 ContextModifier CAS循环更新执行上下文 result.getContextModifier() → UnaryOperator CAS更新 ExecutionSession.currentContext 仅非并发安全工具的modifier被应用 maxRetries=100 超时保护 AtomicReference<ToolUseContext> StreamingToolExecutor 并发模型 ExecutionSession · ConcurrentLinkedQueue · AtomicInteger isConcurrency Safe()? true 并行: Read/Glob/Grep/Token* false 独占: BashTool写操作 QUEUED EXECUTING COMPLETED YIELDED yieldCompleted(): 按原始顺序返回 (FIFO缓冲保证) ToolResultSummarizer 结果处理 三级策略 · 旧轮次清理 · Message注入 L1: ≤18K chars → 原样保持 L2: 18K-50K → 头12K+尾3K L3: >50K → LLM摘要(10s超时) 旧轮次清理: currentTurn - messageTurn > 8 → [tool result cleared] SOFT_LIMIT=18K · HARD_LIMIT=50K · LLM降级为截断 · 注入: Message.UserMessage.toolUseResult() ToolResultSummarizer.java · 轻量级模型 · 10s超时 监控指标 (Micrometer) Counter zhiku.tool.executions.total zhiku.tool.executions.errors Timer zhiku.tool.execution_time [tag:tool] Gauge zhiku.tool.virtual_threads.active ExecutionSession 结构: queue: ConcurrentLinkedQueue tracked: CopyOnWriteArrayList active: AtomicInteger currentContext: AtomicReference

插件生命周期 — 发现 · 隔离加载 · 注册 · 执行 · 卸载 — PluginManager PluginLoader PluginClassLoader

① 发现 Discovery PluginSystemInit @EventListener L23 @Order(100) 最后加载 loadAllPlugins() · SPI: ServiceLoader · JAR: ~/.zhikun/ plugins/*.jar PluginLoader.java L58 PluginSystemInit.java L34 ② 加载 Load + Validate validateJar() · JAR≤50MB L36 · SPI文件校验 L259 PluginClassLoader · URLClassLoader隔离 · API包→委托父CL · 其他→Fail-Closed PluginClassLoader.java L40 isApiCompatible() L221 ③ 初始化 Initialize createContext() · Logger注入 · Config读取 L275 ext.onLoad(ctx) · VirtualThread执行 · 5s超时 L104 · LoadedPlugin创建 PluginLoader.java L99 PluginExtension.java L68 ④ 注册 Register Components Command→Registry L140 Tool→Registry L149 Hook→Registry L156 MCP→Manager L207 命令前缀: plugin:cmd 钩子超时: 5s L177 虚拟线程池执行 PluginManager.java registerPlugin() L137 ⑤ 运行时 Runtime Execution PreToolUse L338 PostToolUse L345 · 优先级排序执行 · Pattern正则匹配 · ReadLock并发安全 → Agent Loop集成 8种HookEvent executeHooks() L352 ReentrantRWLock L54 ⑥ 卸载 Unload + Cleanup 注销命令 L230 注销工具 L235 注销钩子 L239 注销MCP L242 · onUnload() L249 · 关闭ClassLoader L256 (仅LOCAL) unloadAllPlugins() L227 @PreDestroy L271 PluginClassLoader 隔离边界 委托: plugin/tool/command/mcp 四个API包 隔离: 其他宿主类→ClassNotFoundException 放行: java.*/javax.*/slf4j 回退: Spring/Jackson/Jakarta 错误处理与降级路径 validateJar失败→跳过 | API版本不兼容→PluginError | onLoad超时(10s)→skip CLASS_LOAD_FAILED→PluginError | 钩子超时(5s)→allow() | 不阻止主应用 L37 Agent Loop 集成点 QueryEngine→executePreToolUseHooks()→工具执行→executePostToolUseHooks() 8种事件: PRE/POST_TOOL_USE · SESSION_START/END · TASK_COMPLETED ·· 热重载 reloadPlugins() L121 WriteLock → unloadAll → initializePlugins PluginManager PluginLoader PluginClassLoader PluginExtension LoadedPlugin PluginSystemInitializer HookHandler
▸ 工具权限决策模型 — 5种权限模式 · ONCE一次性决策 + 3种持久Grant范围 · 执行前复检
5模式 / ONCE决策 + 3持久Grant范围 DEFAULT · PLAN · ACCEPT_EDITS · DONT_ASK · AUTO_APPROVE DEFAULT — 写操作弹窗确认 PLAN — 仅 SAFE workspace file read ACCEPT_EDITS — 受控工作区文件写 DONT_ASK — 仅 SAFE 文件读,否则拒绝 AUTO_APPROVE — 自动确认,硬拒绝仍生效 一次性决策: ONCE(不持久化) 持久Grant: RUN / SESSION / WORKSPACE 工具元数据(PermissionRequirement,非授权权威): NONE ALWAYS_ASK CONDITIONAL 实际裁决只由 Analyzer、AuthorizationService 与 Gateway 完成 metadata 不得绕过 risk/effect/resource 与最终动态复检 统一授权与执行流程 AuthorizationService + PermissionGrantRepository Schema / Tool 校验 → PreToolUse → 重验 FrozenToolInput → canonical JSON + inputHash SubjectResolver + Analyzer → root identity / facts OperationDescriptor · risk/effect/resource Invariant + 只收紧 Security Hook SAFE_INTERNAL → Grant → 模式 → Interaction AuthorizedOperation → planOutputs() Gateway 动态/Grant 复检 → 短事务 → call() 授权组件: PermissionGrantRepository · 约束化 Grant OperationAnalyzerRegistry · 工具分析器 AuthorizationDiagnostic · 结构化裁决信息 PermissionModeManager · 模式管理 Bash 3层验证 BashCommandClassifier.java Layer 1: READONLY_COMMANDS ~60个纯只读命令 ls, cat, grep, find, wc, head... → 生成 SAFE/GUARDED 分析事实 Layer 2: READONLY_REGEXES 正则匹配只读命令模式 git log/status/diff, docker ps... → 参数级验证后交由 AuthorizationService Layer 3: COMMAND_ALLOWLIST Flag级别白名单验证 含6项安全加固规则 → 未命中 = 需要用户确认 危险/复杂输入 → HIGH + ONCE rm -rf / · chmod 777 · mkfs 不可创建持久 Grant;绝对黑名单直接拒绝 安全保护路径(不可绕过) .git .zhikun .env .ssh .gnupg .aws ← File/Bash Analyzer 与 finalDynamicRecheck 负责路径、链接和动态环境复检 OperationAnalyzerRegistry · PermissionGrantRepository · DurableInteractionService · ToolExecutionGateway 权限系统核心统计 AuthorizationService Bash Parser/Classifier(复用现有实现) OperationAnalyzerRegistry 5模式 · ONCE决策 + 3持久Grant范围 · 2继承策略 关键设计: 冻结输入 · 不变量不可覆盖 · 持久交互CAS · 子Agent按root identity匹配Grant · Gateway最终复检
▸ LSP 协议与编辑器集成 · lsp/ 8文件 · 9种操作 · JSON-RPC over stdio · 多语言支持
L1 前端 Monaco Editor @monaco-editor/react · TypeScript CodeDiagramGenerator.tsx CodeBlock.tsx MemoryEditorPanel.tsx 配置: vs-dark主题 · minimap禁用 · fontSize:12 · wordWrap:on Mermaid编辑+预览 SyntaxHighlighter · 文件编辑 React L2 HTTP 通信层 REST: POST /api/lsp/{operation} 请求: { operation, filePath, line, character } 响应: { result, success } HTTP L3 LSPTool.java implements Tool · 文件≤10MB · 位置转换 1-based→0-based goToDefinition → textDocument/definition findReferences → textDocument/references hover → textDocument/hover documentSymbol → textDocument/documentSymbol workspaceSymbol → workspace/symbol goToImplementation → textDocument/implementation prepareCallHierarchy → textDocument/prepareCallHierarchy incomingCalls → callHierarchy/incomingCalls outgoingCalls → callHierarchy/outgoingCalls POSITION_OPERATIONS: goToDefinition, findReferences, hover, goToImplementation, prepareCallHierarchy JSON-RPC L4 LSPServerManager.java 多服务器实例管理 · ConcurrentHashMap registerAndStart(config) getServerForFile(filePath) sendRequest(method, params) shutdown() 文件同步: openFile→didOpen · changeFile→didChange · closeFile→didClose serversByExtension: Map<ext, LSPServerInstance> · openedFiles: ConcurrentHashMap.newKeySet() 路由 L5 LSPServerInstance.java + 外部LSP进程 ProcessBuilder启动子进程 · JSON-RPC over stdio 初始化: initialize request → initialized notification · isRunning() 健康检查 · isIdleTimeout() 空闲超时 sendRequest(method, params) · sendNotification(method, params) · start() / stop() TypeScript LSP Python (Pyright) Java (Eclipse.jdt.ls) stdio LspCallHierarchyService 调用层级+降级 LSPTool LSPServerManager LSPServerInstance LspCallHierarchyService ChangeImpactAnalyzer LspService LSPServerConfig
9b

CLI 斜杠命令系统 — 7层交互式框架

command/ 9个核心类 + impl/ 37个实现· 88个已注册命令 · WebSocket STOMP 驱动
Frontend Web UI WebSocket STOMP Parser Registry Router 6层安全 Execute ×3 模型 CommandResult 5种·CommandType 3种·Virtual Thread 异步
CLI Slash Command Architecture · 7-Layer Interactive Framework WebSocketController.handleSlashCommand() L1 Frontend Web UI · 用户输入层 SlashCommandPicker / ChatInput · 识别 “/” 前缀才触发选器 输入示例: /commit · /model deepseek-r1 · /clear · /help /command [args] ClientMessage L2 WebSocket STOMP · 传输层 @MessageMapping("/command") · type: slash_command · 双向推送 服务端推送: command_result · stream_delta · tool_use_request /app/command STOMP frame L3 SlashCommandParser · 解析层 parse(rawInput) → ParsedCommand { name, args[] } 验证斜杠前缀 · 拆分命令名与参数 · 处理引号转义 parse() L4 CommandRegistry · 发现层 findCommand(name) → Optional<Command> · ConcurrentHashMap 名称/别名双索引 suggestSimilar(name) → Levenshtein 距离模糊匹配 · 返回 Top-N 候选 @PostConstruct 自动扫描 Spring Bean · register(Command) · 冲突检查 93 commands L5 CommandRouter · 路由与安全层 route(rawInput, context) → CommandResult · 6层安全闸门 ① SlashCommand 解析验证 ② 远程模式·32命令白名单 ③ 桥接模式检查 ④ 认证要求检查 ⑤ FeatureFlag 特性开关 ⑥ getAvailability() 可用性 CommandContext { sessionId, workingDir, currentModel, isAuthenticated, isRemoteMode, isBridgeMode, appState } CommandRouter.java · 任何一层失败 → CommandResult.error() execute(args, context) L6 Execution Layer · 三种执行模型 (CommandType) LOCAL 本地同步执行 execute() → text() /clear /help /status /version /cost /diff PROMPT LLM 驱动 Virtual Thread → QueryEngine 异步 /commit /review /plan /explain /security-scan LOCAL_JSX 前端组件渲染 → jsx(Map) 结构化 /model /config /mcp /permissions /agent L7 Backend Services · 服务依赖层 QueryEngine LLM执行·Agent循环 SessionManager 会话·上下文 ToolRegistry 工具注册·调用 ModelRegistry 多提供商路由 PermissionPipe 统一授权 CompactService · 上下文压缩 /compact · 5级级联 · ContextCascade Concurrency · ConcurrentHashMap<String,AtomicBoolean> sessionQueryRunning 同会话防并发 · PROMPT 命令 Virtual Thread 异步 REGISTERED COMMANDS 93 impl/ · 37 files · ~3,141 lines 9 大命令分类 会话 / 上下文 7 · clear context copy export… Git / 代码管理 8 · commit branch pr review… 代码分析 3 · search blame symbols 交互 / 输出 7 · help status compact undo… 配置 / 模型 9 · model config effort theme… 高级功能 11 · memory plan skill mcp… IDE / 集成 13 · bridge ide chrome init… AI 增强 10 · advisor agent buddy fork… 工作流 8 · workflows ultrareview… CommandResult · 5 种返回型 • TEXT 纯文本·直接展示 • PROMPT 提示词·触发 LLM • JSX Map·前端组件渲染 • COMPACT 压缩上下文结果 • ERROR 错误信息·不中断会话 CommandResult.java · 结构化命令结果 Command 接口 · 核心方法 String getName() CommandType getType() List<String> getAliases() Availability getAvailability() execute(args, context) Command.java · PromptCommand · 稳定接口职责 WebSocket 推送消息类型 → 入口:slash_command ClientMessage { rawInput, sid } ← 出口:command_result stream_delta · tool_use_request permission_request · error WebSocketController.java · slash_command / command_result
▶ 文件路径与核心类
command/ 核心接口
Command.java 基础接口
CommandType.java LOCAL / PROMPT / LOCAL_JSX
CommandContext.java 不可变命令上下文 record
CommandResult.java 5 种结构化结果
PromptCommand.java 提示词接口
command/ 调度与解析
SlashCommandParser.java parse()
CommandRegistry.java 命令注册与发现
CommandRouter.java 6 层安全路由
command/impl/ 命令实现集合
websocket/WebSocketController handleSlashCommand()
09c

运行时验证 — 双模 Verifier 多态分发

VerifyJourneyTool · VerifierFactory · Browser/HTTP API · Evidence + STOMP
Java Verifier 接口 Python httpx 异步 能力域感知 8 Action 策略字典 MAX_STEPS=500 Browser 120s · HTTP API 60s · Evidence + STOMP verify_progress
▸ 运行时验证多态分发机制 — VerifierFactory 双模选择
// VerifyJourneyTool.call() → VerifierFactory.selectVerifier() → Browser | HTTP API VerifyJourneyTool.call() Tool 入口 · @ALWAYS_ASK · isOpenWorld=true backend/tool/verify/VerifyJourneyTool.java parse verification_mode VerifierFactory.selectVerifier(req, mode) enum: "browser" | "http_api" | "auto" @Qualifier("browserVerifier") + @Qualifier("httpApiVerifier") "browser" "auto" "http_api" steps.anyMatch action.startsWith ("http_") false true BrowserVerifier verify/BrowserVerifier.java ▸ capability isCapabilityAvailable ("BROWSER_AUTOMATION") ▸ endpoint /api/browser/journey/run ▸ requires PreviewStackDetector + DevServerLauncher.start() ▸ timeout JOURNEY_TIMEOUT = 120s ▸ body session_id="rv-"+sid · viewport record={video,har,trace} HttpApiVerifier verify/HttpApiVerifier.java ▸ capability isCapabilityAvailable ("HTTP_API") ▸ endpoint /api/http/journey/run ▸ requires — no DevServer — 直连 base_url,跳过 stack 探测 ▸ timeout HTTP_JOURNEY_TIMEOUT = 60s ▸ body session_id · base_url · steps record=Map.of() (无录制) JourneyResult verdict / errorMessage → handleVerificationResult() verified · failed · unavailable → EvidenceStore.save() EvidenceBundle (kind=journey) → STOMP /queue/messages verify_progress · verification_result
▸ HTTP API 验证执行管道 — 8 Action 策略字典分发
// HttpApiVerifier (Java) → callIfAvailable → http_journey_run (Python) → HTTP_ACTION_HANDLERS JAVA · backend/verify/ HttpApiVerifier.verify() guard: isCapabilityAvailable("HTTP_API") body = {session_id, base_url, steps} PythonCapabilityAwareClient .callIfAvailable("HTTP_API", endpoint, body, 60s) → Optional<JourneyResponse> 目标 API 服务器 request.base_url e.g. http://127.0.0.1:8080 业务后端 / 第三方 REST POST /api/http/journey/run PYTHON · python-service/src/routers/http_api.py @router.post("/journey/run") async def http_journey_run(request: JourneyRunRequest) 边界防护 MAX_STEPS = 500 MAX_CONTEXT_SIZE_BYTES = 50MB 连接池 async with httpx.AsyncClient(follow_redirects=True) as client: ▸ for i, step in enumerate(request.steps): _resolve_variables(step, context_vars) ${var_name} → context_vars[name] _execute_http_step(...) handler = HTTP_ACTION_HANDLERS.get(action) client.request() httpx → 目标 API → response last_response · context_vars 反馈下一步 step_results.append(StepResultModel) · failed → break (首步失败即停) HTTP_ACTION_HANDLERS dict[str, Callable] · 8 handlers http_get → client.get(url, headers, params) http_post → client.post(url, json/content) http_put → client.put(url, json, headers) http_delete → client.delete(url, headers) — assertions — assert_status last_response.status_code == expected_code assert_json jsonpath_parse(path) .find(body) == expected assert_header expected_substring in last_response.headers[name] — state — set_variable context_vars[name] = jsonpath_parse(path).find(body)[0] → 跨 step 共享变量 dispatch RESULT · 结果回传 StepResultModel index · action · ok duration_ms · error screenshot_base64=None (HTTP) JourneyRunResponse passed · step_results session_id · final_url → Java JourneyResult.from(r) 异常分类(httpx) ConnectError · TimeoutException HTTPError → ok=False · 计入 step.error

本地文件引用:本机路径与远程 OSS 双路径

▶ GET /api/files/reference-capability → native_path / oss_upload / unavailable 能力判定永久公开警告
native_path · 仅本机安全条件满足
① 直接 loopback、无转发头、启用本地选择器、未配置 allowed roots,且系统选择器可用。
② 前端调用 POST /api/files/pick,并携带 X-Zhikun-Native-Picker: 1。
③ 后端仅返回绝对、canonical、可读普通文件的路径与元数据,不读取或上传内容。
④ 提交为 本地文件路径:"...";选择路径不等于授予 Read 工具访问项目外文件。
oss_upload · ECS / 远程 / 代理访问
① OSS 配置可用时,浏览器单选文件并确保目标 Session 已创建。
② POST /api/oss/local-files?fileName=... 以原始请求体流式上传,使用 X-Session-Id 和原始 Content-Type。
③ 提前检查声明长度,读取时再次执行最大 100 MiB 硬截断;临时文件始终清理。
④ SHA-256 幂等对象键 → 私有上传 → 远端校验 → public-read,随后把文件名和 URL 加入提示词。
边界:能力由后端实际访问条件判定,不根据 ECS RAM Role 猜测部署环境。两条路径都不可用时返回 unavailable。远程文件不做扩展名、敏感文件名或内容扫描;对象永久公开,移除标签、切换 Session 或放弃消息均不会删除。该链路与下方需要显式授权的 /publish-oss 产物发布相互独立。

验证产物归属与显式发布链路

▶ Artifact declare → seal/hash → verified entry → PublishArtifact → OSS Verified / Partial显式高风险

下图上半部分描述 /publish-oss 产物发布链路:工具先声明预期输出,执行完成后封存并计算哈希;Manifest 状态可以是 verified,也可以是包含目标已验证条目的 partial。目标条目还需在发布前再次匹配哈希,并在用户明确提出发布和通过一次高风险授权后才能进入 OSS。生成、预览或完成 Run 均不会自动上传。下半部分是独立的秒悟发布路径:以工作区快照与 VerifyJourney 证据为依据,不复用 OSS Manifest 作为发布前提。

declareplanOutputs()路径 / 类型 / owner seal + hash普通文件封存size / SHA-256 verified entrymanifest: verified / partial发布前再次验 hash PublishArtifact明确指令 + ONCE敏感内容 / 路径复检 OSS 权威外链私有上传 → 远端校验成功后 public-read 根 Session 与后代 Run 产物归属 候选包括同一持久化根 Session 的根 Run,以及通过 parent_run_id 建立的授权后代 Run;目标条目必须已验证且哈希仍匹配 目录、批量、符号链接、workspace 外路径、凭证与敏感文件拒绝发布 秒悟发布 · 显式请求 /publish-meoo · 默认关闭检查与验证路径 / 模式 / 内容摘要VerifyJourney 证据PublishMeoo独立授权 · 快照复核变更 / 缺失证据则拒绝CLI → 秒悟平台新站点 · 消耗额度旧站点保留公网验证静态:匿名 + 内容一致全栈:匿名 HTTPS持久记录 / 网站卡Run / 工具调用去重失败 / 待确认明确展示验证 / 授权未通过不发布;远端创建后失败保留记录,超时不自动重发,也不保证远端取消。
10

上下文管理 — 6层压缩策略

L0 SnipL1 MicroCompact L2 AutoCompact L3 IncrementalCollapse L4 ReactiveCompact ContextCascade 六级级联编排
6 层级联上下文压缩管道 — ContextCascade.java · 统一协调器 ContextCascade · 编排器 每次 API前 执行 L0-L2 低代价 L3-L4 错误 恢复 L0 Snip SnipService.java 单条工具结果超预算 → 截断中间保留首尾 触发: toolResult > contextWindow × 0.3 × 3.5 L1 MicroCompact MicroCompactService.java 旧可压缩工具结果 → 替换为 "[cleared]" 触发: 每次API调用前无条件执行 · protectedTail=10 L1.5 ContextCollapse ContextCollapseService.java 三级渐进折叠: Full(尾10) → Summary(10-30) → Skeleton(30+) 触发: 每次API调用前 · CollapseLevel sealed interface IncrementalCollapseManager 增量折叠 · 每10轮触发 L2 AutoCompact ★ CompactService.java 三区划分(冻结/压缩/保留) + 3级降级: LLM摘要 → 关键消息 → 尾截断 触发: tokens > effectiveWindow - 13,000 buffer 阈值: 85% · 目标: 50% · 摘要上限: 4,096 tokens · 保留最近3轮 413 错误 ↓ L3 CollapseDrain CompactService.compact() 激进压缩 → contextWindow × 0.5 目标 触发: API返回413 · 第一次错误恢复尝试 L4 ReactiveCompact CompactService.reactiveCompact() 最后手段 — 仅保留1轮 + 极度压缩 + 防死亡螺旋 触发: L3失败 · 仅允许执行一次 · 失败则完全终止 TokenCounter 三层精度估算 ① 字符粗估 ② 类型调整 ③ tiktoken精算 中文: 2.0 char/tk JSON: 2.0 char/tk 代码: 3.5 char/tk 混合: 3.5 char/tk 参与所有层级决策 TokenBudget Tracker 续写预算追踪 完成阈值: 90% 递减检测: 500tk 电路断路器: 连续3次失败 配合L2预算管理 数据流: 原始消息 → Snip截断 → 清除旧结果 → 渐进折叠 → LLM摘要 → 压缩后消息 错误恢复: API 413 → CollapseDrain(50%目标) → 失败 → ReactiveCompact(保留1轮) → 失败 → 终止 压缩系统统计 核心文件 CompactService ContextCascade CollapseService TokenCounter MicroCompact SnipService 辅助文件 BudgetTracker CollapseLevel IncrCollapseManager 共 12 个文件 200K tokens → 150K → 100K → 60K → 30K → 15K (413) CompactValidator 压缩效果评估 降级决策输入 三级渐进折叠 A: 尾部10条完整保留 B: 10-30条截断500字符 C: 30+仅role+摘要骨架 PromptTooLongRecovery 阶段1: Collapse Drain(激进压缩) 阶段2: 仅保留1轮 + 极度压缩 CompactMetrics · 压缩效率监控 IncrementalCollapseManager · 增量折叠 QueryEngine:两级压缩后,仅媒体相关错误尝试移除媒体;耗尽后报错终止,不进入普通模型降级。

ContextCascade 正常执行流程 — executePreApiCascade

ContextCascade 正常执行流程 — 每次 API 调用前无条件执行 (executePreApiCascade) QueryEngine.executeLoop() Step 1: 调用 ContextCascade.executePreApiCascade() TokenCounter.countTokens() 三层精度估算 · 计算当前 token 使用量 L0 Snip SnipService.java 方法: snipIfNeeded() 动作: 单条工具结果超预算 → 截断中间内容,保留首尾各50% 触发条件: toolResult > contextWindow × 0.3 × 3.5 防止单条超长结果占据上下文 可压缩工具: Read, Bash, Grep, Glob, WebSearch, WebFetch, Edit, Write 无条件继续 ↓ L1 MicroCompact MicroCompactService.java 方法: microCompact() 动作: 将旧的可压缩工具结果替换为 "[cleared]" 触发: 每次无条件执行 · 保护尾部: 最近10条消息(protectedTail=10) 轻量级操作 — 无 LLM 调用 仅对超过 protectedTail 的历史消息 将 toolResult 内容清空为 [cleared] 无条件继续 ↓ L1.5 ContextCollapse ContextCollapseService.java · 会话折叠 方法: progressiveCollapse() 动作: 三级渐进折叠处理 A. FullRetention: 尾部10条完整保留 B. SummaryRetention: 10-30条截断保留500字符 | C. SkeletonRetention: 30+条仅保留骨架 规则: UserMessage 永远保留原文 CollapseLevel sealed interface IncrementalCollapseManager 增量折叠: 每10轮触发 检查 token > 85% ↓ L2 AutoCompact ⭐ CompactService.java · 主动压缩 方法: compactMessages() 触发: token使用率 > 85% 阈值 (AUTO_COMPACT_THRESHOLD=0.85) 三区划分: FROZEN → COMPACTION → PRESERVED(最近3轮) 3级降级: ① LLM摘要生成(优先) → ② 关键消息选择(LLM失败) → ③ 尾部截断(最后手段) 目标压缩率: 50% · 摘要上限: 4,096 tokens · BUFFER_TOKENS=13,000 三区划分模型 FROZEN ZONE — 已压缩区不再触碰 COMPACTION ZONE — 历史消息压缩目标 PRESERVED ZONE — 最近3轮完整保留 压缩完成 → API 调用 正常路径结束 · 消息发送至模型 错误恢复路径 (仅 413 错误触发) PromptTooLongRecovery API 返回 413 L3 CollapseDrain   目标: contextWindow × 0.5   动作: 激进压缩,仅保留1轮对话 失败 ↓ L4 ReactiveCompact   极度压缩,仅保留1轮 + 最小上下文   仅允许执行一次(防死亡螺旋) · 失败→错误上报 恢复成功 → 重试 API 电路断路器 TokenBudgetTracker 连续3次失败 → 禁用 图例: 正常流程 错误恢复 核心层 仅413触发 L0-L1.5: 每次 API 前无条件执行(低代价) | L2: token > 85% 时触发 | L3-L4: 仅 413 错误恢复

三区划分 — Protected / Compressible / Tail

CompactService · 三区划分 (planCompaction) — CompactService.java L322-L353 消息列表 messages[] (上下文窗口 = contextWindowSize) FROZEN 不可压缩区 compact_boundary 之前的消息 包含历史 COMPACT_SUMMARY 边界: 最后一个 SystemMessage type == COMPACT_SUMMARY L322-L334: compactBoundaryIndex = -1 遍历找最后 COMPACT_SUMMARY splitPoint = max(idx+1, 0) frozen = msgs[0..splitPoint] 策略: 完整保留 绝不压缩 · 含之前的摘要 COMPRESSIBLE 可压缩区 frozen 之后 ~ preserved 之前 对话历史的核心压缩目标 remaining[0..preserveStart] 3级降级策略 (L233-L303): ① LLM 摘要 (L246-L263) ② 关键消息选择 (L265-L288) ③ 尾部截断 1/3 (L293-L302) 策略: LLM → 选择 → 截断 摘要上限 SUMMARY_MAX_TOKENS = 4,096 tokens (L46) PRESERVED 保留区 最近 N 轮用户消息 确保上下文连贯性 findTurnBoundary() L837-L848 关键常量: PRESERVED_RECENT_TURNS = 3 (常规压缩, L49) REACTIVE_PRESERVED_TURNS = 1 (反应式 413 压缩, L52) 策略: 完整保留 从末尾回溯 N 个 UserMessage 压缩触发条件 AUTO_COMPACT_THRESHOLD = 0.85 (L40) tokens / contextWindow > 85% → 触发 COMPACT_TARGET_RATIO = 0.50 (L43) 压缩后目标 = 窗口 50% MIN_MESSAGES_FOR_COMPACT = 5 (L58) AUTOCOMPACT_BUFFER_TOKENS = 13,000 (L55) 压缩执行过程 N 条消息 LLM 摘要 1 条 Summary frozen[] + COMPACT_SUMMARY + preserved[] → buildCompactResultWithSummary() L437-L446 → 文件重注入 reInjectFilesAfterCompact() L861 Token 成本对比 (示例: 200K 上下文窗口) 压缩前 frozen 20K compressible 95K tail 40K ≈ 170K (85% 窗口) 压缩后 frozen 20K 4K tail 40K ≈ 100K (50% 目标) 节省 ~70K tokens ↓ 41% CompactionPlan record (L123-L129) frozenMessages → 不可压缩 compactionMessages → 待压缩 preservedMessages → 已保留 compactionTokens · targetSummaryTokens

▎Agent Loop 任务执行全链路 — Session 7675c534 实例

Agent Loop 任务执行全链路时序图 — Session 7675c534 12:27:54 → 12:37:03 · 1 次工具调用 · Write 86,063B → 文件 72,416B · totalTokens=96,464 用户 / 前端 WebSocket Client QueryEngine Agent Loop 控制器 LLM Provider DashScope / qwen3.8-max-0902 ToolExecutionPipeline 9 阶段执行管线 FileSystem AtomicFileWriter T 12:27:54 ① 用户请求 messageCount=1 maxTurns=200 12:27:54 ② streamChat() effectiveMaxTokens=65536 12:27:55 ③ HTTP 200 · 流开始 SSE chunk_open ④ tool_use_start 12:28:01 · Write ToolInputDelta 流式积累 86,063 字节 · 8m44s ≈ 164 B/s 流速 …积累中… 12:36:45 ⑤ BlockStop 事件 flushToolBlock 触发 12:36:45 ⑥ flushToolBlock(Write, inputLen=86063) ⑦ Stage 1: Schema Validation ✓ deny → ask → checkPermissions → contentLevel → safety → sandbox 12:36:46 ⑧ permission_request → ASK 前端弹出授权确认 12:36:56 ⑨ allow (等待 10s) 12:36:56 ⑩ Stage 5: call AtomicFileWriter 72,416B ⑪ write success · 26ms 12:36:56 ⑫ ToolResult(error=false) · 11,520ms ⑬ Turn 2 · streamChat(携带工具结果) 12:37:03 ⑭ end_turn · TERMINATE_SUCCESS ⑮ message_complete 性能指标 流式积累 8m44s 86KB @ 164 B/s 权限等待 10s 用户授权 allow 文件写入 26ms 72,416 字节落盘 Pipeline 总时 11.5s 含权限等待 10s 总 Token 96,464 2 Turn 累计 端到端 9m09s 12:27:54 → 12:37:03 瓶颈分析 ▸ LLM 流式生成 95.4% ToolExecutionPipeline · 9 阶段执行管线(基于本会话实际命中) Stage 1 validation Schema ✓ Stage 2 deny 未命中黑名单 Stage 3 ask ★ ASK 用户 Stage 4a-c contentLevel safety / sandbox Stage 5 call ★ AtomicFileWriter Stage 6 modeTransform 结果加工 Stage 7 checkPermissions 汇总 → ToolResult
11

辅助系统

▶ 记忆系统 memdir/ · Project记忆与检索
MemdirService核心记忆目录管理
MemorySearchEngineBM25检索(K1=1.2, B=0.75)
MemoryRerankServiceLLM精排(3000ms超时降级)
MemoryTool工具接口
▶ Skill 系统 13 个内置 Skill · 动态扩展
SkillRegistry13 个内置 Skill;BUNDLED → PROJECT → USER 依次注册,同名后者覆盖;项目目录热重载
Bundled Catalogcommit · review · test · pr · debug · verify · remember · software-architecture · csv-data-summarizer · prompt-engineering · test-driven-development · publish-oss · publish-meoo
SkillDefinitionrecord 类型 · SkillSource 六值描述来源,不构成加载优先级
FrontmatterParser简化 YAML 解析 (key: value / 列表项)
FrontmatterData16 个 frontmatter 字段
SkillExecutorSkill 工具的正文 / 元数据返回 · 结果构造等待 120s · 参数校验
SkillToolValidator参数注入检测;当前嵌套深度 ≥3 时拒绝 fork (allowed-tools 白名单仅声明,运行时未拦截)
▶ 安全模块 security/ · Hook与敏感路径
CommandBlacklistService命令黑名单
PathSecurityService路径安全
SensitivePathRegistry敏感路径注册
SensitiveDataFilter数据过滤
SecurityAuditLogger审计日志
▶ Docker 沙箱 sandbox/ · 容器隔离
SandboxManager容器隔离执行环境

记忆系统架构 — BM25检索 · LLM重排序 · 会话历史

memdir + history + controller + frontend · Project记忆持久化与检索链路 存储层 MEMORY.md 文件持久化 · 25KB上限 · 截断 SQLite memories 表 V002迁移 · CRUD · source索引 .zhikun/team-memories/ 团队级共享 · .md 文件扫描 MemoryCategory 4类 EPISODIC事件记忆 SEMANTIC语义知识(默认) PROCEDURAL程序工作流 TEAM团队共享 检索管道 (Query → BM25 → LLM Rerank → Top-K) 用户 Query searchMemories(q, topK) N-gram 分词器 Unigram + Bigram · CJK 停用词过滤 (中英文54个) BM25 评分 k1=1.2 b=0.75 标题2x加权 · IDF预计算 MemorySearchEngine.java 纯Java BM25实现 DocumentEntry · ScoredResult Top-20候选 LLM Rerank 精排 MemoryRerankService.java SideQueryService调用 3s超时 · 512 maxTokens · 降级兜底 relevanceScore排序 Top-K 精排结果 MemdirService.java 核心服务 · 读写删搜 压缩70% · 过期清理90天 接口与注入层 MemoryTool.java LLM工具接口 read / write / delete 三操作 MemoryController.java /api/memory REST GET/PUT/POST/DELETE · SQLite+MD双源 buildMemoryPrompt() Prompt注入 · Personal+Team readMemoriesForPrompt → SystemPrompt MemoryEditorPanel.tsx 前端记忆编辑面板 FileHistoryService.java 快照·事务·Rewind回退 注入 写入流程: 对话 → 关键信息提取 → 记忆索引构建 用户对话 消息流入 LLM 信息提取 MemoryTool.write MemdirService writeMemory() · 原子写入 MEMORY.md 追加 · 元数据头 compactMemories() 50K上限 → 保留70%最新 purgeExpiredMemories() 90天过期自动清理 source: AUTO | USER | TOOL 格式: <!-- source:TOOL time:2024-... category:semantic --> Java MemdirService SearchEngine RerankService MemoryTool Category API MemoryController FileHistoryCtrl TSX MemoryEditorPanel

记忆检索-精排流水线 — Query → BM25 召回 → LLM Rerank → Context 注入

存储层 · Storage MemdirService 核心记忆目录管理 Markdown Files 持久化 · .md 格式存储 Category Dirs 按 category 目录组织 索引构建 IDF 预计算 · 标题2x加权 检索层 · BM25 Recall User Query searchMemories(q) MemorySearchEngine BM25 · K1=1.2 B=0.75 N-gram分词 · CJK · 停用词过滤 Top-K 召回 BM25 候选集 · 评分排序 索引加载 BM25 参数 K1 = 1.2 · B = 0.75 标题权重 2x · IDF 预计算 精排层 · LLM Rerank 候选集 MemoryRerankService LLM精排 · 3000ms超时降级 SideQueryService · 512 maxTokens 降级策略 · Fallback Rerank 超时 3000ms → 直接使用 BM25 结果 超时 Context 注入 → SystemPrompt buildMemoryPrompt() · readMemoriesForPrompt → 精排结果注入 LLM 上下文 Pipeline 耗时 BM25: <50ms Rerank: ≤3000ms relevanceScore 排序 · 截断 · 注入

插件系统 SPI 发现与沙箱隔离架构 — plugin/ 14文件 + hook/ 5文件 · ServiceLoader SPI · URLClassLoader 隔离

SPI 服务发现流程 Java ServiceLoader · PluginLoader 内置插件 (Classpath) ServiceLoader.load() 本地JAR插件 ~/.zhikun/plugins/*.jar 市场插件 (Future) Remote Registry PluginManager JAR限制: 50MB API版本兼容检查 ReentrantReadWriteLock 热重载线程安全 沙箱隔离架构 PluginClassLoader URLClassLoader · Fail-Closed 安全模式 委托父加载器 ✓ com.aicodeassistant.plugin com.aicodeassistant.tool com.aicodeassistant.command com.aicodeassistant.mcp → 隔离不委托 ✗ 其他宿主类 → 不可访问 Fail-Closed 安全默认 插件只能访问公开API → JDK标准库 ✓ java.* / javax.* 委托BootstrapClassLoader 标准库始终安全可用 Hook 拦截链 HookService HookRegistry 虚拟线程池执行 HookRegistry PreExec Hook PostExec Hook Error Hook Stop Hook HttpHookExecutor SSRF防护 SsrfGuard URL验证 HookHandler 回调处理 插件生命周期 ① 安装 Install ② 加载 Load ③ 运行 Active ④ 卸载 Unload ⑤ 热重载 Reload 加载组件: · 命令 (Command) · 工具 (Tool) · 钩子 (Hook) · MCP Server · LSP Provider 关键类: PluginExtension LoadedPlugin PluginManifest plugin/ 14文件 hook/ 5文件 PluginManager PluginClassLoader HookService SPI发现: ServiceLoader(内置) + JAR扫描(本地) + 市场(规划中) 隔离: URLClassLoader · 委托白名单 · Fail-Closed 安全: SsrfGuard防护 · JAR大小限制50MB · API版本兼容校验 生命周期: 安装→加载→运行→卸载→热重载

Skill 系统加载与执行架构 — 13 个内置 Skill · 工具结果 / 命令提示 · 三类来源加载

Skill 入口 工具调用 / Web 技能命令 Skill 加载与正文返回 SkillRegistry SkillRegistry.java BUNDLED → PROJECT → USER 三类依次注册 · 同名后者覆盖 元数据解析 FrontmatterParser FrontmatterData YAML Frontmatter SkillTool → SkillExecutor inline / fork 结果构造 结果构造等待超时:120s SkillCommand Web /skill 技能命令 PROMPT → 当前会话 ArgumentSubstitution.java 参数替换引擎 内置技能示例 commit review debug test pr fork 元数据 ● inline — 正文作为 tool_result ● fork — 正文 + 元数据 内置共 13 项;示例仅展示部分 · frontmatter 按技能解析 技能正文 工具结果 / 命令提示 当前会话继续 SkillSource · 六种来源枚举 MANAGED — 企业管理(预留) USER — ~/.zhikun/skills/ ✓ PROJECT — .zhikun/skills/ ✓ PLUGIN — 插件提供(预留) BUNDLED — 内置 13 项 ✓ MCP — MCP 构建(预留) 加载顺序: BUNDLED→PROJECT→USER (后覆盖前) WatchService 热重载 · DEBOUNCE_MS=500 SkillRegistry · FrontmatterParser · SkillTool / SkillExecutor · SkillCommand · SkillToolValidator

Skill 系统源码级实现细节 — 按源码字段/常量/路径直引

▸ FrontmatterData 字段 (16)
description · name · allowedTools · argumentHint · arguments · whenToUse · version · model · disableModelInvocation · userInvocable · hooks · effort · context · agent · paths · shell
默认: context=inline · shell=bash · userInvocable=true
▸ SkillExecutor 执行模式
• Skill 工具的 inline:渲染正文通过 tool_result 返回
• fork:返回正文及 agent/model/effort 等元数据,不创建子 Agent
• Web 的 /skill 走 SkillCommand:渲染后由 PROMPT 路径继续当前会话
• 120s 仅限制 inline/fork 的结果构造等待,不含此前解析/渲染或后续模型执行
▸ SkillToolValidator 安全检查
• 每个解析参数:MAX_ARG_LENGTH = 2000 字符
• MAX_FORK_NESTING_DEPTH = 3:当前嵌套深度 ≥3 时拒绝 fork
• 6 个 shell 注入正则: $(...) · `...` · ; cmd · | cmd · && rm · ${...}
• SkillExecutor 集成: validateArgs() ✓ · validateForkPermission() ✓
• allowed-tools 白名单声明 (运行时验证规划中,validate() 当前仅测试覆盖)
▸ WatchService 热重载
• 监听目录: 项目 .zhikun/skills/ (含一级子目录)
• 事件类型: ENTRY_CREATE · ENTRY_MODIFY · ENTRY_DELETE
• 防抖间隔: DEBOUNCE_MS = 500 ms (ScheduledExecutorService)
• 守护线程: skill-file-watcher · skill-watcher-debounce
• CREATE/MODIFY → register · DELETE → 反注册
• PreDestroy 时关闭 WatchService 并停止线程池
稳定职责锚点: SkillRegistry(BUNDLED → PROJECT → USER 注册与项目热重载) · SkillDefinition(六值来源枚举与元数据) · SkillExecutor(工具正文 / 元数据返回) · SkillCommand(命令提示返回)。加载不设会话累计额度,模型上下文容量保护仍适用;具体源码行号不作为架构契约。

结构化观测、Session 恢复投影与断线恢复

▶ BestEffortObservabilityRecorder、结构化结果与恢复投影 职责分离故障隔离
1
统一 MDC 关联上下文
sid / rid / prid / agent / turn / tool / llm 由整体日志上下文贯穿 Run、父子 Agent、工具和模型调用,不归因于单个 Recorder。
2
结构化外部资源
工具结果投影为可折叠卡片;下载、Artifact 和 OSS 地址携带来源、状态与权威链接,不从日志文本猜测资源。
3
Recorder 故障隔离
BestEffortObservabilityRecorder 使用有界异步队列写补充事件,并记录丢弃、写失败和队列深度指标;失败不升级为工具或 Run 执行失败。
4
重连恢复
session_restored 返回完整 Session 消息、最近活动、最新 Run snapshot/event sequence 和活跃工具状态,并重放待处理的持久交互;前端按绑定代次替换投影。
MDC Correlationsid/rid/prid/agent/turntool / llm BestEffortObservabilityRecordersupplemental event logbounded queue + metrics Session Restoremessages / Run event seqtools: active + terminal / pending React Projection按持久终态恢复工具卡片权威下载 / snapshot 替换 补充观测与 Session 恢复是独立支路;工具结构化结果和持久 Run/交互状态保持各自权威
12

Agent 与后台 Task

5 类 Agent · 同步 / 并行 / 后台委派 · 会话级任务管理
Agent 委派后台 Agent 汇总Task 生命周期
根 Session 身份、授权与验证产物归属

子 Agent 通过 root session / root run 身份匹配受约束 Grant,不建立第二套授权权威。Artifact 保留 agent 与 parent run 关联;显式发布候选来自同一持久化根 Session 的根 Run 与授权后代 Run,目标条目必须已验证且发布前哈希仍匹配。

▸ 执行架构 — Agent 委派与后台 Task
父 Agent · QueryEngine 按任务边界委派 · 保留父 Session / Run 关联 AgentTool 角色 · model · run_in_background · isolation SubAgentExecutor executeSync / executeAsync 独立子会话 · 并发准入 · none / worktree 子 QueryEngine 模型推理 + 工具循环 工具调用经过 ToolExecutionPipeline 结果 → 直接返回 / 后台 Tracker TaskCreateTool description · prompt · taskType TaskCoordinator 父会话所有权 · 全局 10 槽位 · 满额拒绝 内存任务记录 · 30 分钟 watchdog · 取消信号 general-purpose SubAgentExecutor executeTaskSync → 子 Run shell TaskShellExecutor 受管理的 Bash 执行 结果 → TaskCoordinator 保存 Agent 入口的五类角色 · 运行时与授权 explore 搜索与定位 禁 Edit/Write/NotebookEdit verification 运行检查与证据 禁 Edit/Write/NotebookEdit plan 分析与规划 禁 Edit/Write/NotebookEdit general-purpose 综合实现 当前启用工具 受公共禁用项约束 guide 文件与网页指导 Glob / Grep / Read WebFetch / WebSearch verification 提示要求 PASS / FAIL / PARTIAL 及命令、输出证据;这是证据规范,不是自动硬验收。 RunExecutionRegistry AuthorizationService ManagedProcessRunner Run 登记与执行句柄 根身份与受约束 Grant 受管进程 · 超时 / 取消 / 退出确认 工具过滤非只读沙箱,仍需授权;子 Agent 禁嵌套 Agent / TaskCreate / VerifyPlanExecution,父 Agent 负责汇总。

Agent 执行与交付

▸ 同步 / 后台结果与可叠加的 Worktree 隔离
模型:显式 model → 父查询模型 → premium Agent 准入:全局 30 / 会话 10 · 深度 ≤3 执行等待默认 / 封顶配置 30min · 超时退出等待 30s · 默认 99 轮 · 后台每批等待 31min 同步 / 多个独立调用并行 后台结果 · 当前父 Run 汇总 可叠加的 Worktree 交付 executeSync() run_in_background=true 适用于同步与后台两条执行路径 子 QueryEngine 执行 独立上下文 · 模型与工具循环 AgentResult 直接返回 结果文本 + 执行状态 父 Agent 汇总并继续 多个独立调用可并行 none:沿用父工作目录 并行写入需划清文件边界 executeAsync() 先返回 Agent ID + 输出文件路径 BackgroundAgentTracker 父 Session / Run · 输出文件与终态 父 QueryEngine 等当前 Run 每文件前 4,000 字符作为数据回填 BACKGROUND_AGENT_WAIT 默认开启 仅当前父 Run;更多内容按路径读取 已提交 HEAD → 独立工作树 不复制父目录未提交内容 子 Agent 在隔离目录执行 独立子 Run 与资源归属 成功 + 退出确认 + Git 核验 含后台服务释放与目标安全检查 合回父仓库 安全清理 保留路径 异常 / 冲突 结果数据不授予新权限;普通 Agent 的 timeout / interrupted 不等同于底层执行全部退出。 Worktree 可叠加两条执行路径,准备与交付耗时另计;Task 无此隔离选项,也不进入后台 Agent 自动汇总。
▸ Task 生命周期 — 准入、执行与实际退出
TaskCreate → TaskCoordinator 按父会话登记任务;创建回执不是执行结果 全局 10 个槽位已满 → 拒绝 tryAcquire · 没有等待队列 PENDING 待启动;取消可阻止执行体 RUNNING 执行中;取消后等待实际退出 TaskGet / TaskList 父会话内查询状态与输出 terminationConfirmed 显示退出确认 TaskUpdate 只更新 output 受管理的实际执行 Agent → executeTaskSync · shell → TaskShellExecutor 独立执行身份 · 授权继承 · 按归属追踪资源 TaskStop / 30 分钟 watchdog 记录 cancellationRequested 发取消信号,尚不代表已经退出 执行体与受管理的收尾完成 运行中取消须等待实际退出;此前仍占用任务槽位 执行退出,取消时完成清理,再记录终态并释放槽位 执行结果 TaskCoordinator 保存结果 output / error · 执行终态 TaskState · 按父会话持有 COMPLETED 执行报告成功;仍需验收证据 FAILED 执行失败 / watchdog 超时 CANCELLED 取消 / 中断,退出已确认 TaskCreate 启动执行;待办与进度清单用 TodoWrite。TaskGet / TaskList 按父会话读取。 TaskUpdate 只改 output;TaskStop 请求取消,实际退出与取消清理完成后才记录终态。 agent / shell;local_workflow、monitor_mcp、dream 当前均为单次 Agent 执行的兼容入口。 Task 无 worktree / 自动父模型汇总;30min 触发取消,收尾可更久。记录保存在进程内存。
13

React 前端架构

React · Zustand · 轮次投影 · 响应式工作台
▸ Store 职责与依赖关系
业务领域 Store messageStore sessionStore taskStore permissionStore costStore planStore toolStore messageStore ← permissionStore, costStore 系统集成 Store configStore mcpStore bridgeStore coordinatorStore configStore ← 其他所有Store依赖 UI与对话 Store dialogStore notificationStore inboxStore appUiStore 高级分析 Store codeInsightStore complexityStore changeImpactStore codePathStore 元数据 Store apiContractStore fileTreeStore broadcastMiddleware.ts 跨Store广播中间件 — 事件驱动状态同步 分发到相关 Store · 发布/订阅模式 业务×7 系统×4 UI×4 分析×4 元数据×2 broadcast广播 configStore依赖 消息 / 工具结果 → 轮次投影TurnCard · 三档显示方式 · 双工作台新会话:开发 + 标准;三主题共享状态成功 Edit / Write → 文件记录*按调用标识关联,不推测 Bash 改动逐次差异,不读当前磁盘或合成净差异模型选择 → 会话状态已绑定会话:连接与绑定保护首页预选*:本地暂存 → 首次创建* 2026-09-16 源码新增能力:本轮文件修改、首页模型预选;不更改全局模型偏好。差异详情:≥1024px 侧面板,窄屏全屏;主题、输入草稿与视口测量由共享组件管理。

▸ Store 依赖关系 — dispatch.ts · 消息分发中枢

dispatch.ts 40+消息类型 · 序列号校验 按 type 分发到相关 Zustand Store UI Store appUiStore 1.9KB dialogStore 1.3KB notificationStore 1.4KB inboxStore 1.2KB featureFlagStore 2.8KB Data Store messageStore 6.8KB ★ sessionStore 2.1KB ★ activityStore 9.4KB costStore 1.1KB permissionStore 1.6KB Business Store taskStore planStore coordinatorStore insightStore anomalyStore mcpStore mcpCapabilityStore bridgeStore System Store configStore 9.0KB ★ changeImpactStore 7.5KB codeInsightStore 5.8KB codePathStore 4.4KB complexityStore 4.7KB diagramStore 2.9KB apiContractStore 5.2KB fileTreeStore 2.2KB commandStore 0.7KB toolStore 2.0KB getState() broadcastMiddleware 跨Store协调函数 (dispatch.ts内) 跨Store协调 (源码验证): handlePermissionRequest → permissionStore + sessionStore handleMessageComplete → messageStore + sessionStore handleSessionRestore → 5个Store全量同步 (L497-557) broadcastMiddleware: 跨Tab状态同步 (BroadcastChannel API) 仅 configStore 使用 · 非跨Store依赖 · 防止死循环 UI Store Data Store Business Store System Store dispatch分发 直接依赖(源码) ★=核心Store(被多消息引用) 源码路径: frontend/src/store/

▸ 可视化组件矩阵 — 代码分析 · API契约 · 图表组件

Visualization · Code / API / Insights / Charts frontend/src/components/visualization/{backend,shared}/ + message/VisualizationMessage.tsx 代码分析 4 components CodeComplexityTreemap CodePathTracer ChangeImpactGraph CodeDiagramGenerator Recharts @xyflow×2 Mermaid Monaco Store: complexityStore · codePathStore · changeImpactStore · diagramStore · configStore API契约 3 components APIContractViewer APISequenceDiagram SchemaViewer Mermaid Pure React Store: apiContractStore · messageStore 代码洞察 2个 GitTimeline BlameView Pure React Store: codeInsightStore 共享基础设施 3个 MermaidBlock ToolProgressBar MiniLogViewer Mermaid Pure React Store: configStore VisualizationMessage.tsx · 3 类直渲染 + 4 类 Hint 跳转 · text / json 兼容 直渲染:GitTimeline / SchemaViewer / MermaidBlock;Hint:影响 / 路径 / 复杂度 / API序列 → 对应侧栏 Zustand Store 数据绑定 业务 Store · 选择器订阅 complexityStore codePathStore changeImpactStore diagramStore apiContractStore messageStore codeInsightStore configStore appUiStore Python分析服务 API 6个REST端点 · Java后端代理 /api/code-quality/complexity /api/code-path/endpoints | /trace /api/analysis/change-impact /api/code-diagrams/generate /api/analysis/openapi/* /api/git/* 代码分析×4 API契约×3 洞察×2 共享×3 入口×1 @xyflow Recharts Mermaid Monaco Pure React Store颜色=所属分类 · 圆点颜色=API对应分类 · 箭头=业务数据请求 源码路径: frontend/src/components/visualization/ 业务数据路径示例:组件 → Zustand Store → fetch() → 后端 API ▸ CodeComplexityTreemap → complexityStore → /api/code-quality/complexity ▸ CodePathTracer → codePathStore → /api/code-path/endpoints | /trace ▸ ChangeImpactGraph → changeImpactStore → /api/analysis/change-impact ▸ CodeDiagramGenerator → diagramStore → /api/code-diagrams/generate ▸ APIContractViewer → apiContractStore → /api/analysis/openapi/* ▸ GitTimeline → codeInsightStore → /api/git/*

▸ 前端路由架构 — 页面组织与导航结构

SPA 单页应用 · 无 URL 路由 · Tab-based 导航 · Feature Flag 条件渲染 main.tsx → App.tsx → AppLayout → Sidebar(12 Tabs) + Main Content · 无 React Router · 无权限守卫 main.tsx → ThemeProvider → App AppLayout 三栏布局 · 响应式 Header Sidebar (Desktop) Drawer (Mobile) Main Content StatusBar MobileStatusBar (Flag) ?sidebar=detached&tab=xxx DialogManager SkillDetailModal Sidebar Tab 导航 12 个视图 Tab · Tab切换即"路由" · 无 URL 变更 sessions 会话 tasks 任务 files 文件树 sequence 序列图 dag DAG git Git complexity 复杂度 impact 影响分析 api-docs API文档 diagram 图表生成 code-path 代码路径 apos Activity ⚑ 导航机制: useState<TabType> 切换 · Auto-Routing: appUiStore.pendingVisualizationTab 跨组件跳转 组件渲染: SessionList · TaskPanel · FileTreePanel · APISequenceDiagram · AgentDAGChart · GitTimeline · CodeComplexityTreemap ... Feature Flag 控制 Feature Flag 条件渲染 featureFlagStore · 运行时开关 APOS_ACTIVITY_STREAM APOS_MOBILE_STATUS 控制: Activity Tab 显示/隐藏 · MobileStatusBar 渲染 决策: 无传统路由权限守卫 · 通过 Flag 实现功能灰度发布 URL Query Param 导航 唯一的 URL 级"路由"机制 ?sidebar=detached &tab={TabType} 功能: 新窗口打开 Sidebar 全屏模式 解析: useMemo + URLSearchParams · AppLayout.tsx L30-L38
▶ API 通信层
dispatch.ts

REST API 统一调度层 · 请求/响应拦截 · 错误重试

stompClient.ts

WebSocket/STOMP 实时通信 · 消息订阅 · 重连机制

技术栈
React 18.3Vite 5.4Zustand 4.5Monaco Editor 0.52xterm.js 5.5Tailwind 3.4Mermaid 11.14
14

Python 分析服务架构

服务 + CLI · 32 文件 · 7 能力域
▶ 分析引擎 analyzers/ · 调用图、影响和路径分析
flow_chart_generator.py
code_path_tracer.py
call_graph_builder.py
sequence_diagram_generator.py
change_impact_analyzer.py
▶ 业务服务 services/ · 浏览器、Git与文件服务
browser_service.py浏览器会话与自动化服务
complexity_analyzer.py
tree_sitter_service.py
browser_models.pyPydantic 浏览器数据模型
▶ API 路由 routers/ · 核心与条件路由
/api/analysis /api/browser /api/files /api/code-intel /api/git /api/v1/tokens /api/code-quality /api/tokenizer
7个能力域 支持优雅降级
CODE_INTELFILE_PROCESSINGCODE_QUALITYANALYSISGIT_ENHANCEDBROWSER_AUTOMATIONHTTP_API
▸ Python 代码分析引擎架构
FastAPI 应用入口 main.py 3.9KB · uvicorn ASGI 路由层 — 8个API端点 /analyze /complexity /dependencies /metrics /patterns /health /capabilities /batch 分析器层 — 7个核心分析器 complexity_analyzer 圈复杂度分析 · McCabe指标 dependency_analyzer 依赖关系图 · 模块耦合 code_metrics_analyzer 代码指标 · LOC/函数数 pattern_analyzer 代码模式检测 smell_detector 代码异味检测 performance_profiler 性能分析 security_analyzer 安全分析 服务层 — 7个支撑服务 cache_service storage_service notification_svc batch_processor rate_limiter error_handler metrics_exporter Prometheus 输出层 JSON 分析报告 → 前端可视化组件 (15个) → 浏览器渲染展示 32文件 服务 + CLI 8个API端点 7个分析器 7个服务 15个前端组件 FastAPI

代码分析能力域 — 分析器 · 服务 · API 端点

Java Backend :8080 httpx.AsyncClient · HTTP REST · JSON analysis.py:17 JAVA_BACKEND_URL · /v3/api-docs 代理 FastAPI :8000 · uvicorn ASGI main.py 路由层 — 8 个模块 · 30+ 端点 routers/*.py · capabilities.py 能力域动态注册 · 四层依赖探测 /api/code-intel POST parse·symbols·deps·map code_intel.py:133-213 /api/analysis diagram·impact·path·openapi analysis.py:79-435 /api/code-quality POST complexity treemap code_quality.py:51-96 /api/files tree·encoding·watch SSE file_processing.py:94-277 /api/git diff·log·blame git_enhanced.py:89-126 /api/browser 15 端点 Playwright browser.py:53-279 /api/v1/tokens estimate·single token_estimator.py:45-97 /api/tokenizer POST count tokenizer.py:48-74 分析器层 — 5 个核心分析器 + 支撑服务 analyzers/ · libcst + networkx + tree-sitter 多语言解析 CallGraphBuilder 调用图构建 · networkx.DiGraph Python(libcst high) Java(ts medium) TS(ts low) IN: project_root → OUT: nx.DiGraph(nodes+edges) call_graph_builder.py · 调用图构建 ChangeImpactAnalyzer 变更影响 BFS 传播 · 60s 超时保护 impact_level: direct → indirect → potential IN: file_path+changed_lines → OUT: 影响链路图 change_impact_analyzer.py · 影响分析 (F33) CodePathTracer API 端点扫描 + 正向 BFS 调用路径追踪 Java Spring Boot · Python FastAPI · TS Express IN: entry_file+function → OUT: 层级调用链 code_path_tracer.py · 路径追踪 (F40) SequenceDiagramGenerator Mermaid 时序图 · Controller→Service→Repo 参与者角色映射 · 循环调用检测与截断 IN: API路径/方法签名 → OUT: sequenceDiagram sequence_diagram_generator.py · 时序图 (F35) FlowChartGenerator Mermaid 流程图 · if/loop/try 控制流 tree-sitter AST 解析 · 嵌套深度限制 3 层 IN: target方法体 → OUT: flowchart TD flow_chart_generator.py · 流程图 (F35) 支撑服务层 · services/ TreeSitterService 50+ 语言 AST 统一接口 ComplexityAnalyzer radon+tree-sitter 启发式 FileDetector · GitEnhancedService · BrowserService services/ · 浏览器会话、Git增强、文件检测与复杂度分析 ↓ 被 2/3/4 依赖 核心解析库 tree-sitter ≥0.21.0 AST引擎 libcst ≥1.1.0 CST networkx ≥3.2 图算法 radon ≥6.0.1 CC tiktoken cl100k token playwright ≥1.40 浏览器 chardet 编码检测 httpx async HTTP pygount ≥1.8 统计 17 种语言 · tree-sitter 统一 AST Python · Java · TypeScript · TSX · JavaScript · Go · Rust · Ruby · C++ · C C# · Kotlin · Swift · PHP · Scala · Lua · R tree_sitter_service.py:66 LANG_MAP 前端可视化组件映射 CodeComplexityTreemap ← /api/code-quality/complexity ChangeImpactPanel ← /api/analysis/change-impact 7 能力域 CODE_INTEL · FILE_PROCESSING · CODE_QUALITY · ANALYSIS · GIT_ENHANCED · BROWSER_AUTOMATION · HTTP_API capabilities.py:19 CapabilityDomain · 四层检测: 包导入 + 版本校验 + 系统二进制 + 冒烟测试 · 缺失能力优雅降级 8 路由模块 · 30+ 端点 5 分析器 10 核心库 · 17 种语言
▸ Java ↔ Python 服务完整调用流 · PythonCapabilityAwareClient · 7能力域 · 指数退避重试
后端 → Python 服务完整调用流 PythonCapabilityAwareClient · ConcurrentHashMap + TTL · 指数退避重试 · 7能力域动态注册 Java 工具层 · Tool.call() Spring Boot 3.4 · :8080 BashTool 命令执行 · 沙箱 GitTool Git增强操作 WebBrowserTool 浏览器自动化 CodeQualityTool 代码质量分析 FileAnalysisTool 文件处理分析 AnalysisTool 代码分析 PythonCapabilityAwareClient callIfAvailable(domain, endpoint, body, type) ① isCapabilityAvailable(domain) ② HttpClient.POST /api/{domain}/{op} ③ ObjectMapper.readValue() → Optional<T> 重试: 3次 · 指数退避: 500ms·1s·2s·4s 连接3s · 读取30s · 重型120s ConcurrentHashMap + TTL · 能力探测 GET /api/health/capabilities → Map<domain, CapabilityStatus> 成功缓存 5min · 失败缓存 30s · refreshIfStale() HTTP 通信层 · 127.0.0.1:8000 Java HttpClient → Python FastAPI POST http://127.0.0.1:8000/api/{domain}/{operation} Content-Type: application/json Body: JSON序列化请求对象 · ObjectMapper 超时: 连接 3s · 普通读取 30s · 重型操作 120s 重试策略: maxRetries=3 · initialDelay=500ms · maxDelay=4s · backoff×2 JSON Response · 200 OK Pydantic BaseModel 序列化 → JSON ← ObjectMapper.readValue(body, TypeReference<T>) → Optional<T> 能力探测 · GET /api/health/capabilities 启动时全量探测 → Caffeine 缓存 → refreshIfStale() 成功 TTL=5min · 失败 TTL=30s · 每次调用前检查 调用时序 1. Tool.call() 触发 2. isCapabilityAvailable(domain) [Caffeine] 3. POST /api/{domain}/{operation} 4. 失败? → 指数退避重试 (500ms→1s→2s→4s) 5. FastAPI 路由分发 → Pydantic 验证 6. 业务处理器执行 7. JSON Response → ObjectMapper 8. Optional<T> 返回调用方 全链路耗时: 普通 <100ms · 代码分析 <2s · 浏览器 <30s 异常降级: 连接拒绝/超时 → Optional.empty() → 工具Fallback Python FastAPI · :8000 uvicorn · Pydantic · 动态路由注册 code-intel · /api/code-intel 代码智能: AST分析 · 符号提取 · 复杂度 files · /api/files 文件处理: 编码检测 · 内容分析 · 统计 git · /api/git Git增强: diff分析 · 影响评估 · 变更追踪 browser · /api/browser 浏览器自动化: Playwright · 截图 · DOM code-quality · /api/code-quality 代码质量: 圈复杂度 · 重复检测 · 规范 analysis · /api/analysis 分析: 变更影响 · 架构图 · 时序图 请求处理管线 FastAPI Router → Pydantic 模型验证 → 业务处理器 → BaseModel 响应序列化 异常: HTTPException → {detail, status_code} GET /api/health/capabilities 返回: {domain: {available, version, features}} 四层检测: 包导入·版本校验·系统二进制·冒烟测试 前端代理 · vite.config.ts /api/git, /api/files, /api/code-quality, /api/analysis → Python :8000 /api → Java :8080 /ws → Java :8080 (WebSocket) 超时配置 连接超时: 3秒 · 普通读取: 30秒 · 重型操作: 120秒 重试: maxRetries=3 · initialDelay=500ms · maxDelay=4000ms 能力域统计 6 域 · 30+ 端点 · 动态注册 优雅降级: 不可用→Optional.empty() capabilities.py · PythonCapabilityAwareClient.java
15

部署架构 — 单容器多进程

Single Container · Java主进程托管Python子进程 · 前端静态资源集成 · 日志按日滚动
Single Container — zhikuncode:latest eclipse-temurin:21-jre-jammy · EXPOSE 8080 · HEALTHCHECK /actuator/health Java 主进程 (PID 1) Spring Boot 3.4.13 · :8080 Agent Engine Permission MCP Protocol Tool System PythonProcessManager · 子进程管理 Python 子进程 FastAPI + uvicorn · subprocess Code Analysis Browser Auto Tree-sitter Tokenizer 7个能力域 · 按能力条件装载 · venv隔离 前端静态资源 /app/static/ · Spring Boot 托管 React 18.3 Zustand 37 Monaco Editor xterm.js 112组件 · Vite 5.4 构建 · dist/ spawn static 共享基础设施 Log Rolling app-YYYY-MM-DD-N.log.gz start.sh / stop.sh 一键启停脚本 .env 配置 .env + .env.example Docker Entrypoint docker-entrypoint.sh · 多阶段构建 可选发布执行链:Java → Node.js 22.14.0 / Meoo CLI 0.5.4 → 外部秒悟平台验证依赖:Python / Playwright Chromium;发布默认关闭,账号凭证通过受控挂载提供。公网验证与持久发布记录由后端负责;不将 CLI 完成或超时当作匿名访问成功。
Docker docker-compose.yml · 单容器多进程架构
Dockerfile + docker-entrypoint.sh → 多阶段构建
Scripts start.sh / stop.sh · 一键启停
Java + Python + 前端三进程统一管理
Logging 日志滚动 · app-YYYY-MM-DD-N.log.gz
按日期+序号自动滚动,gzip 压缩归档
Config 环境配置 · .env + .env.example
集中管理数据库、API Key、端口等环境变量
ZhikunCode Architecture Reference · 2026-09-16 · 规模图保留 2026-08-09 历史统计,非当前数量