cc-slim/ARCHITECTURE.md
2026-04-15 16:01:39 +08:00

5.2 KiB
Raw Blame History

架构说明

本文档解释当前代码中真实存在的 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 闭环:

  1. 把用户消息追加到内存 history
  2. 调模型
  3. 流式输出文本 chunk
  4. 如果模型请求工具,先做权限检查
  5. 执行工具
  6. 回填工具结果
  7. 循环,直到得到最终回答或达到最大轮数

当前对外有两个主要入口:

  • stream_reply()
    • 给 REPL 使用
  • reply()
    • 兼容包装层,把流式文本拼成完整字符串

4. Prompt 组装

system prompt 的层次是刻意分开的:

  1. 内置 system.md
  2. runtime summary
  3. workspace AGENTS.md
  4. workspace SKILLS/*.md
  5. Memory

每一层只负责自己的职责,不混用。

5. 工具层

src/cc_slim/tools.py 提供一个刻意收窄的工具面:

  • Read
  • Glob
  • Grep
  • Write
  • Edit
  • Bash

设计重点是:工具都是简单的 string-in / string-out primitive。

重要边界:

  • 文件类工具通过 _safe_path() 保持在 workspace 内
  • EditWrite 都是整文件覆盖,不支持局部 patch
  • Grep 是普通文本搜索,不是 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 Memory
  • Project Memory
  • Constraints
  • Consolidated Facts
  • Scratch 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

优先级关系很重要:

  1. 先做硬阻止
  2. 再进入审批
  3. 最后才执行工具

当前硬阻止包括:

  • plan 模式下阻止 WriteEditBash
  • 明显指向 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 边界测试

这些是可选增强,不是当前已经实现的能力。