agentstudio 0.1.8 → 0.1.10

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.
Files changed (182) hide show
  1. package/README.md +481 -37
  2. package/README.zh-CN.md +525 -0
  3. package/{dist → backend/dist}/bin/agentstudio.js +7 -5
  4. package/backend/dist/bin/agentstudio.js.map +1 -0
  5. package/backend/dist/index.d.ts +3 -0
  6. package/backend/dist/index.d.ts.map +1 -0
  7. package/{dist → backend/dist}/index.js +9 -28
  8. package/{dist → backend/dist}/index.js.map +1 -1
  9. package/{dist → backend/dist}/routes/settings.js +1 -1
  10. package/{dist → backend/dist}/routes/settings.js.map +1 -1
  11. package/package.json +35 -43
  12. package/.cc-sessions/ppt-editor/session_1756253549429_uau1hm6lh.json +0 -665
  13. package/.cc-sessions/ppt-editor/session_1756257240855_v0wa26mde.json +0 -394
  14. package/.env +0 -15
  15. package/dist/bin/agentstudio.js.map +0 -1
  16. package/dist/index.d.ts +0 -2
  17. package/dist/index.d.ts.map +0 -1
  18. package/docs/chat-clean-1.svg +0 -1
  19. package/docs/chat-clean.md +0 -60
  20. package/docs/chat-comprehensive-1.svg +0 -1
  21. package/docs/chat-comprehensive.md +0 -166
  22. package/docs/chat_api_sequence_diagram.md +0 -58
  23. package/docs/command-detection-logic.md +0 -306
  24. package/docs/command-detection-sequence.md +0 -186
  25. package/frontend/dist/assets/AgentsPage-Dqb_aqAA.js +0 -1
  26. package/frontend/dist/assets/ChatPage-BvQmXfcP.css +0 -1
  27. package/frontend/dist/assets/ChatPage-L8Paywyc.js +0 -91
  28. package/frontend/dist/assets/CommandForm-DLl7EIMS.js +0 -7
  29. package/frontend/dist/assets/CommandsPage-Bzavq0Ec.js +0 -1
  30. package/frontend/dist/assets/DashboardPage-B3o4AYFT.js +0 -15
  31. package/frontend/dist/assets/FileBrowser-DL3ayaqb.js +0 -1
  32. package/frontend/dist/assets/GeneralSettingsPage-CBN_de-V.js +0 -1
  33. package/frontend/dist/assets/LandingPage-Dl4ioKos.js +0 -1
  34. package/frontend/dist/assets/LoginPage-4QqRdiSi.js +0 -12
  35. package/frontend/dist/assets/McpPage-CY3tYiqj.js +0 -39
  36. package/frontend/dist/assets/MemorySettingsPage-DGxrok5K.js +0 -1
  37. package/frontend/dist/assets/ProjectSelector-hgmGYVFh.js +0 -1
  38. package/frontend/dist/assets/ProjectsPage-D399IM0c.js +0 -14
  39. package/frontend/dist/assets/SettingsLayout-CL_K-lzJ.js +0 -1
  40. package/frontend/dist/assets/SubagentForm-DXtTTIKg.js +0 -7
  41. package/frontend/dist/assets/SubagentsPage-Chbhj8p2.js +0 -1
  42. package/frontend/dist/assets/ToastTestPage-DT4wuN5C.js +0 -1
  43. package/frontend/dist/assets/UnifiedToolSelector-CsM9qBvs.js +0 -1
  44. package/frontend/dist/assets/VersionSettingsPage-74Q-LVgA.js +0 -5
  45. package/frontend/dist/assets/agents-ClAzIJTw.js +0 -1
  46. package/frontend/dist/assets/agents-DwCY2K8p.css +0 -1
  47. package/frontend/dist/assets/authFetch-BATQyPG5.js +0 -1
  48. package/frontend/dist/assets/data-structures-DLJedtzx.js +0 -27
  49. package/frontend/dist/assets/dateFormat-CXa8VnEC.js +0 -1
  50. package/frontend/dist/assets/index-B9YHa7XT.css +0 -1
  51. package/frontend/dist/assets/index-B_CTNvca.js +0 -268
  52. package/frontend/dist/assets/monaco-editor-C7Z4sOhS.js +0 -19
  53. package/frontend/dist/assets/syntax-highlighting-YWvMU4Hm.js +0 -24
  54. package/frontend/dist/assets/tabManager-DV8urRBM.js +0 -30
  55. package/frontend/dist/assets/table-D6q1rytw.js +0 -1
  56. package/frontend/dist/assets/tools-C4EPanYi.js +0 -1
  57. package/frontend/dist/assets/ui-components-Cw21Epuw.js +0 -481
  58. package/frontend/dist/assets/useAgents-DwnOE1_k.js +0 -2
  59. package/frontend/dist/assets/useClaudeVersions-CQdGnCqv.js +0 -1
  60. package/frontend/dist/assets/useCommands-CCVaurbt.js +0 -1
  61. package/frontend/dist/cc-studio.png +0 -0
  62. package/frontend/dist/index.html +0 -70
  63. package/frontend/dist/vite.svg +0 -1
  64. package/scripts/README.md +0 -76
  65. package/scripts/fix-project-names.js +0 -113
  66. package/scripts/migrate-projects.js +0 -159
  67. package/shared/index.d.ts +0 -6
  68. package/shared/index.d.ts.map +0 -1
  69. package/shared/index.js +0 -7
  70. package/shared/types/agents.d.ts +0 -80
  71. package/shared/types/agents.d.ts.map +0 -1
  72. package/shared/types/agents.js +0 -145
  73. package/shared/types/claude-history.d.ts +0 -61
  74. package/shared/types/claude-history.d.ts.map +0 -1
  75. package/shared/types/claude-history.js +0 -2
  76. package/shared/types/claude-versions.d.ts +0 -40
  77. package/shared/types/claude-versions.d.ts.map +0 -1
  78. package/shared/types/claude-versions.js +0 -1
  79. package/shared/types/commands.d.ts +0 -48
  80. package/shared/types/commands.d.ts.map +0 -1
  81. package/shared/types/commands.js +0 -19
  82. package/shared/types/projects.d.ts +0 -35
  83. package/shared/types/projects.d.ts.map +0 -1
  84. package/shared/types/projects.js +0 -2
  85. package/shared/types/subagents.d.ts +0 -26
  86. package/shared/types/subagents.d.ts.map +0 -1
  87. package/shared/types/subagents.js +0 -1
  88. package/shared/utils/agentStorage.d.ts +0 -27
  89. package/shared/utils/agentStorage.d.ts.map +0 -1
  90. package/shared/utils/agentStorage.js +0 -392
  91. package/shared/utils/claudeVersionStorage.d.ts +0 -16
  92. package/shared/utils/claudeVersionStorage.d.ts.map +0 -1
  93. package/shared/utils/claudeVersionStorage.js +0 -230
  94. package/shared/utils/projectMetadataStorage.d.ts +0 -94
  95. package/shared/utils/projectMetadataStorage.d.ts.map +0 -1
  96. package/shared/utils/projectMetadataStorage.js +0 -422
  97. package/shared/utils/toolMapping.d.ts +0 -56
  98. package/shared/utils/toolMapping.d.ts.map +0 -1
  99. package/shared/utils/toolMapping.js +0 -71
  100. package/src/bin/agentstudio.ts +0 -130
  101. package/src/index.ts +0 -183
  102. package/src/middleware/auth.ts +0 -26
  103. package/src/routes/agents.ts +0 -884
  104. package/src/routes/auth.ts +0 -73
  105. package/src/routes/commands.ts +0 -441
  106. package/src/routes/files.ts +0 -352
  107. package/src/routes/mcp.ts +0 -751
  108. package/src/routes/media.ts +0 -140
  109. package/src/routes/projects.ts +0 -601
  110. package/src/routes/sessions.ts +0 -809
  111. package/src/routes/settings.ts +0 -718
  112. package/src/routes/slides.ts +0 -170
  113. package/src/routes/subagents.ts +0 -364
  114. package/src/services/claudeSession.ts +0 -293
  115. package/src/services/messageQueue.ts +0 -71
  116. package/src/services/sessionManager.ts +0 -532
  117. package/src/utils/jwt.ts +0 -36
  118. package/tsconfig.json +0 -27
  119. /package/{dist → backend/dist}/bin/agentstudio.d.ts +0 -0
  120. /package/{dist → backend/dist}/bin/agentstudio.d.ts.map +0 -0
  121. /package/{dist → backend/dist}/middleware/auth.d.ts +0 -0
  122. /package/{dist → backend/dist}/middleware/auth.d.ts.map +0 -0
  123. /package/{dist → backend/dist}/middleware/auth.js +0 -0
  124. /package/{dist → backend/dist}/middleware/auth.js.map +0 -0
  125. /package/{dist → backend/dist}/routes/agents.d.ts +0 -0
  126. /package/{dist → backend/dist}/routes/agents.d.ts.map +0 -0
  127. /package/{dist → backend/dist}/routes/agents.js +0 -0
  128. /package/{dist → backend/dist}/routes/agents.js.map +0 -0
  129. /package/{dist → backend/dist}/routes/auth.d.ts +0 -0
  130. /package/{dist → backend/dist}/routes/auth.d.ts.map +0 -0
  131. /package/{dist → backend/dist}/routes/auth.js +0 -0
  132. /package/{dist → backend/dist}/routes/auth.js.map +0 -0
  133. /package/{dist → backend/dist}/routes/commands.d.ts +0 -0
  134. /package/{dist → backend/dist}/routes/commands.d.ts.map +0 -0
  135. /package/{dist → backend/dist}/routes/commands.js +0 -0
  136. /package/{dist → backend/dist}/routes/commands.js.map +0 -0
  137. /package/{dist → backend/dist}/routes/files.d.ts +0 -0
  138. /package/{dist → backend/dist}/routes/files.d.ts.map +0 -0
  139. /package/{dist → backend/dist}/routes/files.js +0 -0
  140. /package/{dist → backend/dist}/routes/files.js.map +0 -0
  141. /package/{dist → backend/dist}/routes/mcp.d.ts +0 -0
  142. /package/{dist → backend/dist}/routes/mcp.d.ts.map +0 -0
  143. /package/{dist → backend/dist}/routes/mcp.js +0 -0
  144. /package/{dist → backend/dist}/routes/mcp.js.map +0 -0
  145. /package/{dist → backend/dist}/routes/media.d.ts +0 -0
  146. /package/{dist → backend/dist}/routes/media.d.ts.map +0 -0
  147. /package/{dist → backend/dist}/routes/media.js +0 -0
  148. /package/{dist → backend/dist}/routes/media.js.map +0 -0
  149. /package/{dist → backend/dist}/routes/projects.d.ts +0 -0
  150. /package/{dist → backend/dist}/routes/projects.d.ts.map +0 -0
  151. /package/{dist → backend/dist}/routes/projects.js +0 -0
  152. /package/{dist → backend/dist}/routes/projects.js.map +0 -0
  153. /package/{dist → backend/dist}/routes/sessions.d.ts +0 -0
  154. /package/{dist → backend/dist}/routes/sessions.d.ts.map +0 -0
  155. /package/{dist → backend/dist}/routes/sessions.js +0 -0
  156. /package/{dist → backend/dist}/routes/sessions.js.map +0 -0
  157. /package/{dist → backend/dist}/routes/settings.d.ts +0 -0
  158. /package/{dist → backend/dist}/routes/settings.d.ts.map +0 -0
  159. /package/{dist → backend/dist}/routes/slides.d.ts +0 -0
  160. /package/{dist → backend/dist}/routes/slides.d.ts.map +0 -0
  161. /package/{dist → backend/dist}/routes/slides.js +0 -0
  162. /package/{dist → backend/dist}/routes/slides.js.map +0 -0
  163. /package/{dist → backend/dist}/routes/subagents.d.ts +0 -0
  164. /package/{dist → backend/dist}/routes/subagents.d.ts.map +0 -0
  165. /package/{dist → backend/dist}/routes/subagents.js +0 -0
  166. /package/{dist → backend/dist}/routes/subagents.js.map +0 -0
  167. /package/{dist → backend/dist}/services/claudeSession.d.ts +0 -0
  168. /package/{dist → backend/dist}/services/claudeSession.d.ts.map +0 -0
  169. /package/{dist → backend/dist}/services/claudeSession.js +0 -0
  170. /package/{dist → backend/dist}/services/claudeSession.js.map +0 -0
  171. /package/{dist → backend/dist}/services/messageQueue.d.ts +0 -0
  172. /package/{dist → backend/dist}/services/messageQueue.d.ts.map +0 -0
  173. /package/{dist → backend/dist}/services/messageQueue.js +0 -0
  174. /package/{dist → backend/dist}/services/messageQueue.js.map +0 -0
  175. /package/{dist → backend/dist}/services/sessionManager.d.ts +0 -0
  176. /package/{dist → backend/dist}/services/sessionManager.d.ts.map +0 -0
  177. /package/{dist → backend/dist}/services/sessionManager.js +0 -0
  178. /package/{dist → backend/dist}/services/sessionManager.js.map +0 -0
  179. /package/{dist → backend/dist}/utils/jwt.d.ts +0 -0
  180. /package/{dist → backend/dist}/utils/jwt.d.ts.map +0 -0
  181. /package/{dist → backend/dist}/utils/jwt.js +0 -0
  182. /package/{dist → backend/dist}/utils/jwt.js.map +0 -0
