18-local-filesystem-first-agent-encapsulation.md
4.13 KB
18. Local File-System First 与 Agent 完全自治架构 (v3.5)
1. 架构演进背景
在早期的 LemonBoss 设计中,技能 (Skills)、对话日志 (Conversations)、系统配置和 Agent 实例是分离的。这导致了三个核心问题:
- 全局耦合污染:所有的 Skill 堆砌在外部的
repo/skills/中,当 Innovator 创建新的子 Agent 能力时,很容易造成命名空间冲突或权限越界。 - 缺乏运行闭环:前端、日志存储和运行时配置需要依赖 SQLite 或独立的全局缓存映射,系统状态难以通过简单的文件复制进行迁移和备份。
- Claude CLI 兼容性冲突:Claude Code CLI 默认从工作空间目录底下的
.claude/skills/挂载原生能力,而我们原本的自定义skills/与其天然隔离,导致大模型在本地原生工具和自定义 Agent 调度间产生严重的幻觉或抢跑情况。
2. Agent 的“完全封装” (Encapsulation)
系统现已全线迁移至 Local File-System First 和 “Agent 就是微容器” 的架构。全局根目录下的 skills/ 与数据库已被彻底移除。现在的每一位 Agent 都是一个 100% 便携的“自治微容器”。
2.1 Agent 内部目录结构闭环
所有 Agent(如 innovator-001)统一收拢在 data/agents/{agentId}/ 下。其数据组织如下:
data/agents/innovator-001/
├── config.json ← Agent 基础运行配置项
├── identity.md ← Agent 姓名、Emoji 及基础设定
├── user.md ← 面对的用户画像预设
├── soul.md ← Agent 的性格特征与边界
├── tools.md ← Agent 允许使用的外部工具白名单
├── memory/ ← Agent 长短期记忆数据库
├── conversations/ ← Agent 所有的历史对话记录(原全局级映射下放)
│ └── {convId}/
│ ├── meta.json
│ ├── history.json
│ └── messages.log
├── agent.md ← 【核心】Persona 指令(负责统驭“我是谁”)
└── .claude/
└── skills/ ← 该 Agent 本人拥有的独占子技能挂载区
├── main_skill/
│ └── SKILL.md ← 【核心】Workflow 指令(负责指导“我专业怎么做”)
├── meta_hunt/
└── meta_digest/
2.2 灵肉分离 (Persona vs Capability)
在设计上,将传统臃肿的宏大提示词进行了概念切分:
agent.md: 这是一个轻量级的占位符,仅告知 LLM 它的宏观定位(例如:“你是 Innovator 编排总控大脑…”)并以引用指针的方式要求其遵循main_skill。.claude/skills/main_skill/SKILL.md: 这才是其实际作业指南(包含编排语法[CALL:xxx]规则、反思规则矩阵、生成文件的指令路径逻辑)。这种划分让 LLM 启动时能像挂载可执行程序一样拥有天然的边界感,同时也完美迎合了 Claude MCP 的结构体系。
3. 多路并发与无缝切盘
由于实现了 Agent 单体的绝对封闭自治,后台 Node 服务 server/routes/agent-chat.js 也顺势进行了架构级优化:
- 并发解析:通过对输出流的拦截,现在单次对话可以触发一个纯文本中包含了多个
[CALL:]块的调度池。底层的AgentManager将利用Promise.all齐发请求到各个挂载的 SubAgent 的专用沙盒中执行任务。 - 零配置扫描:服务器不再静态维护全系统的技能库表,而是启动热加载并遍历所有的
data/agents/*/.claude/skills/节点。用户在网页端切换 Agent 头像时,后端路由从对应沙盒目录吐出隔离的conversationsList,界面实现极致丝滑的无状态切盘和防死链。 - 动态生成:
meta_creator被赋予了全权创世能力。它不再只生成一个孤零零的脚本文档,而是通过AgentScaffold.js的引擎直接在data/agents/下开辟一个新的隔离目录,灌入完整的六大配置文件。一个新能力(Agent)的诞生,即代表着文件系统的一次干净合规的增量。