第三章 工具目录

本章覆盖第 11–14 章:智能编程与安全分析工具的参数速查、外部工具服务接入字段与工具权限策略。


第十一节 智能编程工具

[!ref] 详解见用户手册「智能编程工具」节。

11.1 工具一览

工具 用途 默认权限
fs.read 读文件(按行 / 按字节) 启用
fs.write 覆盖写整个文件 询问
fs.patch 基于行号 + 校验哈希做精确替换 询问
fs.list 列目录 启用
fs.glob 通配符匹配文件名 启用
fs.grep 内容正则搜索 启用
fs.exec 同步执行命令 询问
fs.exec.start 启动后台命令,返回 session_id 询问
fs.exec.tail 拉取后台命令实时输出 启用
fs.exec.kill 终止后台命令 启用
fs.exec.list 列出当前后台命令 启用
time.now 获取当前时间(带时区) 启用
git.status 仓库状态 启用
git.branch 创建 / 切换分支 询问
git.init 初始化仓库 询问
git.add 暂存文件 询问
git.commit 提交暂存内容 询问
git.checkout 检出分支 / 文件 询问
git.diff 查看差异 启用
git.log 提交历史 启用
git.show 查看某次提交详情 启用
git.blame 逐行溯源 启用
git.stash 暂存 / 恢复工作现场 询问
git.merge 合并分支 询问
git.rebase 变基 询问
git.worktree.create 创建 worktree 询问
git.worktree.list 列出 worktree 启用
git.worktree.remove 删除 worktree 询问
web.bing Bing 搜索(RSS 端点) 启用
web.fetch 抓取指定 URL 并清洗为可阅读文本 启用
skill.list 列出当前可用技能 启用
skill.invoke 渲染并调用某个技能 启用
TodoWrite 写入 / 更新待办列表(最多 50 条) 启用
TaskWait 阻塞等待后台任务 / 子代理(默认 5min,最长 30min;支持 all / any) 启用
SuggestTask AI 主动建议一个分外任务(卡片形式挂在消息流,不打断当前正事) 启用
DismissTask AI 撤回已过时的建议任务 启用
mcp.list_servers 列出所有 MCP server 启用
mcp.describe_server 查看某 server 详情(密钥脱敏) 启用
mcp.list_tools 查看某 server 暴露的工具 启用
mcp.test_server 真握手探活(30s 预算;阶段 validate_args / policy_denied / needs_approval / connect / list_tools / ok;http / sse 地址指向本机 / 内网时 policy_denied,无限制模式除外) 启用
mcp.add_server 新增 server(写类,两步制 confirm=true) 询问
mcp.remove_server 删除 server(写类,两步制);默认 MCP 后端现在也可删(网关此前会拒删默认后端,已修复) 询问
mcp.toggle_server 启停 server(写类,两步制) 询问
mcp.import_config 批量导入;支持 Claude Desktop schema(写类,两步制) 询问
mcp.export_config 导出当前配置(密钥脱敏) 启用
PluginSearch 搜索插件市场目录(全局只读,无需工作区上下文) 启用
PluginList 列出已装 / 可装插件清单 启用
PluginInstall 安装插件并在当前工作区激活(写类,两步制:先返回 dry_run 预览 — 能力清单 / MCP 真实命令行 / 签名状态 / 来源溯源,confirm=true 才落地;签名校验沿用产品策略) 询问
PluginUninstall 卸载插件并同步清理工具配置残留(写类,两步制) 询问

11.2 通用返回字段

读取 / 搜索类工具的返回都包含:

字段 类型 说明
truncated bool 是否被软上限 / 硬上限截断
next_offset int 下次按行读的起始行号
next_byte_offset int 下次按字节读的起始字节
content_hash string 整文件内容指纹(写入校验用)
line_hashes array 行级指纹(patch 校验用);已去重,仅在需要时输出

结果瘦身(省 token / 额度):工作区工具的返回路径一律相对工作区根(relPath),错误串出口剥除根路径前缀(不外泄绝对根),去除重复 line_hashes,分页记账(next_offset 等)仅在 truncated=true 时才输出。

11.3 read

参数 类型 默认 说明
path string — 相对工作区根,或工作区内的绝对路径;必填
mode enum lines lines / bytes
offset int 0 起始行号 / 字节偏移
limit int 软上限 4096 字节上限;硬上限 256 KiB
as_text bool false 对被判定为二进制的文件强制按文本读取

