chainlesschain 0.45.76 → 0.45.77

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 (47) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{Analytics-sBrYoc3A.js → Analytics-Dd2DjBH5.js} +2 -2
  4. package/src/assets/web-panel/assets/AppLayout-CP9fATUN.js +1 -0
  5. package/src/assets/web-panel/assets/AppLayout-cxfKLu-m.css +1 -0
  6. package/src/assets/web-panel/assets/Backup-D6Tc7sf3.js +1 -0
  7. package/src/assets/web-panel/assets/Chat-DDUJZJ9I.js +1 -0
  8. package/src/assets/web-panel/assets/Chat-DfR76jyX.css +1 -0
  9. package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +1 -0
  10. package/src/assets/web-panel/assets/Cowork-XRFqGfqJ.js +48 -0
  11. package/src/assets/web-panel/assets/{Cron-CNs03iHJ.js → Cron-BnWzy_ZB.js} +2 -2
  12. package/src/assets/web-panel/assets/{Dashboard-DanoHPSI.js → Dashboard-D2vCkoGu.js} +1 -1
  13. package/src/assets/web-panel/assets/{Git-CCMVr3Y8.js → Git-DYlvK4sh.js} +2 -2
  14. package/src/assets/web-panel/assets/{Logs-BY6A0UNG.js → Logs-4VgUbfP0.js} +2 -2
  15. package/src/assets/web-panel/assets/{McpTools-CrBVYlg6.js → McpTools-ChaiHoWY.js} +2 -2
  16. package/src/assets/web-panel/assets/{Memory-CWx3SpUt.js → Memory-PFtpuOwf.js} +2 -2
  17. package/src/assets/web-panel/assets/{Notes-1LcGD49x.js → Notes-wc_n6Rh1.js} +2 -2
  18. package/src/assets/web-panel/assets/{Organization-Dx2DhbkM.js → Organization-D1qUa8NQ.js} +4 -4
  19. package/src/assets/web-panel/assets/{P2P-B16fjqfJ.js → P2P-DIG2gnR8.js} +2 -2
  20. package/src/assets/web-panel/assets/{Permissions-BQbC9FzG.js → Permissions-CpE-Ar1e.js} +3 -3
  21. package/src/assets/web-panel/assets/{Projects-CjhZbNYm.js → Projects-GjuS-C6U.js} +2 -2
  22. package/src/assets/web-panel/assets/{Providers-ivOAQtHM.js → Providers-CCfGeqh_.js} +2 -2
  23. package/src/assets/web-panel/assets/{RssFeed-BrsErdrU.js → RssFeed-5TkrXK7Z.js} +1 -1
  24. package/src/assets/web-panel/assets/{Security-DnEvJU5h.js → Security-CcfBWT1D.js} +3 -3
  25. package/src/assets/web-panel/assets/{Services-7jQywNbl.js → Services-Cnm5Zs5h.js} +1 -1
  26. package/src/assets/web-panel/assets/{Skills-CLlblJcG.js → Skills-BHapMb9h.js} +1 -1
  27. package/src/assets/web-panel/assets/{Tasks-CmJBC1cf.js → Tasks-DPb9OMck.js} +1 -1
  28. package/src/assets/web-panel/assets/Templates-Dij5t-rf.js +1 -0
  29. package/src/assets/web-panel/assets/{Wallet-3iYASEx_.js → Wallet-BJV5KmWA.js} +4 -4
  30. package/src/assets/web-panel/assets/{WebAuthn-s3Hzd9db.js → WebAuthn-DLkvYwSc.js} +5 -5
  31. package/src/assets/web-panel/assets/{antd-gZyc63Qr.js → antd-BQNxIyr-.js} +82 -82
  32. package/src/assets/web-panel/assets/github-dark-Dfs9RUU9.css +1 -0
  33. package/src/assets/web-panel/assets/index-CB5YlndO.js +2 -0
  34. package/src/assets/web-panel/assets/{markdown-Bv7nG63L.js → markdown-BeVIhIzs.js} +1 -1
  35. package/src/assets/web-panel/index.html +2 -2
  36. package/src/gateways/ws/action-protocol.js +54 -1
  37. package/src/gateways/ws/message-dispatcher.js +1 -0
  38. package/src/gateways/ws/ws-server.js +10 -1
  39. package/src/lib/cowork-task-runner.js +101 -0
  40. package/src/lib/cowork-task-templates.js +493 -0
  41. package/src/assets/web-panel/assets/AppLayout-2RCrdXxl.js +0 -1
  42. package/src/assets/web-panel/assets/AppLayout-D9pBLPC3.css +0 -1
  43. package/src/assets/web-panel/assets/Backup-D68fenbD.js +0 -1
  44. package/src/assets/web-panel/assets/Chat-B2nB8o_F.js +0 -1
  45. package/src/assets/web-panel/assets/Chat-DB46afPg.css +0 -1
  46. package/src/assets/web-panel/assets/Templates-RXT8-DNk.js +0 -1
  47. package/src/assets/web-panel/assets/index-CyGtHm63.js +0 -2
