122 lines
5.4 KiB
Markdown
122 lines
5.4 KiB
Markdown
# 规划目录
|
||
|
||
本文描述 `Kernel + Extensions` 架构下的源码与运行数据目录。目录服务于依赖关系和可理解性,不要求为尚未实现的能力预建空 package。
|
||
|
||
## 源码仓库
|
||
|
||
当前采用一个 TypeScript package:
|
||
|
||
```text
|
||
llm-to-agent/
|
||
├── src/
|
||
│ ├── kernel/
|
||
│ │ ├── kernel.ts # 生命周期与总入口
|
||
│ │ ├── extension.ts # Extension 契约与扩展点
|
||
│ │ ├── registry.ts # Extension 注册的能力
|
||
│ │ ├── events.ts # 运行事件
|
||
│ │ └── ... # 后续 Space、Conversation、Run、Store、权限等稳定机制
|
||
│ │
|
||
│ ├── extensions/
|
||
│ │ ├── shared/ # 跨产品公共能力
|
||
│ │ ├── cli/ # CLI 私有能力
|
||
│ │ ├── web/ # Web 私有能力
|
||
│ │ └── desktop/ # Desktop 私有能力
|
||
│ │
|
||
│ ├── products/
|
||
│ │ ├── product.ts # 产品定义
|
||
│ │ ├── index.ts # 产品查找
|
||
│ │ ├── shared.ts # 公共 Extension 装配清单
|
||
│ │ ├── cli.ts # CLI 私有装配清单
|
||
│ │ ├── web.ts # Web 私有装配清单
|
||
│ │ └── desktop.ts # Desktop 私有装配清单
|
||
│ │
|
||
│ └── main.ts # 创建 Kernel 并执行装配
|
||
│
|
||
├── docs/
|
||
├── tests/ # 跨进程或跨版本测试
|
||
├── tooling/ # 构建和开发辅助
|
||
├── package.json
|
||
└── tsconfig.json
|
||
```
|
||
|
||
单元测试与所属源码放在一起。
|
||
|
||
## Kernel 目录
|
||
|
||
`src/kernel/` 只保存所有能力共同依赖的稳定运行机制。首批内容是 Extension 生命周期、能力注册和事件;Space、Conversation、Run、Store、取消、权限等在对应功能实际实现时进入。
|
||
|
||
Kernel 不导入 `src/extensions/` 或 `src/products/`。具体能力流入 Kernel 的唯一方式是安装 Extension 后注册公开抓手。
|
||
|
||
## Extensions 目录
|
||
|
||
Extension 按完整能力纵向组织,不按 Adapter、Tool、Hook、Behavior 等技术名词横向切分。
|
||
|
||
例如未来的 `shared/browser/` 可以同时包含浏览器连接、可调用能力、运行事件处理和自己的测试;无需把同一能力拆散到四种模块目录。
|
||
|
||
只有真实能力开始开发时才创建目录和源码。README 可以说明边界,但不再使用空 `index.ts`、空 package 或预留导出伪造进度。
|
||
|
||
## 公共与产品私有边界
|
||
|
||
- `shared/`:不认识单一产品界面,并可被至少两条产品线或后台 Runtime 能力复用;不要求三条产品全部启用。
|
||
- `cli/`:终端输入、ANSI 渲染、REPL、斜杠命令和 TUI。
|
||
- `web/`:HTTP 接入、事件流、路由、页面与受控远程访问。
|
||
- `desktop/`:窗口、原生桥接、托盘、快捷键、通知、安装与更新。
|
||
|
||
产品私有目录不能互相依赖。Web 和 Desktop 共用的聊天界面、状态或组件应进入 `shared/` 下的合适能力目录,Desktop 不直接引用 `web/` 私有实现。
|
||
|
||
CLI 与 Desktop 需要进程外启动器时,启动器源码可以与该产品的私有 Extension 放在同一能力目录中,但必须保持轻量:只负责 Runtime 拉起、连接和输入输出转发,不能复制状态与 Agent 执行逻辑。
|
||
|
||
这里的“私有”表示产品归属,不自动构成权限边界。若未来需要限制某项能力只对特定产品可见,再由 Kernel 提供通用作用域机制,而不是硬编码三个产品名。
|
||
|
||
## Products 目录
|
||
|
||
`src/products/` 只负责选择 Extension Factory,并允许 Runtime 同时启用一个或多个产品入口:
|
||
|
||
```ts
|
||
const factories = [
|
||
...sharedExtensions,
|
||
...product.extensions,
|
||
];
|
||
```
|
||
|
||
清单使用 Factory 而不是复用 Extension 实例,避免多个 Kernel 或测试之间共享可变生命周期状态。产品逻辑一律留在对应 Extension 中。
|
||
|
||
## Package 调整原则
|
||
|
||
当前单包能够提供最短依赖链和最低维护成本。满足以下真实需求之一时,才将目录提升为独立 package:
|
||
|
||
- Web 或 Desktop 构建工具无法与 Runtime 共用配置;
|
||
- 原生依赖或平台依赖需要单独安装;
|
||
- 能力需要独立测试、版本、分发或进程隔离;
|
||
- 单包依赖导致实际构建或启动成本无法接受。
|
||
|
||
拆包只改变物理构建边界,不改变 `products → extensions → kernel` 的依赖方向。
|
||
|
||
## Supervisor 目录
|
||
|
||
Supervisor 到 P3 自进化发布闭环时再建立。它必须位于当前 Runtime 发布物之外,才能在新 Kernel 启动失败时切回旧版本,但它不是 Runtime 内部的第三种架构模块。
|
||
|
||
## 运行数据目录
|
||
|
||
运行数据不进入源码仓库:
|
||
|
||
```text
|
||
~/.agent/
|
||
├── tasks/
|
||
├── registry.json
|
||
├── extensions/ # 本地安装的扩展
|
||
├── releases/ # Installed Releases
|
||
├── runtime/
|
||
└── config/
|
||
```
|
||
|
||
Project 专属 Agent 数据位于项目根目录的 `.agent/`。候选 worktree 和 Installed Release 由 `~/.agent/` 下的运行数据管理。
|
||
|
||
## 调整判断
|
||
|
||
- 新功能默认进入某个 Extension;
|
||
- 多个 Extension 需要同一种不可绕过的机制时,才调整 Kernel;
|
||
- 两个产品线复用私有代码时,将复用部分提升到 `shared/`;
|
||
- 目录需要独立构建或发布时再拆 package;
|
||
- 调整后同步文档,但不保留没有实际价值的兼容层。
|