chainlesschain 0.45.79 → 0.45.81

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 (51) hide show
  1. package/bin/chainlesschain.js +0 -0
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CoH0P1ux.js → Analytics-C1AnPdMx.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-Dk1eV3Xp.js → AppLayout-YdvJBMHH.js} +1 -1
  6. package/src/assets/web-panel/assets/{Backup-Cv97eAjW.js → Backup-D31iZX3l.js} +1 -1
  7. package/src/assets/web-panel/assets/{Chat-DSbYaPuD.js → Chat-DiXJ3TuK.js} +1 -1
  8. package/src/assets/web-panel/assets/Cowork-BnrHWwZw.js +7 -0
  9. package/src/assets/web-panel/assets/Cowork-CcSoS3eX.css +1 -0
  10. package/src/assets/web-panel/assets/{Cron-BcH0ckxq.js → Cron-DBt1ueXh.js} +2 -2
  11. package/src/assets/web-panel/assets/Dashboard-BS-tzGNj.css +1 -0
  12. package/src/assets/web-panel/assets/{Dashboard-DSOE-azo.js → Dashboard-HPh9FcPt.js} +2 -2
  13. package/src/assets/web-panel/assets/{Git-zd3CuuXJ.js → Git-hwQ1oZHj.js} +2 -2
  14. package/src/assets/web-panel/assets/{Logs-BUKXg48N.js → Logs-4D9p6PRM.js} +1 -1
  15. package/src/assets/web-panel/assets/{McpTools-WVxDlw0C.js → McpTools-CyAUjbbs.js} +1 -1
  16. package/src/assets/web-panel/assets/{Memory-BLFTgTpY.js → Memory-BMqOR7S-.js} +2 -2
  17. package/src/assets/web-panel/assets/{Notes-CFypT876.js → Notes-Cmas8i4E.js} +2 -2
  18. package/src/assets/web-panel/assets/{Organization-BOOqeyu_.js → Organization-DnSa58Tl.js} +4 -4
  19. package/src/assets/web-panel/assets/{P2P-D9xrbb8q.js → P2P-BxksIBWs.js} +2 -2
  20. package/src/assets/web-panel/assets/{Permissions-CidrpFWd.js → Permissions-Bq5Qn2s3.js} +4 -4
  21. package/src/assets/web-panel/assets/{Projects-D3Ycn8xG.js → Projects-B7EM0uPg.js} +1 -1
  22. package/src/assets/web-panel/assets/{Providers-D0kMUvHz.js → Providers-DAwgG5KV.js} +2 -2
  23. package/src/assets/web-panel/assets/{RssFeed-OQLesJxb.js → RssFeed-HSZoRXvS.js} +2 -2
  24. package/src/assets/web-panel/assets/{Security-BR4hAAkF.js → Security-Cz17qBny.js} +3 -3
  25. package/src/assets/web-panel/assets/{Services-BFMDfXE5.js → Services-D2EsLq-v.js} +1 -1
  26. package/src/assets/web-panel/assets/{Skills-BAf_mFKw.js → Skills-C9v-f3vZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{Tasks-DuNOWfjU.js → Tasks-yMEcU0n7.js} +1 -1
  28. package/src/assets/web-panel/assets/{Templates-buh__Yll.js → Templates-l7SvlKuB.js} +1 -1
  29. package/src/assets/web-panel/assets/{Wallet-vgS5USvW.js → Wallet-BHWhLWn9.js} +4 -4
  30. package/src/assets/web-panel/assets/{WebAuthn-BoL2UJ5Z.js → WebAuthn-kWhFYaUK.js} +4 -4
  31. package/src/assets/web-panel/assets/{antd-BQNxIyr-.js → antd-D6h4fDFf.js} +82 -82
  32. package/src/assets/web-panel/assets/{chat-BwUxWn7i.js → chat-BYmuDvol.js} +1 -1
  33. package/src/assets/web-panel/assets/{index-CCRLEutJ.js → index-ByUk2Wmr.js} +2 -2
  34. package/src/assets/web-panel/assets/{markdown-BeVIhIzs.js → markdown-BZsB-Dsv.js} +1 -1
  35. package/src/assets/web-panel/assets/ws-Dma34ig_.js +1 -0
  36. package/src/assets/web-panel/index.html +2 -2
  37. package/src/gateways/ws/action-protocol.js +101 -0
  38. package/src/gateways/ws/message-dispatcher.js +3 -0
  39. package/src/gateways/ws/session-protocol.js +2 -0
  40. package/src/gateways/ws/ws-agent-handler.js +1 -0
  41. package/src/gateways/ws/ws-server.js +18 -0
  42. package/src/gateways/ws/ws-session-gateway.js +1 -0
  43. package/src/lib/cowork-task-runner.js +55 -3
  44. package/src/lib/cowork-task-templates.js +105 -0
  45. package/src/lib/sub-agent-context.js +26 -0
  46. package/src/runtime/agent-core.js +6 -1
  47. package/src/runtime/coding-agent-shell-policy.cjs +16 -1
  48. package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +0 -1
  49. package/src/assets/web-panel/assets/Cowork-DY0Jcql7.js +0 -48
  50. package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +0 -1
  51. package/src/assets/web-panel/assets/ws-B4fo9ew1.js +0 -1
@@ -556,6 +556,7 @@ async function executeToolInner(
556
556
  externalToolDescriptors,
557
557
  externalToolExecutors,
558
558
  mcpClient,
559
+ shellPolicyOverrides,
559
560
  },
560
561
  ) {
561
562
  const localToolDescriptor =
@@ -694,7 +695,10 @@ async function executeToolInner(
694
695
  }
695
696
 
696
697
  case "run_shell": {
697
- const shellPolicy = evaluateShellCommandPolicy(args.command);
698
+ const shellPolicyOpts = shellPolicyOverrides
699
+ ? { overrideRuleIds: shellPolicyOverrides }
700
+ : {};
701
+ const shellPolicy = evaluateShellCommandPolicy(args.command, shellPolicyOpts);
698
702
  const override = getRuntimeToolDescriptorByCommand(args.command);
699
703
  if (!shellPolicy.allowed) {
700
704
  return attachDescriptor(
@@ -1629,6 +1633,7 @@ export async function* agentLoop(messages, options) {
1629
1633
  mcpClient: options.mcpClient || null,
1630
1634
  parentMessages: messages, // pass parent messages for sub-agent auto-condensation
1631
1635
  interaction: options.interaction || null,
1636
+ shellPolicyOverrides: options.shellPolicyOverrides || null,
1632
1637
  };
1633
1638
 
1634
1639
  throwIfAborted(signal);
@@ -165,7 +165,7 @@ function normalizeShellCommand(command) {
165
165
  return splitFirstCommandSegment(command).replace(/\s+/g, " ").trim();
166
166
  }
167
167
 
168
- function evaluateShellCommandPolicy(command) {
168
+ function evaluateShellCommandPolicy(command, options = {}) {
169
169
  const normalized = normalizeShellCommand(command);
170
170
  const tokens = tokenizeShellCommand(normalized);
171
171
  const firstToken = (tokens[0] || "").toLowerCase();
@@ -178,6 +178,11 @@ function evaluateShellCommandPolicy(command) {
178
178
  secondToken,
179
179
  };
180
180
 
181
+ // Rule IDs that should be downgraded from DENY to WARN (e.g. cowork web-research)
182
+ const overrideRuleIds = Array.isArray(options.overrideRuleIds)
183
+ ? new Set(options.overrideRuleIds)
184
+ : new Set();
185
+
181
186
  if (!normalized) {
182
187
  return {
183
188
  allowed: false,
@@ -190,6 +195,16 @@ function evaluateShellCommandPolicy(command) {
190
195
 
191
196
  const blockedRule = BLOCKED_SHELL_RULES.find((rule) => rule.test(context));
192
197
  if (blockedRule) {
198
+ // If the rule is overridden, downgrade from DENY to WARN (allowed)
199
+ if (overrideRuleIds.has(blockedRule.id)) {
200
+ return {
201
+ allowed: true,
202
+ decision: SHELL_POLICY_DECISIONS.WARN,
203
+ reason: `${blockedRule.reason} (overridden by session policy)`,
204
+ ruleId: blockedRule.id,
205
+ normalizedCommand: normalized,
206
+ };
207
+ }
193
208
  return {
194
209
  allowed: false,
195
210
  decision: blockedRule.decision,
@@ -1 +0,0 @@
1
- .cowork-root[data-v-4c6b3e9c]{display:flex;height:calc(100vh - 104px);gap:16px}.template-panel[data-v-4c6b3e9c]{width:280px;flex-shrink:0;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.template-header[data-v-4c6b3e9c]{padding:16px 16px 8px;display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:var(--text-primary)}.header-icon[data-v-4c6b3e9c]{font-size:18px;color:#1677ff}.template-hint[data-v-4c6b3e9c]{padding:0 16px 12px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border-color)}.template-list[data-v-4c6b3e9c]{flex:1;overflow-y:auto;padding:8px}.template-card[data-v-4c6b3e9c]{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:all .15s;margin-bottom:4px;border:1px solid transparent}.template-card[data-v-4c6b3e9c]:hover{background:var(--bg-card-hover)}.template-card.active[data-v-4c6b3e9c]{background:#1677ff14;border-color:#1677ff4d}.template-card.free .card-icon[data-v-4c6b3e9c]{color:#faad14}.card-icon[data-v-4c6b3e9c]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:16px;color:#1677ff;background:#1677ff14;border-radius:8px;flex-shrink:0;margin-top:2px}.card-name[data-v-4c6b3e9c]{font-size:13px;font-weight:500;color:var(--text-primary)}.card-desc[data-v-4c6b3e9c]{font-size:11px;color:var(--text-muted);margin-top:2px;line-height:1.4}.file-zone[data-v-4c6b3e9c]{padding:12px;border-top:1px solid var(--border-color);text-align:center;transition:background .2s}.file-zone.dragging[data-v-4c6b3e9c]{background:#1677ff14}.drop-icon[data-v-4c6b3e9c]{font-size:20px;color:var(--text-muted)}.drop-text[data-v-4c6b3e9c]{font-size:11px;color:var(--text-muted);margin:4px 0 8px}.file-list[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px;justify-content:center}.file-tag[data-v-4c6b3e9c]{max-width:140px;overflow:hidden;text-overflow:ellipsis;font-size:11px}.path-input[data-v-4c6b3e9c]{font-size:11px}.exec-panel[data-v-4c6b3e9c]{flex:1;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.empty-state[data-v-4c6b3e9c],.ready-state[data-v-4c6b3e9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 24px}.empty-icon[data-v-4c6b3e9c]{font-size:48px;color:#1677ff40;margin-bottom:16px}.empty-title[data-v-4c6b3e9c]{font-size:16px;color:var(--text-primary);margin-bottom:6px}.empty-sub[data-v-4c6b3e9c]{font-size:13px;color:var(--text-muted);margin-bottom:24px}.ready-header[data-v-4c6b3e9c]{display:flex;align-items:center;gap:10px;margin-bottom:20px}.ready-icon[data-v-4c6b3e9c]{font-size:28px;color:#1677ff}.ready-name[data-v-4c6b3e9c]{font-size:18px;font-weight:600;color:var(--text-primary)}.ready-examples[data-v-4c6b3e9c]{text-align:center}.example-label[data-v-4c6b3e9c]{font-size:13px;color:var(--text-muted);margin-bottom:12px}.example-grid[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;max-width:500px}.example-chip[data-v-4c6b3e9c]{padding:6px 14px;border-radius:16px;font-size:12px;color:var(--text-primary);background:var(--bg-card-hover);border:1px solid var(--border-color);cursor:pointer;transition:all .15s}.example-chip[data-v-4c6b3e9c]:hover{border-color:#1677ff;background:#1677ff14;color:#1677ff}.messages-area[data-v-4c6b3e9c]{flex:1;overflow-y:auto;padding:20px}.message-row[data-v-4c6b3e9c]{margin-bottom:16px}.user-msg[data-v-4c6b3e9c]{display:flex;justify-content:flex-end}.assistant-msg[data-v-4c6b3e9c]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-4c6b3e9c]{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-4c6b3e9c]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-4c6b3e9c]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-4c6b3e9c]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-4c6b3e9c]:after{content:"○";animation:blink-4c6b3e9c .7s step-start infinite;color:#1677ff}@keyframes blink-4c6b3e9c{50%{opacity:0}}.tool-msg[data-v-4c6b3e9c]{margin:8px 0}.tool-collapse[data-v-4c6b3e9c]{border:1px solid var(--border-color);border-radius:6px;background:var(--bg-card)}.tool-input[data-v-4c6b3e9c]{margin:0;font-size:11px;color:#aaa;white-space:pre-wrap}.tool-result-box[data-v-4c6b3e9c]{margin-top:8px;padding-top:8px;border-top:1px solid var(--border-color)}.tool-result[data-v-4c6b3e9c]{margin:0;font-size:11px;color:#52c41a;white-space:pre-wrap}.question-card[data-v-4c6b3e9c]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-4c6b3e9c]{color:#aaa;font-size:13px}.question-choices[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.input-area[data-v-4c6b3e9c]{padding:12px 16px 16px;border-top:1px solid var(--border-color)}.input-context[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}.context-tag[data-v-4c6b3e9c]{font-size:11px}.context-tag.file[data-v-4c6b3e9c]{background:var(--bg-card-hover)}.input-row[data-v-4c6b3e9c]{display:flex;gap:8px;align-items:flex-end}.msg-input[data-v-4c6b3e9c]{flex:1;background:var(--bg-card-hover);border-color:var(--border-color);color:var(--text-primary);resize:none}.send-btn[data-v-4c6b3e9c]{height:40px}[data-v-4c6b3e9c] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-4c6b3e9c] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-4c6b3e9c] .bubble.assistant p{margin:0 0 8px}[data-v-4c6b3e9c] .bubble.assistant p:last-child{margin:0}
@@ -1,48 +0,0 @@
1
- import{V as ee,f as m,c as D,w as te,o as se,a3 as o,a1 as a,k as g,u as n,F as f,a7 as y,a2 as B,A as H,a5 as d,a4 as O,W as k,a6 as U,Z as w,a9 as ne,X as S,Y as l,G,n as J}from"./vendor-CN0Iv_qZ.js";import{m as K,H as j}from"./markdown-BeVIhIzs.js";/* empty css */import{u as ae}from"./ws-B4fo9ew1.js";import{u as x}from"./chat-BwUxWn7i.js";import{_ as le}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as P,T as oe,v as W,o as ie,G as ce,r as re,j as ue,w as de,x as pe,m as me,y as ve,b as ge,u as he}from"./antd-BQNxIyr-.js";const Z=[{id:"doc-convert",name:"文档格式转换",icon:"FileTextOutlined",category:"document",description:"Word、Markdown、HTML、PDF 之间的格式互转",examples:["把 report.docx 转成 PDF","合并多个 Markdown 为一个文档","把 Excel 导出为 PDF"],acceptsFiles:!0},{id:"media-process",name:"音视频处理",icon:"PlayCircleOutlined",category:"media",description:"视频压缩、音频提取、格式转换、剪辑",examples:["提取 MP4 的音频","压缩视频到 50MB 以内","剪辑 10:30 到 25:00 的片段"],acceptsFiles:!0},{id:"data-analysis",name:"数据分析",icon:"BarChartOutlined",category:"data",description:"CSV/Excel 分析、统计、可视化图表",examples:["分析 sales.csv 的月度趋势","清洗数据去重修复格式","比较两个 CSV 的差异"],acceptsFiles:!0},{id:"web-research",name:"信息检索与调研",icon:"SearchOutlined",category:"research",description:"网页抓取、API 调用、多源信息汇总",examples:["调研 AI Agent 框架对比","查询实时汇率","抓取网页内容并翻译"],acceptsFiles:!1},{id:"image-process",name:"图片处理",icon:"PictureOutlined",category:"media",description:"批量压缩、格式转换、加水印、OCR",examples:["批量压缩到 500KB","加水印文字","识别图上的文字 (OCR)"],acceptsFiles:!0},{id:"code-helper",name:"代码辅助",icon:"CodeOutlined",category:"development",description:"生成脚本、调试代码、自动化任务",examples:["写一个批量重命名脚本","调试这段报错代码","生成 REST API 脚手架"],acceptsFiles:!0},{id:"system-admin",name:"系统运维",icon:"DesktopOutlined",category:"system",description:"磁盘分析、进程管理、日志分析",examples:["查看磁盘使用情况","找出最大的 10 个文件","列出占用端口的进程"],acceptsFiles:!1},{id:"file-organize",name:"文件整理",icon:"FolderOpenOutlined",category:"file",description:"批量重命名、分类整理、查找重复",examples:["按文件类型分类整理","批量重命名去空格","打包排除 node_modules"],acceptsFiles:!1},{id:"network-tools",name:"网络工具",icon:"GlobalOutlined",category:"network",description:"API 调试、网页抓取、网络诊断",examples:["测试 API 接口","抓取网页图片链接","ping 测试网络延迟"],acceptsFiles:!1},{id:"learning-assist",name:"学习辅助",icon:"ReadOutlined",category:"learning",description:"文档翻译、内容总结、论文分析",examples:["翻译 PDF 摘要","总结长文档要点","解释代码工作原理"],acceptsFiles:!0}],_e=ee("cowork",()=>{const F=m(null),t=m([]),v=m(!1),_=m([]),p=m([]),h=m(null),r=m(null);function I(e){F.value=e,T()}function T(){_.value=[],p.value=[],h.value=null,v.value=!1,r.value=null}function N(e){t.value.includes(e)||t.value.push(e)}function Q(e){t.value=t.value.filter(c=>c!==e)}const A=`## 开源工具优先 + 自动安装规则
2
-
3
- ### 第一步: 检查 cli-anything 已注册技能
4
- 先执行 list_skills 查看是否已有 cli-anything-* 技能(如 cli-anything-ffmpeg、cli-anything-pandoc)。
5
- 如果有,优先用 run_skill 调用:
6
- run_skill cli-anything-ffmpeg "用户的自然语言需求"
7
- cli-anything 会自动将自然语言翻译为正确的 CLI 命令,成功率更高。
8
-
9
- ### 第二步: 工具不存在时自动安装
10
- 当所需工具未安装时,直接自动安装,不要询问用户:
11
- 1. Python 包 (pandas/Pillow/pytesseract/...): run_code 的 auto-install 自动处理
12
- 2. npm 包: run_shell: npm install -g <package>
13
- 3. 系统级开源工具:
14
- - Windows: winget install <winget-id> --accept-package-agreements --accept-source-agreements
15
- - 备选: choco install <pkg> -y
16
- - macOS: brew install <pkg>
17
- 4. 安装后验证: <tool> --version
18
- 5. 只有在安装失败且无替代方案时才告知用户
19
-
20
- ### 第三步: 尝试注册为 cli-anything 技能
21
- 安装完底层工具后,尝试为其创建 cli-anything 包装器:
22
- run_shell: chainlesschain cli-anything register <tool> --force --json
23
- 如果成功,后续可用 run_skill cli-anything-<tool> 自然语言调用。
24
- 如果失败(如 cli-anything 未装),直接 run_shell 调用原始工具也可以。
25
-
26
- ### 工具优先级总结
27
- cli-anything 已注册技能 > 直接调用开源工具 CLI > Python/Node 开源库 > 告知用户
28
-
29
- ### 常用开源工具速查
30
- | 工具 | winget ID | 用途 |
31
- | ffmpeg | Gyan.FFmpeg | 音视频处理 |
32
- | pandoc | JohnMacFarlane.Pandoc | 文档格式转换 |
33
- | LibreOffice | TheDocumentFoundation.LibreOffice | Office 文档 |
34
- | Tesseract | UB-Mannheim.TesseractOCR | OCR 文字识别 |
35
- | ImageMagick | ImageMagick.ImageMagick | 图片处理 |
36
- | Ghostscript | ArtifexSoftware.GhostScript | PDF 处理 |
37
- | 7-Zip | 7zip.7zip | 压缩解压 |
38
- | GraphViz | Graphviz.Graphviz | 图表生成 |
39
- | yt-dlp | yt-dlp.yt-dlp | 视频下载 |
40
- | jq | jqlang.jq | JSON 处理 |
41
- `;async function L(e){const c=x();v.value=!0;const u=F.value;let E=A;u&&(E+=`
42
-
43
- ## 当前任务类型: ${u.name}
44
- ${u.description||""}`);let z=e;t.value.length&&(z+=`
45
-
46
- [用户提供的文件: ${t.value.join(", ")}]`),p.value.push({role:"user",content:e,timestamp:Date.now()});const M=await c.createSession("agent",{systemPromptExtension:E});r.value=M,await c.sendMessage(M,z)}async function $(e){const c=ae();v.value=!0,p.value.push({role:"user",content:e,timestamp:Date.now()});try{await c.waitConnected(8e3);const u=await c.sendRaw({type:"cowork-task",templateId:F.value?.id||null,userMessage:e,files:t.value},3e5);p.value.push({role:"assistant",content:u.summary||"(No output)",timestamp:Date.now(),toolsUsed:u.toolsUsed||[],iterationCount:u.iterationCount||0}),h.value=u}catch(u){p.value.push({role:"assistant",content:`Error: ${u.message}`,timestamp:Date.now()})}finally{v.value=!1}}const q=D(()=>r.value?x().getMessages(r.value):[]),V=D(()=>{if(!r.value)return null;const c=x().streaming[r.value];return c?.active?c.content:null}),b=D(()=>r.value&&x().pendingQuestion[r.value]||null);function R(e){if(!r.value)return;x().answerQuestion(r.value,e)}async function i(e){if(!r.value)return;const c=x();p.value.push({role:"user",content:e,timestamp:Date.now()});let u=e;t.value.length&&(u+=`
47
-
48
- [用户提供的文件: ${t.value.join(", ")}]`),await c.sendMessage(r.value,u)}return{selectedTemplate:F,files:t,isRunning:v,steps:_,messages:p,result:h,agentSessionId:r,currentAgentMessages:q,currentStreaming:V,currentQuestion:b,selectTemplate:I,reset:T,addFile:N,removeFile:Q,execute:L,executeDirectWs:$,sendFollowUp:i,answerQuestion:R,TASK_TEMPLATES:Z}}),fe={class:"cowork-root"},ye={class:"template-panel"},ke={class:"template-header"},we={class:"template-list"},Se=["onClick"],xe={class:"card-icon"},Te={class:"card-body"},Ce={class:"card-name"},Oe={class:"card-desc"},Fe={class:"card-icon"},be={class:"drop-text"},Me={key:0,class:"file-list"},Pe={class:"exec-panel"},De={key:0,class:"empty-state"},Ie={class:"empty-icon"},Ae={class:"example-grid"},Le=["onClick"],$e={key:1,class:"ready-state"},Re={class:"ready-header"},Ee={class:"ready-name"},ze={class:"ready-examples"},Be=["onClick"],Ge={key:0,class:"tool-msg"},Ne={class:"tool-input"},Qe={key:0,class:"tool-result-box"},qe={class:"tool-result"},Ve={key:1,class:"user-msg"},He={class:"bubble user"},Ue={key:2,class:"assistant-msg"},je=["innerHTML"],Je={key:0,class:"assistant-msg"},Ke=["innerHTML"],We={key:1,class:"question-card"},Ze={class:"question-text"},Xe={key:0,class:"question-choices"},Ye={class:"input-area"},et={key:0,class:"input-context"},tt={class:"input-row"},st={__name:"Cowork",setup(F){K.setOptions({highlight:(i,e)=>e&&j.getLanguage(e)?j.highlight(i,{language:e}).value:j.highlightAuto(i).value,breaks:!0});const t=_e(),v=x(),_=m(""),p=m(null),h=m(!1),r=m(""),I=m(!1),T={FileTextOutlined:ge,PlayCircleOutlined:ve,BarChartOutlined:me,SearchOutlined:pe,PictureOutlined:de,CodeOutlined:ue,DesktopOutlined:re,FolderOpenOutlined:W,GlobalOutlined:ce,ReadOutlined:ie},N=["把 report.docx 转成 PDF","压缩视频到 50MB","分析 CSV 生成图表","查询今天的汇率","批量压缩图片","写一个自动化脚本"],Q=D(()=>v.isLoading?"等待响应中...":t.selectedTemplate?t.selectedTemplate.examples?.[0]||"描述你的需求...":"描述你想完成的任务,Agent 会帮你搞定"),A=D(()=>t.currentAgentMessages);function L(i){try{return K(i||"")}catch{return i||""}}function $(i){return i.split(/[\\/]/).pop()||i}function q(i){h.value=!1;const e=i.dataTransfer?.files;if(e)for(const c of e)t.addFile(c.path||c.name)}function V(){const i=r.value.trim();i&&(t.addFile(i),r.value="")}async function b(){const i=_.value.trim();!i||v.isLoading||(_.value="",t.agentSessionId?await t.sendFollowUp(i):await t.execute(i))}function R(i){_.value=i,J(()=>b())}return te([A,()=>t.currentStreaming],()=>{J(()=>{p.value&&(p.value.scrollTop=p.value.scrollHeight)})},{deep:!0}),se(()=>{v.loadSessions()}),(i,e)=>{const c=S("a-tag"),u=S("a-input"),E=S("a-collapse-panel"),z=S("a-collapse"),M=S("a-button"),X=S("a-input-search"),Y=S("a-textarea");return l(),o("div",fe,[a("div",ye,[a("div",ke,[g(n(P),{class:"header-icon"}),e[5]||(e[5]=a("span",{class:"header-title"},"日常协作",-1))]),e[7]||(e[7]=a("div",{class:"template-hint"},"选择任务类型,或直接输入需求",-1)),a("div",we,[(l(!0),o(f,null,y(n(Z),s=>(l(),o("div",{key:s.id,class:B(["template-card",{active:n(t).selectedTemplate?.id===s.id}]),onClick:C=>n(t).selectTemplate(s)},[a("div",xe,[(l(),k(U(T[s.icon]||n(P))))]),a("div",Te,[a("div",Ce,d(s.name),1),a("div",Oe,d(s.description),1)])],10,Se))),128)),a("div",{class:B(["template-card free",{active:n(t).selectedTemplate===null&&I.value}]),onClick:e[0]||(e[0]=s=>{n(t).selectTemplate(null),I.value=!0})},[a("div",Fe,[g(n(oe))]),e[6]||(e[6]=a("div",{class:"card-body"},[a("div",{class:"card-name"},"自由提问"),a("div",{class:"card-desc"},"任意任务,Agent 自主完成")],-1))],2)]),n(t).selectedTemplate?.acceptsFiles!==!1?(l(),o("div",{key:0,class:B(["file-zone",{dragging:h.value}]),onDragover:e[2]||(e[2]=H(s=>h.value=!0,["prevent"])),onDragleave:e[3]||(e[3]=s=>h.value=!1),onDrop:H(q,["prevent"])},[g(n(W),{class:"drop-icon"}),a("div",be,d(h.value?"松开以添加文件":"拖拽文件到此处"),1),n(t).files.length?(l(),o("div",Me,[(l(!0),o(f,null,y(n(t).files,s=>(l(),k(c,{key:s,closable:"",onClose:C=>n(t).removeFile(s),class:"file-tag"},{default:w(()=>[G(d($(s)),1)]),_:2},1032,["onClose"]))),128))])):O("",!0),g(u,{value:r.value,"onUpdate:value":e[1]||(e[1]=s=>r.value=s),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:V},null,8,["value"])],34)):O("",!0)]),a("div",Pe,[!n(t).agentSessionId&&!n(t).selectedTemplate?(l(),o("div",De,[a("div",Ie,[g(n(P))]),e[8]||(e[8]=a("div",{class:"empty-title"},"选择一个任务模板开始",-1)),e[9]||(e[9]=a("div",{class:"empty-sub"},"或选择「自由提问」处理任何问题",-1)),a("div",Ae,[(l(),o(f,null,y(N,s=>a("div",{key:s,class:"example-chip",onClick:C=>R(s)},d(s),9,Le)),64))])])):n(t).selectedTemplate&&!n(t).agentSessionId?(l(),o("div",$e,[a("div",Re,[(l(),k(U(T[n(t).selectedTemplate.icon]||n(P)),{class:"ready-icon"})),a("span",Ee,d(n(t).selectedTemplate.name),1)]),a("div",ze,[e[10]||(e[10]=a("div",{class:"example-label"},"试试这些:",-1)),(l(!0),o(f,null,y(n(t).selectedTemplate.examples,s=>(l(),o("div",{key:s,class:"example-chip",onClick:C=>R(s)},d(s),9,Be))),128))])])):(l(),o("div",{key:2,class:"messages-area",ref_key:"messagesEl",ref:p},[(l(!0),o(f,null,y(A.value,(s,C)=>(l(),o("div",{key:C,class:B(["message-row",s.role])},[s.role==="tool"?(l(),o("div",Ge,[g(z,{ghost:"",size:"small"},{default:w(()=>[g(E,{header:`🔧 ${s.tool} ${s.status==="running"?"(执行中...)":"✓"}`,class:"tool-collapse"},{default:w(()=>[a("pre",Ne,d(JSON.stringify(s.input,null,2)),1),s.result?(l(),o("div",Qe,[a("pre",qe,d(typeof s.result=="string"?s.result:JSON.stringify(s.result,null,2)),1)])):O("",!0)]),_:2},1032,["header"])]),_:2},1024)])):s.role==="user"?(l(),o("div",Ve,[a("div",He,d(s.content),1)])):(l(),o("div",Ue,[e[11]||(e[11]=a("div",{class:"avatar"},"AI",-1)),a("div",{class:"bubble assistant",innerHTML:L(s.content)},null,8,je)]))],2))),128)),n(t).currentStreaming?(l(),o("div",Je,[e[12]||(e[12]=a("div",{class:"avatar"},"AI",-1)),a("div",{class:"bubble assistant streaming",innerHTML:L(n(t).currentStreaming)},null,8,Ke)])):O("",!0),n(t).currentQuestion?(l(),o("div",We,[a("div",Ze,d(n(t).currentQuestion.question),1),n(t).currentQuestion.choices?.length?(l(),o("div",Xe,[(l(!0),o(f,null,y(n(t).currentQuestion.choices,s=>(l(),k(M,{key:s,size:"small",onClick:C=>n(t).answerQuestion(s)},{default:w(()=>[G(d(s),1)]),_:2},1032,["onClick"]))),128))])):(l(),k(X,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:n(t).answerQuestion},null,8,["onSearch"]))])):O("",!0)],512)),a("div",Ye,[n(t).selectedTemplate?(l(),o("div",et,[g(c,{color:"blue",class:"context-tag"},{default:w(()=>[(l(),k(U(T[n(t).selectedTemplate.icon]||n(P)))),G(" "+d(n(t).selectedTemplate.name),1)]),_:1}),(l(!0),o(f,null,y(n(t).files,s=>(l(),k(c,{key:s,class:"context-tag file"},{default:w(()=>[G(d($(s)),1)]),_:2},1024))),128))])):O("",!0),a("div",tt,[g(Y,{value:_.value,"onUpdate:value":e[4]||(e[4]=s=>_.value=s),placeholder:Q.value,"auto-size":{minRows:1,maxRows:6},disabled:n(v).isLoading,class:"msg-input",onKeydown:ne(H(b,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),g(M,{type:"primary",loading:n(v).isLoading,class:"send-btn",onClick:b},{icon:w(()=>[g(n(he))]),_:1},8,["loading"])])])])])}}},ut=le(st,[["__scopeId","data-v-4c6b3e9c"]]);export{ut as default};
@@ -1 +0,0 @@
1
- .stat-card[data-v-c2d8ed1e]{background:var(--bg-card)!important;border-color:var(--border-color)!important;transition:border-color .2s}.stat-card[data-v-c2d8ed1e]:hover{border-color:var(--text-muted)!important}.stat-header[data-v-c2d8ed1e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.stat-label[data-v-c2d8ed1e]{color:var(--text-secondary);font-size:12px}.stat-value[data-v-c2d8ed1e]{font-size:22px;font-weight:600;line-height:1.2;margin-bottom:4px}.stat-sub[data-v-c2d8ed1e]{color:var(--text-muted);font-size:11px}.gateway-card[data-v-c2d8ed1e]{border-left:3px solid #1677ff!important}.status-log[data-v-c2d8ed1e]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:6px;padding:10px 14px;color:var(--text-secondary);font-size:11px;font-family:Consolas,monospace;max-height:200px;overflow-y:auto;white-space:pre-wrap;margin:0;line-height:1.6}.telemetry-card[data-v-c2d8ed1e]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:8px;padding:14px;height:100%}.telemetry-filter[data-v-c2d8ed1e]{display:flex;flex-direction:column;gap:6px}.telemetry-filter-label[data-v-c2d8ed1e]{color:var(--text-muted);font-size:12px}.telemetry-label[data-v-c2d8ed1e]{color:var(--text-muted);font-size:12px;margin-bottom:6px}.telemetry-value[data-v-c2d8ed1e]{color:#91caff;font-size:24px;font-weight:600;line-height:1.2}.telemetry-sub[data-v-c2d8ed1e]{color:var(--text-secondary);font-size:11px;margin-top:4px}.telemetry-section[data-v-c2d8ed1e]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:8px;padding:14px;min-height:140px}.telemetry-section-title[data-v-c2d8ed1e]{color:var(--text-secondary);font-size:12px;margin-bottom:10px}.telemetry-list[data-v-c2d8ed1e]{display:flex;flex-direction:column;gap:8px}.telemetry-row[data-v-c2d8ed1e]{display:flex;justify-content:space-between;gap:12px;color:var(--text-secondary);font-size:12px}.telemetry-empty[data-v-c2d8ed1e]{color:var(--text-muted);font-size:12px}
@@ -1 +0,0 @@
1
- import{V as U,f as I,c as B}from"./vendor-CN0Iv_qZ.js";let F=0;const v=()=>`wp-${++F}`,b=new Set;function d(e,r={},n={}){return{type:e,kind:n.kind||"server",sessionId:n.sessionId||r.sessionId||null,timestamp:n.timestamp||Date.now(),payload:r}}function G(e){const r=e?.type,n=e?.payload||{};switch(r){case"task:notification":return d("task:notification",{task:e.task||n.task},{kind:"server"});case"session-created":case"session.started":return d("session:start",{sessionId:e.sessionId||n.sessionId,sessionType:e.sessionType||n.sessionType||null,record:e.record||n.record||{id:e.sessionId||n.sessionId,type:e.sessionType||n.sessionType||null,status:"created",history:[],messageCount:0}},{kind:"server",sessionId:e.sessionId||n.sessionId});case"session-resumed":case"session.resumed":{const u=e.sessionId||n.sessionId,c=e.history||n.history||[];return d("session:resume",{sessionId:u,history:c,historyCount:Array.isArray(c)?c.length:0,record:e.record||n.record||{id:u,type:null,status:"resumed",history:c,messageCount:Array.isArray(c)?c.length:0}},{kind:"server",sessionId:u})}case"worktree-diff":case"worktree.diff":return d("worktree:diff:ready",{requestId:e.requestId||e.id||null,record:e.record||n.record||{branch:e.branch||n.branch||null,summary:e.summary||n.summary||null,previewEntrypoints:[{type:"worktree-diff",branch:e.branch||n.branch||null}]}},{kind:"server"});case"worktree-merged":case"worktree.merged":return d("worktree:merge:completed",{requestId:e.requestId||e.id||null,record:e.record||n.record||{branch:e.branch||n.branch||null,summary:e.summary||n.summary||null,conflicts:e.conflicts||n.conflicts||[],previewEntrypoints:e.previewEntrypoints||n.previewEntrypoints||[]}},{kind:"server"});case"compression-stats":case"context.compaction.completed":return d("compression:summary",{requestId:e.requestId||e.id||null,summary:e.summary||n.summary||{}},{kind:"server"});default:return null}}function P(e,r=null){b.forEach(n=>n(e,r||e))}function Q(e){if(!e)return null;const r=e.record||{id:e.id||null,type:e.type||null,provider:e.provider||null,model:e.model||null,projectRoot:e.projectRoot||null,messageCount:e.messageCount??0,history:e.history||[],status:e.status||null};return{...e,id:e.id||r.id,type:e.type||r.type,provider:e.provider||r.provider,model:e.model||r.model,projectRoot:e.projectRoot||r.projectRoot,messageCount:e.messageCount??r.messageCount??0,status:e.status||r.status||null,record:r}}const K=U("ws",()=>{const e=I(null),r=I("disconnected"),n=I(null),u=new Map,c=new Map;let C=null,m=1e3;const y=window.__CC_CONFIG__||{},R=B(()=>`ws://${y.wsHost||"127.0.0.1"}:${y.wsPort||18800}`);function h(){if(e.value?.readyState!==WebSocket.OPEN){r.value="connecting",n.value=null;try{const t=new WebSocket(R.value);e.value=t,t.onopen=()=>{m=1e3,y.wsToken?l({type:"auth",id:v(),token:y.wsToken}).then(()=>{r.value="connected"}).catch(()=>{r.value="connected"}):r.value="connected"},t.onmessage=o=>{let s;try{s=JSON.parse(o.data)}catch{return}x(s)},t.onerror=()=>{n.value="WebSocket error",r.value="error"},t.onclose=()=>{r.value="disconnected",e.value=null,u.forEach(({reject:o})=>o(new Error("WebSocket closed"))),u.clear(),C=setTimeout(()=>{m=Math.min(m*2,3e4),h()},m)}}catch(t){r.value="error",n.value=t.message}}}function W(){clearTimeout(C),e.value?.close(),e.value=null,r.value="disconnected"}function T(t){if(!t.version&&!t.payload)return t;const o=t.payload||{};return{...t,...o,type:t.type,sessionId:t.sessionId||o.sessionId||null}}function x(t){const{type:o}=t,s=t.requestId||t.id;let i=!1;if(s&&u.has(s)){const{resolve:w,reject:O,timeout:S}=u.get(s);clearTimeout(S),u.delete(s),i=!0;const E=T(t);E.id=s,o==="error"?O(new Error(E.message||"Unknown error")):w(E)}const a=t.sessionId||t.payload&&t.payload.sessionId||null;if(a&&c.has(a)){const w=T(t);c.get(a).forEach(S=>S(w))}k.forEach(w=>w(t));const f=G(t);return f&&P(f,t),i}const k=new Set;function q(t){return k.add(t),()=>k.delete(t)}function J(t){return b.add(t),()=>b.delete(t)}function j(t,o){return c.has(t)||c.set(t,new Set),c.get(t).add(o),()=>{c.get(t)?.delete(o),c.get(t)?.size===0&&c.delete(t)}}function l(t,o=15e3){return new Promise((s,i)=>{if(e.value?.readyState!==WebSocket.OPEN){i(new Error("WebSocket not connected"));return}const a=t.id||v(),f=setTimeout(()=>{u.delete(a),i(new Error("Request timeout"))},o);u.set(a,{resolve:s,reject:i,timeout:f}),e.value.send(JSON.stringify({...t,id:a}))})}function p(t=8e3){return r.value==="connected"?Promise.resolve():new Promise((o,s)=>{const i=Date.now()+t,a=()=>{if(r.value==="connected")return o();if(r.value==="error"||Date.now()>=i)return s(new Error(`WS not ready: ${r.value}`));setTimeout(a,150)};r.value==="disconnected"&&h(),a()})}async function N(t,o=3e4){await p(8e3);const s=await l({type:"execute",command:t},o),i=s.output??s.stdout??"",a=s.stderr??"";return{output:i||a,exitCode:s.exitCode??0}}async function M(t,o=3e4){const{output:s,exitCode:i}=await N(t,o);if(i!==0)throw new Error(`Command failed: ${s}`);try{return JSON.parse(s.trim())}catch{const a=s.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(a)return JSON.parse(a[0]);throw new Error(`Invalid JSON output: ${s.slice(0,200)}`)}}async function _(t="chat",o=null,s={}){await p(8e3);const a={type:"session-create",id:v(),sessionType:t,projectRoot:o||y.projectRoot||null};return s.systemPromptExtension&&(a.systemPromptExtension=s.systemPromptExtension),(await l(a)).sessionId}function $(t,o){e.value?.readyState===WebSocket.OPEN&&e.value.send(JSON.stringify({type:"session-message",id:v(),sessionId:t,content:o}))}function A(t,o,s){e.value?.readyState===WebSocket.OPEN&&e.value.send(JSON.stringify({type:"session-answer",id:v(),sessionId:t,requestId:o,answer:s}))}async function D(){return await p(8e3),((await l({type:"session-list"},1e4)).sessions||[]).map(Q).filter(Boolean)}async function H(t){try{await l({type:"session-close",sessionId:t},5e3),P(d("session:end",{sessionId:t},{kind:"server",sessionId:t}),{type:"result",sessionId:t,success:!0})}catch{}}async function z(t){return await p(8e3),await l({type:"session-resume",sessionId:t},1e4)}return{status:r,error:n,wsUrl:R,connect:h,disconnect:W,waitConnected:p,onMessage:q,onRuntimeEvent:J,onSession:j,sendRaw:l,execute:N,executeJson:M,createSession:_,resumeSession:z,sendSessionMessage:$,answerQuestion:A,listSessions:D,closeSession:H}});export{K as u};