5.2 KiB
架构说明
本文档解释当前代码中真实存在的 cc-slim 架构。
当前已实现
1. 入口层
src/cc_slim/main.py 提供单一 Typer 命令入口,支持:
- 单次 prompt 执行
- REPL 模式
- 显式
--workspace - history 列表与 session resume
--auto-approve启动模式
REPL 本身刻意保持很小。slash command 会在普通 agent loop 之前先被拦截。
当前代码里也明确区分两个 root:
- program root
cc-slim自己读取.cc-slim.toml的位置
- workspace root
- 真正被工具、session、memory、权限与边界逻辑操作的项目目录
2. 命令层
src/cc_slim/commands.py 是一个很薄的 slash command 路由层。
它负责处理:
- session 命令
- memory 命令
- mode 命令
- permission 命令
它本身不负责模型推理逻辑,而是把动作委托给 store 或当前 Agent。
3. 核心 Agent Loop
src/cc_slim/engine.py 包含最小 harness 闭环:
- 把用户消息追加到内存 history
- 调模型
- 流式输出文本 chunk
- 如果模型请求工具,先做权限检查
- 执行工具
- 回填工具结果
- 循环,直到得到最终回答或达到最大轮数
当前对外有两个主要入口:
stream_reply()- 给 REPL 使用
reply()- 兼容包装层,把流式文本拼成完整字符串
4. Prompt 组装
system prompt 的层次是刻意分开的:
- 内置
system.md - runtime summary
- workspace
AGENTS.md - workspace
SKILLS/*.md Memory
每一层只负责自己的职责,不混用。
5. 工具层
src/cc_slim/tools.py 提供一个刻意收窄的工具面:
ReadGlobGrepWriteEditBash
设计重点是:工具都是简单的 string-in / string-out primitive。
重要边界:
- 文件类工具通过
_safe_path()保持在 workspace 内 Edit与Write都是整文件覆盖,不支持局部 patchGrep是普通文本搜索,不是 regex 引擎Bash可用,但受 mode、permission 与 workspace boundary 控制
6. Session 层
src/cc_slim/session.py 保存原始对话历史。
Session 的职责是:
- 保存可恢复的消息历史
- 支持
--history与--resume - 保存标题、时间戳等元信息
Session 刻意保持为“原始历史”,而不是长期知识。
7. Memory 层
src/cc_slim/memory.py 以 Markdown 形式保存结构化长期知识。
当前 sections:
User MemoryProject MemoryConstraintsConsolidated FactsScratch Notes
Memory 不是 transcript。它是一个能跨 session 持续带入 prompt 的长期知识层。
8. Dream 层
Dream v1 当前以手动命令形式存在:
/dream
它只使用当前已加载的 session,调用模型提炼长期有价值的信息,把结果写回结构化 Memory,并刷新内存中的 system prompt。
这很关键,因为 Dream 不是 summary。summary 压缩对话内容,而 Dream 要保留的是未来仍值得记住的知识。
9. Mode、Permission、Boundary
当前工具执行受三层控制:
- mode
- permission approval
- workspace boundary
优先级关系很重要:
- 先做硬阻止
- 再进入审批
- 最后才执行工具
当前硬阻止包括:
plan模式下阻止Write、Edit、Bash- 明显指向 workspace 外路径的
Bash
只有通过硬阻止检查后,才会进入普通 y/n 审批流程。
为什么 Memory 不是 Session
这是整个项目最重要的设计点之一。
Session:
- 原始对话和工具轨迹
- 可恢复
- 天然带噪声
- 适合做连续性上下文
Memory:
- 结构化长期知识
- 不是“发生过”就保留,而是“值得以后继续记住”才保留
- 规模足够小,可以持续注入 prompt
如果把 Session 和 Memory 混成一个概念,整个 harness 会同时失去清晰性和可控性。
为什么 Dream 不是 Summary
Summary 回答的问题是:
- 这次对话发生了什么?
Dream 回答的问题是:
- 这次对话里有哪些内容以后仍值得记住?
所以当前 Dream v1:
- 不做 multi-session 汇总
- 不改写
AGENTS.md - 只更新结构化 memory sections
- 保留
Scratch Notes
它是一个很小的 consolidation pass,而不是 transcript reducer。
为什么 AGENTS.md 不再承担系统人设
system.md 负责内置 harness 行为。
workspace AGENTS.md 负责项目 / 工作区规则。
这样可以把这几类东西拆开:
- 程序内置身份和行为
- 当前项目规则
- 长期用户 / 项目知识
如果不拆开,prompt assembly 会越来越难理解,也更难继续演化。
当前明确未做的内容
当前架构没有实现:
- sandbox
- sub-agent orchestration
- 向量记忆检索
- 自动 dream 或定时 consolidation
- multi-session dream
- 复杂权限策略
- patch 级编辑工具
- skill execution isolation
这些都是刻意保留在范围之外的内容。
未来可选增强
如果项目以后继续扩展,合理的可选方向包括:
- 更稳健的
Bash风险检测,而不是完整 shell 解析 - memory section 质量约束
- 针对选定 session 的 dream
- 更明确的配置来源 / 生效状态展示
- 更细一点的 streaming 边界测试
这些是可选增强,不是当前已经实现的能力。