chainlesschain 0.45.76 → 0.45.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{Analytics-sBrYoc3A.js → Analytics-CoH0P1ux.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-Dk1eV3Xp.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-cxfKLu-m.css +1 -0
- package/src/assets/web-panel/assets/Backup-Cv97eAjW.js +1 -0
- package/src/assets/web-panel/assets/Chat-DSbYaPuD.js +1 -0
- package/src/assets/web-panel/assets/Chat-DfR76jyX.css +1 -0
- package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +1 -0
- package/src/assets/web-panel/assets/Cowork-DY0Jcql7.js +48 -0
- package/src/assets/web-panel/assets/{Cron-CNs03iHJ.js → Cron-BcH0ckxq.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DanoHPSI.js → Dashboard-DSOE-azo.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CCMVr3Y8.js → Git-zd3CuuXJ.js} +2 -2
- package/src/assets/web-panel/assets/{Logs-BY6A0UNG.js → Logs-BUKXg48N.js} +2 -2
- package/src/assets/web-panel/assets/{McpTools-CrBVYlg6.js → McpTools-WVxDlw0C.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-CWx3SpUt.js → Memory-BLFTgTpY.js} +2 -2
- package/src/assets/web-panel/assets/{Notes-1LcGD49x.js → Notes-CFypT876.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-Dx2DhbkM.js → Organization-BOOqeyu_.js} +4 -4
- package/src/assets/web-panel/assets/{P2P-B16fjqfJ.js → P2P-D9xrbb8q.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-BQbC9FzG.js → Permissions-CidrpFWd.js} +3 -3
- package/src/assets/web-panel/assets/{Projects-CjhZbNYm.js → Projects-D3Ycn8xG.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-ivOAQtHM.js → Providers-D0kMUvHz.js} +2 -2
- package/src/assets/web-panel/assets/{RssFeed-BrsErdrU.js → RssFeed-OQLesJxb.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DnEvJU5h.js → Security-BR4hAAkF.js} +3 -3
- package/src/assets/web-panel/assets/{Services-7jQywNbl.js → Services-BFMDfXE5.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CLlblJcG.js → Skills-BAf_mFKw.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-CmJBC1cf.js → Tasks-DuNOWfjU.js} +1 -1
- package/src/assets/web-panel/assets/Templates-buh__Yll.js +1 -0
- package/src/assets/web-panel/assets/{Wallet-3iYASEx_.js → Wallet-vgS5USvW.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-s3Hzd9db.js → WebAuthn-BoL2UJ5Z.js} +5 -5
- package/src/assets/web-panel/assets/{antd-gZyc63Qr.js → antd-BQNxIyr-.js} +82 -82
- package/src/assets/web-panel/assets/chat-BwUxWn7i.js +1 -0
- package/src/assets/web-panel/assets/github-dark-Dfs9RUU9.css +1 -0
- package/src/assets/web-panel/assets/index-CCRLEutJ.js +2 -0
- package/src/assets/web-panel/assets/{markdown-Bv7nG63L.js → markdown-BeVIhIzs.js} +1 -1
- package/src/assets/web-panel/assets/ws-B4fo9ew1.js +1 -0
- package/src/assets/web-panel/index.html +2 -2
- package/src/gateways/ws/action-protocol.js +54 -1
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/session-protocol.js +2 -0
- package/src/gateways/ws/ws-server.js +10 -1
- package/src/gateways/ws/ws-session-gateway.js +6 -1
- package/src/lib/cowork-task-runner.js +101 -0
- package/src/lib/cowork-task-templates.js +493 -0
- package/src/assets/web-panel/assets/AppLayout-2RCrdXxl.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-D9pBLPC3.css +0 -1
- package/src/assets/web-panel/assets/Backup-D68fenbD.js +0 -1
- package/src/assets/web-panel/assets/Chat-B2nB8o_F.js +0 -1
- package/src/assets/web-panel/assets/Chat-DB46afPg.css +0 -1
- package/src/assets/web-panel/assets/Templates-RXT8-DNk.js +0 -1
- package/src/assets/web-panel/assets/chat-DWBA4-cl.js +0 -1
- package/src/assets/web-panel/assets/index-CyGtHm63.js +0 -2
- package/src/assets/web-panel/assets/ws-CU7Gvoom.js +0 -1
|
@@ -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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{V as M,f as g,r as w}from"./vendor-CN0Iv_qZ.js";import{u as f}from"./ws-CU7Gvoom.js";const S="新对话",T="新 Agent",b={"assistant.delta":"response-token","assistant.final":"response-complete","assistant.message":"response-complete","tool.call.started":"tool-executing","tool.call.completed":"tool-result","tool.call.failed":"tool-result","slot.filling":"question","approval.requested":"question",error:"error"},U=M("chat",()=>{const c=g([]),p=g(null),i=w({}),a=w({}),m=w({}),d=g(!1);let q=null;const A=new Set;function h(t){return i[t]||(i[t]=[]),i[t]}function y(t){if(!t?.id)return;const e=c.value.find(o=>o.id===t.id);if(e){Object.assign(e,t);return}c.value.unshift(t)}function C(t,e=f()){i[t]||(i[t]=[]),a[t]||(a[t]={content:"",active:!1}),!A.has(t)&&(A.add(t),e.onSession(t,o=>_(t,o)))}function v(t=f()){q||(q=t.onRuntimeEvent(e=>{const o=e.payload||{},s=o.record||{};if(e.type==="session:start"){const n=o.sessionType||s.type||"chat";y({id:o.sessionId,type:n,provider:s.provider||null,model:s.model||null,projectRoot:s.projectRoot||null,status:s.status||"created",title:n==="chat"?S:T,createdAt:Date.now(),messageCount:s.messageCount??0})}else if(e.type==="session:resume"){const n=o.sessionId;if(!n)return;Array.isArray(o.history)&&(i[n]=o.history.map(r=>({role:r.role,content:r.content,timestamp:r.timestamp||Date.now()}))),a[n]||(a[n]={content:"",active:!1}),y({id:n,type:s.type||null,provider:s.provider||null,model:s.model||null,projectRoot:s.projectRoot||null,status:s.status||"resumed",messageCount:s.messageCount??(Array.isArray(o.history)?o.history.length:0)})}else if(e.type==="session:end"){const n=o.sessionId;c.value=c.value.filter(r=>r.id!==n),p.value===n&&(p.value=c.value[0]?.id||null)}}))}async function D(){const t=f();v(t),c.value=await t.listSessions()}async function E(t="chat"){const e=f();v(e);const o=await e.createSession(t);return y({id:o,type:t,title:t==="chat"?S:T,createdAt:Date.now(),messageCount:0}),C(o,e),p.value=o,o}function _(t,e){const o=h(t),s=b[e.type]||e.type,n=e.payload||{};if(s==="response-token"){a[t]||(a[t]={content:"",active:!0});const r=e.token||n.token||n.delta||n.content||"";a[t].content+=r,a[t].active=!0}else if(s==="response-complete"){const r=e.content||n.content||a[t]?.content||"";o.push({role:"assistant",content:r,timestamp:Date.now()}),a[t]&&(a[t].content="",a[t].active=!1);const l=c.value.find(u=>u.id===t);if(l&&(l.title===S||l.title===T)){const u=o.find(j=>j.role==="user");u&&(l.title=u.content.slice(0,30))}l&&(l.messageCount=o.filter(u=>u.role!=="tool").length),d.value=!1}else if(s==="tool-executing")o.push({role:"tool",tool:e.tool||n.tool||n.toolName||"unknown",input:e.input||n.input||n.args||null,status:"running",timestamp:Date.now()});else if(s==="tool-result"){const r=e.tool||n.tool||n.toolName||"unknown",l=[...o].reverse().find(u=>u.role==="tool"&&u.tool===r);l&&(l.result=e.result||n.result||n.output||null,l.status="done")}else if(s==="question")m[t]={requestId:e.requestId||n.requestId||e.id,question:e.question||n.question||n.message||"",choices:e.choices||n.choices||n.options||[]};else if(s==="error"){const r=e.message||n.message||"Unknown error";o.push({role:"assistant",content:`Error: ${r}`,timestamp:Date.now()}),d.value=!1,a[t]&&(a[t].active=!1)}}async function k(t,e){const o=f();v(o),h(t).push({role:"user",content:e,timestamp:Date.now()}),a[t]||(a[t]={content:"",active:!1}),a[t].active=!0,d.value=!0,o.sendSessionMessage(t,e)}function R(t,e){const o=f(),s=m[t];s&&(o.answerQuestion(t,s.requestId,e),delete m[t])}async function L(t){const e=f();if(v(e),p.value=t,C(t,e),!i[t]||i[t].length===0)try{await e.resumeSession(t)}catch{}}return{sessions:c,currentSessionId:p,messages:i,streaming:a,pendingQuestion:m,isLoading:d,loadSessions:D,createSession:E,sendMessage:k,answerQuestion:R,switchSession:L,getMessages:h}});export{U as u};
|