代理模式 (agent)
Headless 命令 — 不依赖桌面 GUI,直接使用核心包运行。适用于服务器、CI/CD、容器化等无桌面环境。
核心特性
- 🤖 Claude Code 风格: 代理式 AI 会话,自主完成任务
- 🔧 25 个内置工具: 读写/编辑文件、执行命令(含后台)、搜索代码库与会话、代码执行、联网搜索/抓取、Jupyter 编辑、子代理、技能调用、LSP 代码智能、通知/定时意图、交付物发布、浏览器状态观察等
- 🎯 146 个技能: 集成全部内置技能
- 📋 Plan Mode: AI 制定计划,用户审批后执行
- 💾 会话持久化: 自动保存,支持
--session断点恢复 - 🧠 Context Engineering: 6 维上下文注入(Instinct / Memory / BM25 Notes / Task / Permanent Memory / Compaction Summary)
- 🗜️ 智能压缩: 基于重要性评分的对话压缩(替代硬编码截断)
- 🔗 Hook 管道: PreToolUse/PostToolUse/ToolError 钩子集成
- 🤖 自主模式: /auto 命令提交目标,AI 自动分解执行
- ⚠️ DAG 执行 + 风险评估: /plan execute 按依赖拓扑排序执行,/plan risk 显示风险评分
- 🎯 SlotFiller 意图检测: 自动检测用户消息中的缺失参数,交互式补全后再调用 LLM
- 🎭 Persona 系统: 项目级 AI 角色配置,自动替换默认编码助手,支持工具权限控制
- 🎨 输出风格: 命名人格叠加系统提示(
--output-style),保留编码能力改行为/语气,详见 输出风格
系统架构
agent 命令 → agent.js (Commander) → agent-repl.js
│
┌──────────┬──────────┬─────────────┼──────────────┬─────────────┬──────────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
工具系统 Plan Mode Hook管道 Context Engine 会话管理 Autonomous Bootstrap
(19 tools) (plan-mode) (hook- (cli-context- (session- Agent (bootstrap.js)
manager) engineering.js) manager) (ReAct) │
│ │ │ │ │ │ 7-stage init
▼ ▼ ▼ ▼ ▼ ▼ (DB/Config)
read/write 只读→计划→ PreToolUse 6维注入: 自动保存 /auto
edit/shell 审批→执行 PostToolUse Instinct 到SQLite 目标分解
search/code DAG执行 ToolError Memory 断点恢复 ReAct循环
skill/list 风险评估 BM25 Notes 自动纠错
Task重述
Permanent Memory
Compaction Summary
Multi-Provider (10 LLM)
Task Model Selector概述
启动 Claude Code 风格的代理式 AI 会话。AI 可读写文件、执行命令、搜索代码库、运行代码脚本(Python/Node.js/Bash)、调用 146 个内置技能。 支持 8 个 LLM 提供商(ollama/anthropic/openai/deepseek/dashscope/mistral/gemini/volcengine)和自主模式(/auto)。Agent 模式下自动根据任务类型智能选择最佳模型。 通过 6 维 Context Engineering 自动注入用户偏好(Instinct)、相关记忆(Hierarchical Memory)、相关笔记(BM25 搜索)、任务目标提醒、跨会话持久记忆(Permanent Memory)和压缩摘要(Compaction Summary),使 AI 保持上下文聚焦。
Persona 支持: 当项目配置了 Persona(通过 init --template medical-triage 或 persona set),Agent 自动使用自定义角色替代默认编码助手,并按 toolsDisabled 过滤可用工具。详见 Persona 命令。
命令参考
chainlesschain agent # 默认读 ~/.chainlesschain/config.json 的 llm 配置;无配置时 Ollama qwen2.5:7b
chainlesschain a --model llama3 # 短别名
chainlesschain agent --provider openai --api-key sk-...
chainlesschain agent --session <id> # 恢复历史会话
agent命令的短别名为a,两者完全等价。配置默认(v0.162.43+):不带
--provider/--model的裸cc agent会读取config.json的llm段作为默认(provider/model/apiKey/baseUrl),与cc chat/桌面端一致;显式 flag 仍然优先。
命令选项
| 选项 | 说明 | 默认值 |
|---|---|---|
--model <model> | LLM 模型名称 | qwen2.5:7b |
--provider <provider> | LLM 提供商(ollama/anthropic/openai/deepseek/dashscope/mistral/gemini/volcengine) | ollama |
--base-url <url> | API 基础 URL | http://localhost:11434 |
--api-key <key> | API 密钥 | — |
--session <id> | 恢复历史会话 | — |
--add-dir <dir> | 额外工作根(可重复) | — |
--mcp-config <file> | 临时挂载 MCP server,工具 → mcp__<server>__<tool> | — |
--no-mcp | 不自动连 cc mcp add --auto-connect 的服务 | (默认连) |
--settings <file> | 一次性 .claude/settings.json:权限规则 + model/env 覆盖 | — |
--output-style <name> | 套用命名人格(内置 explanatory/learning 或 .claude/output-styles/<name>.md),详见 输出风格 | — |
Headless 模式 (agent -p) 与 Claude Code 平价旗标
cc agent -p 是单轮非交互执行(claude -p 对标),进 CI / 管道 / 脚本;prompt 来自 -p 值 / 位置参数 / stdin。完整旗标 + 输出格式 + 权限档表见 CLI_COMMANDS_REFERENCE → managed-agents。
chainlesschain agent -p "fix the bug in x.js" # 单轮执行后退出
chainlesschain agent -p "..." --output-format json|stream-json # 机器可读 / 逐事件 NDJSON
chainlesschain agent -p "..." --max-turns 5 # 限制循环迭代上限
chainlesschain agent -p "..." --allowed-tools / --disallowed-tools "read_file,git"
chainlesschain agent -p "..." --permission-mode bypassPermissions # default|plan|acceptEdits|bypassPermissions
chainlesschain agent -p "..." --resume <id> | --continue # 会话恢复 + 自动压缩
chainlesschain agent -p "..." --resume <id> --fork-session # 恢复时分叉到新会话 id,原会话不动(claude --fork-session 平价)
chainlesschain agent -p "..." --output-format stream-json --include-partial-messages # 逐 token 增量
chainlesschain agent -p "..." --input-format stream-json # 持续从 stdin 喂多轮 NDJSON 用户事件
chainlesschain agent -p "..." --mcp-config ./mcp.json # 临时 MCP({"mcpServers":{...}})
chainlesschain agent -p "..." --mcp-config m.json --permission-prompt-tool mcp__auth__approve # 审批交 MCP 工具
chainlesschain agent -p "..." --settings ./run.json # 一次性 model/env + 权限覆盖
chainlesschain agent -p "..." --think | --ultrathink # Anthropic 扩展思考(其它 provider 自动忽略)
chainlesschain agent -p "..." --think --thinking-budget 8000 # legacy Claude 的思考 token 预算
chainlesschain agent --image shot.png -p "图里是什么?" # 多模态图像输入(可重复 --image)
chainlesschain agent -p "..." --json-schema schema.json # 结构化输出:最终回答必须通过 JSON Schema 校验
chainlesschain agent -p --input-format stream-json --interactive-approvals # 危险操作改结构化审批往返(见下)
chainlesschain agent -p "..." --safe-mode # 裸跑:禁项目记忆/settings hooks/记忆召回/IDE 上下文/状态行(权限规则仍生效)
chainlesschain agent -p "..." --bare # --safe-mode 之上再禁 skills/插件/MCP·IDE 自动连接——脚本化调用的最小最快面(显式 --mcp-config 仍加载)
chainlesschain agent --disable-slash-commands # 交互 REPL:'/' 开头输入原样给模型不当斜杠命令(/exit /quit 仍可用)
chainlesschain agent --ax-screen-reader # 读屏友好输出:无 ANSI 颜色、无原地状态行重绘(也可 CC_SCREEN_READER=1)交互式审批(--interactive-approvals,v0.162.45+,仅 stream-json 双工模式):confirm 级决策(危险 shell + settings/hook ask)从 headless 一律拒绝(fail-closed)变为结构化往返 —— emit approval_request(id/tool/command/risk/rule/reason),阻塞该工具等 stdin 的 {type:"approval",id,approve}(裁决走中断同款并发泵,mid-turn 即时生效);超时(CC_APPROVAL_TIMEOUT_MS 默认 120s)与 stdin 关闭一律 fail-closed 并 emit approval_resolved。不加 flag 的 CI/管道行为字节不变。VS Code Chat 面板基于此渲染内联 Approve/Deny 审批卡。
逐回合 LLM 覆盖(--input-format stream-json,v0.162.96+):stream-json 的用户事件可携带可选 llm 字段,只对这一回合切换模型而无需重启会话:
{
"type": "user",
"text": "...",
"llm": {
"provider": "ollama",
"model": "qwen2:7b",
"baseUrl": "...",
"apiKey": "..."
}
}只覆盖给出的字段(provider / model 至少给一个,空白忽略),其余沿用会话默认——例如把某一回合从云端模型路由到你自己 PC 上的 Ollama 以提升隐私。图像回合的视觉模型切换优先级更高(图片必须用视觉模型)。IDE 聊天面板与 PDH 个人助手据此做逐回合模型路由。
结构化输出(--json-schema <file>):最终回答必须是通过该 JSON Schema(子集: type/properties/required/items/enum/const/additionalProperties)校验的 JSON——回复自动提取 (裸 / 围栏 / 嵌入三形态),校验失败带错误清单纠错重跑(共 3 次),stdout 只打印校验通过的 JSON,耗尽返回退出码 1。与 --output-format stream-json 互斥。脚本消费 agent 输出不再 parse 自由文本。
逐 token 增量(--include-partial-messages,仅 --output-format stream-json)额外 emit stream_event/content_block_delta;真增量覆盖 ollama + anthropic + OpenAI 兼容 (openai/deepseek/dashscope/mistral/gemini/volcengine),含流式 tool-call 重组。
扩展思考(--think / --ultrathink / --thinking-budget):Anthropic extended thinking 的 opt-in 开关。--think 默认强度、--think hard|ultra 指定强度、--ultrathink = --think ultra。 自适应思考模型(Opus 4.6/4.7/4.8、Sonnet 4.6)走 output_config.effort;legacy 模型(Sonnet 4.5、 Opus 4.0–4.5)走 enabled + budget_tokens,由 --thinking-budget 设预算(自适应模型忽略它)。
多模态 / 图像输入(--image <path>,可重复,仅 headless):附图给视觉模型。支持 png/jpg/jpeg/gif/webp(坏扩展名立刻报错)。内部统一成 OpenAI 形状的 image_url,再按 provider 转换—— OpenAI 兼容(volcengine/doubao 等)原样透传、ollama 转 {content, images:[base64]}、anthropic 转 image content block;纯文本运行请求形状不变。
OpenTelemetry 遥测(--otlp <file>,Phase 7):把本次 agent 运行的真实 span 以 OTLP/JSON 落盘,供真 collector 摄入——零新增依赖(不引 @opentelemetry/*)。覆盖:每次模型调用 agent.model span(provider/model + input/output/cache-read/cache-write token + has_tool_calls)、每次工具调用 agent.tool span(tool.name + is_error)、provider fallback 记 agent.model.fallback counter(按 reason)。无 --otlp 时零成本(_withSpan 短路),写文件 best-effort 不改退出码。
chainlesschain agent -p "重构 auth 模块" --otlp run-spans.json
# → run-spans.json:resourceSpans(typed attr string/double/bool),可喂给 Jaeger/Tempo/collector失败自动重驱动(--auto-rewake / --max-rewakes <n>,Phase 6):当一个 asyncRewake:true 的异步 hook(如后台测试套件)在回合结束时失败,把结构化失败报告作为新一轮 user 输入追加,自动重新驱动 agent 去修。--max-rewakes 设每轮上限(默认 1,给出正值即隐含开启 --auto-rewake)。opt-in:默认关闭时一次性 cc agent -p 行为逐字节不变(CI/脚本不会被静默重跑);重驱动共享迭代预算防失控。
# 后台测试失败即自动修一轮(最多重驱 2 次)
chainlesschain agent -p "实现 X 并让测试通过" --auto-rewake --max-rewakes 2详见异步 Hooks(
async:true/asyncRewake:true)与 SessionResume/SessionPause 事件:Hooks 系统。
MCP — 把工具喂给 agent 循环
两条路(headless + 交互都支持,合并进同一 client,同名 ad-hoc 优先):--mcp-config 临时挂载, 或 cc mcp add --auto-connect 注册后每次自动连(--no-mcp 跳过)。工具名 mcp__<server>__<tool>。
Subagents — cc agents 子代理
.chainlesschain/agents/*.md(原生优先)或 .claude/agents/*.md(Claude Code 可移植)定义命名子代理: 正文 = system prompt,frontmatter tools(白名单)/ model。
chainlesschain agents list | show <name> | run <name> "<task>" | new <name> [--tools ...] [--claude]cc agents run 把子代理映射到 headless 运行;主 agent 经 spawn_sub_agent({ agent: "review:security" }) 委派——加载该子代理的 system prompt + 工具白名单 + model:(继承父 provider/key,只覆盖 model)。
Context — cc context 上下文窗口占用
chainlesschain context [<sessionId>] [--json] [--model <m>] # 按角色拆 token + 占比 + 余量(/context 对标)IDE 桥接 — 自动连接编辑器 + 实时感知
在 VS Code / JetBrains 集成终端里跑 cc agent 会自动连接编辑器的桥接 MCP server(保留名 ide,--ide 强制 / --no-ide 禁用),并获得两个自动行为:
- 提交时共享选区/打开文件:每条 prompt 自动附带
<ide-context>块(活跃文件、打开 tab、选中代码),模型即时知道"你正看着什么";只进在途消息,不写会话持久化。 - 编辑后诊断回喂:agent 改完文件,编辑器的 error/warning 自动回流到工具结果,同一循环内自修。
CC_IDE_CONTEXT=0 关闭自动感知(4 个 mcp__ide__* 工具仍可显式调用)。完整安装/协议/排错见 IDE 桥接。
PDH 桥接 — 自动连接安卓 App 的设备数据采集
IDE 桥接的姊妹能力,把同样的"App-as-MCP-server"反转模式搬到手机:安卓 App 在本机跑一个"设备能力 MCP server",cc agent 在 App 内置终端里自动连接(保留名 pdh,--pdh 强制 / --no-pdh 禁用),从而能主动指挥设备采集自己的数据:
- 6 个设备工具(
mcp__pdh__*):collect_system_data(L2 联系人+应用,免 root/登录)、collect_app_data(L3,7 源:微博/B站/12306/抖音/小红书/头条/快手)、salvage_app_data(L4 root 内存打捞)、collect_files(L1 本地文件)、list_collectors、pdh_ping。 - 引导式协同:采集前置缺失(未登录/cookie 未暖)时工具返回
assist_required,agent 引导你在对应 App 内完成一步再重试(server 标longRunning,免单次调用超时)。
cc pdh list / status / doctor # 检视 PDH 发现状态(token 脱敏)完整安装/协议/排错见 PDH Bridge 个人数据 IDE 桥接。
内置工具
代理模式提供 25 个内置工具(cli ≥ 0.162.158):
| 工具 | 说明 |
|---|---|
read_file | 读取文件内容(支持 hashed: true 返回带哈希锚点的内容) |
write_file | 写入文件 |
edit_file | 编辑文件(查找替换) |
edit_file_hashed | 基于内容哈希锚点的行编辑(抗空白/行号漂移) |
run_shell | 执行 Shell 命令(超时 60s,输出截断 30KB;run_in_background: true 返回 task_id) |
check_shell | 轮询/终止后台 run_shell 任务(增量读取 + kill,详见后台 Shell) |
git | Git 操作封装(status / diff / log / commit 等) |
search_files | 搜索文件内容 |
search_sessions | 跨历史会话语义搜索 |
list_dir | 列出目录内容 |
run_skill | 运行内置技能 |
list_skills | 列出可用技能 |
run_code | 编写并执行代码(Python/Node.js/Bash),超时 1-300s,输出截断 50KB |
spawn_sub_agent | 分派独立上下文的子代理(支持 profile: explorer/executor/design) |
web_fetch | 抓取 URL 内容(默认拒绝私网 / SSRF 防护) |
web_search | 联网搜索(7 个可插拔搜索源,auto 按密钥择优,详见联网搜索) |
notebook_edit | 编辑 Jupyter .ipynb 单元格:按 cell_id(优先)或 cell_index 定位,edit_mode = replace(默认)/ insert / delete |
todo_write | 会话级待办清单(open-agents 对标) |
ask_user_question | 主动向用户提问并阻塞等待回答 |
code_intelligence | LSP 语义代码智能:定义 / 引用 / 诊断 / 重命名(详见 code-intel) |
slash_command | 在会话内执行 REPL 斜杠命令 |
notify | 落一条通知意图到 ~/.chainlesschain/agent-schedule/,由 cc agenda 消费触发 |
schedule | 落一条定时任务意图(同上,agenda 调度执行) |
publish_artifact | 把完工交付物发布进个人交付物库,只回传元数据(详见 Artifacts) |
browser_state | 观察用户 Chrome 当前状态(CDP,需先 cc browse chrome launch):URL/标题/标签页 + 观察窗口 console/失败网络请求 + DOM 快照(40k cap)+ 可选截图;只读不操控,仅 loopback |
run_code 工具详情
run_code 是 v0.40.3 新增的代码执行工具,让 AI 能主动编写脚本解决用户问题。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
language | string | 是 | 编程语言:python、node、bash |
code | string | 是 | 要执行的代码 |
timeout | number | 否 | 超时时间(秒),默认 60,最大 300 |
执行流程:
- 代码写入临时文件(
os.tmpdir()+ 时间戳) - 根据语言选择解释器(
python3/python、node、bash) - 执行并捕获输出(最大 50KB)
- 返回
{ success, output, language, duration }或错误信息 - 清理临时文件
语言选择建议:
- Python: 数据处理、数学计算、Web 抓取、文件批量操作
- Node.js: JSON 处理、API 调用、npm 生态相关
- Bash: 系统管理、文件操作、管道命令
使用示例:
> 帮我统计当前目录下每种文件类型的数量
🤖 好的,我来写个脚本统计:
[run_code: node (156 chars)]
.js: 42
.json: 8
.md: 15
.test.js: 23
共 88 个文件notebook_edit 工具详情
notebook_edit 补齐了 cc 此前缺失的最后一个 Claude Code 代理工具(NotebookEdit),用于编辑 Jupyter .ipynb 笔记本的单元格。纯函数 editNotebookCell() 实现:解析 → 变更 → 以 nbformat 规范(1 空格缩进 + 末尾换行)重新序列化。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
notebook_path | string | 是 | .ipynb 文件路径 |
cell_id | string | 否* | 目标单元格 id(优先) |
cell_index | number | 否* | 0 基单元格下标(无 cell_id 时用) |
edit_mode | string | 否 | replace(默认)/ insert / delete |
new_source | string | replace/insert 必填 | 新单元格源码 |
*
replace/delete须给cell_id或cell_index之一定位目标。
语义:源码以行数组存储并保留末尾 \n;replace 一个代码单元会清空其 outputs 与 execution_count;insert 会生成新的 cell id(插在目标之后,或无定位时插到顶部)。完善的错误路径:坏 JSON / 无 cells[] / 缺定位符 / 目标不存在 / 缺参数。
沙箱网络隔离与出口过滤代理 (Phase 1)
当 run_shell 在沙箱模式下执行(Docker 或 bubblewrap 后端)时,其网络出口由一套策略判定 + 强制过滤的两层机制守卫——把「agent 跑的 shell 命令能访问哪些域名」从提示词约束升级为环境强制。
策略判定(sandbox-network-policy.js)
纯共享逻辑、独立可测,决定一个目标是否放行:
extractHost: 从 URL /host:port/ IPv6 提取主机,归一化方括号(修new URL()对[::1]漏括号的 SSRF 坑)。matchesDomain: 支持*(全放行公网)/*.example.com(含 apex)/ 精确匹配,防后缀欺骗。isPrivateHost: 识别 loopback /10./172.16-31/192.168/169.254/::1/fc00::/fe80::/ 云 metadata / IPv4-mapped。evaluateNetworkAccess: 优先级deny > 具体 allow > 私网守卫 > "*" allow > 默认拒。裸*放行公网但不含内网/metadata;显式白名单可覆盖私网守卫(供 dev)。
出口过滤代理(sandbox-egress-proxy.js)
把「判定」变「强制」:一个本地转发代理,对每个 HTTP 请求 + HTTPS CONNECT 隧道调 evaluateNetworkAccess,拒绝的 host 直接 403 / 关隧道(上游零接触),私网/metadata 即使 * allow 也拦(SSRF 防护)。沙箱进程的 HTTP(S)_PROXY 指向它,其 curl / npm / pip / git / wget / fetch 出口即被过滤。
- Docker 后端: 注入
--add-host host.docker.internal:host-gateway+HTTP(S)_PROXY。 - bubblewrap 后端:
--share-net+HTTP(S)_PROXY指向127.0.0.1。 - 无网络: 不启用网络时 Docker 加
--network none。 - fail-closed: 配了域名限制但代理起不来 → 拒绝无限制网络访问(绝不静默放行)。
配置
{
"sandbox": {
"network": true, // 启用网络(false → --network none 完全断网)
"network.allowedDomains": ["registry.npmjs.org", "*.github.com"],
"network.deniedDomains": ["evil.example.com"],
},
}配了 allowedDomains/deniedDomains 且 network:true 时,run_shell 自动起代理 → 跑命令 → 拆代理。
诚实标注(跨平台但非内核级): 这是代理层控制,Windows 可验、免 root、跨平台。忽略
HTTP(S)_PROXY的工具(或直接 syscall 建连的程序)仍需 OS 级 netns 隔离(Linux bwrap netns / macOS Seatbelt / Windows AppContainer)才能真正封死——那部分属平台相关的内核硬隔离。
Auto Pip-Install (自动安装 Python 包)
v0.40.3+ 新增
当 run_code 工具执行 Python 代码遇到 ModuleNotFoundError 时,会自动尝试 pip install 安装缺失的包,然后重新执行脚本。
工作流程
- 执行 Python 脚本 → 捕获
ModuleNotFoundError: No module named 'pandas' - 从错误消息中提取包名(取顶层名称:
foo.bar→foo) - 通过
isValidPackageName()验证包名安全性(拒绝 Shell 元字符) - 执行
python3 -m pip install pandas(超时 120s) - 重新执行脚本,返回结果
返回示例
{
"success": true,
"output": "DataFrame shape: (100, 5)\n...",
"language": "python",
"duration": "1523ms",
"autoInstalled": ["pandas"],
"scriptPath": ".chainlesschain/agent-scripts/2026-03-15-10-30-45-python.py"
}安全防护
isValidPackageName() 使用正则 /^[a-zA-Z0-9_][a-zA-Z0-9._-]*$/ 验证包名:
- ✅ 合法:
pandas,scikit-learn,python_dotenv,Flask - ❌ 拒绝:
foo; rm -rf /,$(whoami),foo|bar, 空字符串, 超过 100 字符
Script Persistence (脚本持久化)
v0.40.3+ 新增
run_code 工具默认将脚本保存到项目目录下,方便后续查看和复用。
持久化模式(默认)
.chainlesschain/agent-scripts/
├── 2026-03-15-10-30-45-python.py
├── 2026-03-15-10-31-02-node.js
└── 2026-03-15-10-32-18-bash.sh- 文件名格式:
YYYY-MM-DD-HH-MM-SS-{language}.{ext} - 自动创建
.chainlesschain/agent-scripts/目录 - 返回结果中
scriptPath字段指向保存路径
临时模式(persist: false)
- 脚本写入
os.tmpdir() - 执行完毕后自动清理(
finally块中unlinkSync) - 返回结果中
scriptPath为undefined
Error Classification (错误分类)
v0.40.3+ 新增
run_code 执行失败时,classifyError() 函数将错误分为 5 种类型,每种附带 hint 字段提供可操作的修复建议。
| errorType | 匹配模式 | hint 示例 |
|---|---|---|
import_error | ModuleNotFoundError, ImportError | Missing Python module "pandas". Will attempt auto-install. |
syntax_error | SyntaxError, IndentationError | Syntax error on line 15. Check for typos. |
timeout | ETIMEDOUT, timed out, exitCode=null | Script timed out. Consider increasing timeout. |
permission_error | EACCES, Permission denied | Permission denied. Try a different directory. |
runtime_error | 其他所有错误 | Runtime error near line 42. Check traceback. |
返回示例(错误)
{
"error": "ModuleNotFoundError: No module named 'pandas'",
"stderr": "...",
"exitCode": 1,
"language": "python",
"errorType": "import_error",
"hint": "Missing Python module \"pandas\". Will attempt auto-install.",
"scriptPath": ".chainlesschain/agent-scripts/2026-03-15-10-30-45-python.py"
}Environment Detection (环境检测)
v0.40.3+ 新增
getEnvironmentInfo() 在进程启动时检测运行环境信息,缓存后注入到 System Prompt 中,帮助 LLM 感知宿主环境。
检测项
| 字段 | 说明 | 示例 |
|---|---|---|
os | 操作系统 | win32, linux, darwin |
arch | 架构 | x64, arm64 |
python | Python 解释器 | python3 (3.11.0) 或 null |
pip | pip 是否可用 | true / false |
node | Node.js 版本 | v22.12.0 |
git | Git 是否可用 | true / false |
System Prompt 注入
## Environment
OS: win32 (x64)
Python: python3 (3.11.0) + pip
Node.js: v22.12.0
Git: available架构图
agent-core.js (中心模块)
│
├── AGENT_TOOLS (19 工具定义)
├── getBaseSystemPrompt() ← getEnvironmentInfo()
├── executeTool() → executeToolInner() → _executeRunCode()
│ ├── classifyError()
│ ├── isValidPackageName()
│ └── getCachedPython()
├── chatWithTools() → 10 LLM providers
├── agentLoop() → 异步生成器 (slot-filling + tool loop)
└── formatToolArgs()Context Engineering
代理模式集成了轻量级 Context Engineering 适配器(cli-context-engineering.js),在每次 LLM 调用前自动构建优化的上下文消息。
6 维上下文注入
| 注入器 | 数据源 | 说明 |
|---|---|---|
| Instinct | instinct-manager.js | 从学习到的用户偏好生成提示(编码风格、工具偏好等) |
| Memory | hierarchical-memory.js | 召回与当前查询相关的四层记忆(working→core) |
| BM25 Notes | bm25-search.js + notes 表 | 搜索笔记库中的相关内容(topK: 3, threshold: 0.5) |
| Task Reminder | 内置 | 重述当前任务目标和进度,保持 AI 聚焦 |
| Permanent Memory | permanent-memory.js | 跨会话持久记忆 + Daily Notes + MEMORY.md |
| Compaction Summary | 内置 | 被压缩消息的单行摘要,支持上下文恢复 |
稳定前缀缓存 (Stable Prefix Cache)
Context Engineering 按固定顺序排列注入内容(System Prompt → Instinct → Memory → Notes → Task → Permanent Memory),确保 LLM 的 KV-Cache 前缀尽量稳定。当上下文内容不变时,LLM 可复用已缓存的计算结果,显著降低推理延迟。
System Prompt 优化
- 清理时间戳 →
[DATE]、UUID →[UUID]、session ID →[SESSION] - 提升 KV-Cache 命中率,减少重复计算
错误学习
- 自动记录最近 10 条错误及解决方案
- 注入到上下文中,避免 AI 重复犯错
智能压缩 (/compact)
基于重要性评分的对话压缩(替代简单的 "保留最后 4 条"):
- 始终保留 System Prompt
- 评分维度:时间近、含 tool_calls、关联任务目标
- 默认保留得分最高的 6 对消息
优雅降级
- 无 DB 时自动跳过所有注入,使用静态 System Prompt
- 每个注入步骤独立 try/catch,单个失败不影响其他
斜杠命令
@路径补全(v0.162.38+):交互 REPL 中输入@后按 TAB 补全文件/目录路径(目录带尾斜杠可继续下钻,自动排除node_modules/.git,大小写不敏感);IDE 桥接已连接时,编辑器打开的标签页混入候选并排最前(workspace 内转相对路径)。IDE 列表 5s TTL 后台刷新,补全本身同步零延迟。输入排队(v0.162.40+):agent 回合进行中继续打字不再触发并发回合 —— 多余输入按 FIFO 排队(灰色
queued (N)提示),当前回合结束后自动依次执行。Esc 打断(v0.162.40+):回合进行中按
Esc立即中止当前回合(黄色 "turn interrupted" 提示,非报错)——已产出的部分对话保留,排队中的输入照常继续执行。会话回退
/rewind(v0.162.40+,steering 三件套收口):/rewind列出历史用户轮次(新→旧编号 + 预览),/rewind <n>把对话截回该轮之前并把原文预填到输入行(改完重发);空闲时双击 Esc 调出同一选择器。注意这只回退对话,文件状态回退用cc checkpoint restore。恢复摘要(v0.162.40+):
--resume重建对话后,REPL 自动打印一段离线提取式回顾(轮次统计 + 最后提问/回复预览,零 LLM 调用)—— 秒级回想"刚才聊到哪了"。
!bash 直通(v0.162.41+):! <cmd>直接跑 shell(不经 LLM),输出回灌对话上下文(<bash-input>/<bash-output>块),模型下一轮可见;Windows 走chcp 65001防乱码,120s 超时 / 30K 输出截断。
#快捷记忆(v0.162.41+):# <备注>一键追加到 git 根的cc.md(## Notes段、最新在上),本会话立即生效、之后的会话经项目记忆自动加载。
/命令补全(v0.162.41+):行首输入/he<TAB>补全 REPL 命令(命令 token 输入期间生效,空格后不打扰参数)。
基础命令
| 命令 | 说明 |
|---|---|
/exit | 退出代理 |
/help | 显示所有命令帮助 |
/model <name> | 切换/查看模型 |
/provider <p> | 切换/查看提供商,支持 8 个提供商 (ollama/anthropic/openai/deepseek/dashscope/mistral/gemini/volcengine) |
/clear | 清空对话历史 |
/compact | 智能压缩对话(基于重要性评分) |
/rewind [n] | 列出/回退到历史用户轮次(双击 Esc 同效;文件回退用 cc checkpoint) |
! <cmd> | bash 直通:直接跑 shell,输出进对话上下文 |
# <note> | 快捷记忆:追加到项目 cc.md 的 ## Notes |
/output-style [name] | 列出 / 切换 输出风格 人格;none 清除 |
Context Engineering 命令
| 命令 | 说明 |
|---|---|
/task <objective> | 设置当前任务目标 |
/task clear | 清除任务 |
/session | 显示当前 Session ID 和消息数 |
/session resume <id> | 加载历史会话消息 |
/reindex | 重新索引笔记到 BM25 |
/stats | 显示 Context Engine 统计信息 |
Plan Mode 命令
| 命令 | 说明 |
|---|---|
/plan | 进入规划模式 |
/plan show | 查看当前计划 |
/plan approve | 批准计划并开始执行 |
/plan reject | 拒绝计划,重新规划 |
/plan exit | 退出规划模式 |
/plan execute | 按 DAG 依赖顺序执行计划 |
/plan risk | 显示风险评估报告 |
Cowork 命令
| 命令 | 说明 |
|---|---|
/cowork debate <file> | 多视角代码评审 |
/cowork compare <prompt> | A/B 方案对比 |
/cowork graph | ASCII 代码知识图谱 |
/cowork decision | 决策追踪知识库 |
自主模式命令
| 命令 | 说明 |
|---|---|
/auto <goal> | 提交目标,AI 自主分解执行 |
/auto status | 查看当前自主目标进度 |
/auto pause | 暂停自主执行 |
/auto resume | 恢复自主执行 |
/auto cancel | 取消当前目标 |
/auto list | 列出所有目标(含历史) |
Plan Mode
代理模式内置 Plan Mode(规划模式),让 AI 在执行复杂任务前先制定计划并获得用户审批。
规划模式工作流
- 用户输入
/plan或 AI 自动判断需要规划 - AI 进入只读模式(仅允许
read_file、search_files、list_dir) - AI 生成结构化计划,包含步骤、依赖和风险评估
- 用户审批(
/plan approve)后 AI 开始执行 - 用户可随时拒绝(
/plan reject)要求重新规划
使用示例
> /plan
📋 已进入规划模式。请描述您的任务。
> 重构认证模块,从 session 迁移到 JWT
🤖 正在分析代码库...
[只读: read_file auth/session.js]
[只读: search_files "authentication"]
📋 计划:
1. 创建 JWT 工具模块
2. 修改登录接口返回 JWT token
3. 添加 JWT 验证中间件
4. 更新受保护路径
5. 移除 session 依赖
6. 添加单元测试
> /plan approve
✅ 开始执行计划...自主模式 (Autonomous Agent)
代理模式内置自主模式,用户只需提交高层目标,AI 自动分解为子任务并循环执行,无需手动逐步指令。
ReAct 循环
自主模式采用 ReAct(Reason → Act → Observe)循环:
- Reason: AI 分析当前目标和已完成的子任务,决定下一步行动
- Act: 调用工具(读写文件、执行命令、搜索等)执行子任务
- Observe: 观察工具输出,评估结果是否符合预期
- 重复: 回到 Reason,直到目标完成或达到 Token 预算上限
核心特性
- 目标分解: 自动将高层目标拆分为可执行的子任务序列
- 自我纠错: 工具调用失败时自动分析原因并尝试替代方案
- Token 预算: 可配置的 Token 消耗上限,防止无限循环
- 进度追踪:
/auto status实时查看已完成/剩余子任务 - 暂停/恢复:
/auto pause和/auto resume控制执行节奏
使用示例
> /auto 为项目添加完整的 CI/CD 配置(GitHub Actions + Docker)
🤖 目标已接收,正在分解...
子任务 1: 分析项目结构和依赖
子任务 2: 创建 .github/workflows/ci.yml
子任务 3: 创建 Dockerfile
子任务 4: 创建 docker-compose.yml
子任务 5: 添加测试和构建步骤
子任务 6: 验证配置正确性
[Reason] 开始分析项目结构...
[Act] read_file: package.json
[Observe] Node.js 项目,使用 Vitest 测试...
[Reason] 需要创建 CI 工作流...
[Act] write_file: .github/workflows/ci.yml
...
✅ 目标完成!已创建 4 个文件,所有配置已验证。
> /auto status
目标: 为项目添加完整的 CI/CD 配置
状态: ✅ 已完成 (6/6 子任务)
Token 消耗: 12,450 / 50,000SlotFiller 意图检测
v0.41.1 新增
Agent 模式集成了 SlotFiller 参数槽填充引擎,在调用 LLM 之前自动检测用户消息中的已知意图,补全缺失的必需参数。
支持的意图类型
| 意图类型 | 触发关键词 | 必需参数 |
|---|---|---|
create_file | create a file, new file, scaffold | fileType, path |
deploy | deploy, ship it, push to prod | platform |
refactor | refactor, restructure | target |
test | write tests, add test, unit test | target |
analyze | analyze, audit, review code | — |
search | search for, find all, grep | query |
install | install, add package | package |
generate | generate, create component | — |
edit_file | edit file, modify file | target |
工作流程
- 用户输入消息(如 "deploy this")
CLISlotFiller.detectIntent()检测到deploy意图- 检查必需参数
platform缺失 - 通过 InteractionAdapter 向用户提问 "Which platform?"
- 用户回答 "docker"
- 补全结果注入到用户消息末尾:
[Context — user provided: platform: docker] - 带有完整上下文的消息发送给 LLM
使用示例
> deploy this
? Which platform do you want to deploy to?
> docker
> vercel
> aws
> heroku
[SlotFiller] platform = "docker"
🤖 好的,我来帮你部署到 Docker...
[run_shell: docker build -t myapp .]未识别的意图(如 "help me understand this code")不会触发 SlotFiller,直接传给 LLM 处理。
使用示例
基础使用
> 帮我重构 src/utils/helper.js,提取公共方法
🤖 我来分析这个文件...
[调用 read_file: src/utils/helper.js]
[调用 edit_file: 提取公共方法到 src/utils/common.js]
[调用 run_skill: code-review 检查重构质量]
已完成重构,提取了 3 个公共方法到 common.js。使用火山引擎(豆包)Agent 模式
# 设置环境变量
export VOLCENGINE_API_KEY=ark-xxxxxxxxxxxx
# 启动 Agent(默认旗舰模型 doubao-seed-1-6-251015)
chainlesschain agent --provider volcengine
# 指定代码模型
chainlesschain agent --provider volcengine --model doubao-seed-1-6-251015Agent 模式下会自动根据任务类型智能选择最佳模型:
you> 写一个 Python 快速排序函数
[auto] 代码任务 → doubao-seed-1-6-251015
ai> def quicksort(arr): ...
you> 分析 TCP 三次握手的过程
[auto] 复杂推理 → doubao-seed-1-6-251015
ai> TCP三次握手过程如下:...
you> 今天天气怎么样?
ai> (使用默认模型,快速响应)使用 OpenAI / DeepSeek Agent 模式
# OpenAI
export OPENAI_API_KEY=sk-xxxxxxxxxxxx
chainlesschain agent --provider openai --model gpt-4o
# DeepSeek
export DEEPSEEK_API_KEY=sk-xxxxxxxxxxxx
chainlesschain agent --provider deepseek --model deepseek-chat通过中转站使用 Agent 模式(无需科学上网)
# 通过 API2D 中转站使用 GPT-4o
chainlesschain agent \
--provider openai \
--base-url https://oa.api2d.net/v1 \
--api-key fk-xxxxxx \
--model gpt-4o
# 通过 One-API 网关
chainlesschain agent \
--provider openai \
--base-url http://localhost:3000/v1 \
--api-key sk-oneapi-xxxxxx \
--model gpt-4o
# 火山引擎通过代理
chainlesschain agent \
--provider volcengine \
--base-url https://your-proxy.com/volcengine/v3 \
--model doubao-seed-1-6-251015
# 企业 Nginx 反向代理
chainlesschain agent \
--provider openai \
--base-url https://ai-gateway.company.com/v1 \
--model gpt-4o提示:
--base-url覆盖提供商默认地址,但保留 OpenAI 兼容的 API 格式。所有支持/chat/completions接口的中转站和代理均可使用。
Context Engineering 使用
> /task 重构认证模块
✓ Task set: 重构认证模块
> 查看当前进度
🤖 当前任务: 重构认证模块
[Context Engine 自动注入任务提醒 + 相关记忆 + 用户偏好]
...
> /stats
DB connected: true
Notes indexed: 42
Error history: 0
Active task: true会话恢复
# 第一次会话
chainlesschain agent
> 帮我写一个 API 服务
> /exit
# 恢复上次会话
chainlesschain agent --session session-17...
Resumed session session-17... (8 messages)
> 继续上次的工作关键文件
packages/cli/src/commands/agent.js— 命令入口(含--session选项)packages/cli/src/repl/agent-repl.js— 代理 REPL(9 工具 + 146 技能 + Plan Mode + Context Engineering)packages/cli/src/lib/cli-context-engineering.js— Context Engineering 适配器(6 维注入 + 智能压缩)packages/cli/src/lib/plan-mode.js— Plan Mode 实现packages/cli/src/lib/instinct-manager.js— Instinct 学习引擎packages/cli/src/lib/hierarchical-memory.js— 四层记忆系统packages/cli/src/lib/bm25-search.js— BM25 搜索引擎packages/cli/src/lib/session-manager.js— 会话持久化packages/cli/src/lib/permanent-memory.js— 跨会话持久记忆(Daily Notes + MEMORY.md + BM25 混合搜索)packages/cli/src/lib/autonomous-agent.js— ReAct 自主任务循环packages/cli/src/lib/content-recommender.js— TF-IDF 工具相似度 + 工具链推荐packages/cli/src/lib/hook-manager.js— Hook 管道(PreToolUse/PostToolUse/ToolError)packages/cli/src/lib/slot-filler.js— SlotFiller 参数槽填充(意图检测 + 交互式补全)packages/cli/src/lib/agent-core.js— Agent 核心业务逻辑(agentLoop 异步生成器)packages/cli/src/runtime/bootstrap.js— 7 阶段无头启动
安全考虑
run_shell工具可执行任意 Shell 命令,请在可信环境中使用run_code工具可执行 Python/Node.js/Bash 脚本,代码在临时文件中执行并自动清理write_file/edit_file可修改文件系统,建议在 Git 仓库中使用以便回滚- Plan Mode 默认只读,需用户审批后才执行写操作
- API Key 仅存储在本地,不会通过工具调用泄露
- Context Engineering 注入的记忆/笔记仅在本地处理,不泄露到外部
配置参考
Agent REPL 选项
// packages/cli/src/repl/agent-repl.js
{
provider: "ollama", // ollama | anthropic | openai | deepseek |
// dashscope | mistral | gemini | volcengine
model: "qwen2.5:7b", // 模型名称
baseUrl: "http://localhost:11434", // API 基础 URL
apiKey: null, // API 密钥(云端提供商必填)
sessionId: null, // 恢复指定会话 ID
noRecallMemory: false, // 禁用启动时记忆召回
recallLimit: 5, // 启动时注入的记忆条数上限
noStream: false, // 禁用流式输出渲染
noParkOnExit: false, // 退出时关闭而非 park 会话
agentId: null, // 限定记忆召回范围的 agent ID
}Context Engineering 选项
// packages/cli/src/lib/cli-context-engineering.js
{
enableInstinct: true, // 注入用户偏好(Instinct)
enableMemory: true, // 注入层次化记忆(top-5 相关记忆)
enableBm25Notes: true, // 注入 BM25 笔记搜索结果
bm25TopK: 3, // BM25 返回结果数
bm25Threshold: 0.5, // BM25 相关性阈值
enableTaskReminder: true, // 注入任务目标提醒
enablePermanentMemory: true, // 注入跨会话持久记忆
enableCompactionSummary: true, // 注入压缩摘要
compactKeepCount: 6, // 智能压缩保留的消息对数
}Hook 管道选项
// packages/cli/src/lib/hook-manager.js
// 通过 chainlesschain hook add 注册
{
event: "PreToolUse", // PreToolUse | PostToolUse | ToolError |
// SessionStart | UserPromptSubmit | SessionEnd
command: "node my-hook.js", // 钩子命令
priority: 0, // 执行优先级(数值越小越先执行)
timeout: 5000, // 超时时间(ms)
}Plan Mode 选项
// packages/cli/src/lib/plan-mode.js
{
autoEnter: false, // 是否在复杂任务时自动进入规划模式
readOnlyTools: [ // 规划阶段允许使用的只读工具
"read_file", "search_files", "list_dir"
],
requireApproval: true, // 执行前必须用户审批
enableDagExecution: true, // 按 DAG 依赖拓扑顺序执行步骤
enableRiskAssessment: true, // 执行前显示风险评估报告
}自主模式选项
// packages/cli/src/lib/autonomous-agent.js
{
tokenBudget: 50000, // 单目标最大 token 消耗
maxSubtasks: 20, // 子任务数量上限
autoRetry: true, // 工具失败时自动重试
retryLimit: 3, // 单工具最大重试次数
}性能指标
启动与初始化
| 指标 | 数值 | 说明 |
|---|---|---|
7 阶段无头启动(bootstrap.js) | ~200ms | DB 初始化 + 配置加载 + 技能注册 |
| Context Engineering 首次初始化 | ~50ms | BM25 索引加载 + 记忆模型预热 |
环境检测(getEnvironmentInfo) | ~30ms | 检测 Python/Node/Git,结果缓存 |
| 138 个技能元数据加载(stub) | ~15ms | 仅加载 YAML frontmatter,body 按需读取 |
工具执行性能
| 工具 | 典型延迟 | 备注 |
|---|---|---|
read_file | < 5ms | 本地文件读取 |
write_file / edit_file | < 10ms | 含 fsync |
edit_file_hashed | < 5ms | 哈希锚定,无需全文扫描 |
search_files | 10–200ms | 取决于代码库大小 |
run_shell | 视命令而定 | 超时 60s,输出截断 30KB |
run_code (Python/Node) | 500ms–5s | 含解释器启动开销 |
run_code + auto pip-install | +5–15s | 含 pip install 耗时 |
web_fetch | 500ms–3s | 含 DNS + TCP + 页面抓取 |
spawn_sub_agent | 200ms+ | 独立上下文初始化 |
Context Engineering 注入开销
| 注入器 | 典型延迟 | 说明 |
|---|---|---|
| Instinct | < 2ms | 内存读取,已缓存 |
| Memory(层次化记忆) | 5–20ms | BM25 + 向量相关性搜索 |
| BM25 Notes | 10–30ms | topK=3,threshold=0.5 |
| Task Reminder | < 1ms | 内存字段拼接 |
| Permanent Memory | 5–15ms | MEMORY.md + Daily Notes 读取 |
| Compaction Summary | < 1ms | 内存字段拼接 |
| 6 维合计 | 20–70ms | KV-Cache 稳定前缀可复用 |
智能压缩效果
| 指标 | 数值 |
|---|---|
| 压缩率 | 0.76–0.93 |
| 节省 token | 7–24% |
| 压缩触发阈值 | 消息数 ≥ 12 |
| 保留消息对数(默认) | 6 对 |
测试覆盖率
单元测试
✅ agent-core.test.js - 66 测试 (agentLoop / executeTool / chatWithTools)
✅ hashline.test.js - 29 测试 (hashLine / annotateLines / findByHash / replaceByHash)
✅ agent-core-edit-hashed.test.js - 12 测试 (edit_file_hashed handler)
✅ slot-filler.test.js - 18 测试 (intent detection / slot filling / interaction)
✅ plan-mode.test.js - 22 测试 (DAG 执行 / 风险评估 / 审批流)
✅ autonomous-agent.test.js - 20 测试 (ReAct 循环 / 目标分解 / 自动重试)
✅ context-engineering.test.js - 24 测试 (6 维注入 / 智能压缩 / 优雅降级)
✅ session-hooks.test.js - 15 测试 (SessionStart / UserPromptSubmit / SessionEnd)
✅ skill-mcp.test.js - 26 测试 (SKILL.md inline MCP / mount / unmount)集成测试
✅ agent-repl-integration.test.js - 18 测试 (完整 REPL 生命周期 + 会话恢复)
✅ run-code-integration.test.js - 16 测试 (Python / Node / Bash 执行 + auto pip-install)
✅ context-engineering-e2e.test.js - 12 测试 (6 维注入 × 有 DB / 无 DB 场景)验证结果(v5.0.2.10)
| 验证项 | 结果 |
|---|---|
agent-core 定向单测 | ✅ 66/66 |
hashline 单测 | ✅ 29/29 |
edit_file_hashed 单测 | ✅ 12/12 |
slot-filler 单测 | ✅ 18/18 |
plan-mode 单测 | ✅ 22/22 |
session-hooks 单测 | ✅ 15/15 |
skill-mcp 单测 | ✅ 26/26 |
| Agent REPL 集成 | ✅ 18/18 |
run-code 集成 | ✅ 16/16 |
| CLI 本轮定向合计 | ✅ 222/222 |
故障排查
| 问题 | 解决方案 |
|---|---|
| 工具调用失败 | 检查当前目录的文件权限 |
| Plan Mode 不生效 | 输入 /plan 手动进入规划模式 |
| 代理响应过慢 | 切换到更快的模型(如 qwen2.5:7b)或使用云端 API |
run_shell 权限不足 | 检查当前用户的 Shell 执行权限 |
| Context 注入无效果 | 检查 DB 是否初始化(chainlesschain db init) |
--session 恢复失败 | 确认 Session ID 存在(chainlesschain session list) |
| 记忆/笔记未注入 | 使用 /stats 检查 DB 连接和索引状态 |
/auto 无响应 | 检查 LLM 连接和 Token 预算 |
| Hook 执行失败 | 使用 chainlesschain hook stats 检查钩子状态 |
相关文档
- LLM 中转站与自定义接入 — 中转站、代理、自建网关完整指南
- 技能系统 — 146 个内置技能
- Plan Mode — 桌面端 Plan Mode 详情
- AI 对话 — 基础对话功能
- 会话管理 — 代理会话持久化
- 层次化记忆 — 四层记忆系统
- Instinct 学习 — 用户偏好学习
- IDE 桥接 — 自动连接编辑器的 MCP server(
--ide/mcp__ide__*) - PDH Bridge 个人数据 IDE 桥接 — 自动连接安卓 App 的设备采集(
--pdh/mcp__pdh__*)