@@ -0,0 +1,493 @@
1
+ /**
2
+ * Cowork Task Templates — backend definitions for the 10 daily task categories.
3
+ *
4
+ * Each template provides a systemPromptExtension injected into the SubAgentContext
5
+ * task field, guiding the agent to use open-source tools, cli-anything, and
6
+ * auto-install missing dependencies.
7
+ *
8
+ * @module cowork-task-templates
9
+ */
10
+
11
+ // ─── Shared Prompt Fragments ──────────────────────────────────────────────────
12
+
13
+ const OPEN_SOURCE_FIRST_PROMPT = `## 开源工具优先 + 自动安装规则
14
+
15
+ ### 第一步: 检查 cli-anything 已注册技能
16
+ 先执行 list_skills 查看是否已有 cli-anything-* 技能(如 cli-anything-ffmpeg、cli-anything-pandoc)。
17
+ 如果有,优先用 run_skill 调用:
18
+ run_skill cli-anything-ffmpeg "用户的自然语言需求"
19
+ cli-anything 会自动将自然语言翻译为正确的 CLI 命令,成功率更高。
20
+
21
+ ### 第二步: 工具不存在时自动安装
22
+ 当所需工具未安装时,直接自动安装,不要询问用户:
23
+ 1. Python 包 (pandas/Pillow/pytesseract/...): run_code 的 auto-install 自动处理
24
+ 2. npm 包: run_shell: npm install -g <package>
25
+ 3. 系统级开源工具:
26
+ - Windows: winget install <winget-id> --accept-package-agreements --accept-source-agreements
27
+ - 备选: choco install <pkg> -y
28
+ - macOS: brew install <pkg>
29
+ 4. 安装后验证: <tool> --version
30
+ 5. 只有在安装失败且无替代方案时才告知用户
31
+
32
+ ### 第三步: 尝试注册为 cli-anything 技能
33
+ 安装完底层工具后,尝试为其创建 cli-anything 包装器:
34
+ run_shell: chainlesschain cli-anything register <tool> --force --json
35
+ 如果成功,后续可用 run_skill cli-anything-<tool> 自然语言调用。
36
+ 如果失败(如 cli-anything 未装),直接 run_shell 调用原始工具也可以。
37
+
38
+ ### 工具优先级总结
39
+ cli-anything 已注册技能 > 直接调用开源工具 CLI > Python/Node 开源库 > 告知用户
40
+
41
+ ### 常用开源工具速查
42
+ | 工具 | winget ID | 用途 |
43
+ | ffmpeg | Gyan.FFmpeg | 音视频处理 |
44
+ | pandoc | JohnMacFarlane.Pandoc | 文档格式转换 |
45
+ | LibreOffice | TheDocumentFoundation.LibreOffice | Office 文档 |
46
+ | Tesseract | UB-Mannheim.TesseractOCR | OCR 文字识别 |
47
+ | ImageMagick | ImageMagick.ImageMagick | 图片处理 |
48
+ | Ghostscript | ArtifexSoftware.GhostScript | PDF 处理 |
49
+ | 7-Zip | 7zip.7zip | 压缩解压 |
50
+ | GraphViz | Graphviz.Graphviz | 图表生成 |
51
+ | yt-dlp | yt-dlp.yt-dlp | 视频下载 |
52
+ | jq | jqlang.jq | JSON 处理 |
53
+ `;
54
+
55
+ const FILE_HANDLING_PROMPT = `## 文件处理规则
56
+ - 用户提供的文件路径可能是相对路径或绝对路径,先用 read_file 或 list_dir 确认文件存在
57
+ - 输出文件默认放在与输入文件相同的目录下,文件名加后缀区分(如 output_converted.pdf)
58
+ - 处理完成后,告知用户输出文件的完整路径
59
+ - 如果文件很大,先告知用户预估处理时间
60
+ `;
61
+
62
+ const ERROR_RECOVERY_PROMPT = `## 错误恢复策略
63
+ - 工具执行失败时,先检查错误信息,尝试修复参数后重试
64
+ - 如果某个工具不可用,自动尝试安装或切换到替代方案
65
+ - 记录所有尝试过的方法,避免重复尝试失败的路径
66
+ - 最多自动重试 3 次,之后才告知用户需要手动干预
67
+ `;
68
+
69
+ // ─── Template Definitions ─────────────────────────────────────────────────────
70
+
71
+ export const TASK_TEMPLATES = {
72
+ "doc-convert": {
73
+ id: "doc-convert",
74
+ name: "文档格式转换",
75
+ category: "document",
76
+ acceptsFiles: true,
77
+ fileTypes: [
78
+ ".docx",
79
+ ".doc",
80
+ ".md",
81
+ ".html",
82
+ ".pdf",
83
+ ".txt",
84
+ ".xlsx",
85
+ ".pptx",
86
+ ".csv",
87
+ ".rtf",
88
+ ],
89
+ systemPromptExtension: `你是文档格式转换专家。
90
+
91
+ ## 核心能力
92
+ - Word/Markdown/HTML/PDF/TXT 之间的格式互转
93
+ - Excel 导出为 PDF/CSV,CSV 转 Excel
94
+ - 合并多个文档为一个
95
+ - 提取 PDF 中的文字内容
96
+
97
+ ## 工具优先级
98
+ 1. pandoc — 万能文档转换器,支持 40+ 格式互转
99
+ 2. LibreOffice (soffice --headless) — Office 文档转换
100
+ 3. Ghostscript (gs) — PDF 处理
101
+ 4. Python: python-docx, openpyxl, pdfplumber — 编程处理复杂格式
102
+
103
+ ## 典型命令
104
+ - pandoc input.docx -o output.pdf
105
+ - pandoc input.md -o output.html --standalone
106
+ - soffice --headless --convert-to pdf input.docx
107
+ - soffice --headless --convert-to csv input.xlsx
108
+
109
+ ${OPEN_SOURCE_FIRST_PROMPT}
110
+ ${FILE_HANDLING_PROMPT}
111
+ ${ERROR_RECOVERY_PROMPT}`,
112
+ },
113
+
114
+ "media-process": {
115
+ id: "media-process",
116
+ name: "音视频处理",
117
+ category: "media",
118
+ acceptsFiles: true,
119
+ fileTypes: [
120
+ ".mp4",
121
+ ".mp3",
122
+ ".avi",
123
+ ".mkv",
124
+ ".mov",
125
+ ".wav",
126
+ ".flac",
127
+ ".ogg",
128
+ ".webm",
129
+ ".m4a",
130
+ ],
131
+ systemPromptExtension: `你是音视频处理专家。
132
+
133
+ ## 核心能力
134
+ - 视频压缩、格式转换、剪辑
135
+ - 音频提取、格式转换、降噪
136
+ - 视频截图、GIF 制作
137
+ - 字幕提取和嵌入
138
+
139
+ ## 工具优先级
140
+ 1. ffmpeg — 万能音视频处理工具
141
+ 2. yt-dlp — 在线视频下载
142
+ 3. Python: moviepy, pydub — 编程处理
143
+
144
+ ## 典型命令
145
+ - ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4 (压缩)
146
+ - ffmpeg -i input.mp4 -vn -acodec libmp3lame output.mp3 (提取音频)
147
+ - ffmpeg -i input.mp4 -ss 00:10:30 -to 00:25:00 -c copy output.mp4 (剪辑)
148
+ - ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4 (缩放)
149
+ - ffmpeg -i input.mp4 -r 10 -vf "scale=320:-1" output.gif (转GIF)
150
+
151
+ ${OPEN_SOURCE_FIRST_PROMPT}
152
+ ${FILE_HANDLING_PROMPT}
153
+ ${ERROR_RECOVERY_PROMPT}`,
154
+ },
155
+
156
+ "data-analysis": {
157
+ id: "data-analysis",
158
+ name: "数据分析",
159
+ category: "data",
160
+ acceptsFiles: true,
161
+ fileTypes: [".csv", ".xlsx", ".xls", ".json", ".tsv", ".sqlite", ".db"],
162
+ systemPromptExtension: `你是数据分析专家。
163
+
164
+ ## 核心能力
165
+ - CSV/Excel 数据加载、清洗、统计
166
+ - 数据可视化(图表生成)
167
+ - 数据去重、格式修复、缺失值处理
168
+ - 多数据源比较和合并
169
+
170
+ ## 工具优先级
171
+ 1. Python: pandas + matplotlib/seaborn — 数据分析首选
172
+ 2. Python: openpyxl — Excel 读写
173
+ 3. jq — JSON 数据处理
174
+ 4. csvkit (pip install csvkit) — CSV 命令行工具
175
+
176
+ ## 典型代码
177
+ \`\`\`python
178
+ import pandas as pd
179
+ import matplotlib.pyplot as plt
180
+ df = pd.read_csv("data.csv")
181
+ df.describe()
182
+ df.groupby("category").sum().plot(kind="bar")
183
+ plt.savefig("chart.png", dpi=150, bbox_inches="tight")
184
+ \`\`\`
185
+
186
+ ${OPEN_SOURCE_FIRST_PROMPT}
187
+ ${FILE_HANDLING_PROMPT}
188
+ ${ERROR_RECOVERY_PROMPT}`,
189
+ },
190
+
191
+ "web-research": {
192
+ id: "web-research",
193
+ name: "信息检索与调研",
194
+ category: "research",
195
+ acceptsFiles: false,
196
+ fileTypes: [],
197
+ systemPromptExtension: `你是信息检索与调研专家。
198
+
199
+ ## 核心能力
200
+ - 网页内容抓取和解析
201
+ - API 调用获取实时数据(汇率、天气、新闻等)
202
+ - 多源信息汇总和对比
203
+ - 搜索结果整理成结构化报告
204
+
205
+ ## 工具优先级
206
+ 1. run_shell: curl — HTTP 请求
207
+ 2. Python: requests + beautifulsoup4 — 网页抓取
208
+ 3. Python: trafilatura — 网页正文提取
209
+ 4. jq — JSON API 响应解析
210
+
211
+ ## 典型用法
212
+ - curl -s "https://api.exchangerate-api.com/v4/latest/USD" | jq '.rates.CNY'
213
+ - Python: requests.get(url) + BeautifulSoup(html, "html.parser")
214
+
215
+ ## 注意事项
216
+ - 优先使用公开 API 获取数据
217
+ - 抓取网页时遵守 robots.txt
218
+ - 将结果整理为清晰的 Markdown 格式
219
+ - 如果需要搜索,先尝试用 API,再考虑网页抓取
220
+
221
+ ${OPEN_SOURCE_FIRST_PROMPT}
222
+ ${ERROR_RECOVERY_PROMPT}`,
223
+ },
224
+
225
+ "image-process": {
226
+ id: "image-process",
227
+ name: "图片处理",
228
+ category: "media",
229
+ acceptsFiles: true,
230
+ fileTypes: [
231
+ ".png",
232
+ ".jpg",
233
+ ".jpeg",
234
+ ".gif",
235
+ ".bmp",
236
+ ".webp",
237
+ ".svg",
238
+ ".tiff",
239
+ ".ico",
240
+ ],
241
+ systemPromptExtension: `你是图片处理专家。
242
+
243
+ ## 核心能力
244
+ - 批量压缩、格式转换
245
+ - 加水印、调整尺寸
246
+ - OCR 文字识别
247
+ - 图片合并、裁剪
248
+
249
+ ## 工具优先级
250
+ 1. ImageMagick (magick/convert) — 万能图片处理
251
+ 2. Tesseract — OCR 文字识别
252
+ 3. Python: Pillow — 编程处理图片
253
+ 4. ffmpeg — 图片序列/GIF 处理
254
+
255
+ ## 典型命令
256
+ - magick input.png -resize 50% output.png (缩放)
257
+ - magick input.png -quality 80 output.jpg (压缩)
258
+ - magick input.png -gravity southeast -fill white -annotate +10+10 "水印" output.png
259
+ - tesseract input.png output -l chi_sim+eng (中英文OCR)
260
+ - magick mogrify -resize 800x -quality 85 *.jpg (批量处理)
261
+
262
+ ${OPEN_SOURCE_FIRST_PROMPT}
263
+ ${FILE_HANDLING_PROMPT}
264
+ ${ERROR_RECOVERY_PROMPT}`,
265
+ },
266
+
267
+ "code-helper": {
268
+ id: "code-helper",
269
+ name: "代码辅助",
270
+ category: "development",
271
+ acceptsFiles: true,
272
+ fileTypes: [
273
+ ".js",
274
+ ".ts",
275
+ ".py",
276
+ ".java",
277
+ ".go",
278
+ ".rs",
279
+ ".c",
280
+ ".cpp",
281
+ ".sh",
282
+ ".bat",
283
+ ".ps1",
284
+ ],
285
+ systemPromptExtension: `你是代码辅助专家。
286
+
287
+ ## 核心能力
288
+ - 生成脚本(批量重命名、自动化任务、数据处理等)
289
+ - 调试代码错误,分析报错信息
290
+ - 代码格式化、重构建议
291
+ - 生成 REST API / CLI / 自动化脚手架
292
+
293
+ ## 工作方式
294
+ 1. 理解用户需求,确定最合适的编程语言
295
+ 2. 编写代码并用 run_code 或 run_shell 执行验证
296
+ 3. 如果有错误,分析错误信息并修复
297
+ 4. 将最终代码保存到用户指定位置
298
+
299
+ ## 语言选择建议
300
+ - 快速脚本: Python(最通用)
301
+ - 系统任务: Bash/PowerShell
302
+ - Web 应用: Node.js
303
+ - 数据处理: Python (pandas)
304
+
305
+ ${OPEN_SOURCE_FIRST_PROMPT}
306
+ ${ERROR_RECOVERY_PROMPT}`,
307
+ },
308
+
309
+ "system-admin": {
310
+ id: "system-admin",
311
+ name: "系统运维",
312
+ category: "system",
313
+ acceptsFiles: false,
314
+ fileTypes: [],
315
+ systemPromptExtension: `你是系统运维专家。
316
+
317
+ ## 核心能力
318
+ - 磁盘空间分析和清理建议
319
+ - 进程管理(查看、终止占用资源的进程)
320
+ - 网络端口和连接排查
321
+ - 系统日志分析
322
+ - 环境变量和路径管理
323
+
324
+ ## 常用命令 (Windows)
325
+ - wmic logicaldisk get size,freespace,caption (磁盘空间)
326
+ - dir /s /b /o-s | head -20 (最大文件)
327
+ - tasklist /fo csv | sort /R (进程列表)
328
+ - netstat -ano | findstr LISTENING (监听端口)
329
+ - systeminfo (系统信息)
330
+
331
+ ## 常用命令 (Linux/macOS)
332
+ - df -h (磁盘空间)
333
+ - du -sh * | sort -rh | head -20 (目录大小)
334
+ - ps aux --sort=-%mem | head -20 (内存占用)
335
+ - lsof -i -P -n (网络连接)
336
+
337
+ ## 安全注意
338
+ - 不要删除系统文件
339
+ - 终止进程前确认不是关键系统进程
340
+ - 磁盘清理只给建议,不自动删除用户文件
341
+
342
+ ${OPEN_SOURCE_FIRST_PROMPT}
343
+ ${ERROR_RECOVERY_PROMPT}`,
344
+ },
345
+
346
+ "file-organize": {
347
+ id: "file-organize",
348
+ name: "文件整理",
349
+ category: "file",
350
+ acceptsFiles: false,
351
+ fileTypes: [],
352
+ systemPromptExtension: `你是文件整理专家。
353
+
354
+ ## 核心能力
355
+ - 按文件类型/日期/大小分类整理
356
+ - 批量重命名(去空格、统一格式、序号命名)
357
+ - 查找重复文件
358
+ - 打包压缩(排除不需要的文件)
359
+ - 文件夹结构可视化
360
+
361
+ ## 工具优先级
362
+ 1. Python: os, shutil, pathlib — 文件操作
363
+ 2. 7-Zip (7z) — 压缩打包
364
+ 3. rdfind / fdupes — 查找重复文件
365
+ 4. tree — 目录结构可视化
366
+
367
+ ## 典型操作
368
+ \`\`\`python
369
+ import os, shutil
370
+ from pathlib import Path
371
+
372
+ # 按扩展名分类
373
+ for f in Path(".").iterdir():
374
+ if f.is_file():
375
+ ext = f.suffix.lower().lstrip(".") or "no_ext"
376
+ dest = Path(ext)
377
+ dest.mkdir(exist_ok=True)
378
+ shutil.move(str(f), str(dest / f.name))
379
+ \`\`\`
380
+
381
+ ## 安全规则
382
+ - 移动/重命名前先列出计划,给用户确认(除非用户明确说不需要确认)
383
+ - 不删除文件,只移动到分类目录
384
+ - 保留原始文件名信息(如重命名日志)
385
+
386
+ ${OPEN_SOURCE_FIRST_PROMPT}
387
+ ${FILE_HANDLING_PROMPT}
388
+ ${ERROR_RECOVERY_PROMPT}`,
389
+ },
390
+
391
+ "network-tools": {
392
+ id: "network-tools",
393
+ name: "网络工具",
394
+ category: "network",
395
+ acceptsFiles: false,
396
+ fileTypes: [],
397
+ systemPromptExtension: `你是网络诊断与工具专家。
398
+
399
+ ## 核心能力
400
+ - API 接口测试和调试
401
+ - 网页内容抓取
402
+ - 网络连通性测试
403
+ - DNS 查询和诊断
404
+ - SSL 证书检查
405
+
406
+ ## 工具优先级
407
+ 1. curl — HTTP 请求和 API 测试
408
+ 2. ping — 网络连通性
409
+ 3. nslookup / dig — DNS 查询
410
+ 4. Python: requests — 复杂 HTTP 操作
411
+ 5. openssl — SSL 证书检查
412
+
413
+ ## 典型命令
414
+ - curl -v https://api.example.com/endpoint (API测试)
415
+ - curl -X POST -H "Content-Type: application/json" -d '{"key":"val"}' url
416
+ - ping -n 10 example.com (Windows连通性)
417
+ - nslookup example.com (DNS查询)
418
+ - openssl s_client -connect example.com:443 (SSL检查)
419
+
420
+ ${OPEN_SOURCE_FIRST_PROMPT}
421
+ ${ERROR_RECOVERY_PROMPT}`,
422
+ },
423
+
424
+ "learning-assist": {
425
+ id: "learning-assist",
426
+ name: "学习辅助",
427
+ category: "learning",
428
+ acceptsFiles: true,
429
+ fileTypes: [".pdf", ".docx", ".txt", ".md", ".epub", ".html"],
430
+ systemPromptExtension: `你是学习辅助专家。
431
+
432
+ ## 核心能力
433
+ - 文档翻译(整篇或关键段落)
434
+ - 长文档内容总结和要点提取
435
+ - 论文分析和结构梳理
436
+ - 代码原理解释
437
+ - 知识点整理成思维导图格式
438
+
439
+ ## 工具优先级
440
+ 1. pandoc — 文档格式转换(便于提取文字)
441
+ 2. Python: pdfplumber — PDF 文字提取
442
+ 3. Python: translate / deep-translator — 翻译
443
+ 4. Tesseract — 扫描件 OCR
444
+
445
+ ## 工作方式
446
+ 1. 用 read_file 读取文档内容
447
+ 2. 如果是 PDF/扫描件,先提取文字
448
+ 3. 分析内容结构,提取关键信息
449
+ 4. 按用户需求输出(总结/翻译/分析/思维导图)
450
+
451
+ ## 输出格式
452
+ - 总结: 使用 Markdown 格式,包含标题层级
453
+ - 翻译: 保留原文格式,对照翻译
454
+ - 分析: 结构化列表 + 关键发现
455
+ - 思维导图: 使用 Markdown 缩进格式或 Mermaid 语法
456
+
457
+ ${OPEN_SOURCE_FIRST_PROMPT}
458
+ ${FILE_HANDLING_PROMPT}
459
+ ${ERROR_RECOVERY_PROMPT}`,
460
+ },
461
+ };
462
+
463
+ /**
464
+ * Get a template by ID, or return a free-mode template.
465
+ * @param {string|null} templateId
466
+ * @returns {object} Template definition
467
+ */
468
+ export function getTemplate(templateId) {
469
+ if (!templateId || !TASK_TEMPLATES[templateId]) {
470
+ return {
471
+ id: "free",
472
+ name: "自由模式",
473
+ category: "general",
474
+ acceptsFiles: true,
475
+ fileTypes: [],
476
+ systemPromptExtension: `你是一个全能助手,可以处理用户提出的任何日常任务。
477
+ 根据任务类型自动选择最合适的工具和方法。
478
+
479
+ ${OPEN_SOURCE_FIRST_PROMPT}
480
+ ${FILE_HANDLING_PROMPT}
481
+ ${ERROR_RECOVERY_PROMPT}`,
482
+ };
483
+ }
484
+ return TASK_TEMPLATES[templateId];
485
+ }
486
+
487
+ /**
488
+ * List all available template IDs.
489
+ * @returns {string[]}
490
+ */
491
+ export function listTemplateIds() {
492
+ return Object.keys(TASK_TEMPLATES);
493
+ }
@@ -1 +0,0 @@
1
- import{o as _e,W as f,Z as t,X as u,$ as fe,a0 as ve,Y as i,k as e,a1 as a,a2 as w,a3 as r,a4 as S,F as j,u as o,a5 as g,G as l,a6 as ge,a7 as be,f as Oe,c as m}from"./vendor-CN0Iv_qZ.js";import{u as Ce}from"./ws-CU7Gvoom.js";import{u as we,T as je}from"./index-CyGtHm63.js";import{_ as Te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as B,G as x,D as R,M as F,C as K,b as P,c as A,d as G,e as I,B as W,f as D,h as V,T as z,S as E,L as U,W as $,i as H,j as X,P as Y,k as Z,l as q,m as J,n as Q,R as h,K as ee,I as Se}from"./antd-gZyc63Qr.js";const Be={key:0,class:"logo-text"},xe={key:0,class:"mode-banner project"},Le={class:"banner-info"},Ne={class:"banner-name"},Me={key:1,class:"mode-banner global"},Re=["title"],Fe={key:0,class:"footer-text"},Ke={class:"header-left"},Pe={class:"header-right"},Ae={class:"theme-switcher"},Ge=["data-theme-key","onClick"],Ie={__name:"AppLayout",setup(We){const te=fe(),se=ve(),b=Ce(),T=we(),d=Oe(!1),y=window.__CC_CONFIG__||{},p=m(()=>y.mode==="project"),oe=m(()=>T.current),ne=m(()=>T.config.vars["--menu-mode"]),L=m(()=>{const c=se.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[c]||c]}),O=m(()=>b.status),le=m(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),ae=m(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function ie(c){T.setTheme(c)}function ue({key:c}){te.push({mcp:"/mcp"}[c]||`/${c}`)}return _e(()=>b.connect()),(c,s)=>{const n=u("a-menu-item"),k=u("a-menu-item-group"),v=u("a-menu-divider"),de=u("a-menu"),re=u("a-badge"),ce=u("a-layout-sider"),N=u("a-tooltip"),pe=u("a-tag"),me=u("a-layout-header"),ye=u("router-view"),ke=u("a-layout-content"),M=u("a-layout");return i(),f(M,{class:"app-root"},{default:t(()=>[e(ce,{collapsed:d.value,"onUpdate:collapsed":s[1]||(s[1]=_=>d.value=_),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[a("div",{class:w(["logo",{collapsed:d.value}])},[s[2]||(s[2]=a("span",{class:"logo-icon"},"⛓",-1)),d.value?S("",!0):(i(),r("span",Be,"ChainlessChain"))],2),d.value?(i(),r("div",{key:1,class:"mode-icon-sm",title:p.value?o(y).projectName:"全局模式"},[p.value?(i(),f(o(B),{key:0,style:{color:"#1677ff"}})):(i(),f(o(x),{key:1,style:{color:"#722ed1"}}))],8,Re)):(i(),r(j,{key:0},[p.value?(i(),r("div",xe,[e(o(B),{class:"banner-icon"}),a("div",Le,[a("div",Ne,g(o(y).projectName||"项目"),1),s[3]||(s[3]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Me,[e(o(x),{class:"banner-icon"}),s[4]||(s[4]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(de,{selectedKeys:L.value,"onUpdate:selectedKeys":s[0]||(s[0]=_=>L.value=_),theme:ne.value,mode:"inline","inline-collapsed":d.value,class:"side-menu",onClick:ue},{default:t(()=>[d.value?(i(),r(j,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(o(R))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(o(F))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(o(K))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(o(P))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"skills"},{icon:t(()=>[e(o(A))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(o(G))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(o(I))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"notes"},{icon:t(()=>[e(o(W))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(o(D))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(o(V))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(o(z))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(o(E))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(o(U))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(o($))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(o(H))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(o(X))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(o(Y))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(o(Z))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(o(q))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(o(J))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(o(Q))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(o(h))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(o(ee))]),_:1})],64)):(i(),r(j,{key:0},[e(k,null,{title:t(()=>[...s[5]||(s[5]=[a("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(n,{key:"dashboard"},{icon:t(()=>[e(o(R))]),default:t(()=>[s[6]||(s[6]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(o(F))]),default:t(()=>[s[7]||(s[7]=l("AI 对话",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(o(K))]),default:t(()=>[s[8]||(s[8]=l("服务管理",-1))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(o(P))]),default:t(()=>[s[9]||(s[9]=l("日志查看",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...s[10]||(s[10]=[a("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(n,{key:"skills"},{icon:t(()=>[e(o(A))]),default:t(()=>[s[11]||(s[11]=l("技能管理",-1))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(o(G))]),default:t(()=>[s[12]||(s[12]=l("LLM 配置",-1))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(o(I))]),default:t(()=>[s[13]||(s[13]=l("MCP 工具",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...s[14]||(s[14]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(o(W))]),default:t(()=>[s[15]||(s[15]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(o(D))]),default:t(()=>[s[16]||(s[16]=l("记忆文件",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(o(V))]),default:t(()=>[s[17]||(s[17]=l("定时任务",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(o(z))]),default:t(()=>[s[18]||(s[18]=l("后台任务",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...s[19]||(s[19]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(o(E))]),default:t(()=>[s[20]||(s[20]=l("安全中心",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(o(U))]),default:t(()=>[s[21]||(s[21]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(o($))]),default:t(()=>[s[22]||(s[22]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(o(H))]),default:t(()=>[s[23]||(s[23]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(o(X))]),default:t(()=>[s[24]||(s[24]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(o(Y))]),default:t(()=>[s[25]||(s[25]=l("项目管理",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...s[26]||(s[26]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(o(Z))]),default:t(()=>[s[27]||(s[27]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(o(q))]),default:t(()=>[s[28]||(s[28]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(o(J))]),default:t(()=>[s[29]||(s[29]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(o(Q))]),default:t(()=>[s[30]||(s[30]=l("模板中心",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...s[31]||(s[31]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(o(h))]),default:t(()=>[s[32]||(s[32]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(o(ee))]),default:t(()=>[s[33]||(s[33]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:w(["sidebar-footer",{collapsed:d.value}])},[e(re,{status:le.value},null,8,["status"]),d.value?S("",!0):(i(),r("span",Fe,g(ae.value),1))],2)]),_:1},8,["collapsed"]),e(M,{class:"main-area"},{default:t(()=>[e(me,{class:"app-header"},{default:t(()=>[a("div",Ke,[a("div",{class:w(["scope-tag",p.value?"project":"global"])},[(i(),f(ge(p.value?o(B):o(x)))),a("span",null,g(p.value?o(y).projectName||"项目":"全局模式"),1),p.value&&o(y).projectRoot?(i(),f(N,{key:0,title:o(y).projectRoot},{default:t(()=>[e(o(Se),{class:"info-icon"})]),_:1},8,["title"])):S("",!0)],2)]),a("div",Pe,[a("div",Ae,[(i(!0),r(j,null,be(o(je),(_,C)=>(i(),f(N,{key:C,title:_.label},{default:t(()=>[a("button",{class:w(["theme-btn",{active:oe.value===C}]),"data-theme-key":C,onClick:De=>ie(C)},g(_.icon),11,Ge)]),_:2},1032,["title"]))),128))]),s[34]||(s[34]=a("span",{class:"version-tag"},"v5.0.2.9",-1)),e(pe,{color:O.value==="connected"?"green":O.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(g(O.value==="connected"?"已连接":O.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(ke,{class:"page-content"},{default:t(()=>[e(ye)]),_:1})]),_:1})]),_:1})}}},He=Te(Ie,[["__scopeId","data-v-0a18f3af"]]);export{He as default};
@@ -1 +0,0 @@
1
- .app-root[data-v-0a18f3af]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-0a18f3af]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-0a18f3af] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-0a18f3af]{background:var(--bg-base)}.logo[data-v-0a18f3af]{height:52px;display:flex;align-items:center;padding:0 18px;gap:10px;border-bottom:1px solid var(--border-color);overflow:hidden;white-space:nowrap;flex-shrink:0}.logo.collapsed[data-v-0a18f3af]{padding:0;justify-content:center}.logo-icon[data-v-0a18f3af]{font-size:20px;flex-shrink:0}.logo-text[data-v-0a18f3af]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-0a18f3af]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-0a18f3af]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-0a18f3af]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-0a18f3af]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-0a18f3af]{color:#722ed1}.banner-info[data-v-0a18f3af]{flex:1;min-width:0}.banner-name[data-v-0a18f3af]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-0a18f3af]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-0a18f3af]{color:#c084fc}.mode-icon-sm[data-v-0a18f3af]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-0a18f3af]{border:none!important;margin-top:2px;-webkit-user-select:none;user-select:none;background:transparent!important;flex:1;overflow-y:auto;overflow-x:hidden}.group-label[data-v-0a18f3af]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-0a18f3af] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-0a18f3af] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-0a18f3af]{margin:4px 0!important}.sidebar-footer[data-v-0a18f3af]{flex-shrink:0;padding:8px 18px;display:flex;align-items:center;gap:8px;border-top:1px solid var(--border-color)}.sidebar-footer.collapsed[data-v-0a18f3af]{justify-content:center;padding:8px 0}.footer-text[data-v-0a18f3af]{color:var(--text-secondary);font-size:11px}.app-header[data-v-0a18f3af]{background:var(--bg-header)!important;padding:0 20px!important;border-bottom:1px solid var(--border-color);height:50px!important;line-height:50px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;box-shadow:0 1px 4px #0000000f}.header-left[data-v-0a18f3af],.header-right[data-v-0a18f3af]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-0a18f3af]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-0a18f3af]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-0a18f3af]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-0a18f3af]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-0a18f3af]{display:flex;align-items:center;gap:4px;background:var(--bg-card);border:1px solid var(--border-color);border-radius:20px;padding:3px 6px}.theme-btn[data-v-0a18f3af]{width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;background:transparent;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s,transform .15s;opacity:.55}.theme-btn[data-v-0a18f3af]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-0a18f3af]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-0a18f3af]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-0a18f3af]{margin:0!important;font-size:11px}.page-content[data-v-0a18f3af]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
@@ -1 +0,0 @@
1
- import{u as Me}from"./ws-CU7Gvoom.js";import{_ as Ne}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as Le,y as me,i as re,E as N,a1 as U,$ as Te}from"./antd-gZyc63Qr.js";import{o as je,a3 as s,a1 as p,k as a,Z as o,f as n,X as y,Y as l,G as f,u as v,W as b,a4 as r,a5 as u,F as Ee}from"./vendor-CN0Iv_qZ.js";const Re={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},De={key:0,style:{"text-align":"center",padding:"30px"}},Ue={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},Ke={key:1},Ve={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Je={key:3,style:{"margin-top":"16px"}},Ge={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},We={key:4,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},He={key:0,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px","margin-top":"8px"}},Xe={style:{"font-family":"monospace"}},Ye={key:0},Ze={key:1,style:{"margin-top":"12px"}},qe={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Qe={key:0,style:{"text-align":"center",padding:"30px"}},et={key:0,style:{"margin-bottom":"16px"}},tt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},at={key:0,style:{"font-family":"monospace","font-size":"12px"}},ot={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},lt={key:0,style:{"text-align":"center",padding:"30px"}},nt={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},st={key:0,style:{"text-align":"center",padding:"30px"}},rt={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},it={key:1},ut={key:2},ct={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},pt={key:0,style:{"margin-top":"12px"}},vt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},yt={__name:"Backup",setup(ft){const g=Me(),ie=n("backup"),K=n(!1),V=n(!1),J=n(!1),B=n(""),w=n([]),_=n(""),be=[{title:"备份 ID",key:"id"},{title:"大小",key:"size",width:120},{title:"创建时间",key:"createdAt"},{title:"操作",key:"action",width:100}];async function ue(){V.value=!0,B.value="";try{const{output:t}=await g.execute("backup list --json",15e3),e=M(t);Array.isArray(e)?w.value=e:e&&Array.isArray(e.backups)?w.value=e.backups:(w.value=[],t&&t.trim()&&(_.value=t))}catch(t){B.value=`加载备份列表失败: ${t.message}`}finally{V.value=!1}}async function xe(){J.value=!0,_.value="",B.value="";try{const{output:t}=await g.execute("backup create --json",3e4);_.value=t||"备份已创建",await ue()}catch(t){_.value=`创建备份失败: ${t.message}`}finally{J.value=!1}}const G=n(!1),W=n(!1),k=n(null),z=n("");function _e(t){k.value=t,z.value="",G.value=!0}async function ke(){if(k.value){W.value=!0,z.value="";try{const{output:t}=await g.execute(`backup restore ${k.value.id}`,6e4);z.value=t||"恢复完成"}catch(t){z.value=`恢复失败: ${t.message}`}finally{W.value=!1}}}const H=n(!1),L=n(""),I=n(!1),T=n("未知"),j=n(0),X=n(""),x=n(""),Y=n(!1),Z=n(!1),S=n([]),he=[{title:"文件路径",key:"path"},{title:"冲突类型",key:"type",width:120}];async function q(){H.value=!0,L.value="";try{const{output:t}=await g.execute("sync status --json",15e3),e=M(t);e?(I.value=e.online||e.synced||e.status==="online"||!1,T.value=I.value?"已同步":"未同步",j.value=e.pending??e.pendingChanges??0,X.value=e.lastSync||e.lastSyncTime||""):we(t)}catch(t){L.value=`加载同步状态失败: ${t.message}`}finally{H.value=!1}}function we(t){if(!t){T.value="未知";return}I.value=/synced|online|up.to.date/i.test(t),T.value=I.value?"已同步":"未同步";const e=t.match(/pending[:\s]+(\d+)/i);j.value=e?parseInt(e[1]):0;const c=t.match(/last[:\s]+(.+)/i);c&&(X.value=c[1].trim())}async function ze(){Y.value=!0,x.value="";try{const{output:t}=await g.execute("sync push",3e4);x.value=t||"推送完成",await q()}catch(t){x.value=`推送失败: ${t.message}`}finally{Y.value=!1}}async function Se(){Z.value=!0,x.value="";try{const{output:t}=await g.execute("sync pull",3e4);x.value=t||"拉取完成",await q()}catch(t){x.value=`拉取失败: ${t.message}`}finally{Z.value=!1}}async function Ce(){try{const{output:t}=await g.execute("sync conflicts --json",15e3),e=M(t);Array.isArray(e)?S.value=e:e&&Array.isArray(e.conflicts)?S.value=e.conflicts:S.value=[]}catch{S.value=[]}}const Q=n(!1),E=n(""),C=n(!1),ee=n(""),te=n(!1),O=n(""),A=n([]),Ae=[{title:"CID",key:"cid"},{title:"名称",key:"name"},{title:"大小",key:"size",width:120},{title:"固定时间",key:"pinnedAt"},{title:"操作",key:"action",width:120}];async function Pe(){Q.value=!0,E.value="";try{const{output:t}=await g.execute("ipfs status --json",15e3),e=M(t);if(e)C.value=e.online||e.status==="online"||e.connected||!1,ee.value=e.peerId||e.id||"";else{C.value=t?/online|connected|running/i.test(t):!1;const c=t?t.match(/(?:peer\s*id|id)[:\s]+(\S+)/i):null;ee.value=c?c[1]:""}}catch(t){E.value=`加载 IPFS 状态失败: ${t.message}`}finally{Q.value=!1}}async function ae(){te.value=!0,O.value="";try{const{output:t}=await g.execute("ipfs pins --json",15e3),e=M(t);Array.isArray(e)?A.value=e:e&&Array.isArray(e.pins)?A.value=e.pins:A.value=[]}catch(t){O.value=`加载固定列表失败: ${t.message}`}finally{te.value=!1}}const oe=n(!1),le=n(!1),R=n(""),F=n("");async function ce(){if(R.value.trim()){le.value=!0,F.value="";try{const{output:t}=await g.execute(`ipfs pin "${R.value.trim()}"`,3e4);F.value=t||"固定成功",await ae()}catch(t){F.value=`固定失败: ${t.message}`}finally{le.value=!1}}}async function $e(t){try{await g.execute(`ipfs unpin ${t.cid}`,15e3),await ae()}catch(e){O.value=`取消固定失败: ${e.message}`}}function M(t){if(!t||!t.trim())return null;try{return JSON.parse(t.trim())}catch{const c=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(c)try{return JSON.parse(c[0])}catch{}return null}}function de(t){if(t==null||isNaN(t))return"-";const e=Number(t);if(e===0)return"0 B";const c=["B","KB","MB","GB","TB"],h=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,h)).toFixed(h>0?1:0)+" "+c[h]}async function pe(){K.value=!0;try{await Promise.all([ue(),q(),Ce(),Pe(),ae()])}finally{K.value=!1}}return je(pe),(t,e)=>{const c=y("a-button"),h=y("a-space"),D=y("a-spin"),ve=y("a-empty"),ne=y("a-table"),m=y("a-card"),ye=y("a-modal"),se=y("a-tab-pane"),P=y("a-statistic"),$=y("a-col"),fe=y("a-row"),ge=y("a-tag"),Be=y("a-popconfirm"),Ie=y("a-input"),Oe=y("a-tabs");return l(),s("div",null,[p("div",Re,[e[6]||(e[6]=p("div",null,[p("h2",{class:"page-title"},"备份与同步"),p("p",{class:"page-sub"},"备份管理 / 数据同步 / IPFS")],-1)),a(c,{type:"primary",ghost:"",loading:K.value,onClick:pe},{icon:o(()=>[a(v(Le))]),default:o(()=>[e[5]||(e[5]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Oe,{activeKey:ie.value,"onUpdate:activeKey":e[4]||(e[4]=i=>ie.value=i),type:"card"},{default:o(()=>[a(se,{key:"backup"},{tab:o(()=>[a(v(re)),e[7]||(e[7]=f(" 备份管理",-1))]),default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{title:o(()=>[a(h,null,{default:o(()=>[a(v(re)),e[8]||(e[8]=p("span",null,"备份操作",-1))]),_:1})]),extra:o(()=>[a(c,{type:"primary",loading:J.value,onClick:xe},{icon:o(()=>[a(v(me))]),default:o(()=>[e[9]||(e[9]=f(" 创建备份 ",-1))]),_:1},8,["loading"])]),default:o(()=>[V.value?(l(),s("div",De,[a(D)])):w.value.length===0&&!_.value?(l(),b(ve,{key:1,description:"暂无备份记录"})):r("",!0),w.value.length>0?(l(),b(ne,{key:2,columns:be,"data-source":w.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:i,record:d})=>[i.key==="id"?(l(),s("span",Ue,u(d.id.length>20?d.id.slice(0,20)+"...":d.id),1)):r("",!0),i.key==="size"?(l(),s("span",Ke,u(de(d.size)),1)):r("",!0),i.key==="createdAt"?(l(),s("span",Ve,u(d.createdAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(c,{key:3,size:"small",type:"link",onClick:Fe=>_e(d)},{default:o(()=>[...e[10]||(e[10]=[f(" 恢复 ",-1)])]),_:1},8,["onClick"])):r("",!0)]),_:1},8,["data-source"])):r("",!0),_.value?(l(),s("div",Je,[e[11]||(e[11]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"最近操作结果",-1)),p("pre",Ge,u(_.value),1)])):r("",!0),B.value?(l(),s("div",We,u(B.value),1)):r("",!0)]),_:1}),a(ye,{open:G.value,"onUpdate:open":e[0]||(e[0]=i=>G.value=i),title:"确认恢复备份","ok-text":"确认恢复","cancel-text":"取消","confirm-loading":W.value,onOk:ke,"ok-type":"danger"},{default:o(()=>[e[15]||(e[15]=p("p",{style:{color:"var(--text-secondary)"}}," 确定要恢复以下备份吗?此操作将覆盖当前数据。 ",-1)),k.value?(l(),s("div",He,[p("div",null,[e[12]||(e[12]=p("strong",null,"备份 ID:",-1)),e[13]||(e[13]=f()),p("span",Xe,u(k.value.id),1)]),k.value.createdAt?(l(),s("div",Ye,[e[14]||(e[14]=p("strong",null,"创建时间:",-1)),f(" "+u(k.value.createdAt),1)])):r("",!0)])):r("",!0),z.value?(l(),s("div",Ze,[p("pre",qe,u(z.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),a(se,{key:"sync"},{tab:o(()=>[a(v(N)),e[16]||(e[16]=f(" 数据同步",-1))]),default:o(()=>[H.value?(l(),s("div",Qe,[a(D)])):(l(),s(Ee,{key:1},[a(fe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"同步状态",value:T.value,"value-style":{color:I.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"待同步变更",value:j.value,"value-style":{color:j.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"最近同步",value:X.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(h,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(c,{loading:Y.value,onClick:ze,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(re))]),default:o(()=>[e[17]||(e[17]=f(" 推送 ",-1))]),_:1},8,["loading"]),a(c,{loading:Z.value,onClick:Se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(N))]),default:o(()=>[e[18]||(e[18]=f(" 拉取 ",-1))]),_:1},8,["loading"])]),_:1}),x.value?(l(),s("div",et,[e[19]||(e[19]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),p("pre",tt,u(x.value),1)])):r("",!0),S.value.length>0?(l(),b(m,{key:1,title:"冲突列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(ne,{columns:he,"data-source":S.value,pagination:!1,size:"small","row-key":"path"},{bodyCell:o(({column:i,record:d})=>[i.key==="path"?(l(),s("span",at,u(d.path),1)):r("",!0),i.key==="type"?(l(),b(ge,{key:1,color:"red"},{default:o(()=>[f(u(d.type||"冲突"),1)]),_:2},1024)):r("",!0)]),_:1},8,["data-source"])]),_:1})):r("",!0)],64)),L.value?(l(),s("div",ot,u(L.value),1)):r("",!0)]),_:1}),a(se,{key:"ipfs"},{tab:o(()=>[a(v(U)),e[20]||(e[20]=f(" IPFS 存储",-1))]),default:o(()=>[a(m,{title:"IPFS 状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[a(ge,{color:C.value?"green":"default"},{default:o(()=>[f(u(C.value?"在线":"离线"),1)]),_:1},8,["color"])]),default:o(()=>[Q.value?(l(),s("div",lt,[a(D)])):(l(),b(fe,{key:1,gutter:[16,16]},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"节点状态",value:C.value?"已连接":"未连接","value-style":{color:C.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"已固定文件",value:A.value.length,"value-style":{fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"Peer ID",value:ee.value||"-","value-style":{color:"var(--text-muted)",fontSize:"12px",fontFamily:"monospace"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1})),E.value?(l(),s("div",nt,u(E.value),1)):r("",!0)]),_:1}),a(m,{title:"固定文件列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[a(c,{size:"small",onClick:e[1]||(e[1]=i=>oe.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(me))]),default:o(()=>[e[21]||(e[21]=f(" 固定文件 ",-1))]),_:1})]),default:o(()=>[te.value?(l(),s("div",st,[a(D)])):A.value.length===0?(l(),b(ve,{key:1,description:"暂无固定文件"})):(l(),b(ne,{key:2,columns:Ae,"data-source":A.value,pagination:{pageSize:10},size:"small","row-key":"cid"},{bodyCell:o(({column:i,record:d})=>[i.key==="cid"?(l(),s("span",rt,u(d.cid.length>24?d.cid.slice(0,24)+"...":d.cid),1)):r("",!0),i.key==="name"?(l(),s("span",it,u(d.name||"-"),1)):r("",!0),i.key==="size"?(l(),s("span",ut,u(de(d.size)),1)):r("",!0),i.key==="pinnedAt"?(l(),s("span",ct,u(d.pinnedAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(Be,{key:4,title:"确定取消固定?","ok-text":"确定","cancel-text":"取消",onConfirm:Fe=>$e(d)},{default:o(()=>[a(c,{size:"small",type:"link",danger:""},{default:o(()=>[a(v(Te)),e[22]||(e[22]=f(" 取消固定 ",-1))]),_:1})]),_:1},8,["onConfirm"])):r("",!0)]),_:1},8,["data-source"])),O.value?(l(),s("div",dt,u(O.value),1)):r("",!0)]),_:1}),a(ye,{open:oe.value,"onUpdate:open":e[3]||(e[3]=i=>oe.value=i),title:"固定文件到 IPFS","confirm-loading":le.value,onOk:ce,"ok-text":"固定","cancel-text":"取消"},{default:o(()=>[e[23]||(e[23]=p("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要固定的文件路径",-1)),a(Ie,{value:R.value,"onUpdate:value":e[2]||(e[2]=i=>R.value=i),placeholder:"文件路径,例如: /path/to/file.txt",onPressEnter:ce},null,8,["value"]),F.value?(l(),s("div",pt,[p("pre",vt,u(F.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},_t=Ne(yt,[["__scopeId","data-v-3d5d81e6"]]);export{_t as default};
@@ -1 +0,0 @@
1
- import{w as Q,o as R,a3 as n,a1 as s,k as i,u as r,a5 as u,Z as d,F as S,a7 as z,G as c,a4 as y,W as T,a9 as V,A as q,c as x,X as f,f as $,Y as o,a2 as A,n as J}from"./vendor-CN0Iv_qZ.js";import{m as H,H as M}from"./markdown-Bv7nG63L.js";import{u as K}from"./chat-DWBA4-cl.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as P,G as U,M as W,p as X,t as Y}from"./antd-gZyc63Qr.js";import"./ws-CU7Gvoom.js";const Z={style:{display:"flex",height:"calc(100vh - 56px - 48px)",gap:"16px"}},ee={style:{width:"240px","flex-shrink":"0",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},te={key:0,style:{padding:"6px 12px 4px","font-size":"11px",color:"#1677ff",background:"rgba(22,119,255,.07)","border-bottom":"1px solid rgba(22,119,255,.15)",display:"flex","align-items":"center",gap:"4px"}},se=["title"],oe={key:1,style:{padding:"6px 12px 4px","font-size":"11px",color:"#722ed1",background:"rgba(114,46,209,.07)","border-bottom":"1px solid rgba(114,46,209,.15)",display:"flex","align-items":"center",gap:"4px"}},ne={style:{padding:"10px 12px","border-bottom":"1px solid var(--border-color)",display:"flex",gap:"8px"}},ae={style:{flex:"1","overflow-y":"auto",padding:"8px"}},le=["onClick"],ie={class:"session-icon"},re={class:"session-info"},de={class:"session-title"},pe={class:"session-meta"},ue={key:0,style:{"text-align":"center",color:"var(--text-muted)",padding:"24px 0","font-size":"13px"}},ce={style:{flex:"1",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},ve={key:0,style:{flex:"1",display:"flex","flex-direction":"column","align-items":"center","justify-content":"center",color:"var(--text-muted)"}},xe={style:{"margin-top":"24px",display:"flex",gap:"12px"}},ge={key:0,class:"tool-msg"},ye={style:{margin:"0","font-size":"11px",color:"#aaa","white-space":"pre-wrap"}},fe={key:0,style:{"margin-top":"8px","padding-top":"8px","border-top":"1px solid var(--border-color)"}},_e={style:{margin:"0","font-size":"11px",color:"#52c41a","white-space":"pre-wrap"}},me={key:1,class:"user-msg"},be={class:"bubble user"},he={key:2,class:"assistant-msg"},ke=["innerHTML"],we={key:0,class:"assistant-msg"},Ce=["innerHTML"],Se={key:1,class:"question-card"},ze={class:"question-text"},Me={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"10px"}},Oe={key:2,style:{padding:"16px","border-top":"1px solid var(--border-color)"}},Ie={style:{display:"flex",gap:"8px","align-items":"flex-end"}},Le={__name:"Chat",setup(Ne){const k=window.__CC_CONFIG__||{},j=x(()=>k.mode==="project");H.setOptions({highlight:(a,e)=>e&&M.getLanguage(e)?M.highlight(a,{language:e}).value:M.highlightAuto(a).value,breaks:!0});const l=K(),_=$(null),g=$(""),p=x(()=>l.currentSessionId),O=x(()=>p.value?l.getMessages(p.value):[]),w=x(()=>{const a=l.streaming[p.value];return a?.active?a.content:null}),m=x(()=>l.pendingQuestion[p.value]),b=x(()=>l.isLoading);function I(a){try{return H(a||"")}catch{return a||""}}async function h(a){await l.createSession(a)}async function L(){if(!g.value.trim()||b.value||!p.value)return;const a=g.value;g.value="",await l.sendMessage(p.value,a)}function N(a){l.answerQuestion(p.value,a)}return Q([O,w],()=>{J(()=>{_.value&&(_.value.scrollTop=_.value.scrollHeight)})},{deep:!0}),R(()=>{l.loadSessions()}),(a,e)=>{const v=f("a-button"),E=f("a-collapse-panel"),F=f("a-collapse"),B=f("a-input-search"),G=f("a-textarea");return o(),n("div",Z,[s("div",ee,[j.value?(o(),n("div",te,[i(r(P)),s("span",{style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},title:r(k).projectRoot},u(r(k).projectName||"项目"),9,se)])):(o(),n("div",oe,[i(r(U)),e[5]||(e[5]=s("span",null,"全局会话",-1))])),s("div",ne,[i(v,{type:"primary",size:"small",style:{flex:"1"},onClick:e[0]||(e[0]=t=>h("chat"))},{icon:d(()=>[i(r(W))]),default:d(()=>[e[6]||(e[6]=c(" Chat ",-1))]),_:1}),i(v,{size:"small",style:{flex:"1"},onClick:e[1]||(e[1]=t=>h("agent"))},{icon:d(()=>[i(r(X))]),default:d(()=>[e[7]||(e[7]=c(" Agent ",-1))]),_:1})]),s("div",ae,[(o(!0),n(S,null,z(r(l).sessions,t=>(o(),n("div",{key:t.id,class:A(["session-item",{active:t.id===r(l).currentSessionId}]),onClick:C=>r(l).switchSession(t.id)},[s("span",ie,u(t.type==="agent"?"🤖":"💬"),1),s("div",re,[s("div",de,u(t.title||"新对话"),1),s("div",pe,u(t.messageCount||0)+" 条消息",1)])],10,le))),128)),r(l).sessions.length?y("",!0):(o(),n("div",ue,[...e[8]||(e[8]=[c(" 点击上方按钮",-1),s("br",null,null,-1),c("开始新对话 ",-1)])]))])]),s("div",ce,[p.value?(o(),n("div",{key:1,style:{flex:"1","overflow-y":"auto",padding:"20px"},ref_key:"messagesEl",ref:_},[(o(!0),n(S,null,z(O.value,(t,C)=>(o(),n("div",{key:C,class:A(["message-row",t.role])},[t.role==="tool"?(o(),n("div",ge,[i(F,{ghost:"",size:"small"},{default:d(()=>[i(E,{header:`🔧 ${t.tool} ${t.status==="running"?"(执行中...)":"✓"}`,style:{border:"1px solid var(--border-color)","border-radius":"6px",background:"var(--bg-card)"}},{default:d(()=>[s("pre",ye,u(JSON.stringify(t.input,null,2)),1),t.result?(o(),n("div",fe,[s("pre",_e,u(typeof t.result=="string"?t.result:JSON.stringify(t.result,null,2)),1)])):y("",!0)]),_:2},1032,["header"])]),_:2},1024)])):t.role==="user"?(o(),n("div",me,[s("div",be,u(t.content),1)])):(o(),n("div",he,[e[14]||(e[14]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant",innerHTML:I(t.content)},null,8,ke)]))],2))),128)),w.value?(o(),n("div",we,[e[15]||(e[15]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant streaming",innerHTML:I(w.value)},null,8,Ce)])):y("",!0),m.value?(o(),n("div",Se,[s("div",ze,u(m.value.question),1),m.value.choices?.length?(o(),n("div",Me,[(o(!0),n(S,null,z(m.value.choices,t=>(o(),T(v,{key:t,size:"small",onClick:C=>N(t)},{default:d(()=>[c(u(t),1)]),_:2},1032,["onClick"]))),128))])):(o(),T(B,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:N}))])):y("",!0)],512)):(o(),n("div",ve,[e[11]||(e[11]=s("div",{style:{"font-size":"48px","margin-bottom":"16px"}},"💬",-1)),e[12]||(e[12]=s("div",{style:{"font-size":"16px","margin-bottom":"8px",color:"#777"}},"开始 AI 对话",-1)),e[13]||(e[13]=s("div",{style:{"font-size":"13px",color:"var(--text-muted)"}},"选择左侧会话或创建新对话",-1)),s("div",xe,[i(v,{type:"primary",onClick:e[2]||(e[2]=t=>h("chat"))},{default:d(()=>[...e[9]||(e[9]=[c("新建 Chat",-1)])]),_:1}),i(v,{style:{},onClick:e[3]||(e[3]=t=>h("agent"))},{default:d(()=>[...e[10]||(e[10]=[c("新建 Agent",-1)])]),_:1})])])),p.value?(o(),n("div",Oe,[s("div",Ie,[i(G,{value:g.value,"onUpdate:value":e[4]||(e[4]=t=>g.value=t),placeholder:b.value?"等待响应中...":"输入消息,Shift+Enter 换行,Enter 发送","auto-size":{minRows:1,maxRows:6},disabled:b.value,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)",color:"var(--text-primary)",resize:"none",flex:"1"},onKeydown:V(q(L,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),i(v,{type:"primary",loading:b.value,onClick:L,style:{height:"40px"}},{icon:d(()=>[i(r(Y))]),_:1},8,["loading"])])])):y("",!0)])])}}},Fe=D(Le,[["__scopeId","data-v-8392b2d7"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}.session-item[data-v-8392b2d7]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:background .15s;margin-bottom:4px}.session-item[data-v-8392b2d7]:hover{background:var(--bg-card-hover)}.session-item.active[data-v-8392b2d7]{background:#1677ff20;border:1px solid #1677ff40}.session-icon[data-v-8392b2d7]{font-size:16px}.session-info[data-v-8392b2d7]{flex:1;min-width:0}.session-title[data-v-8392b2d7]{color:#ccc;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-meta[data-v-8392b2d7]{color:var(--text-muted);font-size:11px;margin-top:2px}.message-row[data-v-8392b2d7]{margin-bottom:16px}.user-msg[data-v-8392b2d7]{display:flex;justify-content:flex-end}.assistant-msg[data-v-8392b2d7]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-8392b2d7]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--text-primary);flex-shrink:0}.bubble[data-v-8392b2d7]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-8392b2d7]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-8392b2d7]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-8392b2d7]:after{content:"▋";animation:blink-8392b2d7 .7s step-start infinite;color:#1677ff}@keyframes blink-8392b2d7{50%{opacity:0}}.tool-msg[data-v-8392b2d7]{margin:8px 0}.question-card[data-v-8392b2d7]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-8392b2d7]{color:#aaa;font-size:13px}[data-v-8392b2d7] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-8392b2d7] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-8392b2d7] .bubble.assistant p{margin:0 0 8px}[data-v-8392b2d7] .bubble.assistant p:last-child{margin:0}
@@ -1 +0,0 @@
1
- import{o as fe,a3 as x,a1 as n,k as t,Z as o,f as c,X as l,r as ye,$ as ge,Y as u,F as U,a7 as A,u as p,a5 as d,G as i,W as y,a4 as R}from"./vendor-CN0Iv_qZ.js";import{u as _e}from"./ws-CU7Gvoom.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{U as M,w as G,c as be,m as W,y as ke,b as Y,a0 as we,$ as Ce,x as h}from"./antd-gZyc63Qr.js";const ze={style:{display:"flex","align-items":"flex-start",gap:"10px"}},he={style:{flex:"1","min-width":"0"}},Pe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},Oe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},$e={style:{"margin-top":"12px","text-align":"right"}},Te={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Ie={key:0,style:{"text-align":"center",padding:"40px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},je={style:{flex:"1","min-width":"0"}},Se={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Ne={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ue={key:0,style:{"margin-top":"4px"}},Ae={style:{"margin-top":"12px","text-align":"right"}},Re={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},De={style:{"margin-bottom":"16px"}},Fe={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ke={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Le={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Ve={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},X="cc_prompt_templates",qe={__name:"Templates",setup(Ee){const P=_e(),Z=ge(),D=c("project"),O=c(""),v=c(null),b=c(!1),$=c(""),H=[{name:"code-project",description:"代码项目 — 代码审查、重构、单元测试"},{name:"data-science",description:"数据科学 — ML/数据分析、可视化"},{name:"devops",description:"DevOps — 基础设施、部署、监控"},{name:"medical-triage",description:"医疗分诊 — 症状分析、分诊建议"},{name:"agriculture-expert",description:"农业专家 — 作物管理、病虫害"},{name:"general-assistant",description:"通用助手 — 日常问答、任务管理"},{name:"ai-media-creator",description:"AI 媒体创作 — 图文生成、视频脚本"},{name:"ai-doc-creator",description:"AI 文档创作 — 文档生成、格式转换"},{name:"empty",description:"空白模板 — 最小项目结构"}];function Q(s){$.value=s,b.value=!0}async function ee(){b.value=!1;const s=$.value;if(s){O.value=s,v.value=null;try{const e=`init --template ${s} --yes`,{output:m,exitCode:_}=await P.execute(e,3e4);v.value={success:_===0,output:m}}catch(e){v.value={success:!1,output:`初始化失败: ${e.message}`}}finally{O.value=""}}}const T=c(!1),k=c([]),I=c(""),f=c(null);async function te(){T.value=!0;try{const{output:s}=await P.execute("bi templates --json",15e3),e=JSON.parse(s);k.value=Array.isArray(e)?e:e.templates||[]}catch{k.value=[]}finally{T.value=!1}}async function oe(s){I.value=s,f.value=null;try{const e=`bi dashboard create --template ${s} --json`,{output:m,exitCode:_}=await P.execute(e,3e4);f.value={success:_===0,output:m}}catch(e){f.value={success:!1,output:`创建失败: ${e.message}`}}finally{I.value=""}}const g=c([]),w=c(!1),r=ye({name:"",category:"general",content:""});function ae(){try{const s=localStorage.getItem(X);g.value=s?JSON.parse(s):[]}catch{g.value=[]}}function F(){localStorage.setItem(X,JSON.stringify(g.value))}function ne(){!r.name||!r.content||(g.value.push({name:r.name,category:r.category,content:r.content}),F(),K(),h.success("模板已保存"))}function K(){w.value=!1,r.name="",r.category="general",r.content=""}function se(s){g.value.splice(s,1),F(),h.success("模板已删除")}function le(s){navigator.clipboard.writeText(s.content).then(()=>{h.success("已复制到剪贴板")}).catch(()=>{h.error("复制失败")})}function ie(s){Z.push({path:"/chat",query:{prompt:s.content}})}function re(s){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[s]||"default"}return fe(()=>{ae(),te()}),(s,e)=>{const m=l("a-button"),_=l("a-card"),B=l("a-col"),j=l("a-row"),L=l("a-alert"),S=l("a-tab-pane"),ue=l("a-spin"),V=l("a-empty"),q=l("a-tag"),pe=l("a-tabs"),E=l("a-modal"),ce=l("a-input"),N=l("a-form-item"),C=l("a-select-option"),de=l("a-select"),me=l("a-textarea"),ve=l("a-form");return u(),x("div",null,[e[27]||(e[27]=n("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[n("div",null,[n("h2",{class:"page-title"},"模板中心"),n("p",{class:"page-sub"},"项目模板 / BI 模板 / Prompt 模板")])],-1)),t(pe,{activeKey:D.value,"onUpdate:activeKey":e[3]||(e[3]=a=>D.value=a),type:"card"},{default:o(()=>[t(S,{key:"project"},{tab:o(()=>[t(p(be)),e[10]||(e[10]=i(" 项目模板 ",-1))]),default:o(()=>[t(j,{gutter:[16,16]},{default:o(()=>[(u(),x(U,null,A(H,a=>t(B,{key:a.name,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",ze,[t(p(M),{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),n("div",he,[n("div",Pe,d(a.name),1),n("div",Oe,d(a.description),1)])]),n("div",$e,[t(m,{type:"primary",size:"small",loading:O.value===a.name,onClick:z=>Q(a.name)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[11]||(e[11]=i(" 初始化 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024)),64))]),_:1}),v.value?(u(),y(L,{key:0,message:v.value.success?"初始化成功":"初始化失败",type:v.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=a=>v.value=null)},{description:o(()=>[n("pre",Te,d(v.value.output),1)]),_:1},8,["message","type"])):R("",!0)]),_:1}),t(S,{key:"bi"},{tab:o(()=>[t(p(W)),e[12]||(e[12]=i(" BI 模板 ",-1))]),default:o(()=>[T.value?(u(),x("div",Ie,[t(ue),e[13]||(e[13]=n("div",{style:{color:"var(--text-muted)","margin-top":"8px"}},"加载 BI 模板...",-1))])):k.value.length?(u(),y(j,{key:2,gutter:[16,16]},{default:o(()=>[(u(!0),x(U,null,A(k.value,a=>(u(),y(B,{key:a.id,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Be,[t(p(W),{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),n("div",je,[n("div",Se,d(a.name),1),n("div",Ne,d(a.description||"暂无描述"),1),a.id?(u(),x("div",Ue,[t(q,{size:"small",color:"purple"},{default:o(()=>[i(d(a.id),1)]),_:2},1024)])):R("",!0)])]),n("div",Ae,[t(m,{type:"primary",size:"small",loading:I.value===a.id,onClick:z=>oe(a.id)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[14]||(e[14]=i(" 创建仪表板 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:1,description:"暂无 BI 模板"})),f.value?(u(),y(L,{key:3,message:f.value.success?"仪表板创建成功":"创建失败",type:f.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[1]||(e[1]=a=>f.value=null)},{description:o(()=>[n("pre",Re,d(f.value.output),1)]),_:1},8,["message","type"])):R("",!0)]),_:1}),t(S,{key:"prompts"},{tab:o(()=>[t(p(Y)),e[15]||(e[15]=i(" Prompt 模板 ",-1))]),default:o(()=>[n("div",De,[t(m,{type:"primary",onClick:e[2]||(e[2]=a=>w.value=!0)},{icon:o(()=>[t(p(ke))]),default:o(()=>[e[16]||(e[16]=i(" 新建模板 ",-1))]),_:1})]),g.value.length?(u(),y(j,{key:1,gutter:[16,16]},{default:o(()=>[(u(!0),x(U,null,A(g.value,(a,z)=>(u(),y(B,{key:z,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Fe,[t(p(Y),{style:{"font-size":"18px",color:"#52c41a"}}),n("span",Ke,d(a.name),1),t(q,{color:re(a.category),size:"small"},{default:o(()=>[i(d(a.category),1)]),_:2},1032,["color"])]),n("div",Le,d(a.content.length>120?a.content.slice(0,120)+"...":a.content),1),n("div",Ve,[t(m,{size:"small",onClick:J=>ie(a)},{icon:o(()=>[t(p(M))]),default:o(()=>[e[17]||(e[17]=i(" 使用 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",onClick:J=>le(a)},{icon:o(()=>[t(p(we))]),default:o(()=>[e[18]||(e[18]=i(" 复制 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",danger:"",onClick:J=>se(z)},{icon:o(()=>[t(p(Ce))]),default:o(()=>[e[19]||(e[19]=i(" 删除 ",-1))]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:0,description:"暂无 Prompt 模板,点击上方按钮创建"}))]),_:1})]),_:1},8,["activeKey"]),t(E,{open:b.value,"onUpdate:open":e[4]||(e[4]=a=>b.value=a),title:"确认初始化",onOk:ee,onCancel:e[5]||(e[5]=a=>b.value=!1),"ok-text":"确认","cancel-text":"取消"},{default:o(()=>[n("p",null,[e[20]||(e[20]=i("确定要使用模板 ",-1)),n("strong",null,d($.value),1),e[21]||(e[21]=i(" 初始化项目吗?",-1))]),e[22]||(e[22]=n("p",{style:{color:"var(--text-muted)","font-size":"12px"}},"这将在当前工作目录创建项目结构。",-1))]),_:1},8,["open"]),t(E,{open:w.value,"onUpdate:open":e[9]||(e[9]=a=>w.value=a),title:"新建 Prompt 模板",onOk:ne,onCancel:K,"ok-text":"保存","cancel-text":"取消","ok-button-props":{disabled:!r.name||!r.content}},{default:o(()=>[t(ve,{layout:"vertical"},{default:o(()=>[t(N,{label:"模板名称",required:""},{default:o(()=>[t(ce,{value:r.name,"onUpdate:value":e[6]||(e[6]=a=>r.name=a),placeholder:"输入模板名称"},null,8,["value"])]),_:1}),t(N,{label:"分类"},{default:o(()=>[t(de,{value:r.category,"onUpdate:value":e[7]||(e[7]=a=>r.category=a),style:{width:"100%"}},{default:o(()=>[t(C,{value:"general"},{default:o(()=>[...e[23]||(e[23]=[i("general",-1)])]),_:1}),t(C,{value:"code"},{default:o(()=>[...e[24]||(e[24]=[i("code",-1)])]),_:1}),t(C,{value:"writing"},{default:o(()=>[...e[25]||(e[25]=[i("writing",-1)])]),_:1}),t(C,{value:"analysis"},{default:o(()=>[...e[26]||(e[26]=[i("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(N,{label:"模板内容",required:""},{default:o(()=>[t(me,{value:r.content,"onUpdate:value":e[8]||(e[8]=a=>r.content=a),rows:6,placeholder:"输入 Prompt 模板内容"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","ok-button-props"])])}}},Ye=xe(qe,[["__scopeId","data-v-22e50acf"]]);export{Ye as default};