编码识别:优先按 BOM 判定;无 BOM 时识别 GBK / GB18030 / UTF-16 等常见编码,解码为 UTF-8 后交付。grep 走同一套解码。确属二进制的文件默认拒读(用 as_text 覆盖)。

11.4 write

参数 类型 默认 说明
path string — 必填
content string — 必填
expected_hash string — 上次 read 返回的 content_hash;用于并发覆写校验(CAS)

11.5 patch

参数 类型 默认 说明
path string — 必填
start_line int — 1-based
end_line int — 1-based,含
replacement string — 新内容
verify_hashes array — 该行号区间的 line_hashes;不匹配则拒绝

11.6 list

参数 类型 默认 说明
path string . 相对工作区根
pattern string * shell 风格通配
include_hidden bool false 是否包含隐藏文件
sort enum name name / mtime / size
limit int 4096 字节 单次返回总长度上限

11.7 glob

参数 类型 默认 说明
pattern string — 通配符表达式
path string . 相对工作区根
sort enum mtime mtime / name
自动跳过 — .git/ node_modules/ dist/ 不可解除

11.8 grep

参数 类型 默认 说明
pattern string — RE2 正则
path string . 相对工作区根
path_glob string **/* 文件名过滤
case enum smart sensitive / insensitive / smart
context int 0 上下文行数
include_binary bool false 默认启发式跳过二进制

11.9 fs.exec / fs.exec.start

参数 类型 默认 说明
cmd string — 必填
cwd string 工作区根 相对路径
timeout_seconds int 120 超过即终止
env object — 追加环境变量
stdin string — 选填
output_byte_limit int 4096 / 256 KiB 软上限 / 硬上限(stdout、stderr 各自)

支持的 shell 语法(非无限制模式同样可用):

语法 判定
&& / || / ; 串联,| 管道 逐段各自过白名单;任一段不过 → 整条拒绝
> / >> 重定向 目标须落在工作区或已附加的可写路径内
cd 允许,仍圈禁在工作区内
  • samples/ 只拦执行,不拦读取与作为参数传入。
  • test.run / lint.run / sast.run 给出的命令走同一套护栏与同一个分词器。
  • 路径口径:工作区内的绝对路径与相对路径走同一套判定,不再一律拒绝绝对路径。
  • 白名单已含 cc 家族编译器(cc / gcc / clang 等):写出通道(-o / -MF 等)圈禁工作区内,危险旗标前缀拦截。
  • 命令名归一化(Windows):大小写与 .exe 后缀不影响白名单判定;被策略拒绝时错误信息带上命令与规则上下文。
  • 输出编码:Windows 下 GBK / UTF-16 输出在汇聚点统一归一为 UTF-8(fs.exec 与 fs.exec.tail 均覆盖)。
  • 回显:结果中的命令按原样保留引号,不做空格重拼。
  • Windows 批处理(.bat / .cmd)参数带专门的注入护栏。
  • 工作目录不被劫持:工作区下的同名文件不会被解析成待执行程序。

11.10 fs.exec.tail / fs.exec.kill / fs.exec.list

工具 参数 说明
fs.exec.tail session_id, stream(stdout 默认 / stderr), byte_offset(opt), byte_limit(opt,默认 4096,硬上限 256 KiB) 按字节偏移续读输出;返回 status / exit_code / buffer_truncated / next_byte_offset
fs.exec.kill session_id, grace_seconds(opt) 终止会话;grace_seconds 先发 SIGTERM 等 N 秒再 SIGKILL,0 = 直接 SIGKILL(Windows 忽略)。Unix 整组终止,Windows 单杀头进程
fs.exec.list 无 当前所有后台会话列表

本地后台会话上限:最多 16 个并发;单会话磁盘日志 256 MiB(溢出丢尾);进程退出后日志可继续拉取,1 小时后 GC 回收;会话随 Interpreter 生命周期结束。

SSH 远端后台会话不受上述限制:状态与日志落在远端 <root>/.avlcode/sessions/,日志为完整文件(无 256 MiB 环形丢尾),且跨断线重连与应用重启存活(见 §22.4)。

11.11 web.bing / web.fetch

工具 参数 说明
web.bing query, top_k(默认 5) Bing RSS 搜索;返回标题 / 摘要 / URL
web.fetch url, format(md/txt/html) 抓取并清洗

11.12 code.* — 代码智能工具组(基于 LSP)

工具 参数 说明
code.definition path, symbol 或 line/character 跳转到符号定义
code.references path, symbol 或 line/character, include_declaration(默认 false) 查找符号的全部引用 / 调用点
code.hover path, line, character 查看符号的类型 / 签名 / 文档
code.symbols path 列出文件的符号大纲
code.workspace_symbols query 全仓按名搜索符号
code.diagnostics path(可空) 报告编译错误 / 警告;空 path 返回工作区聚合
code.call_hierarchy path, symbol 或 line/character, direction(incoming/outgoing) 调用图
code.repo_map — 项目骨架(文件树 + 各文件顶层符号),token 友好
code.rename path, symbol 或 line/character, new_name 跨文件安全重命名(写盘)
code.code_action path, line, character, apply_title(可空) 不传 = 列出动作;传 = 应用对应快速修复(写盘)
code.lsp_status — LSP server 池实时状态:运行中的 server / 工程 root / 存活 / 在线·空闲秒数 / 支持语言
code.search query(必填), limit(默认 20), path, refresh(默认 false), expand(默认 false) 非向量全库 RAG 检索(见 §11.12.3)
code.ask question(必填), limit(默认 12), path 全库 RAG 问答,模型按路由策略选(见 §11.12.3、§6.8.1)
code.implementation path, symbol 或 line/character 跳到接口 / 抽象方法的实现(LSP implementation)
code.type_definition path, symbol 或 line/character 跳到变量 / 表达式的类型定义(LSP typeDefinition)
code.document_highlight path, symbol 或 line/character 本文件内该符号的全部读 / 写 / 引用点,比全仓 references 轻量
code.completion path, line, character 该光标位置的补全候选
code.signature_help path, line, character 函数调用的形参签名 + 当前高亮参数(光标置于调用括号内)
code.formatting path, tab_size(默认 4), use_tabs(默认 false) 按 LSP 格式化整篇并写盘;无改动则不写

位置参数对外 1-based(对齐 fs.read 行模式 / cat -n);进 LSP 前由 interpret 层转 0-based。

能力降级:可选能力(implementation / type_definition / document_highlight / completion / signature_help / formatting 等)并非每个语言服务器都实现。是否支持按真实响应判定而非按 server 声明预判(避免声明缺失导致的误拒);判定为不支持后跨会话缓存,同一 server 不再重复试探。

11.12.1 内置语言(24 门,按 ID)

go · ts · py · c(cpp) · rust · java · deno · eslint(js 增强) · lua · bash · yaml · php · ruby · vue · zig · dart · kotlin · clojure · elixir · haskell · fsharp · csharp · gleam · astro

每门语言绑定一个 LSP 命令(gopls / typescript-language-server / pyright-langserver / clangd / rust-analyzer / jdtls / …);缺哪个按需自动下载(go install / npm 等),并显示安装进度。

11.12.2 用户配置文件 lsp.yaml / lsp.json

工作区根目录 .avlcode/ 或 ~/.avlcode/,按 lsp.yaml > lsp.yml > lsp.json 顺序取第一个存在的:

lsp:
  rust:
    disabled: true              # 禁用
  go:
    cmd: gopls                  # 覆盖启动命令
    args: ["-rpc.trace"]
    root_markers: ["go.mod", "go.work"]
  custom_lang:                  # 增加自定义 server
    extensions: [".myx"]
    cmd: my-langserver
    install_via: npm
    install_pkgs: [my-langserver]

热重载:文件 mtime/size 变更自动重读,不必重启工作区。服务器进程崩了 / SSH 掉线自动重启。

11.12.3 全库 RAG 检索与问答(code.search / code.ask)

非向量(零 embedding)符号级全库检索:BM25 + 标识符切分(驼峰 / 下划线 / 连字符)+ 中日韩二元切分(中文注释 / 中文提问同样能命中),纯本地、可离线。索引落 <base>/.avlcode/rag/symbols.jsonl(远程工作区仅内存),首建后按文件 mtime 增量同步(改 / 增 / 删)。仅索引定义类符号(函数 / 方法 / 类型 / 接口 / 常量等)。

索引文件数上限 4000(不可配)。超限时如实回报而非静默截断:结果里带 index_covers_all_files=false、files_not_indexed(未纳入索引的文件数)与 truncated_hint 可读提示,便于判断"没搜到"是真不存在还是没覆盖到。

code.search 参数

参数 类型 默认 说明
query string — 必填,自然语言 / 关键词 / 符号名
limit int 20 返回命中数上限
path string 工作区根 限定子目录
refresh bool false 强制全量重建索引
expand bool false 结构重排:对头部命中跑 LSP 调用层级,被调用更多 = 更核心、排更前(更准但慢)

返回 hits[](file / start_line / end_line / name / kind / score / why[](命中的关键词)/ 可选 container·signature)、count、indexed_symbols、indexed_files;空结果给 hint。

code.ask 参数

参数 类型 默认 说明
question string — 必填,自然语言问题
limit int 12 喂给合成的检索片段数
path string 工作区根 限定子目录

模型:按「模型路由策略」在已启用且有 API Key 的澜砥系列模型中选(默认效果优先);无可用澜砥模型时用当前会话的 provider / model(隐式注入);本地模式下只用会话模型;两者都拿不到时报错。超时与输出上限跟随所选模型配置。检索片段会发给所选模型。

返回 answer + citations[](file / start_line / end_line / name)+ hit_count + model + provider + routed(是否为路由选中的澜砥模型);检索不到会直说、不编造。默认对扩展检索结果做结构感知智能重排(无需显式 expand)。

上限:索引文件数 ≤ 4000、全量构建超时 120s、每文件 ≤ 400 符号 / ≤ 4 MiB;结构重排取头部 8 条。增量刷新的作用域已修正(文件变更后不多刷、不漏刷)。

11.13 test.run — 测试运行 + 失败回灌

字段 类型 说明
framework string 可选;go / pytest / cargo / node(vitest / jest);留空 = 自动探测
path string 可选;限定范围(Go 包模式 ./pkg/... / pytest 目录或文件 / cargo 包名)
command string 可选;完整测试命令覆盖(如 go test -run TestFoo ./pkg)
timeout_sec int 默认 300 秒

返回:failures[](最多 50 条 {test, file, line, message}) + 一小段原始 tail;未知框架退回到退出码 + tail 兜底。plan(筹划)与 assess(评估)模式均禁用(执行测试会产生写副作用)。

11.13.1 自检门禁(opt-in,泛化的多检查器)

项 粒度 默认 说明
自检门禁 G — 设置 → 测试与自检 tab 配全局默认(~/.config/avlcode/checkgate-default.yaml)
自检门禁 W 关 工作区 .avlcode/testgate.yaml;新会话默认值
自检门禁 S 继承 W 会话菜单的检查项勾选清单逐条覆盖;显示实际生效态
仅在有编辑后跑 — 是 没改动文件的轮次跳过
连续注入上限 — 3 撞到即停门禁

testgate.yaml 结构:

enabled: true
checks:                              # 检查器列表(可单选 / 组合)
  - name: test                       # test | diagnostics | lint | sast
    mode: block                      # block | report
    submode: changed                 # test: changed | full
    scope: changed                   # changed | workspace
  - name: lint
    mode: block
    submode: strict                  # lint: strict | lenient
    linters: [errcheck, govet]       # 子集(可选)
  - name: sast
    mode: report
    submode: quick                   # sast: quick | deep
    config: .semgrep.yml             # 离线规则(可选)
modes:                               # 按工作模式分别覆盖
  plan:    { enabled: false }
  prepare: { enabled: false }

11.13.2 CheckSpec 字段

字段 类型 说明
name enum test / diagnostics / lint / sast / testgen / judge
mode enum block(默认,注入强制修) / report(只通报不拦)
submode string test: changed / full;lint: strict / lenient;sast: quick / deep
scope enum changed(默认,改动文件) / workspace(全库)
path string 限定范围(可选)
linters array lint 子集(可选)
config string 自定义配置路径(sast .semgrep.yml 等)
timeout_sec int 单检查器超时

11.13.2a testgen — 改动缺测试自动补(opt-in)

  • 不在默认集:要显式把 testgen 加进 checks 才生效。
  • 覆盖语言:Go / Python / JavaScript / TypeScript;其它扩展名(.c / .java 等)不判定。
  • 测试文件本身与生成物跳过:避免「给测试写测试」「给 .pb.go 写测试」。
  • 存在性查询:经 zMCP 网关 fs.glob 查测试文件存在性(SSH 远端也正确)。
  • 3 次注入硬上限:复用 MaxTestGateRetries,误报最多纠缠 3 轮即停门禁。

11.13.2b judge — LLM 收尾自审(opt-in,默认 report)

  • 独立 fresh-context 模型调用:复用 agentFacade.CompactSummaryStream;不带 agent 自己的对话历史,消除自我合理化偏见。
  • 看什么:本轮目标 + diff,挑出机检抓不到的逻辑 / 语义 / 安全意图错。
  • few-shot 提示 + 当轮诊断背景注入到 prompt,判断更准、误报更少。
  • 门控:judge 在所有便宜检查器之后、且仅当 block 检查器全绿时才跑。
  • 模型乱报 / JSON 脏 / 超时 → 非权威放行,绝不误拦。
  • 返回结构:{ok: bool, issues: [{file, line, severity, confidence, message}]} — severity ∈ error / warning / info,confidence ∈ 0..1。block 模式下的 confidence / severity 阈值过滤为 Phase 2 计划。

11.13.3 lint.run — 静态检查(只读分析)

字段 类型 说明
linter string golangci-lint / eslint / ruff;留空 = 自动探测(go.mod → golangci-lint / .eslintrc·eslint.config → eslint / pyproject.toml·ruff.toml → ruff)
path string 范围(目录 / 文件 / Go 包模式 ./...)
linters array 子集(如 golangci 的 errcheck / govet)
submode string strict(警告也算失败) / lenient
config string 自定义配置文件路径
command string 完整命令覆盖
timeout_sec int 默认 180

返回:findings[]({file, line, rule, severity, message}),与 test.run 同形。golangci-lint v1 / v2 JSON 输出参数已自适应。只读分析,plan / assess 模式可用。

11.13.4 sast.run — 安全静态分析(只读分析)

字段 类型 说明
path string 范围
submode string quick(限大文件加速) / deep(完整)
config string 规则配置;空 = --config auto(联网拉规则);离线请用本地 .semgrep.yml
command string 完整命令覆盖
timeout_sec int 默认 240

返回:findings[] 同形。后端:semgrep。只读分析,plan / assess 模式可用。

11.14 tools.list / tools.describe / tools.load — 工具自省与按需加载

工具 参数 说明
tools.list prefix(可选) 列本会话可调用的工具(名 + 描述);可按命名空间过滤
tools.describe name(必填) 返回指定工具的完整 schema(描述 + 参数定义)
tools.load 分类名 按分类加载工具;不传时返回分类目录(每类一句话能力说明 + 工具名清单)

自省结果按本会话的实际可用性裁剪(受工具三态与分类延迟加载影响),返回的说明中会提示"表里看不见 ≠ 不存在,可先 tools.load"。这两个自省工具本身穿透子代理白名单恒可用,但输出仍按名单裁剪,且压不过用户设置的禁用清单。

11.14.1 工具分类延迟加载

默认开启(Settings.ToolLazyLoad,schema v9 起)。开关在智能体管理器 →「配置工具」Tab →「工具分类延迟加载」,不在设置页。

  • 常驻分类:fs(读写 / glob / grep / exec)、tools(list / describe / load)、agent(委派 + EnterPlanMode / ExitPlanMode / TodoWrite)。
  • 16 个可延迟分类:code / git / sec / vt / sbom / mcp / web / skill / test / lint / sast / market / plugin / gh / sys / time。
  • 加载路径:① 隐式 —— 按新增 user 消息中的关键词预加载对应分类(中英关键词表);② 显式 —— tools.load 点名加载。会话中途新连的 MCP 后端分类自动放行。
  • 旁路:可见候选 ≤ 32 个时整表放行(子代理白名单模式通常走这条)。
  • 开启时系统提示词会注入一段说明,告知助手工具表是有意精简的、可按需加载。
  • 每个 MCP 服务可单独设置是否延迟(Settings.MCPLazyLoad,缺省跟随全局)—— 见 §13.1。

11.15 Python venv 自动感知

fs.exec / fs.exec.start 在工作区里跑 Python 相关命令时自动遵循工作区 venv:

来源 探测路径
标准 venv <工作区>/.venv / <工作区>/venv
conda env 目录下的 bin/python(含 Windows Scripts/python.exe)
poetry poetry env info -p(项目外环境也支持)
pipenv pipenv --venv

机制:把首命令改写成 venv 里的绝对路径 + 注入 VIRTUAL_ENV / PATH。项目外发现缓存 5 分钟 / 探测超时 15 秒。全局关闭:AVLCODE_DISABLE_VENV_AUTODETECT=1。

pyright 语言服务(code.*)也接入 venv 感知,本地 + SSH 远端一致。

例外:SSH 远端的后台命令(fs.exec.start)不做 venv 感知 —— venv 探测靠本机目录结构,在远端会探到错误的本地路径。远端跑 Python 后台任务请显式指定解释器。