@@ -1,306 +0,0 @@
1
- # 后端从会话历史消息中识别自定义命令的逻辑分析
2
-
3
- ## 概述
4
-
5
- 本文档详细描述了后端系统如何从Claude历史会话消息中识别和提取自定义命令的完整逻辑流程。
6
-
7
- ## 核心组件
8
-
9
- ### 1. 数据结构
10
-
11
- #### ClaudeHistoryMessage
12
- ```typescript
13
- interface ClaudeHistoryMessage {
14
- type: 'summary' | 'user' | 'text' | 'assistant' | 'message' | 'thinking' | 'tool_use' | 'tool_result';
15
- uuid: string;
16
- timestamp: string;
17
- sessionId: string;
18
- message?: ClaudeMessage;
19
- parentUuid?: string | null;
20
- // ... 其他字段
21
- }
22
- ```
23
-
24
- #### SlashCommand
25
- ```typescript
26
- interface SlashCommand {
27
- id: string;
28
- name: string;
29
- description: string;
30
- content: string;
31
- scope: 'project' | 'user';
32
- namespace?: string;
33
- argumentHint?: string;
34
- allowedTools?: string[];
35
- model?: string;
36
- createdAt: Date;
37
- updatedAt: Date;
38
- }
39
- ```
40
-
41
- ### 2. 主要函数
42
-
43
- #### readClaudeHistorySessions()
44
- - **位置**: `backend/src/routes/agents.ts:30`
45
- - **功能**: 读取并解析Claude历史会话文件
46
- - **输入**: `projectPath: string`
47
- - **输出**: `ClaudeHistorySession[]`
48
-
49
- #### extractContentFromClaudeMessage()
50
- - **位置**: `backend/src/routes/agents.ts:226`
51
- - **功能**: 从Claude消息中提取内容,特别处理命令格式
52
- - **关键逻辑**: 识别 `<command-message>` 和 `<command-name>` 标签
53
-
54
- #### convertClaudeMessageToMessageParts()
55
- - **位置**: `backend/src/routes/agents.ts:248`
56
- - **功能**: 将Claude消息转换为系统内部格式
57
- - **关键逻辑**: 识别命令格式并创建特殊的 `command` 类型消息部分
58
-
59
- ## 命令识别逻辑
60
-
61
- ### 1. 命令标识符检测
62
-
63
- 系统通过正则表达式检测消息中的命令格式:
64
-
65
- ```javascript
66
- const commandMatch = msg.message.content.match(
67
- /<command-message>.*?<\/command-message>\s*<command-name>(.+?)<\/command-name>/
68
- );
69
- ```
70
-
71
- **匹配模式**:
72
- - `<command-message>` 标签:包含命令的描述信息
73
- - `<command-name>` 标签:包含实际的命令名称
74
-
75
- ### 2. 消息过滤规则
76
-
77
- #### 2.1 基本过滤条件
78
- ```javascript
79
- const conversationMessages = messages.filter(msg => {
80
- // 排除特定类型的消息
81
- if (['summary', 'thinking'].includes(msg.type)) return false;
82
-
83
- // 排除某些工具输出消息
84
- if (msg.type === 'tool_result' &&
85
- msg.message?.content?.includes('<local-command-stdout></local-command-stdout>') &&
86
- msg.parentUuid) {
87
- // 检查父消息是否为 /clear 命令
88
- const parentMsg = messages.find(m => m.uuid === msg.parentUuid);
89
- if (parentMsg && parentMsg.message?.content?.includes('<command-name>/clear</command-name>')) {
90
- return false;
91
- }
92
- }
93
-
94
- // 处理 assistant 类型消息
95
- if (msg.type === 'assistant') return true;
96
-
97
- // 处理 user 类型消息
98
- if (msg.type === 'user') {
99
- if (msg.message?.content && Array.isArray(msg.message.content)) {
100
- const hasNonToolResult = msg.message.content.some(block => block.type !== 'tool_result');
101
- return hasNonToolResult;
102
- }
103
- return typeof msg.message?.content === 'string' || !msg.message?.content;
104
- }
105
-
106
- return false;
107
- });
108
- ```
109
-
110
- #### 2.2 特殊命令处理
111
- - **清理命令**: 系统特别处理 `/clear` 命令,会过滤掉其相关的输出消息
112
- - **工具结果**: 过滤掉纯工具结果消息,只保留包含用户内容的消息
113
-
114
- ### 3. 消息转换流程
115
-
116
- #### 3.1 内容提取
117
- ```javascript
118
- function extractContentFromClaudeMessage(msg) {
119
- if (typeof msg.message.content === 'string') {
120
- const commandMatch = msg.message.content.match(
121
- /<command-message>.*?<\/command-message>\s*<command-name>(.+?)<\/command-name>/
122
- );
123
- if (commandMatch) {
124
- return commandMatch[1]; // 返回命令名称
125
- }
126
- return msg.message.content;
127
- }
128
-
129
- if (Array.isArray(msg.message.content)) {
130
- return msg.message.content
131
- .filter(block => block.type === 'text')
132
- .map(block => block.text)
133
- .join('');
134
- }
135
- }
136
- ```
137
-
138
- #### 3.2 消息部分创建
139
- ```javascript
140
- function convertClaudeMessageToMessageParts(msg) {
141
- if (typeof msg.message.content === 'string') {
142
- // 检测命令格式
143
- const commandMatch = msg.message.content.match(
144
- /<command-message>.*?<\/command-message>\s*<command-name>(.+?)<\/command-name>/
145
- );
146
-
147
- if (commandMatch) {
148
- return [{
149
- id: `part_0_${msg.uuid}`,
150
- type: 'command',
151
- content: commandMatch[1], // 命令名称
152
- originalContent: msg.message.content, // 保留原始内容
153
- order: 0
154
- }];
155
- }
156
-
157
- // 普通文本消息
158
- return [{
159
- id: `part_0_${msg.uuid}`,
160
- type: 'text',
161
- content: msg.message.content,
162
- order: 0
163
- }];
164
- }
165
-
166
- // 处理数组内容(工具使用、图片等)
167
- if (Array.isArray(msg.message.content)) {
168
- return msg.message.content.map((block, index) => {
169
- if (block.type === 'text') {
170
- return {
171
- id: `part_${index}_${msg.uuid}`,
172
- type: 'text',
173
- content: block.text,
174
- order: index
175
- };
176
- } else if (block.type === 'tool_use') {
177
- return {
178
- id: `part_${index}_${msg.uuid}`,
179
- type: 'tool',
180
- toolData: {
181
- claudeId: block.id,
182
- toolName: block.name,
183
- toolInput: block.input || {},
184
- toolResult: '',
185
- isExecuting: false,
186
- isError: false
187
- },
188
- order: index
189
- };
190
- }
191
- // ... 处理其他类型
192
- }).filter(part => part !== null);
193
- }
194
- }
195
- ```
196
-
197
- ## 自定义命令管理
198
-
199
- ### 1. 命令存储结构
200
-
201
- #### 项目命令
202
- - **路径**: `{projectPath}/.ai-commands/`
203
- - **范围**: 项目级别,与团队共享
204
-
205
- #### 用户命令
206
- - **路径**: `~/.ai-commands/`
207
- - **范围**: 用户级别,个人使用
208
-
209
- ### 2. 命令文件格式
210
-
211
- ```markdown
212
- ---
213
- description: "命令描述"
214
- argument-hint: "参数提示"
215
- allowed-tools: "Read,Write,Edit"
216
- model: "claude-3-5-sonnet-20241022"
217
- ---
218
-
219
- 命令的具体内容...
220
- ```
221
-
222
- ### 3. 命令扫描逻辑
223
-
224
- ```javascript
225
- async function scanCommands(dirPath, scope) {
226
- const commands = [];
227
-
228
- async function scanDirectory(currentDir, namespace) {
229
- const items = await readdir(currentDir, { withFileTypes: true });
230
-
231
- for (const item of items) {
232
- if (item.isDirectory()) {
233
- const subNamespace = namespace ? `${namespace}/${item.name}` : item.name;
234
- await scanDirectory(path.join(currentDir, item.name), subNamespace);
235
- } else if (item.name.endsWith('.md')) {
236
- const commandName = item.name.replace('.md', '');
237
- const content = await readFile(path.join(currentDir, item.name), 'utf-8');
238
- const parsed = parseCommandContent(content);
239
-
240
- commands.push({
241
- id: `${scope}:${namespace ? namespace + '/' : ''}${commandName}`,
242
- name: commandName,
243
- description: parsed.frontmatter.description || '',
244
- content: parsed.body,
245
- scope,
246
- namespace,
247
- // ... 其他属性
248
- });
249
- }
250
- }
251
- }
252
-
253
- await scanDirectory(dirPath);
254
- return commands;
255
- }
256
- ```
257
-
258
- ## 关键技术点
259
-
260
- ### 1. 正则表达式模式
261
- - **命令识别**: `/<command-message>.*?<\/command-message>\s*<command-name>(.+?)<\/command-name>/`
262
- - **非贪婪匹配**: 使用 `.*?` 避免跨命令匹配
263
- - **命名捕获**: 提取 `<command-name>` 标签内的内容
264
-
265
- ### 2. 消息层次结构
266
- - **父子关系**: 通过 `parentUuid` 建立消息间的层次关系
267
- - **工具链**: 工具使用和工具结果的关联处理
268
- - **会话隔离**: 按 `sessionId` 组织消息
269
-
270
- ### 3. 内容类型处理
271
- - **字符串内容**: 直接处理文本消息
272
- - **数组内容**: 处理包含多种类型(文本、工具、图片)的复合消息
273
- - **工具消息**: 特殊处理工具使用和结果消息
274
-
275
- ### 4. 错误处理
276
- - **文件不存在**: 优雅处理命令文件缺失
277
- - **解析错误**: 容错处理格式错误的命令文件
278
- - **权限问题**: 处理文件系统访问权限
279
-
280
- ## 性能优化
281
-
282
- ### 1. 缓存策略
283
- - 避免重复扫描命令目录
284
- - 使用文件修改时间检测变更
285
-
286
- ### 2. 内存管理
287
- - 流式处理大型历史文件
288
- - 及时释放不需要的消息数据
289
-
290
- ### 3. 并发处理
291
- - 并行扫描多个命令目录
292
- - 异步文件操作
293
-
294
- ## 安全考虑
295
-
296
- ### 1. 路径安全
297
- - 验证命令文件路径,防止目录遍历攻击
298
- - 限制命令文件的访问范围
299
-
300
- ### 2. 内容验证
301
- - 验证命令内容的格式和语法
302
- - 过滤恶意代码和脚本
303
-
304
- ### 3. 权限控制
305
- - 区分项目级和用户级命令权限
306
- - 验证用户对命令的访问权限
@@ -1,186 +0,0 @@
1
- # 命令识别逻辑时序图
2
-
3
- ```mermaid
4
- sequenceDiagram
5
- participant Client as 前端客户端
6
- participant AgentRoute as agents.ts 路由
7
- participant FileSystem as 文件系统
8
- participant CommandParser as 命令解析器
9
- participant MessageConverter as 消息转换器
10
-
11
- Note over Client, MessageConverter: 会话历史读取和命令识别流程
12
-
13
- Client->>AgentRoute: GET /api/agents/history/sessions?projectPath={path}
14
-
15
- AgentRoute->>FileSystem: 读取 Claude 历史目录
16
- Note right of FileSystem: ~/.claude/projects/.../*.jsonl
17
-
18
- FileSystem-->>AgentRoute: 返回历史文件列表
19
-
20
- loop 遍历每个历史文件
21
- AgentRoute->>FileSystem: readFile(historyFile)
22
- FileSystem-->>AgentRoute: 原始 JSON 行数据
23
-
24
- AgentRoute->>AgentRoute: 解析 JSON 行数据
25
- Note right of AgentRoute: 过滤无效消息
26
-
27
- loop 遍历每条消息
28
- AgentRoute->>MessageConverter: 消息过滤检查
29
-
30
- alt 消息类型为 summary 或 thinking
31
- MessageConverter-->>AgentRoute: 跳过消息
32
- else 消息类型为 tool_result 且包含 local-command-stdout
33
- MessageConverter->>MessageConverter: 检查父消息是否为 /clear 命令
34
- alt 父消息是 /clear 命令
35
- MessageConverter-->>AgentRoute: 跳过消息
36
- else 父消息不是 /clear 命令
37
- MessageConverter-->>AgentRoute: 保留消息
38
- end
39
- else 消息类型为 user
40
- MessageConverter->>MessageConverter: 检查是否只包含 tool_result
41
- alt 只包含 tool_result
42
- MessageConverter-->>AgentRoute: 跳过消息
43
- else 包含其他内容
44
- MessageConverter-->>AgentRoute: 保留消息
45
- end
46
- else 消息类型为 assistant
47
- MessageConverter-->>AgentRoute: 保留消息
48
- end
49
- end
50
-
51
- loop 处理保留的消息
52
- AgentRoute->>MessageConverter: extractContentFromClaudeMessage(msg)
53
-
54
- MessageConverter->>MessageConverter: 检查消息内容类型
55
-
56
- alt 内容为字符串
57
- MessageConverter->>CommandParser: 正则匹配命令格式
58
- Note right of CommandParser: /<command-message>.*?<\/command-message>\s*<command-name>(.+?)<\/command-name>/
59
-
60
- alt 匹配到命令格式
61
- CommandParser-->>MessageConverter: 返回命令名称
62
- MessageConverter-->>AgentRoute: 返回命令名称
63
- else 未匹配命令格式
64
- CommandParser-->>MessageConverter: 返回原始内容
65
- MessageConverter-->>AgentRoute: 返回原始内容
66
- end
67
-
68
- else 内容为数组
69
- MessageConverter->>MessageConverter: 过滤 text 类型块
70
- MessageConverter->>MessageConverter: 拼接文本内容
71
- MessageConverter-->>AgentRoute: 返回拼接后的内容
72
- end
73
-
74
- AgentRoute->>MessageConverter: convertClaudeMessageToMessageParts(msg)
75
-
76
- alt 内容为字符串且匹配命令格式
77
- MessageConverter->>MessageConverter: 创建 command 类型部分
78
- Note right of MessageConverter: type: 'command', content: 命令名称
79
- MessageConverter-->>AgentRoute: 返回命令消息部分
80
- else 内容为字符串但非命令格式
81
- MessageConverter->>MessageConverter: 创建 text 类型部分
82
- MessageConverter-->>AgentRoute: 返回文本消息部分
83
- else 内容为数组
84
- loop 遍历内容块
85
- alt 块类型为 text
86
- MessageConverter->>MessageConverter: 创建 text 部分
87
- else 块类型为 tool_use
88
- MessageConverter->>MessageConverter: 创建 tool 部分
89
- Note right of MessageConverter: 包含工具名称、输入、结果等
90
- else 块类型为 tool_result
91
- MessageConverter->>MessageConverter: 跳过(将合并到 tool_use)
92
- else 块类型为 image
93
- MessageConverter->>MessageConverter: 创建 image 部分
94
- else 其他类型
95
- MessageConverter->>MessageConverter: 创建 unknown 部分
96
- end
97
- end
98
- MessageConverter-->>AgentRoute: 返回消息部分数组
99
- end
100
- end
101
-
102
- AgentRoute->>AgentRoute: 合并连续的 assistant 消息
103
- Note right of AgentRoute: 优化对话展示
104
-
105
- AgentRoute->>AgentRoute: 构建会话对象
106
- Note right of AgentRoute: 包含会话元数据和处理后的消息
107
- end
108
-
109
- AgentRoute-->>Client: 返回处理后的会话历史
110
- Note left of Client: 包含识别出的命令和其他消息类型
111
-
112
- Note over Client, MessageConverter: 命令文件扫描和管理流程(独立流程)
113
-
114
- Client->>AgentRoute: GET /api/commands?projectPath={path}
115
-
116
- AgentRoute->>FileSystem: 扫描项目命令目录
117
- Note right of FileSystem: {projectPath}/.ai-commands/
118
-
119
- AgentRoute->>FileSystem: 扫描用户命令目录
120
- Note right of FileSystem: ~/.ai-commands/
121
-
122
- loop 遍历命令目录
123
- FileSystem->>FileSystem: 递归扫描子目录
124
-
125
- loop 遍历 .md 文件
126
- FileSystem->>CommandParser: readFile(commandFile)
127
- CommandParser->>CommandParser: parseCommandContent()
128
- Note right of CommandParser: 解析 frontmatter 和内容
129
-
130
- CommandParser->>CommandParser: 构建命令对象
131
- Note right of CommandParser: 包含 id, name, description, scope 等
132
-
133
- CommandParser-->>FileSystem: 返回解析后的命令
134
- end
135
-
136
- FileSystem-->>AgentRoute: 返回目录下所有命令
137
- end
138
-
139
- AgentRoute-->>Client: 返回所有可用命令列表
140
- ```
141
-
142
- ## 关键流程说明
143
-
144
- ### 1. 消息过滤阶段
145
- - **目的**: 从原始 Claude 历史中筛选出有价值的对话消息
146
- - **规则**:
147
- - 排除 `summary` 和 `thinking` 类型消息
148
- - 排除纯工具结果消息(除非包含用户内容)
149
- - 特殊处理 `/clear` 命令的输出消息
150
-
151
- ### 2. 命令识别阶段
152
- - **触发条件**: 消息内容包含特定的 XML 标签格式
153
- - **识别模式**: `<command-message>` + `<command-name>` 标签组合
154
- - **结果**: 提取出实际的命令名称,创建 `command` 类型的消息部分
155
-
156
- ### 3. 消息转换阶段
157
- - **目的**: 将 Claude 原始消息格式转换为系统内部格式
158
- - **处理类型**:
159
- - 文本消息 → `text` 部分
160
- - 命令消息 → `command` 部分
161
- - 工具使用 → `tool` 部分
162
- - 图片内容 → `image` 部分
163
-
164
- ### 4. 会话重构阶段
165
- - **消息合并**: 合并连续的 assistant 消息以优化展示
166
- - **层次建立**: 基于 `parentUuid` 建立消息间的父子关系
167
- - **会话组织**: 按 `sessionId` 组织完整的对话会话
168
-
169
- ### 5. 命令管理阶段(独立流程)
170
- - **文件扫描**: 递归扫描项目和用户命令目录
171
- - **内容解析**: 解析 Markdown 文件的 frontmatter 和内容
172
- - **命令构建**: 创建完整的命令对象,包含元数据和权限信息
173
-
174
- ## 性能优化点
175
-
176
- 1. **异步处理**: 所有文件操作都采用异步方式
177
- 2. **并行扫描**: 同时扫描多个命令目录
178
- 3. **增量解析**: 只处理发生变化的历史文件
179
- 4. **内存管理**: 及时释放大型历史文件的内存占用
180
-
181
- ## 错误处理机制
182
-
183
- 1. **文件不存在**: 优雅降级,返回空结果
184
- 2. **格式错误**: 跳过格式错误的消息,继续处理其他消息
185
- 3. **权限问题**: 记录错误日志,但不中断整个流程
186
- 4. **解析异常**: 使用默认值填充缺失的字段
@@ -1 +0,0 @@
1
- import{j as e}from"./data-structures-DLJedtzx.js";import{r as n}from"./monaco-editor-C7Z4sOhS.js";import{T as ee,a as se,b as _,c as x,d as ae,e as m}from"./table-D6q1rytw.js";import{u as re,a as te,b as le,c as ne}from"./useAgents-DwnOE1_k.js";import{e as de}from"./agents-ClAzIJTw.js";import{P as ie}from"./ProjectSelector-hgmGYVFh.js";import{U as oe}from"./UnifiedToolSelector-CsM9qBvs.js";import{b as ce,s as P}from"./index-B_CTNvca.js";import{u as xe}from"./tools-C4EPanYi.js";import{f as me,o as ue,a2 as U,a3 as B,t as ge,a4 as pe,a5 as he,E as be,a6 as ye,u as fe,r as je,X as ve}from"./ui-components-Cw21Epuw.js";import"./syntax-highlighting-YWvMU4Hm.js";import"./authFetch-BATQyPG5.js";import"./FileBrowser-DL3ayaqb.js";const Le=()=>{const{t:r}=xe("pages"),{isMobile:M}=ce(),{data:O,isLoading:W}=re(),w=te(),z=le(),$=ne(),T=de(),[u,p]=n.useState(null),[a,d]=n.useState({}),[h,b]=n.useState(!1),[K,y]=n.useState(!1),[F,o]=n.useState(null),[f,j]=n.useState(null),[c,H]=n.useState(""),[v,X]=n.useState("all"),[D,L]=n.useState(!1),[N,S]=n.useState([]),[g,C]=n.useState([]),[R,A]=n.useState(!1),k=O?.agents||[],E=k.filter(s=>{const t=s.name.toLowerCase().includes(c.toLowerCase())||s.description.toLowerCase().includes(c.toLowerCase()),l=v==="all"||v==="enabled"&&s.enabled||v==="disabled"&&!s.enabled;return t&&l}),G=s=>{if(f){const t=new URLSearchParams;t.set("project",s);const l=`/chat/${f.id}?${t.toString()}`;window.open(l,"_blank")}y(!1),j(null)},J=async s=>{try{await w.mutateAsync({agentId:s.id,data:{enabled:!s.enabled}}),T.invalidateQueries({queryKey:["agents"]})}catch(t){console.error("Failed to toggle agent:",t),P(r("agents.errors.toggleFailed"))}},q=s=>{p(s),d(s),b(!1);const t=s.allowedTools?.filter(i=>i.enabled).map(i=>i.name)||[],l=t.filter(i=>!i.startsWith("mcp__")),Q=t.filter(i=>i.startsWith("mcp__"));S(l),C(Q),A(Q.length>0)},I=()=>{const s={name:"",description:"",version:"1.0.0",systemPrompt:"",maxTurns:void 0,permissionMode:"default",allowedTools:[{name:"Read",enabled:!0},{name:"Write",enabled:!0},{name:"Edit",enabled:!0}],ui:{icon:"🤖",headerTitle:"",headerDescription:"",componentType:"chat"},author:"User",tags:["custom"],enabled:!0};p(null),d(s),b(!0);const t=s.allowedTools?.filter(l=>l.enabled).map(l=>l.name)||[];S(t),C([]),A(!1)},V=()=>{const s=[...N];return R&&s.push(...g),s.map(l=>({name:l,enabled:!0}))},Y=async()=>{if(!a||!a.name?.trim()){o(r("agents.form.nameRequired"));return}if(a.maxTurns!==void 0&&(a.maxTurns<1||a.maxTurns>100)){o(r("agents.form.maxTurnsError"));return}o(null);try{const s=V();if(h){const t={...a,allowedTools:s,maxTurns:a.maxTurns,id:`custom-${Date.now()}`,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),ui:{...a.ui,headerTitle:a.ui?.headerTitle||a.name,headerDescription:a.ui?.headerDescription||a.description}};await $.mutateAsync(t)}else{if(!u)return;const t={...a,allowedTools:s,maxTurns:a.maxTurns,enabled:u.enabled};await w.mutateAsync({agentId:u.id,data:t})}p(null),d({}),b(!1),o(null),T.invalidateQueries({queryKey:["agents"]})}catch(s){console.error("Failed to save agent:",s);let t=r(h?"agents.errors.createFailed":"agents.errors.saveFailed");if(s?.response?.data?.details?.issues?.length>0){const l=s.response.data.details.issues[0];l.path.includes("maxTurns")&&l.code==="too_big"?t=r("agents.form.maxTurnsExceeded",{maximum:l.maximum}):t=l.message||t}else s?.response?.data?.error?t=s.response.data.error:s?.message&&(t=s.message);o(t)}},Z=async s=>{if(s.id==="ppt-editor"||s.id==="code-assistant"||s.id==="document-writer"){P(r("agents.errors.builtinCannotDelete"));return}if(window.confirm(r("agents.confirmDelete",{name:s.name})))try{await z.mutateAsync(s.id),T.invalidateQueries({queryKey:["agents"]})}catch(l){console.error("Failed to delete agent:",l),P(r("agents.errors.deleteFailed"))}};return W?e.jsx("div",{className:"p-8 flex items-center justify-center",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"}),e.jsx("div",{className:"text-gray-600 dark:text-gray-400",children:r("agents.loading")})]})}):e.jsxs("div",{className:"p-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("div",{className:"flex items-center justify-between mb-6",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 dark:text-white",children:r("agents.title")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mt-2",children:r("agents.subtitle")})]})}),e.jsxs("div",{className:"flex items-center space-x-4",children:[e.jsx("div",{className:"flex-1 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4",children:e.jsxs("div",{className:"flex items-center space-x-4",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(me,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5"}),e.jsx("input",{type:"text",placeholder:r("agents.searchPlaceholder"),value:c,onChange:s=>H(s.target.value),className:"pl-10 pr-4 py-2 w-full border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white"})]}),e.jsx("div",{className:"flex space-x-1 bg-gray-100 dark:bg-gray-700 rounded-lg p-1",children:[{key:"all",label:r("agents.filter.all"),count:k.length},{key:"enabled",label:r("agents.filter.enabled"),count:k.filter(s=>s.enabled).length},{key:"disabled",label:r("agents.filter.disabled"),count:k.filter(s=>!s.enabled).length}].map(s=>e.jsxs("button",{onClick:()=>X(s.key),className:`px-3 py-1 rounded-md text-sm font-medium transition-colors ${v===s.key?"bg-white dark:bg-gray-600 text-blue-700 dark:text-blue-400 shadow-sm":"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200"}`,children:[s.label," (",s.count,")"]},s.key))})]})}),e.jsxs("button",{onClick:I,className:"flex items-center space-x-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors whitespace-nowrap",children:[e.jsx(ue,{className:"w-5 h-5"}),e.jsx("span",{children:r("agents.createButton")})]})]})]}),E.length===0?e.jsxs("div",{className:"text-center py-16 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700",children:[e.jsx("div",{className:"text-6xl mb-4",children:"🤖"}),e.jsx("h3",{className:"text-xl font-medium text-gray-900 dark:text-white mb-2",children:r(c?"agents.noAgentsSearch":"agents.noAgents")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:r(c?"agents.adjustSearch":"agents.createFirst")}),!c&&e.jsx("button",{onClick:I,className:"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:r("agents.createButton")})]}):e.jsxs(e.Fragment,{children:[M&&e.jsx("div",{className:"space-y-4",children:E.map(s=>e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4",children:[e.jsxs("div",{className:"flex items-start space-x-3 mb-4",children:[e.jsx("div",{className:`text-2xl ${s.enabled?"":"opacity-50"}`,children:s.ui.icon}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:`text-base font-medium ${s.enabled?"text-gray-900 dark:text-white":"text-gray-600 dark:text-gray-400"} truncate`,children:s.name}),e.jsx("p",{className:`text-sm ${s.enabled?"text-gray-500 dark:text-gray-400":"text-gray-400 dark:text-gray-500"} truncate mt-1`,children:s.description})]})]}),e.jsxs("div",{className:"space-y-2 text-sm mb-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-400",children:"类型:"}),e.jsx("span",{className:`px-2 py-1 text-xs rounded-full ${s.ui.componentType==="slides"?"bg-blue-100 text-blue-800":s.ui.componentType==="code"?"bg-green-100 text-green-800":s.ui.componentType==="documents"?"bg-purple-100 text-purple-800":"bg-gray-100 text-gray-800"}`,children:s.ui.componentType})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-400",children:"工具:"}),e.jsxs("span",{className:"text-gray-900 dark:text-white",children:[s.allowedTools?.length||0," 个"]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-gray-500 dark:text-gray-400",children:"状态:"}),e.jsx("span",{className:`px-2 py-1 text-xs rounded-full ${s.enabled?"bg-green-100 text-green-800":"bg-gray-100 text-gray-800"}`,children:s.enabled?"已启用":"已禁用"})]})]}),e.jsxs("div",{className:"flex items-center justify-between border-t border-gray-200 dark:border-gray-700 pt-3",children:[s.enabled&&e.jsxs("button",{onClick:()=>{j(s),y(!0)},className:"flex items-center space-x-1 px-3 py-1 text-xs text-primary-foreground bg-primary rounded-md",children:[e.jsx(U,{className:"w-3 h-3"}),e.jsx("span",{children:"使用"})]}),e.jsx("button",{onClick:()=>q(s),className:"p-1 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/50 rounded",title:"编辑助手",children:e.jsx(B,{className:"w-4 h-4"})})]})]},s.id))}),!M&&e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden",children:e.jsxs(ee,{children:[e.jsx(se,{children:e.jsxs(_,{children:[e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:r("agents.table.agent")}),e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:r("agents.table.type")}),e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:r("agents.table.config")}),e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:"工具"}),e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:r("agents.table.status")}),e.jsx(x,{className:"px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider",children:r("agents.table.actions")})]})}),e.jsx(ae,{children:E.map(s=>e.jsxs(_,{className:"hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors",children:[e.jsx(m,{className:"px-6 py-4 whitespace-nowrap",children:e.jsxs("div",{className:"flex items-center",children:[e.jsx("div",{className:`text-2xl mr-4 ${s.enabled?"":"opacity-50"}`,children:s.ui.icon}),e.jsxs("div",{children:[e.jsx("div",{className:`text-sm font-medium ${s.enabled?"text-gray-900 dark:text-white":"text-gray-600 dark:text-gray-400"}`,children:s.name}),e.jsx("div",{className:`text-sm ${s.enabled?"text-gray-500 dark:text-gray-400":"text-gray-400 dark:text-gray-500"}`,children:s.description})]})]})}),e.jsx(m,{className:"px-6 py-4 whitespace-nowrap",children:e.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${s.ui.componentType==="slides"?"bg-blue-100 text-blue-800":s.ui.componentType==="code"?"bg-green-100 text-green-800":s.ui.componentType==="documents"?"bg-purple-100 text-purple-800":"bg-gray-100 text-gray-800"}`,children:s.ui.componentType})}),e.jsx(m,{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white",children:e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx(ge,{className:"w-3 h-3 mr-1 text-gray-400"}),e.jsxs("span",{children:["最大轮次: ",s.maxTurns!==void 0?s.maxTurns:"不限制"]})]}),e.jsxs("div",{className:"flex items-center",children:[e.jsx(pe,{className:"w-3 h-3 mr-1 text-gray-400"}),e.jsxs("span",{children:["权限: ",s.permissionMode==="default"?"默认":s.permissionMode==="acceptEdits"?"自动接受编辑":s.permissionMode==="bypassPermissions"?"绕过权限":s.permissionMode==="plan"?"规划模式":"默认"]})]})]})}),e.jsx(m,{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-white",children:e.jsxs("div",{className:"flex items-center",children:[e.jsx(he,{className:"w-3 h-3 mr-1 text-gray-400"}),e.jsxs("span",{children:[s.allowedTools?.length||0," 个工具"]})]})}),e.jsx(m,{className:"px-6 py-4 whitespace-nowrap",children:e.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${s.enabled?"bg-green-100 text-green-800":"bg-gray-100 text-gray-800"}`,children:s.enabled?"已启用":"已禁用"})}),e.jsx(m,{className:"px-6 py-4 whitespace-nowrap text-right text-sm font-medium",children:e.jsxs("div",{className:"flex items-center space-x-2",children:[s.enabled&&e.jsxs("button",{onClick:()=>{j(s),y(!0)},className:"flex items-center space-x-1 px-3 py-1 text-xs text-primary-foreground bg-primary rounded-md transition-colors hover:opacity-90",title:"开始使用助手",children:[e.jsx(U,{className:"w-3 h-3"}),e.jsx("span",{children:"使用"})]}),e.jsx("button",{onClick:()=>J(s),className:`p-1 rounded transition-colors ${s.enabled?"text-green-600 hover:bg-green-50 dark:hover:bg-green-900/50":"text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700"}`,title:s.enabled?"禁用助手":"启用助手",children:s.enabled?e.jsx(be,{className:"w-4 h-4"}):e.jsx(ye,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>q(s),className:"p-1 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/50 rounded transition-colors",title:"编辑助手",children:e.jsx(B,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>Z(s),className:"p-1 text-red-600 hover:bg-red-50 dark:hover:bg-red-900/50 rounded transition-colors",title:"删除助手",disabled:s.id==="ppt-editor"||s.id==="code-assistant"||s.id==="document-writer",children:e.jsx(fe,{className:"w-4 h-4"})})]})})]},s.id))})]})})]}),(u||h)&&e.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg max-w-4xl w-full max-h-[90vh] overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700",children:[e.jsx("h1",{className:"text-xl font-semibold text-gray-900 dark:text-white",children:h?"创建助手":`编辑助手:${u?.name}`}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsxs("button",{onClick:Y,disabled:w.isPending||$.isPending,className:"flex items-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50",children:[e.jsx(je,{className:"w-4 h-4"}),e.jsx("span",{children:"保存"})]}),e.jsxs("button",{onClick:()=>{p(null),d({}),b(!1),o(null)},className:"flex items-center space-x-2 px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700",children:[e.jsx(ve,{className:"w-4 h-4"}),e.jsx("span",{children:"取消"})]})]})]}),F&&e.jsx("div",{className:"p-4 bg-red-50 dark:bg-red-900/50 border-b border-red-200 dark:border-red-800",children:e.jsxs("div",{className:"flex items-center",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx("svg",{className:"h-5 w-5 text-red-400",viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})})}),e.jsx("div",{className:"ml-3",children:e.jsx("p",{className:"text-sm text-red-800 dark:text-red-200",children:F})})]})}),e.jsx("div",{className:"p-6 overflow-y-auto max-h-[calc(90vh-80px)]",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"名称"}),e.jsx("input",{type:"text",value:a.name||"",onChange:s=>d({...a,name:s.target.value}),className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"描述"}),e.jsx("textarea",{value:a.description||"",onChange:s=>d({...a,description:s.target.value}),rows:6,className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"最大轮次"}),e.jsx("input",{type:"number",min:"1",max:"100",value:a.maxTurns!==void 0?a.maxTurns:"",placeholder:"不限制",onChange:s=>{const t=s.target.value;if(t==="")d({...a,maxTurns:void 0});else{const l=parseInt(t);isNaN(l)||d({...a,maxTurns:l})}},className:`w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 dark:bg-gray-700 dark:text-white ${a.maxTurns!==void 0&&(a.maxTurns<1||a.maxTurns>100)?"border-red-500 focus:ring-red-500":"border-gray-300 dark:border-gray-600 focus:ring-blue-500"}`}),a.maxTurns!==void 0&&(a.maxTurns<1||a.maxTurns>100)&&e.jsx("p",{className:"text-red-500 dark:text-red-400 text-sm mt-1",children:"最大轮次必须在1-100之间"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"权限模式"}),e.jsxs("select",{value:a.permissionMode||"default",onChange:s=>d({...a,permissionMode:s.target.value}),className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white",children:[e.jsx("option",{value:"default",children:"默认"}),e.jsx("option",{value:"acceptEdits",children:"自动接受编辑"}),e.jsx("option",{value:"bypassPermissions",children:"绕过权限检查"}),e.jsx("option",{value:"plan",children:"规划模式"})]})]}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"图标"}),e.jsx("input",{type:"text",value:a.ui?.icon||"",onChange:s=>d({...a,ui:{...a.ui,icon:s.target.value}}),placeholder:"🤖",className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"})]})})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300",children:"启用的工具"}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("button",{type:"button",onClick:()=>L(!D),className:"px-3 py-2 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 rounded-lg transition-colors text-sm",children:"选择工具"}),(N.length>0||g.length>0)&&e.jsxs("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:["常规工具 ",N.length," 个",g.length>0&&`, MCP工具 ${g.length} 个`]}),e.jsx(oe,{isOpen:D,onClose:()=>L(!1),selectedRegularTools:N,onRegularToolsChange:S,selectedMcpTools:g,onMcpToolsChange:C,mcpToolsEnabled:R,onMcpEnabledChange:A})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"系统提示词"}),e.jsx("textarea",{value:a.systemPrompt||"",onChange:s=>d({...a,systemPrompt:s.target.value}),rows:8,className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm dark:bg-gray-700 dark:text-white",placeholder:"输入助手的系统提示词..."})]})]})})]})}),K&&f&&e.jsx(ie,{agent:f,onProjectSelect:G,onClose:()=>{y(!1),j(null)}})]})};export{Le as AgentsPage};
@@ -1 +0,0 @@
1
- .diff-container{font-family:monospace;white-space:pre;text-align:left;border:1px solid #ccc;border-radius:4px;padding:10px;background-color:#fff;font-size:14px;line-height:1.4;overflow-x:auto;color:#333}.diff-hunk{margin-top:20px;border-top:1px solid #ddd;padding-top:20px}.diff-hunk:first-child{margin-top:0;border-top:none;padding-top:0}.hunk-header{background-color:#f1f8ff;color:#555;padding:5px 0}.diff-line{display:flex;width:100%}.diff-added{background-color:#e6ffed}.diff-removed{background-color:#ffeef0}.line-gutter{display:inline-block;width:80px;text-align:right;padding-right:15px;color:#888;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0}.line-prefix{display:inline-block;width:15px;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0}.line-content{flex-grow:1;padding-left:10px}.diff-added .line-content{color:#22863a}.diff-removed .line-content{color:#b31d28}