Initial TrueGrowth source import

This commit is contained in:
2026-07-07 09:36:36 +08:00
commit 3b6781d695
2283 changed files with 691996 additions and 0 deletions

577
docs/CONCEPTS.md Normal file
View File

@@ -0,0 +1,577 @@
# Opentu 项目概念文档
> 本文档定义了 Opentu 项目的核心概念和术语,确保团队成员在开发过程中保持一致的理解。
## 一、项目定位
**Opentu开图** 是一个以画布为核心工作区底座的开源 **AI应用平台**
Opentu 的平台结构分为四层:
- **工作区层**:画布、视口、元素、项目组织
- **应用层**图片、视频、灵感板、思维导图、流程图、知识库、工具箱、Agent/Skill
- **运行层**:模型路由、任务队列、工作流执行、缓存与同步
- **开放层**:插件化、开源、可部署、可扩展
画布仍然是产品骨架,但在品牌与概念体系里,它承担的是 `工作区底座`,而不是旧意义上的全部产品定义。
- **官网**: https://opentu.ai
- **版本**: 0.6.x
- **许可证**: MIT
- **定位短句**: 在同一工作区中连接模型、工具、知识与工作流
- **技术栈**: React + TypeScript + Plait + Vite + Nx (Monorepo)
---
## 二、核心概念术语表
### 2.1 工作区层概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **画板 (Board)** | Board | 工作区中的单个画布页面,包含元素集合、视口状态和主题配置 | `workspace.types.ts` |
| **元素 (Element)** | PlaitElement | 画板上的基本单位,如图片、图形、文字、视频等 | `@plait/core` |
| **视口 (Viewport)** | Viewport | 画布的可视区域状态,包含缩放比例和偏移位置 | `@plait/core` |
| **文件夹 (Folder)** | Folder | 组织画板的容器,支持嵌套结构 | `workspace.types.ts` |
| **工作区 (Workspace)** | Workspace | 管理所有文件夹、画板与平台 UI 状态的顶层容器 | `workspace.types.ts` |
| **画布工作区** | Canvas Workspace | 面向用户的统一操作界面,承载 AI 应用与内容组织 | `drawnix.tsx` |
**层级关系**:
```
Workspace (工作区)
├── Folder (文件夹)
│ ├── Board (画板)
│ │ ├── PlaitElement (元素)
│ │ └── Viewport (视口)
│ └── Folder (嵌套文件夹)
└── Board (根级画板)
```
### 2.2 AI 生成概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **任务 (Task)** | Task | AI 生成的基本执行单位,有状态生命周期 | `task.types.ts` |
| **任务类型 (TaskType)** | TaskType | 任务分类IMAGE / VIDEO / CHARACTER / CHAT / INSPIRATION_BOARD | `task.types.ts` |
| **任务状态 (TaskStatus)** | TaskStatus | 任务生命周期状态 | `task.types.ts` |
| **任务队列 (TaskQueue)** | TaskQueue | 管理所有任务的队列系统,运行在 Service Worker 中 | `sw/task-queue/` |
| **远程 ID (RemoteId)** | remoteId | 服务端返回的任务标识,用于轮询和恢复 | `task.types.ts` |
| **执行阶段 (ExecutionPhase)** | TaskExecutionPhase | 任务执行的细分阶段SUBMITTING / POLLING / DOWNLOADING | `task.types.ts` |
**任务状态流转**:
```
PENDING (待执行)
PROCESSING (执行中)
COMPLETED (完成) / FAILED (失败) / CANCELLED (取消)
```
**任务类型说明**:
- `IMAGE`: 图片生成任务
- `VIDEO`: 视频生成任务
- `CHARACTER`: 角色提取任务 (Sora-2 专属)
- `CHAT`: 聊天/AI 分析任务
- `INSPIRATION_BOARD`: 灵感板生成任务 (图片生成 + 分割 + 布局)
### 2.3 工作流概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **工作流 (Workflow)** | Workflow | 包含多个步骤的任务执行计划 | `workflow-types.ts` |
| **工作流步骤 (WorkflowStep)** | WorkflowStep | 工作流中的单个 MCP 工具调用 | `workflow-types.ts` |
| **WorkZone** | WorkZone | 画布上显示工作流进度的特殊元素 | `workzone.types.ts` |
| **MCP 工具** | MCPTool | Model Context Protocol 工具,执行具体的 AI 操作 | `mcp/types.ts` |
| **工作流上下文** | WorkflowContext | 工作流的执行环境信息 | `workflow-types.ts` |
**工作流执行流程**:
```
WorkflowDefinition (定义)
↓ submit
Workflow (运行时)
↓ execute
WorkflowStep[] (步骤列表)
↓ for each
MCPTool.execute() (工具执行)
↓ result
Task (可能创建任务)
```
**步骤状态**:
- `pending`: 待执行
- `running`: 执行中
- `completed`: 已完成
- `failed`: 执行失败
- `skipped`: 跳过执行
### 2.4 素材库概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **素材 (Asset)** | Asset | 媒体库中的图片或视频资源 | `asset.types.ts` |
| **素材类型 (AssetType)** | AssetType | 素材分类IMAGE / VIDEO | `asset.types.ts` |
| **素材来源 (AssetSource)** | AssetSource | 素材来源LOCAL / AI_GENERATED | `asset.types.ts` |
| **统一缓存 (UnifiedCache)** | UnifiedCache | 协调 Cache Storage 和 IndexedDB 的缓存服务 | `unified-cache-service.ts` |
| **存储素材 (StoredAsset)** | StoredAsset | IndexedDB 中存储的素材元数据 | `asset.types.ts` |
**素材来源说明**:
- `LOCAL`: 用户从本地上传的素材
- `AI_GENERATED`: 通过 AI 生成的素材
**数据来源优先级**:
1. 本地上传素材 ← IndexedDB 元数据 + Cache Storage 实际数据
2. AI 生成素材 ← 任务队列已完成任务
3. Cache Storage 媒体 ← 虚拟路径缓存
### 2.5 聊天与对话概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **对话会话 (Session)** | ChatSession | 一个独立的对话上下文 | `chat.types.ts` |
| **消息 (Message)** | ChatMessage | 对话中的单条消息 | `chat.types.ts` |
| **消息角色 (Role)** | MessageRole | 消息发送者USER / ASSISTANT | `chat.types.ts` |
| **消息状态 (MessageStatus)** | MessageStatus | 消息发送状态 | `chat.types.ts` |
| **AI 输入上下文** | AIInputContext | 用户输入的完整解析结果 | `chat.types.ts` |
| **附件 (Attachment)** | Attachment | 消息中附带的文件 | `chat.types.ts` |
**消息状态**:
- `sending`: 发送中
- `streaming`: 流式接收中
- `success`: 发送成功
- `failed`: 发送失败
**AIInputContext 结构**:
```typescript
{
rawInput: string; // 原始输入(含模型/参数标记)
userInstruction: string; // 纯净用户指令
model: { id, type, isExplicit };
params: { count, size, duration };
selection: { texts, images, videos, graphics };
finalPrompt: string; // 最终生成 prompt
}
```
### 2.6 模型概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **模型类型 (ModelType)** | ModelType | 模型分类image / video / text | `model-config.ts` |
| **模型配置 (ModelConfig)** | ModelConfig | 模型的完整配置信息 | `model-config.ts` |
| **短代码 (ShortCode)** | shortCode | 模型快捷标识,如 `nbpv``veo3` | `model-config.ts` |
| **参数配置 (ParamConfig)** | ParamConfig | 模型参数的配置信息 | `model-config.ts` |
**模型分类**:
- `image`: 图片生成模型 (Gemini Imagen, GPT Image)
- `video`: 视频生成模型 (Veo3, Sora-2)
- `text`: 文本/Agent 模型 (DeepSeek, Claude, Gemini)
**常用短代码**:
| 短代码 | 模型 | 类型 |
|--------|------|------|
| `nbpv` | nano-banana-pro-vip | 图片 |
| `nb` | nano-banana | 图片 |
| `veo3` | Veo 3 | 视频 |
| `sora-2` | Sora 2 | 视频 |
### 2.7 角色概念 (Sora 专属)
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **角色 (Character)** | SoraCharacter | 从 Sora-2 视频中提取的可复用人物 | `character.types.ts` |
| **角色状态 (CharacterStatus)** | CharacterStatus | 角色创建生命周期状态 | `character.types.ts` |
| **时间戳范围** | characterTimestamps | 角色提取的视频时间范围 (格式: "start,end") | `character.types.ts` |
**角色使用方式**:
- 通过 `@username` 在提示词中引用角色
- 角色提取需要 1-3 秒的视频片段
### 2.8 工具箱概念
| 术语 | 英文 | 定义 | 关键文件 |
|------|------|------|----------|
| **工具定义 (ToolDefinition)** | ToolDefinition | 工具箱中工具的配置信息 | `toolbox.types.ts` |
| **工具元素 (PlaitTool)** | PlaitTool | 画布上的工具实例iframe 容器)| `toolbox.types.ts` |
| **工具窗口 (ToolWindow)** | ToolWindowState | 浮窗形式打开的工具状态 | `toolbox.types.ts` |
| **工具分类 (ToolCategory)** | ToolCategory | 工具分类枚举 | `toolbox.types.ts` |
**工具分类**:
- `AI_TOOLS`: AI 工具(提示词、生成等)
- `CONTENT_TOOLS`: 内容工具(文案、素材等)
- `UTILITIES`: 实用工具(批处理、转换等)
- `CUSTOM`: 自定义工具
### 2.9 平台分层概念
| 术语 | 英文 | 定义 |
|------|------|------|
| **应用层** | Application Layer | 面向用户的能力模块如图片、视频、知识库、工具箱、Agent |
| **运行层** | Runtime Layer | 支撑应用运行的任务队列、模型路由、缓存、工作流 |
| **开放层** | Extensibility Layer | 插件、部署、开源与扩展机制 |
---
## 三、架构分层概念
### 3.1 应用层 (apps/web)
| 模块 | 文件 | 职责 |
|------|------|------|
| 主入口 | `main.tsx` | 应用启动、Service Worker 注册 |
| App 组件 | `app.tsx` | 工作区管理、数据加载 |
| Service Worker | `sw/index.ts` | 后台任务执行、缓存管理 |
| 任务队列 | `sw/task-queue/` | 任务调度、执行器 |
### 3.2 核心库 (packages/drawnix)
| 模块 | 目录 | 职责 |
|------|------|------|
| 主组件 | `drawnix.tsx` | 编辑器主入口组件 |
| 插件 | `plugins/` | 功能扩展插件 (`withXxx` 模式) |
| 服务 | `services/` | 业务逻辑服务 |
| 钩子 | `hooks/` | React 状态管理 |
| MCP 工具 | `mcp/` | AI 工具系统 |
| 组件 | `components/` | UI 组件库 |
| 类型 | `types/` | TypeScript 类型定义 |
| 常量 | `constants/` | 配置常量 |
| 工具 | `utils/` | 工具函数 |
### 3.3 适配层
| 包 | 职责 |
|-----|------|
| `packages/react-board` | Plait Board 的 React 适配 |
| `packages/react-text` | Slate 文本编辑的 React 适配 |
| `packages/utils` | 共享工具函数 |
---
## 四、数据流概念
### 4.1 AI 生成数据流
```
用户输入 (AIInputBar)
↓ 解析
AIInputContext (输入上下文)
↓ convertToWorkflow
WorkflowDefinition (工作流定义)
↓ workflowSubmissionService.submit
postMessage → Service Worker
↓ WorkflowExecutor
执行 MCP 工具
↓ 创建 Task
SWTaskQueue (任务队列)
↓ 调用生成 API
结果返回
↓ broadcastToClients
应用层接收
unifiedCacheService.cache() → 缓存
insertToCanvas() → 插入画布
```
### 4.2 素材库数据流
```
素材展示
├── 本地上传素材 ← assetStorageService (IndexedDB 元数据)
│ 验证 Cache Storage 有实际数据
├── AI 生成素材 ← taskQueueService.getCompletedTasks()
└── 缓存媒体 ← unifiedCacheService (Cache Storage)
删除素材
├── 本地素材 → assetStorageService.removeAsset()
└── AI 素材 → taskQueueService.deleteTask()
```
### 4.3 虚拟路径规范
| 路径前缀 | 用途 | 示例 |
|----------|------|------|
| `/__aitu_cache__/image/` | AI 生成图片、合并图片、分割图片 | `/__aitu_cache__/image/task-123.png` |
| `/__aitu_cache__/video/` | AI 生成视频 | `/__aitu_cache__/video/task-456.mp4` |
| `/asset-library/` | 本地上传素材 | `/asset-library/asset-789.jpg` |
**重要规则**:
- 虚拟路径由 Service Worker 拦截并从 Cache Storage 返回
- 存储时使用相对路径作为缓存 key确保一致性
- 查询时支持完整 URL 和相对路径的匹配
---
## 五、状态管理概念
### 5.1 React Context
| Context | 职责 | 提供者位置 |
|---------|------|------------|
| `DrawnixContext` | 编辑器全局状态(指针模式、弹窗状态等)| `drawnix.tsx` |
| `WorkflowContext` | 工作流执行状态 | `drawnix.tsx` |
| `AssetContext` | 素材库状态和操作 | `drawnix.tsx` |
| `ChatDrawerContext` | 聊天抽屉状态 | `drawnix.tsx` |
| `RecentColorsProvider` | 最近使用颜色 | `drawnix.tsx` |
| `I18nProvider` | 国际化 | `drawnix.tsx` |
| `ToolbarConfigProvider` | 工具栏配置 | `drawnix.tsx` |
### 5.2 持久化存储
| 存储方式 | 用途 | API |
|----------|------|-----|
| LocalForage (IndexedDB) | 画板数据、会话消息、素材元数据、任务数据 | `localforage` |
| Cache Storage | 媒体文件实际内容 | `caches.open()` |
| localStorage | 设置配置、UI 状态 | `localStorage` |
**存储 Key 规范**:
- 画板: `boards-{id}`
- 文件夹: `folders-{id}`
- 会话: `chat-sessions-{id}`
- 消息: `chat-messages-{sessionId}`
- 素材元数据: `assets-{id}`
---
## 六、UI 层级概念 (Z-Index)
| 层级 | 范围 | 用途 | 示例 |
|------|------|------|------|
| Layer 0 | 0-999 | 基础画布元素 | 画布内容 |
| Layer 1 | 1000-1999 | 画布装饰元素 | 选中框 |
| Layer 2 | 2000-2999 | 工具栏 | UnifiedToolbar |
| Layer 3 | 3000-3999 | Popover / Tooltip | 弹出菜单 |
| Layer 4 | 4000-4999 | 抽屉 / 面板 | TaskQueue, ChatDrawer |
| Layer 5 | 5000-5999 | 弹窗 / Dialog | AI 生成弹窗 |
| Layer 6 | 6000-6999 | 通知 | 任务警告 |
| Layer 7 | 7000-7999 | 认证弹窗 | 登录框 |
| Layer 8 | 8000-8999 | 图片查看器 | ImageViewer |
| Layer 9 | 9000+ | 系统级覆盖层 | 加载遮罩 |
**使用规范**:
- TypeScript: 从 `constants/z-index.ts` 导入 `Z_INDEX`
- SCSS: 从 `styles/z-index.scss` 导入 `$z-*` 变量
---
## 七、命名规范
### 7.1 文件命名
| 类型 | 规范 | 示例 |
|------|------|------|
| 组件 | PascalCase.tsx | `ImageCropPopup.tsx` |
| Hooks | camelCase.ts (use 前缀) | `useImageCrop.ts` |
| 服务 | kebab-case-service.ts | `workspace-service.ts` |
| 工具函数 | kebab-case.ts | `image-utils.ts` |
| 类型定义 | kebab-case.types.ts | `task.types.ts` |
| 常量 | UPPER_SNAKE_CASE.ts | `TASK_CONSTANTS.ts` |
| 样式 | kebab-case.scss | `ai-input-bar.scss` |
### 7.2 变量命名
| 类型 | 规范 | 示例 |
|------|------|------|
| 组件 | PascalCase | `AIInputBar` |
| 函数 | camelCase | `handleSubmit` |
| 常量 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT` |
| 类型/接口 | PascalCase | `TaskStatus` |
| 枚举值 | UPPER_SNAKE_CASE | `TaskType.IMAGE` |
| CSS 类名 | kebab-case (BEM) | `.ai-input-bar__container` |
### 7.3 事件命名
| 类型 | 规范 | 示例 |
|------|------|------|
| CustomEvent | kebab-case | `ai-generation-complete` |
| 追踪事件 | snake_case | `toolbar_click_save` |
| 回调 Props | on + PascalCase | `onSubmit`, `onChange` |
---
## 八、关键概念辨析
### 8.1 Task vs Workflow
| 维度 | Task | Workflow |
|------|------|----------|
| 定义 | 单个 AI 生成任务 | 多步骤执行计划 |
| 粒度 | 原子操作 | 组合操作 |
| 状态 | 独立状态和结果 | 整体状态 + 步骤状态 |
| 创建方 | TaskQueue | WorkflowExecutor |
| 关系 | 一个 Workflow 可创建多个 Task | - |
### 8.2 Board vs Workspace
| 维度 | Board | Workspace |
|------|-------|-----------|
| 定义 | 单个画板 | 平台中的统一工作区容器 |
| 内容 | 元素、视口、主题 | 文件夹、画板、UI 状态 |
| 持久化 | 独立存储 | 状态存储 |
| 切换 | 可以切换当前画板 | 唯一实例 |
### 8.3 Asset vs Task Result
| 维度 | Asset | Task Result |
|------|-------|-------------|
| 定义 | 素材库中的资源 | 任务的输出结果 |
| 元数据 | 完整(名称、来源、类型等)| 基本URL、格式、尺寸|
| 来源 | 本地上传 / AI 生成 | 仅 AI 生成 |
| 转换 | Task Result 可转换为 Asset | - |
### 8.4 MCP Tool vs Built-in Tool
| 维度 | MCP Tool | Built-in Tool |
|------|----------|---------------|
| 定义 | AI 相关工具 | 工具箱中的外部工具 |
| 实现 | 函数执行 | iframe 嵌入 |
| 示例 | generate_image, ai_analyze | 香蕉提示词、素材网站 |
| 调用 | 通过工作流步骤 | 用户手动打开 |
### 8.5 Service Worker 通信
| 消息方向 | 类型前缀 | 示例 |
|----------|----------|------|
| 主线程 → SW | `TASK_*`, `WORKFLOW_*` | `TASK_SUBMIT`, `WORKFLOW_CANCEL` |
| SW → 主线程 | `TASK_*`, `WORKFLOW_*` | `TASK_COMPLETED`, `WORKFLOW_STEP_STATUS` |
---
## 九、插件系统概念
### 9.1 插件模式
Opentu 使用 `withXxx` 模式扩展 Plait Board 功能:
```typescript
// 插件链式组合
const plugins = [
withGroup,
withDraw,
withMind,
withFreehand,
withVideo,
withTool,
withWorkZone,
// ...
];
```
### 9.2 核心插件列表
| 插件 | 功能 |
|------|------|
| `withDraw` | 基础绘图能力 |
| `withMind` | 思维导图支持 |
| `withFreehand` | 自由绘画 |
| `withPen` | 钢笔工具 |
| `withVideo` | 视频元素支持 |
| `withTool` | 工具元素iframe|
| `withWorkZone` | WorkZone 元素 |
| `withHotkey` | 快捷键处理 |
| `withTextLink` | 文本链接 |
| `withTextPaste` | 文本粘贴 |
| `withImage` | 图片粘贴 |
| `withTracking` | 数据追踪 |
---
## 十、MCP 工具系统
### 10.1 工具注册
MCP 工具在 `mcp/registry.ts` 中注册:
```typescript
export const mcpTools: Map<string, MCPTool> = new Map([
['generate_image', imageGenerationTool],
['generate_video', videoGenerationTool],
['ai_analyze', aiAnalyzeTool],
['canvas_insert', canvasInsertTool],
// ...
]);
```
### 10.2 工具接口
```typescript
interface MCPTool {
name: string;
description: string;
inputSchema: JSONSchema;
execute: (params, options?) => Promise<MCPResult>;
supportedModes?: MCPExecuteMode[];
promptGuidance?: ToolPromptGuidance;
}
```
### 10.3 执行模式
| 模式 | 说明 | 使用场景 |
|------|------|----------|
| `async` | 同步等待 API 返回 | 快速操作 |
| `queue` | 加入任务队列 | 长时间生成任务 |
---
## 十一、Service Worker 架构
### 11.1 核心职责
1. **任务队列管理**: 处理 AI 生成任务
2. **缓存管理**: 预缓存静态资源、缓存媒体文件
3. **工作流执行**: 执行多步骤工作流
4. **消息通信**: 与主线程双向通信
### 11.2 关键模块
| 模块 | 文件 | 职责 |
|------|------|------|
| 主入口 | `sw/index.ts` | SW 生命周期、fetch 拦截 |
| 任务队列 | `sw/task-queue/queue.ts` | 任务调度 |
| 任务存储 | `sw/task-queue/storage.ts` | IndexedDB 持久化 |
| 处理器 | `sw/task-queue/handlers/` | 具体任务执行 |
| 工作流执行器 | `sw/task-queue/workflow-executor.ts` | 工作流执行 |
### 11.3 消息协议
```typescript
// 主线程 → SW
type MainToSWMessage =
| { type: 'TASK_QUEUE_INIT'; geminiConfig; videoConfig }
| { type: 'TASK_SUBMIT'; taskId; taskType; params }
| { type: 'WORKFLOW_SUBMIT'; workflow }
// ...
// SW → 主线程
type SWToMainMessage =
| { type: 'TASK_CREATED'; task }
| { type: 'TASK_STATUS'; taskId; status; progress }
| { type: 'WORKFLOW_STEP_STATUS'; workflowId; stepId; status }
// ...
```
---
## 十二、附录
### 12.1 相关文档
- [CLAUDE.md](../CLAUDE.md) - 完整开发指南
- [Z_INDEX_GUIDE.md](./Z_INDEX_GUIDE.md) - Z-Index 层级规范
- [UNIFIED_CACHE_DESIGN.md](./UNIFIED_CACHE_DESIGN.md) - 统一缓存设计
- [VERSION_CONTROL.md](./VERSION_CONTROL.md) - 版本控制规范
### 12.2 类型定义文件索引
| 概念领域 | 文件路径 |
|----------|----------|
| 任务系统 | `packages/drawnix/src/types/task.types.ts` |
| 工作区 | `packages/drawnix/src/types/workspace.types.ts` |
| 素材库 | `packages/drawnix/src/types/asset.types.ts` |
| 聊天 | `packages/drawnix/src/types/chat.types.ts` |
| WorkZone | `packages/drawnix/src/types/workzone.types.ts` |
| 角色 | `packages/drawnix/src/types/character.types.ts` |
| 工具箱 | `packages/drawnix/src/types/toolbox.types.ts` |
| MCP | `packages/drawnix/src/mcp/types.ts` |
| 工作流 | `apps/web/src/sw/task-queue/workflow-types.ts` |
| 模型配置 | `packages/drawnix/src/constants/model-config.ts` |