@maidang1/hataraku 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/CLAUDE.md +21 -0
- package/.codex/skills/beautiful-mermaid/SKILL.md +171 -0
- package/.codex/skills/beautiful-mermaid/references/mermaid-syntax.md +235 -0
- package/.codex/skills/beautiful-mermaid/scripts/create-html.ts +177 -0
- package/.codex/skills/beautiful-mermaid/scripts/render.ts +221 -0
- package/.codex/skills/find-skills/SKILL.md +133 -0
- package/.github/workflows/publish-github-packages.yml +58 -0
- package/.github/workflows/publish-npm.yml +46 -0
- package/.vscode/settings.json +2 -0
- package/AGENTS.md +41 -0
- package/LICENSE +21 -0
- package/README.md +119 -0
- package/bun.lock +327 -0
- package/docs/agent/architecture.md +28 -0
- package/docs/agent/development_commands.md +6 -0
- package/docs/plan/agent-plan-2026-02-05.md +136 -0
- package/docs/plan/core-agent-sdk-structure-2026-02-07.md +156 -0
- package/docs/plan/implementation-summary.md +303 -0
- package/docs/plan/mcp-2026-02-05.md +700 -0
- package/docs/plan/op.md +478 -0
- package/docs/plan/skills-2026-02-05.md +352 -0
- package/docs/plan/skills-flow.svg +120 -0
- package/docs/plan/tui-readability-2026-02-06.md +67 -0
- package/package.json +34 -0
- package/src/cli/index.tsx +4 -0
- package/src/cli/main.tsx +98 -0
- package/src/core/README.md +19 -0
- package/src/core/api/agent.ts +1 -0
- package/src/core/api/config.ts +1 -0
- package/src/core/api/index.ts +10 -0
- package/src/core/api/integrations.ts +1 -0
- package/src/core/api/observability.ts +1 -0
- package/src/core/api/policy.ts +1 -0
- package/src/core/api/providers.ts +1 -0
- package/src/core/api/runtime.ts +1 -0
- package/src/core/api/shared.ts +1 -0
- package/src/core/api/tools.ts +1 -0
- package/src/core/api/types.ts +1 -0
- package/src/core/index.ts +1 -0
- package/src/core/internal/config/defaults.ts +8 -0
- package/src/core/internal/config/index.ts +3 -0
- package/src/core/internal/config/loader.ts +97 -0
- package/src/core/internal/config/schema.ts +47 -0
- package/src/core/internal/integrations/index.ts +2 -0
- package/src/core/internal/integrations/mcp/connection-manager.ts +231 -0
- package/src/core/internal/integrations/mcp/health-checker.ts +91 -0
- package/src/core/internal/integrations/mcp/index.ts +197 -0
- package/src/core/internal/integrations/mcp/retry-strategy.ts +111 -0
- package/src/core/internal/integrations/mcp/tool-cache.ts +103 -0
- package/src/core/internal/integrations/mcp/transport.ts +58 -0
- package/src/core/internal/integrations/mcp/types.ts +95 -0
- package/src/core/internal/integrations/mcp/utils.ts +44 -0
- package/src/core/internal/integrations/skills/cache/index.ts +38 -0
- package/src/core/internal/integrations/skills/cache/interface.ts +9 -0
- package/src/core/internal/integrations/skills/cache/memory-cache.ts +118 -0
- package/src/core/internal/integrations/skills/config/defaults.ts +35 -0
- package/src/core/internal/integrations/skills/config/index.ts +71 -0
- package/src/core/internal/integrations/skills/config/schema.ts +31 -0
- package/src/core/internal/integrations/skills/core/errors.ts +36 -0
- package/src/core/internal/integrations/skills/core/events.ts +143 -0
- package/src/core/internal/integrations/skills/core/types.ts +83 -0
- package/src/core/internal/integrations/skills/dependency/conflict-detector.ts +126 -0
- package/src/core/internal/integrations/skills/dependency/graph.ts +91 -0
- package/src/core/internal/integrations/skills/dependency/resolver.ts +128 -0
- package/src/core/internal/integrations/skills/dependency/types.ts +51 -0
- package/src/core/internal/integrations/skills/discovery/index.ts +98 -0
- package/src/core/internal/integrations/skills/discovery/resolver.ts +39 -0
- package/src/core/internal/integrations/skills/discovery/scanner.ts +116 -0
- package/src/core/internal/integrations/skills/discovery/strategies/file-system.ts +16 -0
- package/src/core/internal/integrations/skills/index.ts +3 -0
- package/src/core/internal/integrations/skills/integration/lifecycle.ts +124 -0
- package/src/core/internal/integrations/skills/integration/mcp-loader.ts +100 -0
- package/src/core/internal/integrations/skills/integration/tool-mapper.ts +56 -0
- package/src/core/internal/integrations/skills/loaders/index.ts +5 -0
- package/src/core/internal/integrations/skills/loaders/skill-loader.ts +97 -0
- package/src/core/internal/integrations/skills/manager.ts +200 -0
- package/src/core/internal/integrations/skills/parsers/base.ts +134 -0
- package/src/core/internal/integrations/skills/parsers/factory.ts +42 -0
- package/src/core/internal/integrations/skills/parsers/index.ts +71 -0
- package/src/core/internal/integrations/skills/parsers/markdown.ts +111 -0
- package/src/core/internal/integrations/skills/parsers/yaml-metadata.ts +49 -0
- package/src/core/internal/integrations/skills/types.ts +15 -0
- package/src/core/internal/integrations/skills/utils/fs.ts +59 -0
- package/src/core/internal/integrations/skills/utils/logger.ts +109 -0
- package/src/core/internal/integrations/skills/utils/path.ts +27 -0
- package/src/core/internal/integrations/skills/validation/index.ts +43 -0
- package/src/core/internal/integrations/skills/validation/schema.ts +37 -0
- package/src/core/internal/integrations/skills/validation/skill-validator.ts +56 -0
- package/src/core/internal/observability/index.ts +2 -0
- package/src/core/internal/observability/logging/env.ts +32 -0
- package/src/core/internal/observability/logging/export.ts +55 -0
- package/src/core/internal/observability/logging/index.ts +4 -0
- package/src/core/internal/observability/logging/session-logger.ts +54 -0
- package/src/core/internal/observability/logging/types.ts +53 -0
- package/src/core/internal/policy/index.ts +1 -0
- package/src/core/internal/policy/safety/index.ts +2 -0
- package/src/core/internal/policy/safety/policy.ts +96 -0
- package/src/core/internal/policy/safety/types.ts +24 -0
- package/src/core/internal/providers/anthropic/client.ts +20 -0
- package/src/core/internal/providers/anthropic/index.ts +1 -0
- package/src/core/internal/providers/index.ts +1 -0
- package/src/core/internal/sdk/agent/agent.ts +691 -0
- package/src/core/internal/sdk/agent/index.ts +3 -0
- package/src/core/internal/sdk/agent/session.ts +9 -0
- package/src/core/internal/sdk/agent/tool-loop.ts +10 -0
- package/src/core/internal/sdk/index.ts +3 -0
- package/src/core/internal/sdk/runtime/context.ts +1 -0
- package/src/core/internal/sdk/runtime/errors.ts +9 -0
- package/src/core/internal/sdk/runtime/execution.ts +12 -0
- package/src/core/internal/sdk/runtime/index.ts +3 -0
- package/src/core/internal/sdk/types/api.ts +4 -0
- package/src/core/internal/sdk/types/index.ts +1 -0
- package/src/core/internal/sdk/types/internal.ts +1 -0
- package/src/core/internal/shared/fs.ts +10 -0
- package/src/core/internal/shared/index.ts +3 -0
- package/src/core/internal/shared/message.ts +12 -0
- package/src/core/internal/shared/path.ts +10 -0
- package/src/core/internal/tools/base/errors.ts +6 -0
- package/src/core/internal/tools/base/index.ts +3 -0
- package/src/core/internal/tools/base/schema.ts +1 -0
- package/src/core/internal/tools/base/tool.ts +42 -0
- package/src/core/internal/tools/builtins/architect.ts +45 -0
- package/src/core/internal/tools/builtins/bash.ts +135 -0
- package/src/core/internal/tools/builtins/fetch.ts +62 -0
- package/src/core/internal/tools/builtins/file-edit.ts +134 -0
- package/src/core/internal/tools/builtins/file-read.ts +75 -0
- package/src/core/internal/tools/builtins/fs.ts +254 -0
- package/src/core/internal/tools/builtins/glob.ts +75 -0
- package/src/core/internal/tools/builtins/grep.ts +104 -0
- package/src/core/internal/tools/builtins/index.ts +26 -0
- package/src/core/internal/tools/builtins/list-files.ts +64 -0
- package/src/core/internal/tools/builtins/search.ts +50 -0
- package/src/core/internal/tools/builtins/skills.ts +127 -0
- package/src/core/internal/tools/builtins/todo.ts +121 -0
- package/src/core/internal/tools/guards/file-edit-cache.ts +21 -0
- package/src/core/internal/tools/guards/limits.ts +43 -0
- package/src/core/internal/tools/index.ts +39 -0
- package/src/core/internal/tools/registry/index.ts +2 -0
- package/src/core/internal/tools/registry/presets.ts +28 -0
- package/src/core/internal/tools/registry/registry.ts +21 -0
- package/src/index.ts +3 -0
- package/src/render/commands/index.ts +113 -0
- package/src/render/commands/init.ts +45 -0
- package/src/render/components/ActivityPane.tsx +67 -0
- package/src/render/components/ChatBubble.tsx +58 -0
- package/src/render/components/ConfirmCard.tsx +100 -0
- package/src/render/components/ConfirmSelectMenu.tsx +56 -0
- package/src/render/components/ConversationPane.tsx +65 -0
- package/src/render/components/EventTimeline.tsx +30 -0
- package/src/render/components/MarkdownText.tsx +139 -0
- package/src/render/components/SlashCommandMenu.tsx +68 -0
- package/src/render/components/Spinner.tsx +18 -0
- package/src/render/components/StatusBar.tsx +72 -0
- package/src/render/components/Timeline.tsx +57 -0
- package/src/render/components/TimelineEvent.tsx +313 -0
- package/src/render/components/ToolCard.tsx +126 -0
- package/src/render/components/formatters/confirm.test.ts +34 -0
- package/src/render/components/formatters/confirm.ts +32 -0
- package/src/render/index.tsx +466 -0
- package/src/render/state/events.ts +301 -0
- package/src/render/state/history.ts +5 -0
- package/src/render/state/loading.ts +18 -0
- package/src/render/state/message.tsx +35 -0
- package/src/render/state/store.ts +7 -0
- package/src/render/theme.ts +52 -0
- package/test-e2e.ts +250 -0
- package/tsconfig.json +29 -0
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
# MCP 和 Skills 系统集成完善计划
|
|
2
|
+
|
|
3
|
+
## 项目概述
|
|
4
|
+
|
|
5
|
+
本计划旨在完善当前项目中的 MCP (Model Context Protocol) 实现,参考 OpenAI Codex 的 MCP 实现方式,增强连接管理、错误处理、性能优化和配置管理功能。
|
|
6
|
+
|
|
7
|
+
**参考资料**:
|
|
8
|
+
- [OpenAI Codex MCP 文档](https://developers.openai.com/codex/mcp/)
|
|
9
|
+
- [Model Context Protocol GitHub](https://github.com/modelcontextprotocol)
|
|
10
|
+
- [MCP 超时和重试最佳实践](https://octopus.com/blog/mcp-timeout-retry)
|
|
11
|
+
|
|
12
|
+
## 当前状态分析
|
|
13
|
+
|
|
14
|
+
### 已完成的功能
|
|
15
|
+
|
|
16
|
+
✅ **MCP 基础实现**
|
|
17
|
+
- 支持 Stdio 和 HTTP 两种传输方式
|
|
18
|
+
- McpTool 类包装 MCP 工具
|
|
19
|
+
- 基本的连接生命周期事件(start, success, error)
|
|
20
|
+
- 三层配置优先级系统(local > project > user)
|
|
21
|
+
- Agent 中已集成 MCP 工具加载
|
|
22
|
+
|
|
23
|
+
✅ **Skills 系统**
|
|
24
|
+
- 完整的分层协调器架构(Discovery, Parser, Validation, Cache)
|
|
25
|
+
- 支持多作用域(Repo, User, System, Admin)
|
|
26
|
+
- 事件驱动系统
|
|
27
|
+
- 配置化设计
|
|
28
|
+
- 与 MCP 的基础集成(Skills 可声明 MCP 依赖)
|
|
29
|
+
|
|
30
|
+
### 需要改进的部分
|
|
31
|
+
|
|
32
|
+
⚠️ **MCP 连接管理**
|
|
33
|
+
- 连接失败只记录警告,没有重试机制
|
|
34
|
+
- 缺少连接池和状态管理
|
|
35
|
+
- 没有健康检查机制
|
|
36
|
+
- 缺少优雅关闭和资源清理
|
|
37
|
+
|
|
38
|
+
⚠️ **性能和缓存**
|
|
39
|
+
- 没有 MCP 工具列表的缓存,每次初始化都要重新连接
|
|
40
|
+
- 没有工具调用超时限制
|
|
41
|
+
- 缺少启动超时配置
|
|
42
|
+
|
|
43
|
+
⚠️ **Skills 依赖管理**
|
|
44
|
+
- Skill 依赖处理是简化版本
|
|
45
|
+
- 缺少重复检测和冲突解决机制
|
|
46
|
+
- 没有依赖图构建和循环依赖检测
|
|
47
|
+
|
|
48
|
+
⚠️ **配置管理**
|
|
49
|
+
- 缺少工具过滤功能(enabledTools/disabledTools)
|
|
50
|
+
- 缺少服务器启用/禁用开关
|
|
51
|
+
- 缺少认证配置支持(bearer token, OAuth)
|
|
52
|
+
- 缺少超时配置(startup_timeout_sec, tool_timeout_sec)
|
|
53
|
+
|
|
54
|
+
## 实施计划
|
|
55
|
+
|
|
56
|
+
### 阶段 1:MCP 连接管理增强(优先级:高)
|
|
57
|
+
|
|
58
|
+
#### 目标
|
|
59
|
+
实现健壮的 MCP 连接管理系统,包括连接池、重连策略、健康检查和优雅关闭。
|
|
60
|
+
|
|
61
|
+
#### 关键文件
|
|
62
|
+
|
|
63
|
+
**新增文件**:
|
|
64
|
+
- `src/core/mcp/connection-manager.ts` - 连接池和生命周期管理
|
|
65
|
+
- `src/core/mcp/retry-strategy.ts` - 重连策略(指数退避)
|
|
66
|
+
- `src/core/mcp/health-checker.ts` - 健康检查机制
|
|
67
|
+
- `src/core/mcp/tool-cache.ts` - MCP 工具缓存
|
|
68
|
+
- `src/core/mcp/types.ts` - MCP 类型定义扩展
|
|
69
|
+
- `src/core/mcp/transport.ts` - 传输层创建逻辑(从 index.ts 提取)
|
|
70
|
+
|
|
71
|
+
**修改文件**:
|
|
72
|
+
- `src/core/mcp/index.ts` - 重构以使用 ConnectionManager
|
|
73
|
+
|
|
74
|
+
#### 实施细节
|
|
75
|
+
|
|
76
|
+
**1.1 连接管理器 (ConnectionManager)**
|
|
77
|
+
|
|
78
|
+
核心功能:
|
|
79
|
+
- 管理多个 MCP 服务器连接的生命周期
|
|
80
|
+
- 连接状态机:DISCONNECTED → CONNECTING → CONNECTED → RECONNECTING → FAILED
|
|
81
|
+
- 自动重连机制(使用 RetryStrategy)
|
|
82
|
+
- 事件发射:connectionStateChanged, connectionError, reconnectAttempt
|
|
83
|
+
- 支持优雅关闭和资源清理
|
|
84
|
+
|
|
85
|
+
关键接口:
|
|
86
|
+
```typescript
|
|
87
|
+
class ConnectionManager extends EventEmitter {
|
|
88
|
+
async connect(serverName: string, config: McpServerConfig, transport: Transport): Promise<Client>
|
|
89
|
+
async reconnect(serverName: string): Promise<void>
|
|
90
|
+
getConnection(serverName: string): ManagedConnection | undefined
|
|
91
|
+
getAllConnections(): ManagedConnection[]
|
|
92
|
+
async disconnect(serverName: string): Promise<void>
|
|
93
|
+
async disconnectAll(): Promise<void>
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**1.2 重连策略 (RetryStrategy)**
|
|
98
|
+
|
|
99
|
+
核心功能:
|
|
100
|
+
- 指数退避算法:delay = min(initialDelay * 2^attempt, maxDelay)
|
|
101
|
+
- 添加抖动(jitter)避免雷鸣群效应
|
|
102
|
+
- 可配置的最大重试次数(默认 3 次)
|
|
103
|
+
- 智能错误分类(网络错误可重试,配置错误不可重试)
|
|
104
|
+
|
|
105
|
+
配置参数:
|
|
106
|
+
- `maxRetries`: 3(默认)
|
|
107
|
+
- `initialDelay`: 1000ms(默认)
|
|
108
|
+
- `maxDelay`: 30000ms(默认)
|
|
109
|
+
- `jitterFactor`: 0.1(默认)
|
|
110
|
+
|
|
111
|
+
**1.3 健康检查 (HealthChecker)**
|
|
112
|
+
|
|
113
|
+
核心功能:
|
|
114
|
+
- 定期检查 MCP 服务器健康状态(默认 60 秒间隔)
|
|
115
|
+
- 使用 `client.listTools()` 作为健康检查探针
|
|
116
|
+
- 记录延迟和错误信息
|
|
117
|
+
- 触发 onUnhealthy 回调用于自动重连
|
|
118
|
+
|
|
119
|
+
**1.4 工具缓存 (McpToolCache)**
|
|
120
|
+
|
|
121
|
+
核心功能:
|
|
122
|
+
- 缓存 MCP 服务器的工具列表
|
|
123
|
+
- TTL 机制(默认 5 分钟)
|
|
124
|
+
- 支持手动失效和自动过期清理
|
|
125
|
+
- 减少重复的 listTools 调用
|
|
126
|
+
|
|
127
|
+
**1.5 配置类型扩展**
|
|
128
|
+
|
|
129
|
+
新增配置字段(参考 OpenAI Codex):
|
|
130
|
+
```typescript
|
|
131
|
+
interface McpServerConfig {
|
|
132
|
+
// 现有字段
|
|
133
|
+
command?: string
|
|
134
|
+
args?: string[]
|
|
135
|
+
env?: Record<string, string>
|
|
136
|
+
cwd?: string
|
|
137
|
+
url?: string
|
|
138
|
+
headers?: Record<string, string>
|
|
139
|
+
|
|
140
|
+
// 新增字段
|
|
141
|
+
enabled?: boolean // 是否启用(默认 true)
|
|
142
|
+
startupTimeoutSec?: number // 启动超时(默认 30s)
|
|
143
|
+
toolTimeoutSec?: number // 工具调用超时(默认 60s)
|
|
144
|
+
enabledTools?: string[] // 工具白名单
|
|
145
|
+
disabledTools?: string[] // 工具黑名单
|
|
146
|
+
maxRetries?: number // 最大重试次数(默认 3)
|
|
147
|
+
retryDelay?: number // 初始重试延迟(默认 1000ms)
|
|
148
|
+
healthCheckInterval?: number // 健康检查间隔(默认 60000ms)
|
|
149
|
+
|
|
150
|
+
// 认证配置
|
|
151
|
+
auth?: {
|
|
152
|
+
type: "bearer" | "oauth" | "basic"
|
|
153
|
+
token?: string
|
|
154
|
+
username?: string
|
|
155
|
+
password?: string
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### 验证方案
|
|
161
|
+
|
|
162
|
+
1. **连接管理测试**
|
|
163
|
+
- 启动应用,验证 MCP 服务器正常连接
|
|
164
|
+
- 手动停止 MCP 服务器,验证自动重连
|
|
165
|
+
- 检查日志中的重连尝试和指数退避延迟
|
|
166
|
+
|
|
167
|
+
2. **工具缓存测试**
|
|
168
|
+
- 首次加载记录时间
|
|
169
|
+
- 第二次加载应使用缓存(显著更快)
|
|
170
|
+
- 等待 TTL 过期后验证缓存失效
|
|
171
|
+
|
|
172
|
+
3. **健康检查测试**
|
|
173
|
+
- 运行应用超过 60 秒
|
|
174
|
+
- 检查健康检查日志
|
|
175
|
+
- 模拟服务器故障,验证健康检查检测到问题
|
|
176
|
+
|
|
177
|
+
4. **配置测试**
|
|
178
|
+
- 测试 `enabled: false` 禁用服务器
|
|
179
|
+
- 测试 `enabledTools` 白名单过滤
|
|
180
|
+
- 测试 `disabledTools` 黑名单过滤
|
|
181
|
+
- 测试超时配置
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### 阶段 2:Skills 依赖管理增强(优先级:中)
|
|
186
|
+
|
|
187
|
+
#### 目标
|
|
188
|
+
完善 Skills 系统中 MCP 工具依赖的解析、冲突检测和加载管理。
|
|
189
|
+
|
|
190
|
+
#### 关键文件
|
|
191
|
+
|
|
192
|
+
**新增文件**:
|
|
193
|
+
- `src/core/skills/dependency/resolver.ts` - 依赖解析器
|
|
194
|
+
- `src/core/skills/dependency/conflict-detector.ts` - 冲突检测
|
|
195
|
+
- `src/core/skills/dependency/graph.ts` - 依赖图构建
|
|
196
|
+
- `src/core/skills/dependency/types.ts` - 依赖类型定义
|
|
197
|
+
- `src/core/skills/integration/mcp-loader.ts` - MCP 依赖加载器
|
|
198
|
+
- `src/core/skills/integration/tool-mapper.ts` - 工具映射
|
|
199
|
+
- `src/core/skills/integration/lifecycle.ts` - 生命周期管理
|
|
200
|
+
|
|
201
|
+
**修改文件**:
|
|
202
|
+
- `src/core/agent/index.ts` - 使用新的依赖解析器
|
|
203
|
+
|
|
204
|
+
#### 实施细节
|
|
205
|
+
|
|
206
|
+
**2.1 依赖解析器 (DependencyResolver)**
|
|
207
|
+
|
|
208
|
+
核心功能:
|
|
209
|
+
- 解析 Skill 的 MCP 工具依赖
|
|
210
|
+
- 构建依赖图检测循环依赖
|
|
211
|
+
- 拓扑排序确定加载顺序
|
|
212
|
+
- 版本冲突检测和解决策略
|
|
213
|
+
|
|
214
|
+
关键接口:
|
|
215
|
+
```typescript
|
|
216
|
+
class DependencyResolver {
|
|
217
|
+
resolve(skills: SkillMetadata[]): ResolvedDependencies
|
|
218
|
+
detectConflicts(dependencies: ToolDependency[]): Conflict[]
|
|
219
|
+
buildDependencyGraph(skills: SkillMetadata[]): DependencyGraph
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**2.2 冲突检测 (ConflictDetector)**
|
|
224
|
+
|
|
225
|
+
冲突类型:
|
|
226
|
+
- **版本冲突**:同一 MCP 服务器的不同版本
|
|
227
|
+
- **配置冲突**:同一服务器的不同配置(URL、命令等)
|
|
228
|
+
- **工具名称冲突**:不同服务器提供相同名称的工具
|
|
229
|
+
|
|
230
|
+
解决策略:
|
|
231
|
+
- **优先级策略**:Repo > User > System > Admin
|
|
232
|
+
- **最新版本策略**:选择最新版本
|
|
233
|
+
- **用户选择策略**:提示用户选择(通过 AskUserQuestion)
|
|
234
|
+
|
|
235
|
+
**2.3 MCP 依赖加载器 (McpDependencyLoader)**
|
|
236
|
+
|
|
237
|
+
核心功能:
|
|
238
|
+
- 从 Skills 依赖中提取 MCP 服务器配置
|
|
239
|
+
- 合并到全局 MCP 配置中
|
|
240
|
+
- 去重和冲突解决
|
|
241
|
+
- 动态加载 MCP 工具
|
|
242
|
+
|
|
243
|
+
当前实现位置:`src/core/agent/index.ts:127-145`(简化版本)
|
|
244
|
+
|
|
245
|
+
改进点:
|
|
246
|
+
- 添加重复检测
|
|
247
|
+
- 添加冲突解决
|
|
248
|
+
- 支持依赖版本约束
|
|
249
|
+
- 支持可选依赖和必需依赖
|
|
250
|
+
|
|
251
|
+
#### 验证方案
|
|
252
|
+
|
|
253
|
+
1. **依赖解析测试**
|
|
254
|
+
- 创建多个 Skills,声明相同的 MCP 依赖
|
|
255
|
+
- 验证去重逻辑
|
|
256
|
+
- 验证依赖图构建
|
|
257
|
+
|
|
258
|
+
2. **冲突检测测试**
|
|
259
|
+
- 创建两个 Skills,声明同一 MCP 服务器的不同配置
|
|
260
|
+
- 验证冲突检测和解决策略
|
|
261
|
+
- 检查日志中的冲突警告
|
|
262
|
+
|
|
263
|
+
3. **循环依赖测试**
|
|
264
|
+
- 创建循环依赖的 Skills(如果支持 Skill 间依赖)
|
|
265
|
+
- 验证循环检测和错误报告
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### 阶段 3:配置管理和工具过滤(优先级:中)
|
|
270
|
+
|
|
271
|
+
#### 目标
|
|
272
|
+
增强配置系统,支持工具过滤、认证配置和超时设置。
|
|
273
|
+
|
|
274
|
+
#### 关键文件
|
|
275
|
+
|
|
276
|
+
**修改文件**:
|
|
277
|
+
- `src/core/config/index.ts` - 扩展配置 schema
|
|
278
|
+
- `src/core/mcp/index.ts` - 实现工具过滤逻辑
|
|
279
|
+
|
|
280
|
+
#### 实施细节
|
|
281
|
+
|
|
282
|
+
**3.1 工具过滤**
|
|
283
|
+
|
|
284
|
+
实现逻辑:
|
|
285
|
+
```typescript
|
|
286
|
+
function filterTools(
|
|
287
|
+
tools: McpToolDefinition[],
|
|
288
|
+
config: McpServerConfig
|
|
289
|
+
): McpToolDefinition[] {
|
|
290
|
+
let filtered = tools;
|
|
291
|
+
|
|
292
|
+
// 白名单过滤
|
|
293
|
+
if (config.enabledTools && config.enabledTools.length > 0) {
|
|
294
|
+
filtered = filtered.filter(tool =>
|
|
295
|
+
config.enabledTools!.includes(tool.name)
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// 黑名单过滤
|
|
300
|
+
if (config.disabledTools && config.disabledTools.length > 0) {
|
|
301
|
+
filtered = filtered.filter(tool =>
|
|
302
|
+
!config.disabledTools!.includes(tool.name)
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return filtered;
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**3.2 超时配置**
|
|
311
|
+
|
|
312
|
+
实现位置:
|
|
313
|
+
- `startupTimeoutSec`:在 `client.connect()` 时使用 Promise.race 实现超时
|
|
314
|
+
- `toolTimeoutSec`:在 `McpTool.execute()` 时使用 Promise.race 实现超时
|
|
315
|
+
|
|
316
|
+
示例:
|
|
317
|
+
```typescript
|
|
318
|
+
async function connectWithTimeout(
|
|
319
|
+
client: Client,
|
|
320
|
+
transport: Transport,
|
|
321
|
+
timeoutSec: number = 30
|
|
322
|
+
): Promise<void> {
|
|
323
|
+
const timeoutPromise = new Promise((_, reject) =>
|
|
324
|
+
setTimeout(() => reject(new Error('Connection timeout')), timeoutSec * 1000)
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
await Promise.race([
|
|
328
|
+
client.connect(transport),
|
|
329
|
+
timeoutPromise
|
|
330
|
+
]);
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**3.3 认证配置**
|
|
335
|
+
|
|
336
|
+
支持的认证类型:
|
|
337
|
+
- **Bearer Token**:在 HTTP headers 中添加 `Authorization: Bearer <token>`
|
|
338
|
+
- **Basic Auth**:在 HTTP headers 中添加 `Authorization: Basic <base64>`
|
|
339
|
+
- **OAuth**:实现 OAuth 2.0 客户端凭证流程
|
|
340
|
+
|
|
341
|
+
实现位置:`src/core/mcp/transport.ts`
|
|
342
|
+
|
|
343
|
+
#### 验证方案
|
|
344
|
+
|
|
345
|
+
1. **工具过滤测试**
|
|
346
|
+
- 配置 `enabledTools: ["tool1", "tool2"]`
|
|
347
|
+
- 验证只有这两个工具被加载
|
|
348
|
+
- 配置 `disabledTools: ["tool3"]`
|
|
349
|
+
- 验证 tool3 被排除
|
|
350
|
+
|
|
351
|
+
2. **超时测试**
|
|
352
|
+
- 配置 `startupTimeoutSec: 5`
|
|
353
|
+
- 使用一个慢启动的 MCP 服务器
|
|
354
|
+
- 验证 5 秒后超时并报错
|
|
355
|
+
|
|
356
|
+
3. **认证测试**
|
|
357
|
+
- 配置 bearer token 认证
|
|
358
|
+
- 验证 HTTP 请求包含正确的 Authorization header
|
|
359
|
+
- 测试认证失败的错误处理
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
### 阶段 4:UI 和用户体验改进(优先级:低)
|
|
364
|
+
|
|
365
|
+
#### 目标
|
|
366
|
+
提供更好的用户反馈和配置管理界面。
|
|
367
|
+
|
|
368
|
+
#### 关键文件
|
|
369
|
+
|
|
370
|
+
**修改文件**:
|
|
371
|
+
- `src/render/index.tsx` - 增强 MCP 状态显示
|
|
372
|
+
|
|
373
|
+
#### 实施细节
|
|
374
|
+
|
|
375
|
+
**4.1 增强 MCP 状态显示**
|
|
376
|
+
|
|
377
|
+
当前实现:
|
|
378
|
+
- ✅ 连接开始:`🔌 MCP 连接中: ${serverName}`
|
|
379
|
+
- ✅ 连接成功:`✅ MCP 已连接: ${serverName} (tools: ${toolCount})`
|
|
380
|
+
- ❌ 连接失败:`❌ MCP 连接失败: ${serverName}\n${error.message}`
|
|
381
|
+
|
|
382
|
+
改进点:
|
|
383
|
+
- 显示重连尝试:`🔄 MCP 重连中: ${serverName} (尝试 ${attempt}/${maxRetries})`
|
|
384
|
+
- 显示健康检查状态:`💚 MCP 健康: ${serverName} (延迟: ${latency}ms)`
|
|
385
|
+
- 显示工具过滤信息:`🔧 MCP 工具已过滤: ${serverName} (${filteredCount}/${totalCount})`
|
|
386
|
+
- 显示缓存命中:`⚡ MCP 缓存命中: ${serverName}`
|
|
387
|
+
|
|
388
|
+
**4.2 配置验证和错误提示**
|
|
389
|
+
|
|
390
|
+
在加载配置时验证:
|
|
391
|
+
- 检查必需字段(command 或 url)
|
|
392
|
+
- 检查冲突配置(enabledTools 和 disabledTools 同时包含相同工具)
|
|
393
|
+
- 检查超时值的合理性(不能为负数或过大)
|
|
394
|
+
- 提供清晰的错误消息
|
|
395
|
+
|
|
396
|
+
#### 验证方案
|
|
397
|
+
|
|
398
|
+
1. **UI 测试**
|
|
399
|
+
- 启动应用,观察 MCP 连接状态消息
|
|
400
|
+
- 模拟连接失败,观察重连消息
|
|
401
|
+
- 观察健康检查状态更新
|
|
402
|
+
|
|
403
|
+
2. **配置验证测试**
|
|
404
|
+
- 提供无效配置(缺少 command 和 url)
|
|
405
|
+
- 验证错误消息清晰易懂
|
|
406
|
+
- 提供冲突配置,验证警告消息
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## 关键文件清单
|
|
411
|
+
|
|
412
|
+
### 需要创建的文件(共 13 个)
|
|
413
|
+
|
|
414
|
+
**MCP 连接管理(6 个)**:
|
|
415
|
+
```
|
|
416
|
+
src/core/mcp/connection-manager.ts
|
|
417
|
+
src/core/mcp/retry-strategy.ts
|
|
418
|
+
src/core/mcp/health-checker.ts
|
|
419
|
+
src/core/mcp/tool-cache.ts
|
|
420
|
+
src/core/mcp/types.ts
|
|
421
|
+
src/core/mcp/transport.ts
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Skills 依赖管理(7 个)**:
|
|
425
|
+
```
|
|
426
|
+
src/core/skills/dependency/resolver.ts
|
|
427
|
+
src/core/skills/dependency/conflict-detector.ts
|
|
428
|
+
src/core/skills/dependency/graph.ts
|
|
429
|
+
src/core/skills/dependency/types.ts
|
|
430
|
+
src/core/skills/integration/mcp-loader.ts
|
|
431
|
+
src/core/skills/integration/tool-mapper.ts
|
|
432
|
+
src/core/skills/integration/lifecycle.ts
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### 需要修改的文件(共 4 个)
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
src/core/mcp/index.ts # 重构以使用 ConnectionManager
|
|
439
|
+
src/core/config/index.ts # 扩展配置 schema
|
|
440
|
+
src/core/agent/index.ts # 使用新的依赖解析器
|
|
441
|
+
src/render/index.tsx # 增强 MCP 状态显示
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## 技术细节
|
|
447
|
+
|
|
448
|
+
### 重连策略:指数退避算法
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
尝试次数 | 延迟计算 | 实际延迟(含抖动)
|
|
452
|
+
--------|---------|------------------
|
|
453
|
+
0 | 1s | 1.0s - 1.1s
|
|
454
|
+
1 | 2s | 2.0s - 2.2s
|
|
455
|
+
2 | 4s | 4.0s - 4.4s
|
|
456
|
+
3 | 8s | 8.0s - 8.8s
|
|
457
|
+
4 | 16s | 16.0s - 17.6s
|
|
458
|
+
5 | 30s (max) | 30.0s - 33.0s
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
公式:`delay = min(initialDelay * 2^attempt, maxDelay) + jitter`
|
|
462
|
+
|
|
463
|
+
### 缓存策略
|
|
464
|
+
|
|
465
|
+
**MCP 工具列表缓存**:
|
|
466
|
+
- TTL:5 分钟(可配置)
|
|
467
|
+
- 失效条件:
|
|
468
|
+
- 超过 TTL
|
|
469
|
+
- 手动调用 `invalidate()`
|
|
470
|
+
- 连接断开后重连
|
|
471
|
+
- 缓存键:服务器名称
|
|
472
|
+
|
|
473
|
+
**Skills 加载结果缓存**:
|
|
474
|
+
- 已在 `src/core/skills/cache/` 中实现
|
|
475
|
+
- TTL:5 分钟(可配置)
|
|
476
|
+
- 失效条件:
|
|
477
|
+
- 超过 TTL
|
|
478
|
+
- 手动调用 `forceReload`
|
|
479
|
+
|
|
480
|
+
### 错误分类
|
|
481
|
+
|
|
482
|
+
**可重试错误**:
|
|
483
|
+
- `ECONNREFUSED` - 连接被拒绝
|
|
484
|
+
- `ETIMEDOUT` - 连接超时
|
|
485
|
+
- `ENOTFOUND` - 主机未找到
|
|
486
|
+
- `socket hang up` - Socket 挂起
|
|
487
|
+
|
|
488
|
+
**不可重试错误**:
|
|
489
|
+
- 配置错误(缺少必需字段)
|
|
490
|
+
- 认证错误(401, 403)
|
|
491
|
+
- 协议错误(MCP 协议不兼容)
|
|
492
|
+
|
|
493
|
+
### 工具超时实现
|
|
494
|
+
|
|
495
|
+
```typescript
|
|
496
|
+
async execute(input: any): Promise<string> {
|
|
497
|
+
const timeoutMs = this.config.toolTimeoutSec
|
|
498
|
+
? this.config.toolTimeoutSec * 1000
|
|
499
|
+
: 60000;
|
|
500
|
+
|
|
501
|
+
const timeoutPromise = new Promise<never>((_, reject) =>
|
|
502
|
+
setTimeout(() => reject(new Error('Tool execution timeout')), timeoutMs)
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
const result = await Promise.race([
|
|
506
|
+
this.client.callTool({ name: this.toolName, arguments: input }),
|
|
507
|
+
timeoutPromise
|
|
508
|
+
]);
|
|
509
|
+
|
|
510
|
+
return formatToolResult(result);
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## 端到端验证方案
|
|
517
|
+
|
|
518
|
+
### 测试场景 1:正常启动和工具调用
|
|
519
|
+
|
|
520
|
+
1. 启动应用:`bun run src/index.ts`
|
|
521
|
+
2. 验证 MCP 服务器连接成功
|
|
522
|
+
3. 列出可用工具(应包含 MCP 工具)
|
|
523
|
+
4. 调用一个 MCP 工具
|
|
524
|
+
5. 验证工具执行成功
|
|
525
|
+
|
|
526
|
+
### 测试场景 2:连接失败和自动重连
|
|
527
|
+
|
|
528
|
+
1. 配置一个无效的 MCP 服务器(错误的 URL 或命令)
|
|
529
|
+
2. 启动应用
|
|
530
|
+
3. 观察连接失败和重连尝试
|
|
531
|
+
4. 验证指数退避延迟
|
|
532
|
+
5. 验证达到最大重试次数后停止
|
|
533
|
+
|
|
534
|
+
### 测试场景 3:工具缓存
|
|
535
|
+
|
|
536
|
+
1. 首次启动应用,记录 MCP 工具加载时间
|
|
537
|
+
2. 不关闭应用,等待 1 分钟
|
|
538
|
+
3. 触发工具列表刷新(如果有此功能)
|
|
539
|
+
4. 验证使用缓存(加载时间显著减少)
|
|
540
|
+
5. 等待 5 分钟(TTL 过期)
|
|
541
|
+
6. 再次刷新,验证缓存失效并重新加载
|
|
542
|
+
|
|
543
|
+
### 测试场景 4:Skills 依赖加载
|
|
544
|
+
|
|
545
|
+
1. 创建一个 Skill,声明 MCP 工具依赖
|
|
546
|
+
2. 启动应用
|
|
547
|
+
3. 验证 MCP 服务器被自动加载
|
|
548
|
+
4. 验证 Skill 可以使用依赖的工具
|
|
549
|
+
5. 创建第二个 Skill,声明相同的 MCP 依赖
|
|
550
|
+
6. 验证去重逻辑(不会重复加载)
|
|
551
|
+
|
|
552
|
+
### 测试场景 5:工具过滤
|
|
553
|
+
|
|
554
|
+
1. 配置 MCP 服务器,设置 `enabledTools: ["tool1"]`
|
|
555
|
+
2. 启动应用
|
|
556
|
+
3. 验证只有 tool1 被加载
|
|
557
|
+
4. 修改配置为 `disabledTools: ["tool2"]`
|
|
558
|
+
5. 重启应用
|
|
559
|
+
6. 验证 tool2 被排除
|
|
560
|
+
|
|
561
|
+
### 测试场景 6:健康检查和自动恢复
|
|
562
|
+
|
|
563
|
+
1. 启动应用,MCP 服务器正常连接
|
|
564
|
+
2. 运行应用超过 60 秒
|
|
565
|
+
3. 观察健康检查日志
|
|
566
|
+
4. 手动停止 MCP 服务器进程
|
|
567
|
+
5. 等待健康检查检测到故障
|
|
568
|
+
6. 观察自动重连尝试
|
|
569
|
+
7. 重新启动 MCP 服务器
|
|
570
|
+
8. 验证连接恢复
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## 向后兼容性
|
|
575
|
+
|
|
576
|
+
### 保持现有接口不变
|
|
577
|
+
|
|
578
|
+
**SkillsManager**:
|
|
579
|
+
```typescript
|
|
580
|
+
class SkillsManager {
|
|
581
|
+
constructor(codexHome: string) // 保持不变
|
|
582
|
+
getSkillsForCwd(cwd: string, forceReload?: boolean): SkillLoadOutcome // 保持不变
|
|
583
|
+
clearCache(): void // 保持不变
|
|
584
|
+
}
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
**loadMcpTools**:
|
|
588
|
+
```typescript
|
|
589
|
+
export async function loadMcpTools(
|
|
590
|
+
mcpServersOverride?: Record<string, McpServerConfig>,
|
|
591
|
+
hooks?: {
|
|
592
|
+
onServerConnectStart?: (serverName: string) => void;
|
|
593
|
+
onServerConnectSuccess?: (serverName: string, toolCount: number) => void;
|
|
594
|
+
onServerConnectError?: (serverName: string, error: Error) => void;
|
|
595
|
+
}
|
|
596
|
+
): Promise<{
|
|
597
|
+
tools: Tool[];
|
|
598
|
+
cleanup: () => Promise<void>;
|
|
599
|
+
// 新增:返回 ConnectionManager 供高级用户使用
|
|
600
|
+
connectionManager?: ConnectionManager;
|
|
601
|
+
}>
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
### 配置向后兼容
|
|
605
|
+
|
|
606
|
+
所有新增的配置字段都是可选的,默认值保持现有行为:
|
|
607
|
+
- `enabled`: 默认 `true`
|
|
608
|
+
- `startupTimeoutSec`: 默认 `30`
|
|
609
|
+
- `toolTimeoutSec`: 默认 `60`
|
|
610
|
+
- `maxRetries`: 默认 `3`
|
|
611
|
+
- `healthCheckInterval`: 默认 `60000`
|
|
612
|
+
|
|
613
|
+
现有配置文件无需修改即可继续工作。
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## 依赖检查
|
|
618
|
+
|
|
619
|
+
### 需要的 npm 包
|
|
620
|
+
|
|
621
|
+
当前已安装:
|
|
622
|
+
- `@modelcontextprotocol/sdk`: ^1.17.5 ✅
|
|
623
|
+
- `@anthropic-ai/sdk`: ^0.72.1 ✅
|
|
624
|
+
- `zod`: 需要检查是否已安装
|
|
625
|
+
|
|
626
|
+
检查命令:
|
|
627
|
+
```bash
|
|
628
|
+
bun pm ls zod
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
如果未安装,需要添加:
|
|
632
|
+
```bash
|
|
633
|
+
bun add zod
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## 实施优先级建议
|
|
639
|
+
|
|
640
|
+
### 高优先级(立即实施)
|
|
641
|
+
1. **阶段 1:MCP 连接管理增强**
|
|
642
|
+
- 最大的改进点
|
|
643
|
+
- 解决当前最严重的问题(无重连、无缓存)
|
|
644
|
+
- 为后续阶段奠定基础
|
|
645
|
+
|
|
646
|
+
### 中优先级(后续实施)
|
|
647
|
+
2. **阶段 2:Skills 依赖管理增强**
|
|
648
|
+
- 改进用户体验
|
|
649
|
+
- 避免依赖冲突问题
|
|
650
|
+
|
|
651
|
+
3. **阶段 3:配置管理和工具过滤**
|
|
652
|
+
- 增加灵活性
|
|
653
|
+
- 参考 OpenAI Codex 的功能
|
|
654
|
+
|
|
655
|
+
### 低优先级(可选)
|
|
656
|
+
4. **阶段 4:UI 和用户体验改进**
|
|
657
|
+
- 锦上添花
|
|
658
|
+
- 不影响核心功能
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
## 预期成果
|
|
663
|
+
|
|
664
|
+
完成本计划后,项目将具备:
|
|
665
|
+
|
|
666
|
+
✅ **健壮的连接管理**
|
|
667
|
+
- 自动重连机制,提高可靠性
|
|
668
|
+
- 健康检查,及时发现问题
|
|
669
|
+
- 优雅关闭,避免资源泄漏
|
|
670
|
+
|
|
671
|
+
✅ **优秀的性能**
|
|
672
|
+
- 工具列表缓存,减少重复加载
|
|
673
|
+
- 可配置的超时,避免长时间等待
|
|
674
|
+
- 高效的依赖解析
|
|
675
|
+
|
|
676
|
+
✅ **灵活的配置**
|
|
677
|
+
- 工具过滤,按需加载
|
|
678
|
+
- 认证支持,连接私有服务
|
|
679
|
+
- 细粒度控制,满足各种场景
|
|
680
|
+
|
|
681
|
+
✅ **完善的 Skills 集成**
|
|
682
|
+
- 自动加载 MCP 依赖
|
|
683
|
+
- 冲突检测和解决
|
|
684
|
+
- 依赖图可视化
|
|
685
|
+
|
|
686
|
+
✅ **良好的用户体验**
|
|
687
|
+
- 清晰的状态反馈
|
|
688
|
+
- 详细的错误消息
|
|
689
|
+
- 完整的文档
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## 参考资料
|
|
694
|
+
|
|
695
|
+
- [OpenAI Codex MCP 文档](https://developers.openai.com/codex/mcp/)
|
|
696
|
+
- [Model Context Protocol GitHub](https://github.com/modelcontextprotocol)
|
|
697
|
+
- [MCP SDK 文档](https://github.com/modelcontextprotocol/sdk)
|
|
698
|
+
- [指数退避最佳实践](https://betterstack.com/community/guides/monitoring/exponential-backoff/)
|
|
699
|
+
- [AWS 重试模式](https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/retry-backoff.html)
|
|
700
|
+
- [MCP 超时和重试](https://octopus.com/blog/mcp-timeout-retry)
|