Files
Alfred/docs/development/architecture.md

161 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 架构与边界
本文档说明 alfred 的项目结构、启动链路、运行时流程、HTTP 请求流程和前后端边界。
适用场景修改目录边界、启动流程、运行时调度、HTTP server、前后端集成方式或主要模块职责。
## 项目结构
```text
src/
server/
bootstrap.ts 统一启动引导loadServerConfig -> DB 初始化 -> startServer
config.ts CLI 参数解析与配置文件加载 facade
config/ 配置解析模块
index.ts 配置模块导出
types.ts 配置类型定义
issues.ts 配置问题收集
variables.ts 变量解析
normalizer.ts 配置标准化
schema/ JSON Schema 生成与校验
builder.ts
export.ts
fragments.ts
validate.ts
db/ SQLite 数据库模块
index.ts 数据库模块导出
schema.ts Drizzle ORM schema 定义
connection.ts 数据库连接与 PRAGMA 设置
load-migrations.ts 从文件系统加载 migration SQL
migrate.ts migration 执行器(备份 + 事务应用)
projects.ts 项目数据访问函数
providers.ts 供应商数据访问函数
models.ts 模型数据访问函数
conversations.ts 会话与消息数据访问函数
ai/ AI 服务层
types.ts AI 配置类型定义
registry.ts AI Provider Registry 构建与连接测试
agents/ Agent 工厂
alfred-agent.ts Agent 工厂ToolLoopAgent + 工具)
tools/ 工具定义
get-current-time.ts 获取当前时间工具
dev.ts 开发模式启动入口
main.ts 生产模式启动入口
server.ts HTTP server 启动工厂Bun.serve routes 声明式路由)
static.ts 生产模式静态资源服务
helpers/ 共享工具模块
index.ts 模块导出
response.ts 响应格式化工具
url.ts URL 拼接工具
middleware/ API 中间件模块
index.ts 模块导出
validate.ts 参数校验中间件
error-handler.ts 错误处理中间件
logger.ts 结构化日志(基于 pino + pino-roll
version.ts 运行时版本号读取
routes/ API 路由处理器
meta.ts 应用元信息路由
providers/ 供应商 CRUD 与测试路由
models/ 模型 CRUD 与测试路由
projects/ 项目 CRUD、归档与恢复路由
chat/ 聊天会话与消息路由(含 SSE 流式发送)
shared/
api.ts 前后端共享 TypeScript 类型定义
app.ts 应用全局常量name、title、subtitle、description
web/ React 前端(通过 Vite 构建)
index.html HTML 入口
main.tsx React 入口StrictMode + ErrorBoundary + QueryClientProvider + BrowserRouter
app.tsx 根组件(设置 document 标题和 meta
routes.tsx 路由配置Admin + Workbench 两大控制台)
menu.tsx 共享菜单项类型定义
styles.css 全局样式
css.d.ts CSS Modules 类型声明
pages/ 页面组件
dashboard/ 总览页面
projects/ 项目管理页面及其子组件
models/ 模型管理页面及其子组件
404/ 404 页面
components/ 共享 UI 组件
ErrorBoundary.tsx 错误边界
ConsoleShell/ 通用控制台外壳ConsoleShell、ConsoleOutlet、types
Sidebar/ 侧边栏导航组件
consoles/ 控制台入口
admin/ Admin 管理台AdminConsoleLayout、菜单配置
workbench/ Workbench 工作台ProjectGate、ConsoleLayout、菜单配置、ChatPage 等)
hooks/ React Hooksuse-meta、use-projects、use-providers、use-models、use-conversations、主题/侧边栏偏好)
utils/ 前端工具函数fetch 封装、时间格式化)
scripts/ 独立运行脚本
tests/ 测试文件(镜像 src 目录结构)
docs/ 项目文档
openspec/ OpenSpec 规格、变更与 fast-drive workflow schema
```
## 启动流程
```text
dev.ts / main.ts
-> parseRuntimeArgs(cli args)
-> 必须指定 config.yaml
-> bootstrap({ configPath, mode })
-> loadServerConfig(configPath)
-> createRuntimeLogger(config.logging)
-> 确保 dataDir 就绪mkdirSync
-> 加载 migrations生产嵌入的 bytes开发磁盘 drizzle/ 目录)
-> createDatabase(dataDir)
-> runMigrations(db, migrations)pending migration 存在时先备份 DB
-> startServer({ config, logger, db })
-> logger 记录启动成功
-> SIGINT/SIGTERM -> db.close() -> logger.flush() -> exit
```
## HTTP 请求流程
```text
Request
-> Bun.serve routes 声明式匹配
-> routes/*.ts handler
-> helpers/ 响应格式化
-> Response
```
生产模式下,非 API 路径由 fetch fallback 处理:有文件扩展名的返回静态资源或 404无扩展名的返回 SPA index.html。
开发模式下Vite proxy 将 /api 请求转发到 Bun API server。
## 前后端边界
- 前端只通过 HTTP 调用后端API 路径为 /api/\*。
- 共享类型放在 src/shared/。
- 前端不得 import src/server/ 的运行时实现。
- 后端不得依赖 src/web/ 运行时代码HTML import 集成除外。
## 主要模块职责
| 模块 | 职责 |
| ------------------------- | ---------------------------------------------------------------------- |
| `src/server/bootstrap.ts` | 统一启动引导、DB 初始化和 shutdown 编排 |
| `src/server/server.ts` | Bun HTTP server 和 routes 注册 |
| `src/server/routes/` | API handler按资源端点拆分meta、providers、models、projects、chat |
| `src/server/db/` | SQLite 连接、schema、migration 和 data access |
| `src/server/ai/` | AI Provider Registry 构建与 Agent 流式调用 |
| `src/server/config/` | 配置解析模块types、variables、normalizer、schema |
| `src/server/helpers/` | 共享响应格式化和 URL 工具 |
| `src/server/middleware/` | API 参数校验和错误处理中间件 |
| `src/web/` | React 前端Admin + Workbench 双控制台架构) |
| `src/shared/api.ts` | 前后端共享 API 类型 |
| `src/shared/app.ts` | 应用全局常量 |
### 路由按资源分组
| 资源分组 | 路径前缀 | 路由文件 |
| --------- | ------------------------------------------------------------- | ---------------------------- |
| meta | `/api/meta` | `routes/meta.ts` |
| providers | `/api/providers` | `routes/providers/` (7 文件) |
| models | `/api/models` | `routes/models/` (6 文件) |
| projects | `/api/projects` | `routes/projects/` (7 文件) |
| chat | `/api/projects/:id/conversations``/api/projects/:id/chat` | `routes/chat/` (7 文件) |
## 更新触发条件
修改项目结构、启动流程、HTTP 请求流程、前后端边界或主要模块职责时,必须更新本文档。