# WorkBuddy方法调用结构**技术栈**:Flutter + Dart + SQLite + Provider**支持平台**:Android、iOS、Windows、macOS、Linux、Web---## 需求点0:AI对话与智能执行### 功能点0.1:对话交互与消息管理#### 客户端 (Flutter - 全平台)##### UI层* `ChatScreen`:对话主界面,展示消息列表,支持输入和发送。 * **操作**:用户在输入框输入文本,点击"发送"按钮,查看AI响应,滚动历史消息。* `MessageBubble`:单条消息组件,支持渲染文本、代码块、附件等。 * **操作**:用户查看消息内容,复制文本,点击链接。##### ViewModel/Provider层* `ChatProvider` (extends ChangeNotifier) * `Future<void> sendMessage(String content)` * **作用**:发送用户消息,触发AI处理流程。调用`SendMessageUseCase`。 * **参数**: * `content: String`:用户输入的消息文本。 * `Future<List<Message>> loadHistory(String sessionId)` * **作用**:加载指定会话的历史消息。调用`LoadConversationHistoryUseCase`。 * **参数**: * `sessionId: String`:会话ID。 * `Future<void> clearSession(String sessionId)` * **作用**:清空当前会话的历史记录。调用`ClearSessionUseCase`。##### UseCase层* `SendMessageUseCase` (`Future<Message> execute(String message, String sessionId)`) * **作用**:发送消息并触发AI处理。**核心逻辑**:1. 保存用户消息到本地数据库。2. 调用AI引擎分析消息。3. 执行可能的操作(文件操作、命令执行等)。4. 生成并保存AI响应。调用`MessageRepository.save`, `AIEngine.process`, `ActionExecutor.execute`。* `LoadConversationHistoryUseCase` (`Future<List<Message>> execute(String sessionId)`) * **作用**:从本地数据库加载会话历史。调用`MessageRepository.findBySessionId`。* `ClearSessionUseCase` (`Future<void> execute(String sessionId)`) * **作用**:清空会话记录。调用`MessageRepository.deleteBySessionId`。##### Repository层 (接口)* `MessageRepository` * `Future<Message> save(Message message)` * **作用**:保存消息到本地数据库。 * `Future<List<Message>> findBySessionId(String sessionId)` * **作用**:查询指定会话的所有消息。 * `Future<void> deleteBySessionId(String sessionId)` * **作用**:删除指定会话的所有消息。##### 数据源层 (实现)* `MessageRepositoryImpl` (实现 `MessageRepository`接口) * `final Database db`:sqflite数据库实例。 * `Future<Message> save(Message message)` * **实现**:执行`INSERT INTO messages (id, session_id, role, content, timestamp) VALUES (?, ?, ?, ?, ?)`,使用`db.insert()`。 * `Future<List<Message>> findBySessionId(String sessionId)` * **实现**:执行`SELECT * FROM messages WHERE session_id = ? ORDER BY timestamp ASC`,使用`db.query()`,将结果映射为`List<Message>`。 * `Future<void> deleteBySessionId(String sessionId)` * **实现**:执行`DELETE FROM messages WHERE session_id = ?`,使用`db.delete()`。#### 服务层 (Dart)##### Service层* `AIEngine` * `Future<AIResponse> process(String input, ConversationContext context)` * **作用**:**核心AI处理逻辑**。1. 调用意图分类器识别用户意图。2. 根据意图类型分支:对话意图直接生成响应;执行意图规划并执行操作;查询意图检索知识库。3. 整合结果生成最终响应。调用`IntentClassifier.classify`, `ActionPlanner.plan`, `ResponseGenerator.generate`。* `IntentClassifier` * `Future<IntentType> classify(String input)` * **作用**:分析用户输入,返回意图类型(`CONVERSATION`, `EXECUTION`, `QUERY`)。使用LLM进行分类。* `ActionPlanner` * `Future<ActionPlan> plan(IntentType intent, ConversationContext context)` * **作用**:根据意图和上下文,生成执行计划。**逻辑**:确定需要调用的工具、参数、执行顺序。调用`MemoryManager.getContext`。* `ActionExecutor` * `Future<ActionResult> execute(ActionPlan plan)` * **作用**:执行操作计划。**顺序控制**:按计划依次调用各工具,收集执行结果。调用`ToolOrchestrator.selectTools`, `ToolExecutor.executeSequence`。##### Tool层* `ToolOrchestrator` * `List<Tool> selectTools(ActionPlan plan)` * **作用**:根据计划选择需要执行的工具实例。* `ToolExecutor` * `Future<ActionResult> executeSequence(List<Tool> tools, dynamic params)` * **作用**:依次执行工具序列,传递参数,收集结果。##### Database层* **sqflite 数据库**:本地嵌入式数据库。 * **表 `messages`**:存储消息记录。 * 字段:`id` (TEXT PRIMARY KEY), `session_id` (TEXT), `role` (TEXT), `content` (TEXT), `timestamp` (INTEGER)。 * **索引**:`idx_session_timestamp` 在 `(session_id, timestamp)` 上,加速历史查询。### 功能点0.2:意图识别与任务规划#### 服务层 (Dart)##### Service层* `IntentClassifier` * `Future<IntentType> classify(String input)` * **作用**:**意图分类**。调用LLM API,传入用户输入和预定义的意图模板,返回分类结果。**逻辑**:支持多标签分类,可同时属于多个意图类型。* `ActionPlanner` * `Future<ActionPlan> plan(IntentType intent, ConversationContext context)` * **作用**:**任务规划**。根据意图生成具体的操作序列。**逻辑**:1. 分析意图关联的工具集。2. 确定工具执行顺序和依赖关系。3. 从上下文中提取参数。4. 生成结构化的`ActionPlan`对象。调用`MemoryManager.getRecentContext`, `ToolRegistry.getToolsByIntent`。* `ResponseGenerator` * `Future<String> generate(ActionResult actionResult, ConversationContext context)` * **作用**:**响应生成**。将操作结果转换为自然语言响应。**逻辑**:根据操作类型选择响应模板,填充动态内容,生成友好的用户回复。调用`TemplateEngine.render`, `LLMClient.generate`。---## 需求点1:文件系统操作### 功能点1.1:文件读写与管理#### 客户端 (Flutter - 全平台)##### UI层* `FileExplorerScreen`:文件浏览器主界面,展示文件树和文件内容。 * **操作**:用户浏览目录结构,点击文件查看内容,右键菜单或长按执行操作(新建、删除、重命名)。* `FileEditorScreen`:文件编辑界面,支持文本编辑和实时预览。 * **操作**:用户编辑文件内容,保存更改,查看语法高亮。##### ViewModel/Provider层* `FileExplorerProvider` (extends ChangeNotifier) * `Future<List<FileInfo>> loadDirectory(String path)` * **作用**:加载指定目录的文件列表。调用`ListDirectoryUseCase`。 * **参数**: * `path: String`:目录路径。 * `Future<FileContent> readFile(String path)` * **作用**:读取文件内容。调用`ReadFileUseCase`。 * **参数**: * `path: String`:文件路径。 * `Future<void> writeFile(String path, String content)` * **作用**:写入文件内容。调用`WriteFileUseCase`。 * **参数**: * `path: String`:文件路径。 * `content: String`:文件内容。 * `Future<void> deleteFile(String path)` * **作用**:删除文件或目录。调用`DeleteFileUseCase`。 * **参数**: * `path: String`:目标路径。##### UseCase层* `ListDirectoryUseCase` (`Future<List<FileInfo>> execute(String path)`) * **作用**:列出目录内容。**校验**:检查路径是否在允许的工作区范围内。调用`FileRepository.listDirectory`, `PathValidator.validate`。* `ReadFileUseCase` (`Future<FileContent> execute(String path)`) * **作用**:读取文件内容。**逻辑**:1. 校验路径安全性。2. 读取文件。3. 根据文件类型解析内容(文本、图片等)。调用`FileRepository.read`, `FileParser.parse`。* `WriteFileUseCase` (`Future<void> execute(String path, String content)`) * **作用**:写入文件。**逻辑**:1. 校验路径安全性。2. 创建备份(如果文件已存在)。3. 写入新内容。调用`FileRepository.write`, `BackupManager.createBackup`。* `DeleteFileUseCase` (`Future<void> execute(String path)`) * **作用**:删除文件。**安全控制**:对于重要文件,先移动到回收站而非永久删除。调用`FileRepository.delete`, `TrashManager.moveToTrash`。##### Repository层 (接口)* `FileRepository` * `Future<List<FileInfo>> listDirectory(String path)` * **作用**:列出目录内容。 * `Future<Uint8List> read(String path)` * **作用**:读取文件二进制内容。 * `Future<void> write(String path, dynamic content)` * **作用**:写入文件内容。 * `Future<void> delete(String path)` * **作用**:删除文件或目录。 * `Future<bool> exists(String path)` * **作用**:检查路径是否存在。##### 数据源层 (实现)* `FileRepositoryImpl` (实现 `FileRepository`接口) * `Future<List<FileInfo>> listDirectory(String path)` * **实现**:使用`dart:io`的`Directory(path).list().toList()`,将`FileSystemEntity`对象列表映射为`FileInfo`对象列表(包含name, isDirectory, size, modifiedTime等字段)。**Web平台**:使用`file_picker`插件或IndexedDB。 * `Future<Uint8List> read(String path)` * **实现**:调用`File(path).readAsBytes()`。**Web平台**:使用`http`请求获取文件。 * `Future<void> write(String path, dynamic content)` * **实现**:调用`File(path).writeAsBytes(content)`或`File(path).writeAsString(content)`。 * `Future<void> delete(String path)` * **实现**:调用`FileSystemEntity.isDirectorySync(path) ? Directory(path).delete(recursive: true) : File(path).delete()`。#### 服务层 (Dart)##### Service层* `PathValidator` * `ValidationResult validate(String path)` * **作用**:**路径安全校验**。检查路径是否在允许的工作区范围内,防止目录遍历攻击。 * `bool isWithinWorkspace(String path)` * **作用**:检查路径是否在当前工作区内。* `BackupManager` * `Future<String> createBackup(String path)` * **作用**:创建文件备份。**逻辑**:在`.workbuddy/backups/`目录下创建文件的备份副本,返回备份路径。调用`FileRepository.read`, `FileRepository.write`。* `TrashManager` * `Future<void> moveToTrash(String path)` * **作用**:将文件移动到回收站。**跨平台支持**: * **Windows**:使用`move_to_trash`插件 * **macOS**:使用`move_to_trash`插件 * **Linux**:使用`gio trash`命令 * **移动端**:直接删除(无回收站概念) * **Web**:不支持 调用`PlatformAdapter.moveToTrash`。##### Database层* **sqflite 数据库**:存储文件操作日志。 * **表 `file_operations_log`**:记录文件操作历史。 * 字段:`id` (INTEGER PRIMARY KEY), `operation` (TEXT), `path` (TEXT), `timestamp` (INTEGER), `user_id` (TEXT)。### 功能点1.2:文件搜索#### 客户端 (Flutter - 全平台)##### UI层* `SearchScreen`:搜索界面,包含搜索框和结果列表。 * **操作**:用户输入搜索关键词,选择搜索类型(文件名/内容),查看搜索结果。##### ViewModel/Provider层* `SearchProvider` (extends ChangeNotifier) * `Future<List<String>> searchFiles(String pattern, String rootPath)` * **作用**:根据文件名模式搜索文件。调用`SearchFilesUseCase`。 * **参数**: * `pattern: String`:Glob模式或文件名。 * `rootPath: String`:搜索根目录。 * `Future<List<SearchResult>> searchContent(String pattern, SearchOptions options)` * **作用**:搜索文件内容。调用`SearchContentUseCase`。 * **参数**: * `pattern: String`:搜索模式(支持正则)。 * `options: SearchOptions`:搜索选项(路径、文件类型、忽略规则等)。##### UseCase层* `SearchFilesUseCase` (`Future<List<String>> execute(String pattern, String rootPath)`) * **作用**:文件名搜索。**逻辑**:使用Glob模式匹配文件名,返回匹配的文件路径列表。调用`FileSearcher.searchByPattern`。* `SearchContentUseCase` (`Future<List<SearchResult>> execute(String pattern, SearchOptions options)`) * **作用**:内容搜索。**逻辑**:使用Ripgrep引擎在文件内容中搜索匹配项,返回包含文件路径、行号、匹配内容的结构化结果。调用`ContentSearcher.search`。##### Repository层 (接口)* `SearchRepository` * `Future<List<String>> searchFiles(String pattern, String rootPath)` * **作用**:文件名搜索。 * `Future<List<SearchResult>> searchContent(String pattern, SearchOptions options)` * **作用**:内容搜索。##### 数据源层 (实现)* `SearchRepositoryImpl` (实现 `SearchRepository`接口) * `Future<List<String>> searchFiles(String pattern, String rootPath)` * **实现**:使用`glob`包匹配文件路径,递归遍历目录树进行匹配。 * `Future<List<SearchResult>> searchContent(String pattern, SearchOptions options)` * **实现**:**桌面平台**:调用Ripgrep可执行文件,执行`rg --json --pattern "..." --path "..."`,解析JSON输出。**移动端/Web**:使用纯Dart实现的内容搜索(性能较低)。#### 服务层 (Dart)##### Service层* `FileSearcher` * `Future<List<String>> searchByPattern(String pattern, String rootPath)` * **作用**:Glob模式搜索。支持`*`, `**`, `?`等通配符。* `ContentSearcher` * `Future<List<SearchResult>> search(String pattern, SearchOptions options)` * **作用**:**Ripgrep集成**(仅桌面平台)。调用Ripgrep引擎进行高性能内容搜索。**逻辑**:1. 构建Ripgrep命令行参数。2. 执行子进程。3. 解析JSON输出。4. 处理上下文行、匹配高亮等。调用`RipgrepEngine.search`。* `RipgrepEngine` * `Future<List<RipgrepResult>> search(String pattern, String path, List<String> args)` * **作用**:执行Ripgrep命令。**实现**:使用`dart:io`的`Process.run`执行`rg`命令,捕获并解析输出。---## 需求点2:技能系统### 功能点2.1:技能加载与执行#### 客户端 (Flutter - 全平台)##### UI层* `SkillManagerScreen`:技能管理界面,展示已安装技能列表。 * **操作**:用户浏览技能列表,点击技能查看详情,执行技能。* `SkillExecutionScreen`:技能执行界面,展示执行进度和结果。 * **操作**:用户查看技能执行状态,中断执行。##### ViewModel/Provider层* `SkillManagerProvider` (extends ChangeNotifier) * `Future<Skill> loadSkill(String skillName)` * **作用**:加载指定技能。调用`LoadSkillUseCase`。 * **参数**: * `skillName: String`:技能名称。 * `Future<SkillResult> executeSkill(String skillName, dynamic input)` * **作用**:执行技能。调用`ExecuteSkillUseCase`。 * **参数**: * `skillName: String`:技能名称。 * `input: dynamic`:输入数据。 * `Future<void> installSkill(String skillPath, String level)` * **作用**:安装技能。调用`InstallSkillUseCase`。 * **参数**: * `skillPath: String`:技能路径。 * `level: String`:安装级别('user' 或 'project')。##### UseCase层* `LoadSkillUseCase` (`Future<Skill> execute(String skillName)`) * **作用**:加载技能。**逻辑**:1. 从注册表查找技能路径。2. 读取`SKILL.md`文件。3. 解析技能内容。4. 执行安全审计。5. 缓存技能对象。调用`SkillRegistry.get`, `SkillLoader.loadFromPath`, `SecurityAuditor.audit`。* `ExecuteSkillUseCase` (`Future<SkillResult> execute(String skillName, dynamic input)`) * **作用**:执行技能。**逻辑**:1. 加载技能。2. 创建执行上下文。3. 解析技能指令。4. 按序执行指令。5. 收集执行结果。调用`SkillManager.load`, `SkillInterpreter.execute`。* `InstallSkillUseCase` (`Future<void> execute(String skillPath, String level)`) * **作用**:安装技能。**逻辑**:1. 验证技能结构。2. 执行安全审计。3. 复制技能文件到目标目录。4. 注册到技能注册表。调用`SkillValidator.validate`, `SecurityAuditor.audit`, `SkillInstaller.install`。##### Repository层 (接口)* `SkillRepository` * `Future<Skill> load(String skillName)` * **作用**:加载技能对象。 * `Future<void> save(Skill skill, String level)` * **作用**:保存技能到指定级别。 * `Future<List<Skill>> list(String? level)` * **作用**:列出已安装的技能。 * `Future<void> delete(String skillName)` * **作用**:删除技能。##### 数据源层 (实现)* `SkillRepositoryImpl` (实现 `SkillRepository`接口) * `Future<Skill> load(String skillName)` * **实现**:从`~/.workbuddy/skills/{skillName}/SKILL.md`或`{workspace}/.workbuddy/skills/{skillName}/SKILL.md`读取技能文件,解析Markdown内容并构造`Skill`对象。**Web平台**:从IndexedDB或服务器加载。 * `Future<void> save(Skill skill, String level)` * **实现**:将技能对象序列化为Markdown,写入对应目录的`SKILL.md`文件。#### 服务层 (Dart)##### Service层* `SkillLoader` * `Future<Skill> loadFromPath(String skillPath)` * **作用**:从路径加载技能。**逻辑**:1. 读取`SKILL.md`。2. 解析Front Matter和正文。3. 加载关联的参考文件和脚本。4. 构造完整的技能对象。调用`FileRepository.read`, `SkillParser.parse`。* `SkillParser` * `SkillDefinition parse(String content)` * **作用**:解析技能Markdown内容。提取名称、描述、指令、引用等字段。* `SkillInterpreter` * `Future<dynamic> execute(String instructions, SkillContext context)` * **作用**:**技能执行引擎**。**逻辑**:1. 解析指令文本。2. 识别指令类型(工具调用、文件引用、脚本执行)。3. 按序执行各指令。4. 收集并返回结果。调用`ToolCallHandler.handle`, `ReferenceLoader.load`, `ScriptExecutor.execute`。* `SecurityAuditor` * `Future<SecurityReport> audit(Skill skill)` * **作用**:**安全审计**。检查技能是否包含危险操作(如访问系统目录、执行未授权命令等),生成安全报告。返回风险等级(P0/P1/P2)。##### Tool层* `ToolCallHandler` * `Future<dynamic> handle(String toolName, dynamic args)` * **作用**:处理工具调用指令。查找并执行对应的工具。* `ReferenceLoader` * `Future<String> load(String referencePath)` * **作用**:加载技能引用文件。读取`references/`目录下的文件内容。* `ScriptExecutor` * `Future<dynamic> execute(String scriptPath, dynamic args)` * **作用**:执行技能脚本。**安全控制**:在沙箱环境中执行,限制系统访问。**Web平台**:不支持脚本执行。调用`SandboxExecutor.run`。##### Database层* **sqflite 数据库**:存储技能注册信息。 * **表 `skill_registry`**:技能注册表。 * 字段:`name` (TEXT PRIMARY KEY), `path` (TEXT), `level` (TEXT), `installed_at` (INTEGER), `risk_level` (TEXT)。---## 需求点3:命令执行与系统集成### 功能点3.1:命令执行与安全控制#### 客户端 (Flutter - 全平台)##### UI层* `CommandTerminalScreen`:命令行终端界面,支持命令输入和输出显示。 * **操作**:用户输入命令,查看执行输出,发送中断信号(Ctrl+C)。**仅桌面平台可用**。##### ViewModel/Provider层* `CommandProvider` (extends ChangeNotifier) * `Future<CommandResult> executeCommand(String command, CommandOptions options)` * **作用**:执行命令。调用`ExecuteCommandUseCase`。 * **参数**: * `command: String`:要执行的命令。 * `options: CommandOptions`:执行选项(工作目录、超时时间、是否需要审批等)。 * `Future<void> killProcess(int pid)` * **作用**:终止进程。调用`KillProcessUseCase`。 * **参数**: * `pid: int`:进程ID。 * `List<ProcessInfo> getActiveProcesses()` * **作用**:获取活动进程列表。调用`GetActiveProcessesUseCase`。##### UseCase层* `ExecuteCommandUseCase` (`Future<CommandResult> execute(String command, CommandOptions options)`) * **作用**:执行命令。**核心逻辑**:1. 验证命令安全性(黑名单检查)。2. 检查是否需要用户审批。3. 如需审批,显示确认对话框。4. 执行命令。5. 记录命令历史。调用`CommandValidator.validate`, `ApprovalManager.request`, `CommandExecutor.execute`, `CommandLogger.log`。**仅桌面平台支持**。* `KillProcessUseCase` (`Future<void> execute(int pid)`) * **作用**:终止进程。调用`ProcessManager.kill`。* `GetActiveProcessesUseCase` (`Future<List<ProcessInfo>> execute()`) * **作用**:获取活动进程列表。调用`ProcessManager.listActive`。##### Repository层 (接口)* `CommandRepository` * `Future<CommandResult> execute(String command, CommandOptions options)` * **作用**:执行命令。 * `Future<void> kill(int pid)` * **作用**:终止进程。 * `List<ProcessInfo> listActive()` * **作用**:列出活动进程。##### 数据源层 (实现)* `CommandRepositoryImpl` (实现 `CommandRepository`接口) * `Future<CommandResult> execute(String command, CommandOptions options)` * **实现**:使用`dart:io`的`Process.start`执行命令,捕获stdout和stderr流,设置超时定时器,返回包含输出和退出码的结果对象。**Web/移动端**:不支持。 * `Future<void> kill(int pid)` * **实现**:调用`Process.killPid(pid, ProcessSignal.sigterm)`,如进程未终止,5秒后发送`ProcessSignal.sigkill`。#### 服务层 (Dart)##### Service层* `CommandValidator` * `ValidationResult validate(String command)` * **作用**:**命令安全校验**。检查命令是否在黑名单中,是否包含危险操作(如`rm -rf /`、`sudo`等)。 * `bool isBlacklisted(String command)` * **作用**:检查命令是否在黑名单中。* `ApprovalManager` * `Future<bool> request(String command)` * **作用**:**审批流程**。向用户显示命令确认对话框,等待用户批准或拒绝。返回用户选择。* `CommandExecutor` * `Future<CommandResult> execute(String command, CommandOptions options)` * **作用**:**命令执行**。**逻辑**:1. 创建Shell进程。2. 设置工作目录和环境变量。3. 捕获输出流。4. 设置超时。5. 监控进程状态。调用`ProcessManager.spawn`, `OutputStreamHandler.handle`。* `ProcessManager` * `Process spawn(String command, SpawnOptions options)` * **作用**:创建子进程。使用`dart:io`的`Process.start`执行命令。 * `void kill(int pid)` * **作用**:终止进程。 * `List<ProcessInfo> listActive()` * **作用**:列出所有由WorkBuddy启动的活动进程。* `CommandLogger` * `Future<void> log(String command, CommandResult result)` * **作用**:记录命令执行历史。调用`CommandHistoryRepository.save`。##### Database层* **sqflite 数据库**:存储命令执行历史。 * **表 `command_history`**:命令历史记录。 * 字段:`id` (INTEGER PRIMARY KEY), `command` (TEXT), `exit_code` (INTEGER), `output` (TEXT), `executed_at` (INTEGER), `user_id` (TEXT)。---## 需求点4:团队协作### 功能点4.1:团队创建与成员管理#### 客户端 (Flutter - 全平台)##### UI层* `TeamManagementScreen`:团队管理界面,展示团队列表和成员。 * **操作**:用户创建团队,添加成员,查看成员状态,删除团队。##### ViewModel/Provider层* `TeamProvider` (extends ChangeNotifier) * `Future<Team> createTeam(String name)` * **作用**:创建团队。调用`CreateTeamUseCase`。 * **参数**: * `name: String`:团队名称。 * `Future<Agent> spawnMember(AgentConfig config)` * **作用**:生成团队成员。调用`SpawnMemberUseCase`。 * **参数**: * `config: AgentConfig`:成员配置(类型、权限等)。 * `Future<void> deleteTeam()` * **作用**:删除团队。调用`DeleteTeamUseCase`。##### UseCase层* `CreateTeamUseCase` (`Future<Team> execute(String name)`) * **作用**:创建团队。**逻辑**:1. 验证团队名称。2. 创建团队目录结构。3. 初始化团队配置文件。4. 注册团队。调用`TeamValidator.validateName`, `TeamStorage.create`, `TeamRegistry.register`。* `SpawnMemberUseCase` (`Future<Agent> execute(AgentConfig config)`) * **作用**:生成团队成员(AI Agent)。**逻辑**:1. 加载Agent定义。2. 初始化Agent实例。3. 创建成员邮箱。4. 启动Agent循环。调用`AgentFactory.create`, `AgentRuntime.start`。* `DeleteTeamUseCase` (`Future<void> execute()`) * **作用**:删除团队。**逻辑**:1. 关闭所有成员。2. 清理团队目录。3. 注销团队。调用`TeamManager.getAllMembers`, `Member.shutdown`, `TeamStorage.cleanup`。##### Repository层 (接口)* `TeamRepository` * `Future<Team> create(String name)` * **作用**:创建团队。 * `Future<void> delete(String teamName)` * **作用**:删除团队。 * `Future<void> addMember(String teamName, Agent member)` * **作用**:添加成员。 * `Future<List<Agent>> getMembers(String teamName)` * **作用**:获取成员列表。##### 数据源层 (实现)* `TeamRepositoryImpl` (实现 `TeamRepository`接口) * `Future<Team> create(String name)` * **实现**:创建目录`{workspace}/.workbuddy/teams/{name}/`,写入配置文件`team.toml`,返回Team对象。**Web平台**:存储到IndexedDB或服务器。 * `Future<void> delete(String teamName)` * **实现**:递归删除目录`{workspace}/.workbuddy/teams/{teamName}/`。#### 服务层 (Dart)##### Service层* `AgentFactory` * `Future<Agent> create(AgentConfig config)` * **作用**:创建Agent实例。**逻辑**:1. 加载Agent定义文件。2. 初始化Agent上下文。3. 注入工具集。4. 返回Agent实例。调用`AgentLoader.loadDefinition`, `AgentInstance.initialize`。* `AgentRuntime` * `Future<void> start(Agent agent)` * **作用**:启动Agent运行循环。**逻辑**:1. 创建邮箱。2. 启动消息轮询循环。3. 处理接收到的消息。调用`Mailbox.create`, `AgentLoop.start`。* `MessageRouter` * `void route(Message message)` * **作用**:路由消息到目标成员。根据`recipient`字段查找目标邮箱,投递消息。调用`MailboxStore.get`, `Mailbox.put`。##### Tool层* `Mailbox` * `void put(Message message)` * **作用**:投递消息到邮箱。 * `Message? poll()` * **作用**:从邮箱拉取消息。* `AgentLoop` * `Future<void> start(Agent agent)` * **作用**:**Agent主循环**。**逻辑**:不断轮询邮箱,接收消息,处理消息,发送响应。调用`Mailbox.poll`, `Agent.processMessage`, `MessageRouter.route`。##### Database层* **文件系统存储**:团队数据存储在`.workbuddy/teams/`目录下。 * **目录结构**:`{team_name}/team.toml`(团队配置)、`{team_name}/members/`(成员定义)、`{team_name}/mailbox/`(邮箱数据)。### 功能点4.2:成员间消息通信#### 服务层 (Dart)##### Service层* `Agent` * `Future<void> sendMessage(String recipient, Message message)` * **作用**:发送消息给其他成员。调用`MessageRouter.route`。 * `void processMessage(Message message)` * **作用**:处理接收到的消息。**逻辑**:根据消息类型(任务、通知、关闭请求等)执行相应处理。调用`TaskHandler.handle`, `NotificationHandler.handle`, `ShutdownHandler.handle`。* `MessageRouter` * `void route(Message message)` * **作用**:消息路由。查找目标成员邮箱,投递消息。---## 需求点5:自动化系统### 功能点5.1:自动化任务创建与管理#### 客户端 (Flutter - 全平台)##### UI层* `AutomationScreen`:自动化管理界面,展示自动化任务列表。 * **操作**:用户创建自动化,配置调度规则,启用/暂停自动化,查看执行历史。##### ViewModel/Provider层* `AutomationProvider` (extends ChangeNotifier) * `Future<String> createAutomation(AutomationConfig config)` * **作用**:创建自动化任务。调用`CreateAutomationUseCase`。 * **参数**: * `config: AutomationConfig`:自动化配置(名称、提示词、调度规则等)。 * `Future<void> updateAutomation(String id, Map<String, dynamic> updates)` * **作用**:更新自动化。调用`UpdateAutomationUseCase`。 * **参数**: * `id: String`:自动化ID。 * `updates: Map<String, dynamic>`:更新内容。 * `Future<void> pauseAutomation(String id)` * **作用**:暂停自动化。调用`PauseAutomationUseCase`。 * **参数**: * `id: String`:自动化ID。##### UseCase层* `CreateAutomationUseCase` (`Future<String> execute(AutomationConfig config)`) * **作用**:创建自动化。**逻辑**:1. 验证配置(调度规则、提示词)。2. 保存配置到TOML文件。3. 注册自动化。4. 调度首次执行。调用`AutomationValidator.validate`, `AutomationStorage.save`, `Scheduler.schedule`。* `UpdateAutomationUseCase` (`Future<void> execute(String id, Map<String, dynamic> updates)`) * **作用**:更新自动化。**逻辑**:1. 加载现有配置。2. 应用更新。3. 重新保存。4. 重新调度。调用`AutomationLoader.load`, `AutomationUpdater.apply`, `Scheduler.reschedule`。* `PauseAutomationUseCase` (`Future<void> execute(String id)`) * **作用**:暂停自动化。**逻辑**:1. 取消调度。2. 更新状态为PAUSED。调用`Scheduler.cancel`, `AutomationStatusUpdater.set`。##### Repository层 (接口)* `AutomationRepository` * `Future<void> save(AutomationConfig config)` * **作用**:保存自动化配置。 * `Future<Automation> load(String id)` * **作用**:加载自动化。 * `Future<List<Automation>> list()` * **作用**:列出所有自动化。 * `Future<void> update(String id, dynamic updates)` * **作用**:更新自动化。##### 数据源层 (实现)* `AutomationRepositoryImpl` (实现 `AutomationRepository`接口) * `Future<void> save(AutomationConfig config)` * **实现**:将配置对象序列化为TOML格式,写入`~/.workbuddy/automations/{id}/automation.toml`文件。**Web平台**:存储到IndexedDB或服务器。 * `Future<Automation> load(String id)` * **实现**:读取`automation.toml`文件,解析TOML内容,构造Automation对象。#### 服务层 (Dart)##### Service层* `Scheduler` * `void schedule(Automation automation)` * **作用**:**调度自动化任务**。**逻辑**:根据调度类型(recurring/once)计算下次执行时间,设置定时器。调用`RRuleScheduler.calculateNextRun`, `TimerManager.setTimer`。 * `void cancel(String automationId)` * **作用**:取消调度。清除定时器。 * `void reschedule(Automation automation)` * **作用**:重新调度。取消旧定时器,设置新定时器。* `RRuleScheduler` * `DateTime calculateNextRun(String rrule)` * **作用**:根据RRule规则计算下次执行时间。使用`rrule`包解析规则。* `TimerManager` * `void setTimer(DateTime executeAt, String automationId)` * **作用**:设置定时器。使用`Timer`在指定时间触发自动化执行。##### Database层* **sqflite 数据库**:存储自动化运行时状态。 * **表 `automations`**:自动化运行时状态。 * 字段:`id` (TEXT PRIMARY KEY), `name` (TEXT), `status` (TEXT), `last_run` (INTEGER), `next_run` (INTEGER), `created_at` (INTEGER)。* **文件系统存储**:自动化配置存储在TOML文件中。 * **路径**:`~/.workbuddy/automations/{id}/automation.toml`。### 功能点5.2:自动化执行引擎#### 服务层 (Dart)##### Service层* `AutomationExecutor` * `Future<void> execute(String automationId)` * **作用**:**自动化执行**。**逻辑**:1. 加载自动化配置。2. 创建执行上下文。3. 处理提示词。4. 执行任务。5. 记录执行日志。6. 调度下次执行。调用`AutomationLoader.load`, `PromptProcessor.process`, `TaskExecutor.execute`, `Scheduler.scheduleNextRun`。* `PromptProcessor` * `String process(String prompt, ExecutionContext context)` * **作用**:处理提示词模板。替换变量、注入上下文信息。* `ExecutionContextManager` * `ExecutionContext create(Automation automation)` * **作用**:创建执行上下文。设置工作目录、环境变量等。##### Database层* **sqflite 数据库**:存储执行日志。 * **表 `automation_execution_log`**:执行日志。 * 字段:`id` (INTEGER PRIMARY KEY), `automation_id` (TEXT), `started_at` (INTEGER), `completed_at` (INTEGER), `status` (TEXT), `result` (TEXT)。---## 需求点6:记忆系统### 功能点6.1:工作记忆管理#### 服务层 (Dart)##### Service层* `MemoryManager` * `Future<MemoryContext> loadSession(String sessionId)` * **作用**:**会话记忆加载**。**逻辑**:1. 加载今日日记。2. 加载长期记忆。3. 初始化记忆上下文。调用`MemoryStorage.loadDaily`, `MemoryStorage.loadLongTerm`。 * `Future<void> saveNote(String note)` * **作用**:保存记忆笔记。追加到今日日记文件。调用`MemoryStorage.appendDaily`。 * `Future<void> updateLongTerm(String key, dynamic value)` * **作用**:更新长期记忆。修改MEMORY.md文件。调用`MemoryStorage.updateLongTerm`。 * `Future<void> maintain()` * **作用**:**记忆维护**。**逻辑**:1. 查找超过30天的日记文件。2. 提炼关键信息。3. 更新长期记忆。4. 删除旧日记。调用`MemoryStorage.listFiles`, `MemoryDistiller.distill`, `FileSystem.delete`。* `MemoryDistiller` * `Future<String> distill(List<String> contents)` * **作用**:**记忆提炼**。使用AI从多条日记中提取关键信息,生成简洁的摘要。调用`AIEngine.summarize`。##### Repository层 (接口)* `MemoryRepository` * `Future<String> loadDaily(DateTime date)` * **作用**:加载指定日期的日记。 * `Future<void> appendDaily(DateTime date, String content)` * **作用**:追加日记内容。 * `Future<String> loadLongTerm()` * **作用**:加载长期记忆。 * `Future<void> updateLongTerm(String content)` * **作用**:更新长期记忆。##### 数据源层 (实现)* `MemoryRepositoryImpl` (实现 `MemoryRepository`接口) * `Future<String> loadDaily(DateTime date)` * **实现**:读取`{workspace}/.workbuddy/memory/YYYY-MM-DD.md`文件。 * `Future<void> appendDaily(DateTime date, String content)` * **实现**:读取日记文件,追加新内容(Markdown格式),写回文件。 * `Future<String> loadLongTerm()` * **实现**:读取`{workspace}/.workbuddy/memory/MEMORY.md`文件。**Web平台**:从IndexedDB或服务器加载。##### Database层* **文件系统存储**:记忆数据存储在Markdown文件中。 * **目录结构**:`{workspace}/.workbuddy/memory/` * **文件**:`YYYY-MM-DD.md`(日记)、`MEMORY.md`(长期记忆)。---## 需求点7:结果展示与交付### 功能点7.1:HTML预览与文件展示#### 服务层 (Dart)##### Service层* `ResultPresenter` * `Future<void> present(TaskResult result)` * **作用**:**结果展示**。根据结果类型选择展示方式。调用`HtmlPresenter.prepare`, `FilePresenter.prepare`, `AttachmentManager.collect`。 * `Future<void> previewHtml(String filePath)` * **作用**:预览HTML文件。启动本地服务器,在浏览器中打开。调用`LocalServer.start`, `PreviewUrl.open`。 * `Future<void> openResult(String filePath)` * **作用**:打开结果文件。使用系统默认应用打开。调用`url_launcher`插件。 * `Future<void> deliverAttachments(List<String> filePaths)` * **作用**:交付附件文件。显示附件列表供用户下载。调用`AttachmentManager.deliver`。* `LocalServer` * `Future<String> start(int port, String directory)` * **作用**:**启动本地HTTP服务器**。在指定端口提供静态文件服务。返回服务器URL。**桌面平台**:使用`shelf`包创建HTTP服务器。**移动端/Web**:不支持。 * `Future<void> stop()` * **作用**:停止服务器。* `PreviewService` * `Future<void> openUrl(String url)` * **作用**:在系统浏览器中打开URL。调用`url_launcher`插件。##### Tool层* `AttachmentManager` * `List<Attachment> collect(List<String> filePaths)` * **作用**:收集附件。验证文件存在性,构造附件对象列表。 * `void deliver(List<Attachment> attachments)` * **作用**:交付附件。在UI中显示附件列表,支持下载/分享。移动端使用`share_plus`插件。---## 需求点8:知识库检索### 功能点8.1:知识库搜索与集成#### 服务层 (Dart)##### Service层* `KnowledgeBaseManager` * `Future<List<SearchResult>> search(String query, List<String> bases)` * **作用**:**知识库搜索**。**逻辑**:1. 连接知识库服务。2. 处理查询。3. 执行搜索。4. 聚合结果。调用`CloudService.connect`, `QueryProcessor.process`, `SearchEngine.search`, `ResultAggregator.aggregate`。 * `Future<void> connect()` * **作用**:连接知识库服务。获取访问凭证。调用`CloudService.connect`, `AuthService.authenticate`。 * `List<KnowledgeBase> listAvailable()` * **作用**:列出可用知识库。返回预定义的知识库列表。* `QueryProcessor` * `ProcessedQuery process(String query)` * **作用**:处理查询。优化查询表达式,提取关键词。 * `String optimize(String query)` * **作用**:优化查询。移除停用词,扩展同义词。* `SearchEngine` * `Future<List<SearchResult>> search(ProcessedQuery query, List<String> bases)` * **作用**:**搜索引擎**。调用向量搜索引擎或API进行检索。调用`RAGProcessor.retrieve`。* `ResultAggregator` * `List<SearchResult> aggregate(List<SearchResult> results)` * **作用**:**结果聚合**。去重、排序、评分。调用`RelevanceScorer.score`。##### Repository层 (接口)* `KnowledgeBaseRepository` * `Future<List<SearchResult>> search(String query, List<String> bases)` * **作用**:知识库搜索API调用。##### 数据源层 (实现)* `KnowledgeBaseRepositoryImpl` (实现 `KnowledgeBaseRepository`接口) * `Future<List<SearchResult>> search(String query, List<String> bases)` * **实现**:调用腾讯云知识库API,使用`dio`或`http`包发送HTTP请求,传入查询和知识库ID列表,返回搜索结果。---## 核心数据结构### Dart类定义```dart// 消息class Message { final String id; final String sessionId; final String role; // 'user' | 'assistant' final String content; final DateTime timestamp; Message({ required this.id, required this.sessionId, required this.role, required this.content, required this.timestamp, }); Map<String, dynamic> toMap() => { 'id': id, 'session_id': sessionId, 'role': role, 'content': content, 'timestamp': timestamp.millisecondsSinceEpoch, }; factory Message.fromMap(Map<String, dynamic> map) => Message( id: map['id'], sessionId: map['session_id'], role: map['role'], content: map['content'], timestamp: DateTime.fromMillisecondsSinceEpoch(map['timestamp']), );}// 技能class Skill { final String name; final String description; final String instructions; final List<String>? references; final List<String>? scripts; Skill({ required this.name, required this.description, required this.instructions, this.references, this.scripts, });}// 自动化class Automation { final String id; final String name; final String prompt; final String? rrule; final DateTime? scheduledAt; final String scheduleType; // 'recurring' | 'once' final String status; // 'ACTIVE' | 'PAUSED' final List<String> cwds; Automation({ required this.id, required this.name, required this.prompt, this.rrule, this.scheduledAt, required this.scheduleType, required this.status, required this.cwds, });}// 团队class Team { final String name; final List<Agent> members; final DateTime createdAt; Team({ required this.name, required this.members, required this.createdAt, });}// Agentclass Agent { final String name; final String type; final List<String> permissions; final String status; // 'active' | 'idle' Agent({ required this.name, required this.type, required this.permissions, required this.status, });}// 记忆上下文class MemoryContext { final String daily; final String longTerm; final dynamic sessionContext; MemoryContext({ required this.daily, required this.longTerm, this.sessionContext, });}// 命令结果class CommandResult { final String output; final String error; final int exitCode; final Duration duration; CommandResult({ required this.output, required this.error, required this.exitCode, required this.duration, });}// 搜索结果class SearchResult { final String filePath; final int lineNumber; final String content; final String? context; SearchResult({ required this.filePath, required this.lineNumber, required this.content, this.context, });}// 文件信息class FileInfo { final String name; final String path; final bool isDirectory; final int size; final DateTime modifiedTime; FileInfo({ required this.name, required this.path, required this.isDirectory, required this.size, required this.modifiedTime, });}// 任务结果class TaskResult { final String type; // 'html' | 'file' | 'attachments' final dynamic content; final String? filePath; final List<String>? attachmentPaths; TaskResult({ required this.type, required this.content, this.filePath, this.attachmentPaths, });}```---## 项目目录结构```workbuddy/├── pubspec.yaml├── analysis_options.yaml├── .gitignore├── README.md│├── lib/│ ├── main.dart # 应用入口│ ││ ├── app/│ │ ├── app.dart # MaterialApp配置│ │ ├── routes.dart # 路由定义│ │ └── theme.dart # 主题配置│ ││ ├── screens/ # UI层(页面)│ │ ├── chat/│ │ │ ├── chat_screen.dart│ │ │ └── widgets/│ │ │ └── message_bubble.dart│ │ ├── file/│ │ │ ├── file_explorer_screen.dart│ │ │ └── file_editor_screen.dart│ │ ├── search/│ │ │ └── search_screen.dart│ │ ├── skill/│ │ │ ├── skill_manager_screen.dart│ │ │ └── skill_execution_screen.dart│ │ ├── command/│ │ │ └── command_terminal_screen.dart│ │ ├── team/│ │ │ └── team_management_screen.dart│ │ ├── automation/│ │ │ └── automation_screen.dart│ │ └── settings/│ │ └── settings_screen.dart│ ││ ├── providers/ # Provider层(状态管理)│ │ ├── chat_provider.dart│ │ ├── file_explorer_provider.dart│ │ ├── search_provider.dart│ │ ├── skill_manager_provider.dart│ │ ├── command_provider.dart│ │ ├── team_provider.dart│ │ └── automation_provider.dart│ ││ ├── usecases/ # UseCase层(业务逻辑)│ │ ├── chat/│ │ │ ├── send_message_usecase.dart│ │ │ ├── load_history_usecase.dart│ │ │ └── clear_session_usecase.dart│ │ ├── file/│ │ │ ├── list_directory_usecase.dart│ │ │ ├── read_file_usecase.dart│ │ │ ├── write_file_usecase.dart│ │ │ └── delete_file_usecase.dart│ │ ├── search/│ │ │ ├── search_files_usecase.dart│ │ │ └── search_content_usecase.dart│ │ ├── command/│ │ │ ├── execute_command_usecase.dart│ │ │ ├── kill_process_usecase.dart│ │ │ └── get_active_processes_usecase.dart│ │ ├── skill/│ │ │ ├── load_skill_usecase.dart│ │ │ ├── execute_skill_usecase.dart│ │ │ └── install_skill_usecase.dart│ │ ├── team/│ │ │ ├── create_team_usecase.dart│ │ │ ├── spawn_member_usecase.dart│ │ │ └── delete_team_usecase.dart│ │ └── automation/│ │ ├── create_automation_usecase.dart│ │ ├── update_automation_usecase.dart│ │ └── pause_automation_usecase.dart│ ││ ├── repositories/ # Repository层(数据访问接口)│ │ ├── message_repository.dart│ │ ├── file_repository.dart│ │ ├── search_repository.dart│ │ ├── command_repository.dart│ │ ├── skill_repository.dart│ │ ├── team_repository.dart│ │ ├── automation_repository.dart│ │ ├── memory_repository.dart│ │ └── knowledge_base_repository.dart│ ││ ├── data/│ │ ├── datasources/ # 数据源实现│ │ │ ├── local/│ │ │ │ ├── database_helper.dart│ │ │ │ ├── message_repository_impl.dart│ │ │ │ ├── file_repository_impl.dart│ │ │ │ ├── search_repository_impl.dart│ │ │ │ ├── command_repository_impl.dart│ │ │ │ ├── skill_repository_impl.dart│ │ │ │ ├── team_repository_impl.dart│ │ │ │ ├── automation_repository_impl.dart│ │ │ │ ├── memory_repository_impl.dart│ │ │ │ └── knowledge_base_repository_impl.dart│ │ │ └── remote/│ │ │ └── llm_api_client.dart│ │ ││ │ └── models/ # 数据模型│ │ ├── message.dart│ │ ├── skill.dart│ │ ├── automation.dart│ │ ├── team.dart│ │ ├── agent.dart│ │ ├── command_result.dart│ │ ├── search_result.dart│ │ ├── file_info.dart│ │ └── task_result.dart│ ││ ├── services/ # Service层(核心业务服务)│ │ ├── ai_engine.dart│ │ ├── intent_classifier.dart│ │ ├── action_planner.dart│ │ ├── action_executor.dart│ │ ├── file_service.dart│ │ ├── search_service.dart│ │ ├── command_service.dart│ │ ├── skill_service.dart│ │ ├── team_service.dart│ │ ├── automation_service.dart│ │ ├── memory_service.dart│ │ ├── knowledge_base_service.dart│ │ ├── path_validator.dart│ │ ├── backup_manager.dart│ │ ├── trash_manager.dart│ │ ├── security_auditor.dart│ │ ├── agent_factory.dart│ │ ├── agent_runtime.dart│ │ ├── message_router.dart│ │ ├── scheduler.dart│ │ ├── memory_manager.dart│ │ ├── result_presenter.dart│ │ └── local_server.dart│ ││ ├── tools/ # Tool层(工具类)│ │ ├── tool_orchestrator.dart│ │ ├── tool_executor.dart│ │ ├── tool_call_handler.dart│ │ ├── reference_loader.dart│ │ ├── script_executor.dart│ │ ├── mailbox.dart│ │ ├── agent_loop.dart│ │ ├── file_searcher.dart│ │ ├── content_searcher.dart│ │ ├── ripgrep_engine.dart│ │ ├── process_manager.dart│ │ ├── timer_manager.dart│ │ ├── rrule_scheduler.dart│ │ ├── automation_executor.dart│ │ ├── prompt_processor.dart│ │ ├── memory_distiller.dart│ │ ├── attachment_manager.dart│ │ ├── query_processor.dart│ │ ├── search_engine.dart│ │ └── result_aggregator.dart│ ││ ├── utils/ # 工具函数│ │ ├── constants.dart│ │ ├── validators.dart│ │ ├── helpers.dart│ │ └── platform_adapter.dart│ ││ └── core/ # 核心类│ ├── dependency_injection.dart│ ├── error_handling.dart│ └── logger.dart│├── assets/ # 静态资源│ ├── images/│ │ ├── logo.png│ │ └── icons/│ └── fonts/│├── test/ # 测试│ ├── unit/│ ├── widget/│ └── integration/│├── web/ # Web平台特定文件│ ├── index.html│ ├── manifest.json│ └── favicon.png│├── android/ # Android平台特定文件├── ios/ # iOS平台特定文件├── windows/ # Windows平台特定文件├── macos/ # macOS平台特定文件└── linux/ # Linux平台特定文件```---## 配置文件### pubspec.yaml```yamlname: workbuddydescription: AI-powered multi-platform assistantversion: 1.0.0environment: sdk: '>=3.0.0 <4.0.0'dependencies: flutter: sdk: flutter # 状态管理 provider: ^6.1.0 # 数据库 sqflite: ^2.3.0 path_provider: ^2.1.0 # HTTP & 网络 dio: ^5.4.0 # 文件操作 path: ^1.8.0 # UI组件 flutter_markdown: ^0.6.0 url_launcher: ^6.2.0 share_plus: ^7.2.0 file_picker: ^6.1.0 # JSON序列化 json_annotation: ^4.8.0 # 工具库 uuid: ^4.2.0 rrule: ^0.2.0 # 本地服务器(桌面平台) shelf: ^1.4.0 # 命令执行(仅桌面) process_run: ^0.13.0dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^3.0.0 build_runner: ^2.4.0 json_serializable: ^6.7.0flutter: uses-material-design: true assets: - assets/images/ - assets/fonts/```### analysis_options.yaml```yamlinclude: package:flutter_lints/flutter.yamllinter: rules: - prefer_const_constructors - prefer_const_declarations - avoid_print - prefer_single_quotes```---## 数据库Schema### sqflite数据库表```dart// 数据库初始化脚本class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._init(); static Database? _database; Future<Database> get database async { if (_database != null) return _database!; _database = await _initDB('workbuddy.db'); return _database!; } Future<Database> _initDB(String filePath) async { final dbPath = await getApplicationDocumentsDirectory(); final path = join(dbPath.path, filePath); return await openDatabase(path, version: 1, onCreate: _createDB); } Future _createDB(Database db, int version) async { // 消息表 await db.execute(''' CREATE TABLE messages ( id TEXT PRIMARY KEY, session_id TEXT NOT NULL, role TEXT NOT NULL CHECK(role IN ('user', 'assistant')), content TEXT NOT NULL, timestamp INTEGER NOT NULL, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000) ) '''); await db.execute(''' CREATE INDEX idx_messages_session ON messages(session_id, timestamp) '''); // 命令历史表 await db.execute(''' CREATE TABLE command_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, command TEXT NOT NULL, exit_code INTEGER, output TEXT, error TEXT, executed_at INTEGER NOT NULL, user_id TEXT, duration_ms INTEGER ) '''); await db.execute(''' CREATE INDEX idx_command_history_time ON command_history(executed_at DESC) '''); // 自动化表 await db.execute(''' CREATE TABLE automations ( id TEXT PRIMARY KEY, name TEXT NOT NULL, prompt TEXT NOT NULL, schedule_type TEXT NOT NULL CHECK(schedule_type IN ('recurring', 'once')), rrule TEXT, scheduled_at INTEGER, status TEXT NOT NULL DEFAULT 'ACTIVE' CHECK(status IN ('ACTIVE', 'PAUSED')), cwds TEXT, last_run INTEGER, next_run INTEGER, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000), updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000) ) '''); await db.execute(''' CREATE INDEX idx_automations_next_run ON automations(next_run) WHERE status = 'ACTIVE' '''); // 自动化执行日志表 await db.execute(''' CREATE TABLE automation_execution_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, automation_id TEXT NOT NULL, started_at INTEGER NOT NULL, completed_at INTEGER, status TEXT CHECK(status IN ('running', 'success', 'failed')), result TEXT, error_message TEXT, FOREIGN KEY (automation_id) REFERENCES automations(id) ) '''); await db.execute(''' CREATE INDEX idx_execution_log_automation ON automation_execution_log(automation_id, started_at DESC) '''); // 技能注册表 await db.execute(''' CREATE TABLE skill_registry ( name TEXT PRIMARY KEY, path TEXT NOT NULL, level TEXT NOT NULL CHECK(level IN ('user', 'project')), risk_level TEXT CHECK(risk_level IN ('P0', 'P1', 'P2')), installed_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000) ) '''); // 文件操作日志表 await db.execute(''' CREATE TABLE file_operations_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, operation TEXT NOT NULL, path TEXT NOT NULL, timestamp INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000), user_id TEXT, details TEXT ) '''); await db.execute(''' CREATE INDEX idx_file_ops_time ON file_operations_log(timestamp DESC) '''); }}```---## 方法调用关系图```┌─────────────────────────────────────────────────────────────────────┐│ UI层 (Flutter Widgets) ││ ChatScreen FileExplorer SkillManager CommandTerminal ... │└───────────────────────────┬─────────────────────────────────────────┘ │ Provider方法调用┌───────────────────────────▼─────────────────────────────────────────┐│ Provider层 (状态管理) ││ ChatProvider FileExplorerProvider SkillManagerProvider ... │└───────────────────────────┬─────────────────────────────────────────┘ │ UseCase方法调用┌───────────────────────────▼─────────────────────────────────────────┐│ UseCase层(业务逻辑) ││ SendMessageUseCase ReadFileUseCase ExecuteCommandUseCase ... │└────┬───────────────────┬───────────────────┬─────────────────────────┘ │ │ │ │ │ Repository调用 │ 服务调用┌────▼───────────────────▼───────────────────▼─────────────────────────┐│ Service层 & Repository层 ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │AIEngine │ │FileRepo │ │CmdRepo │ │SkillRepo │ ... ││ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ │└────────┼────────────┼────────────┼────────────┼─────────────────────┘ │ │ │ │┌────────▼────────────▼────────────▼────────────▼─────────────────────┐│ Tool层 & 数据访问层 ││ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ││ │LLMAPI │ │dart:io │ │Process │ │TOMLFile│ │sqflite │ ││ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │└─────────────────────────────────────────────────────────────────────┘ │ │ │ │┌────────▼────────────▼────────────▼────────────▼─────────────────────┐│ 外部系统 & 存储 ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │LLM Service│ │OS Files │ │Shell/Cmd │ │SQLite DB │ ││ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │└─────────────────────────────────────────────────────────────────────┘```---## 平台差异说明### 命令执行- **桌面平台(Windows/macOS/Linux)**:完整支持,使用`dart:io Process`- **移动端(Android/iOS)**:受限支持,仅能执行特定命令- **Web**:不支持### 文件系统- **桌面/移动端**:使用`dart:io`直接访问文件系统- **Web**:使用IndexedDB、LocalStorage或服务器存储### 本地服务器- **桌面平台**:支持,使用`shelf`包创建HTTP服务器- **移动端/Web**:不支持### 进程管理- **桌面平台**:完整支持- **移动端**:受限支持- **Web**:不支持---## 下一步:生成完整项目代码此方法调用结构文档详细定义了WorkBuddy的Flutter架构:1. **分层架构**:UI层 → Provider层 → UseCase层 → Repository层 → 数据源层2. **9个需求模块**,每个包含详细的方法定义、参数、核心逻辑3. **跨平台支持**:Android、iOS、Windows、macOS、Linux、Web4. **数据持久化**:sqflite数据库 + 文件系统存储5. **状态管理**:Provider模式6. **平台差异**:针对不同平台的适配策略下一步将基于此结构生成:- 完整的Dart源代码(所有类、方法实现)- pubspec.yaml配置文件- 数据库初始化脚本- 平台特定配置(Android、iOS、Windows、macOS、Linux、Web)- 测试代码- 文档(README.md, API文档)