chainlesschain 0.45.80 → 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 (43) 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--dpzs0oZ.js → Analytics-C1AnPdMx.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-DWXapZbP.js → AppLayout-YdvJBMHH.js} +1 -1
  6. package/src/assets/web-panel/assets/{Backup-BoUUzGFw.js → Backup-D31iZX3l.js} +1 -1
  7. package/src/assets/web-panel/assets/{Chat-CkSlXBzN.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-xiBL6XfP.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-CmgEtUKl.js → Dashboard-HPh9FcPt.js} +2 -2
  13. package/src/assets/web-panel/assets/{Git-DCDjvp5Z.js → Git-hwQ1oZHj.js} +2 -2
  14. package/src/assets/web-panel/assets/{Logs-Qz-GLplC.js → Logs-4D9p6PRM.js} +1 -1
  15. package/src/assets/web-panel/assets/{McpTools-qYf_sT-Y.js → McpTools-CyAUjbbs.js} +1 -1
  16. package/src/assets/web-panel/assets/{Memory-BxoM2XNZ.js → Memory-BMqOR7S-.js} +2 -2
  17. package/src/assets/web-panel/assets/{Notes-DltR8wq4.js → Notes-Cmas8i4E.js} +2 -2
  18. package/src/assets/web-panel/assets/{Organization-7m_PX3yo.js → Organization-DnSa58Tl.js} +4 -4
  19. package/src/assets/web-panel/assets/{P2P-e88KqFBm.js → P2P-BxksIBWs.js} +2 -2
  20. package/src/assets/web-panel/assets/{Permissions-DAY4Xy1h.js → Permissions-Bq5Qn2s3.js} +4 -4
  21. package/src/assets/web-panel/assets/{Projects-ylUhg9th.js → Projects-B7EM0uPg.js} +1 -1
  22. package/src/assets/web-panel/assets/{Providers-DNIlBWLm.js → Providers-DAwgG5KV.js} +2 -2
  23. package/src/assets/web-panel/assets/{RssFeed-Dr_6vD69.js → RssFeed-HSZoRXvS.js} +2 -2
  24. package/src/assets/web-panel/assets/{Security-U57Q-VOj.js → Security-Cz17qBny.js} +3 -3
  25. package/src/assets/web-panel/assets/{Services-BUfO-jvr.js → Services-D2EsLq-v.js} +1 -1
  26. package/src/assets/web-panel/assets/{Skills-D0NYT7Q8.js → Skills-C9v-f3vZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{Tasks-WXqKX58l.js → Tasks-yMEcU0n7.js} +1 -1
  28. package/src/assets/web-panel/assets/{Templates-B1zfqNTe.js → Templates-l7SvlKuB.js} +1 -1
  29. package/src/assets/web-panel/assets/{Wallet-CUSPGN3F.js → Wallet-BHWhLWn9.js} +4 -4
  30. package/src/assets/web-panel/assets/{WebAuthn-ZGz__UJi.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/{index-BYqeR6ME.js → index-ByUk2Wmr.js} +2 -2
  33. package/src/assets/web-panel/assets/{markdown-BeVIhIzs.js → markdown-BZsB-Dsv.js} +1 -1
  34. package/src/assets/web-panel/index.html +2 -2
  35. package/src/gateways/ws/action-protocol.js +101 -0
  36. package/src/gateways/ws/message-dispatcher.js +3 -0
  37. package/src/gateways/ws/ws-server.js +18 -0
  38. package/src/lib/cowork-task-runner.js +49 -3
  39. package/src/lib/cowork-task-templates.js +103 -0
  40. package/src/lib/sub-agent-context.js +26 -0
  41. package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +0 -1
  42. package/src/assets/web-panel/assets/Cowork-DjAJ5ymV.js +0 -48
  43. package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +0 -1
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AppLayout-DWXapZbP.js","./vendor-CN0Iv_qZ.js","./ws-Dma34ig_.js","./_plugin-vue_export-helper-DlAUqK2U.js","./antd-BQNxIyr-.js","./AppLayout-cxfKLu-m.css","./Dashboard-CmgEtUKl.js","./chat-BYmuDvol.js","./Dashboard-CKeMmCoT.css","./Chat-CkSlXBzN.js","./markdown-BeVIhIzs.js","./Chat-DfR76jyX.css","./github-dark-Dfs9RUU9.css","./Cowork-DjAJ5ymV.js","./Cowork-CPqYhoMI.css","./Services-BUfO-jvr.js","./Services-C8Qs6KXv.css","./Logs-Qz-GLplC.js","./Logs-Gf_Mv9Nx.css","./Skills-D0NYT7Q8.js","./parsers-DftYMnlk.js","./Skills-BdjRyorN.css","./Providers-DNIlBWLm.js","./Providers-BEakqcO5.css","./McpTools-qYf_sT-Y.js","./McpTools-CyhSLDwf.css","./Notes-DltR8wq4.js","./Notes-BG69sJKi.css","./Memory-BxoM2XNZ.js","./Memory-DRghrGJr.css","./Cron-xiBL6XfP.js","./Tasks-WXqKX58l.js","./Tasks-BJjN_YEm.css","./Security-U57Q-VOj.js","./Security-Dwxw7rfP.css","./Permissions-DAY4Xy1h.js","./Permissions-C9WlkGl-.css","./P2P-e88KqFBm.js","./P2P-OEzOeMZX.css","./Git-DCDjvp5Z.js","./Git-DGcuBXST.css","./Projects-ylUhg9th.js","./Projects-DxKelI5h.css","./Wallet-CUSPGN3F.js","./Wallet-DnIumafl.css","./Organization-7m_PX3yo.js","./Organization-DdOOM4ic.css","./Analytics--dpzs0oZ.js","./Analytics-B4OM8S8X.css","./Templates-B1zfqNTe.js","./Templates-DOY_oZnm.css","./Backup-BoUUzGFw.js","./Backup-fZqtfC1m.css","./RssFeed-Dr_6vD69.js","./RssFeed-BlFC20eg.css","./WebAuthn-ZGz__UJi.js","./WebAuthn-CNPl2VQR.css"])))=>i.map(i=>d[i]);
2
- import{S as B,U as L,V as I,f as T,c as E,o as R,W as O,u as k,X as y,Y as V,Z as x,k as D,R as S,_ as w}from"./vendor-CN0Iv_qZ.js";import{a as g,A as M}from"./antd-BQNxIyr-.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))m(t);new MutationObserver(t=>{for(const o of t)if(o.type==="childList")for(const n of o.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&m(n)}).observe(document,{childList:!0,subtree:!0});function c(t){const o={};return t.integrity&&(o.integrity=t.integrity),t.referrerPolicy&&(o.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?o.credentials="include":t.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function m(t){if(t.ep)return;t.ep=!0;const o=c(t);fetch(t.href,o)}})();const C="modulepreload",N=function(s,a){return new URL(s,a).href},P={},e=function(a,c,m){let t=Promise.resolve();if(c&&c.length>0){let b=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};const n=document.getElementsByTagName("link"),r=document.querySelector("meta[property=csp-nonce]"),u=r?.nonce||r?.getAttribute("nonce");t=b(c.map(i=>{if(i=N(i,m),i in P)return;P[i]=!0;const d=i.endsWith(".css"),p=d?'[rel="stylesheet"]':"";if(m)for(let f=n.length-1;f>=0;f--){const _=n[f];if(_.href===i&&(!d||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${p}`))return;const l=document.createElement("link");if(l.rel=d?"stylesheet":C,d||(l.as="script"),l.crossOrigin="",l.href=i,u&&l.setAttribute("nonce",u),document.head.appendChild(l),d)return new Promise((f,_)=>{l.addEventListener("load",f),l.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${i}`)))})}))}function o(n){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=n,window.dispatchEvent(r),!r.defaultPrevented)throw n}return t.then(n=>{for(const r of n||[])r.status==="rejected"&&o(r.reason);return a().catch(o)})},U=[{path:"/",component:()=>e(()=>import("./AppLayout-DWXapZbP.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"Dashboard",component:()=>e(()=>import("./Dashboard-CmgEtUKl.js"),__vite__mapDeps([6,1,2,7,3,4,8]),import.meta.url)},{path:"chat",name:"Chat",component:()=>e(()=>import("./Chat-CkSlXBzN.js"),__vite__mapDeps([9,1,10,4,7,2,3,11,12]),import.meta.url)},{path:"cowork",name:"Cowork",component:()=>e(()=>import("./Cowork-DjAJ5ymV.js"),__vite__mapDeps([13,1,10,4,2,7,3,14,12]),import.meta.url)},{path:"services",name:"Services",component:()=>e(()=>import("./Services-BUfO-jvr.js"),__vite__mapDeps([15,2,1,3,4,16]),import.meta.url)},{path:"logs",name:"Logs",component:()=>e(()=>import("./Logs-Qz-GLplC.js"),__vite__mapDeps([17,2,1,3,4,18]),import.meta.url)},{path:"skills",name:"Skills",component:()=>e(()=>import("./Skills-D0NYT7Q8.js"),__vite__mapDeps([19,1,2,20,7,3,4,21]),import.meta.url)},{path:"providers",name:"Providers",component:()=>e(()=>import("./Providers-DNIlBWLm.js"),__vite__mapDeps([22,1,2,20,3,4,23]),import.meta.url)},{path:"mcp",name:"McpTools",component:()=>e(()=>import("./McpTools-qYf_sT-Y.js"),__vite__mapDeps([24,2,1,3,4,25]),import.meta.url)},{path:"notes",name:"Notes",component:()=>e(()=>import("./Notes-DltR8wq4.js"),__vite__mapDeps([26,2,1,3,4,27]),import.meta.url)},{path:"memory",name:"Memory",component:()=>e(()=>import("./Memory-BxoM2XNZ.js"),__vite__mapDeps([28,2,1,3,4,29]),import.meta.url)},{path:"cron",name:"Cron",component:()=>e(()=>import("./Cron-xiBL6XfP.js"),__vite__mapDeps([30,2,1,4]),import.meta.url)},{path:"tasks",name:"Tasks",component:()=>e(()=>import("./Tasks-WXqKX58l.js"),__vite__mapDeps([31,1,2,3,4,32]),import.meta.url)},{path:"security",name:"Security",component:()=>e(()=>import("./Security-U57Q-VOj.js"),__vite__mapDeps([33,2,1,3,4,34]),import.meta.url)},{path:"permissions",name:"Permissions",component:()=>e(()=>import("./Permissions-DAY4Xy1h.js"),__vite__mapDeps([35,2,1,3,4,36]),import.meta.url)},{path:"p2p",name:"P2P",component:()=>e(()=>import("./P2P-e88KqFBm.js"),__vite__mapDeps([37,2,1,3,4,38]),import.meta.url)},{path:"git",name:"Git",component:()=>e(()=>import("./Git-DCDjvp5Z.js"),__vite__mapDeps([39,2,1,3,4,40]),import.meta.url)},{path:"projects",name:"Projects",component:()=>e(()=>import("./Projects-ylUhg9th.js"),__vite__mapDeps([41,2,1,3,4,42]),import.meta.url)},{path:"wallet",name:"Wallet",component:()=>e(()=>import("./Wallet-CUSPGN3F.js"),__vite__mapDeps([43,2,1,3,4,44]),import.meta.url)},{path:"organization",name:"Organization",component:()=>e(()=>import("./Organization-7m_PX3yo.js"),__vite__mapDeps([45,1,2,3,4,46]),import.meta.url)},{path:"analytics",name:"Analytics",component:()=>e(()=>import("./Analytics--dpzs0oZ.js"),__vite__mapDeps([47,2,1,3,4,48]),import.meta.url)},{path:"templates",name:"Templates",component:()=>e(()=>import("./Templates-B1zfqNTe.js"),__vite__mapDeps([49,1,2,3,4,50]),import.meta.url)},{path:"backup",name:"Backup",component:()=>e(()=>import("./Backup-BoUUzGFw.js"),__vite__mapDeps([51,2,1,3,4,52]),import.meta.url)},{path:"rssfeed",name:"RssFeed",component:()=>e(()=>import("./RssFeed-Dr_6vD69.js"),__vite__mapDeps([53,1,2,3,4,54]),import.meta.url)},{path:"webauthn",name:"WebAuthn",component:()=>e(()=>import("./WebAuthn-ZGz__UJi.js"),__vite__mapDeps([55,2,1,3,4,56]),import.meta.url)}]}],F=B({history:L(),routes:U}),A="cc_theme",v={dark:{label:"暗黑",icon:"🌑",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#1677ff",colorBgBase:"#141414",colorBgContainer:"#1f1f1f",colorBgElevated:"#2a2a2a",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#1c1c1c",headerBg:"#1c1c1c",bodyBg:"#141414"},Menu:{darkItemBg:"#1c1c1c",darkSubMenuItemBg:"#171717"}}},vars:{"--bg-base":"#141414","--bg-sidebar":"#1c1c1c","--bg-header":"#1c1c1c","--bg-card":"#1f1f1f","--bg-card-hover":"#262626","--border-color":"#252525","--border-subtle":"#1e1e1e","--text-primary":"#e0e0e0","--text-secondary":"#888","--text-muted":"#444","--logo-text":"#ffffff","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,0,0,.45)","--group-title":"#3a3a3a"}},light:{label:"亮白",icon:"☀️",antd:{algorithm:g.defaultAlgorithm,token:{colorPrimary:"#1677ff",colorBgBase:"#ffffff",colorBgContainer:"#ffffff",colorBgElevated:"#ffffff",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#ffffff",headerBg:"#ffffff",bodyBg:"#f4f6fb"},Menu:{itemBg:"#ffffff"}}},vars:{"--bg-base":"#f4f6fb","--bg-sidebar":"#ffffff","--bg-header":"#ffffff","--bg-card":"#ffffff","--bg-card-hover":"#f0f4ff","--border-color":"#e8edf5","--border-subtle":"#f0f0f0","--text-primary":"#1a1a2e","--text-secondary":"#5a6474","--text-muted":"#b0b8c8","--logo-text":"#1a1a2e","--menu-mode":"light","--shadow-card":"0 2px 12px rgba(0,0,0,.07)","--group-title":"#aab0bc"}},blue:{label:"深蓝",icon:"🌊",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#2f80ed",colorBgBase:"#0d1117",colorBgContainer:"#161b22",colorBgElevated:"#1c2230",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#0f1923",headerBg:"#0f1923",bodyBg:"#0d1117"},Menu:{darkItemBg:"#0f1923",darkSubMenuItemBg:"#0b1520"}}},vars:{"--bg-base":"#0d1117","--bg-sidebar":"#0f1923","--bg-header":"#0f1923","--bg-card":"#161b22","--bg-card-hover":"#1c2230","--border-color":"#21303f","--border-subtle":"#182030","--text-primary":"#c9d8ef","--text-secondary":"#6e8caa","--text-muted":"#2d4060","--logo-text":"#e0eeff","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,40,80,.5)","--group-title":"#2d4060"}},green:{label:"翠绿",icon:"🌿",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#29a270",colorBgBase:"#0a1a12",colorBgContainer:"#0f2318",colorBgElevated:"#152e20",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#0c1e14",headerBg:"#0c1e14",bodyBg:"#0a1a12"},Menu:{darkItemBg:"#0c1e14",darkSubMenuItemBg:"#091810"}}},vars:{"--bg-base":"#0a1a12","--bg-sidebar":"#0c1e14","--bg-header":"#0c1e14","--bg-card":"#0f2318","--bg-card-hover":"#152e20","--border-color":"#1a3828","--border-subtle":"#122a1c","--text-primary":"#c0e8c8","--text-secondary":"#5a9a6a","--text-muted":"#1e4028","--logo-text":"#d8f0e0","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,40,20,.5)","--group-title":"#1e4028"}}},j=I("theme",()=>{const s=T(localStorage.getItem(A)||"light"),a=E(()=>v[s.value]||v.dark),c=E(()=>a.value.antd),m=E(()=>s.value!=="light");function t(){const r=a.value.vars,u=document.documentElement;for(const[b,i]of Object.entries(r))u.style.setProperty(b,i);u.setAttribute("data-theme",s.value)}function o(r){v[r]&&(s.value=r,localStorage.setItem(A,r),t())}function n(){t()}return{current:s,config:a,antdTheme:c,isDark:m,setTheme:o,init:n}}),W={__name:"App",setup(s){const a=j();return R(()=>a.init()),(c,m)=>{const t=y("router-view"),o=y("a-config-provider");return V(),O(o,{theme:k(a).antdTheme},{default:x(()=>[D(t)]),_:1},8,["theme"])}}},h=S(W);h.use(w());h.use(F);h.use(M);h.mount("#app");export{v as T,j as u};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AppLayout-YdvJBMHH.js","./vendor-CN0Iv_qZ.js","./ws-Dma34ig_.js","./_plugin-vue_export-helper-DlAUqK2U.js","./antd-D6h4fDFf.js","./AppLayout-cxfKLu-m.css","./Dashboard-HPh9FcPt.js","./chat-BYmuDvol.js","./Dashboard-BS-tzGNj.css","./Chat-DiXJ3TuK.js","./markdown-BZsB-Dsv.js","./Chat-DfR76jyX.css","./github-dark-Dfs9RUU9.css","./Cowork-BnrHWwZw.js","./Cowork-CcSoS3eX.css","./Services-D2EsLq-v.js","./Services-C8Qs6KXv.css","./Logs-4D9p6PRM.js","./Logs-Gf_Mv9Nx.css","./Skills-C9v-f3vZ.js","./parsers-DftYMnlk.js","./Skills-BdjRyorN.css","./Providers-DAwgG5KV.js","./Providers-BEakqcO5.css","./McpTools-CyAUjbbs.js","./McpTools-CyhSLDwf.css","./Notes-Cmas8i4E.js","./Notes-BG69sJKi.css","./Memory-BMqOR7S-.js","./Memory-DRghrGJr.css","./Cron-DBt1ueXh.js","./Tasks-yMEcU0n7.js","./Tasks-BJjN_YEm.css","./Security-Cz17qBny.js","./Security-Dwxw7rfP.css","./Permissions-Bq5Qn2s3.js","./Permissions-C9WlkGl-.css","./P2P-BxksIBWs.js","./P2P-OEzOeMZX.css","./Git-hwQ1oZHj.js","./Git-DGcuBXST.css","./Projects-B7EM0uPg.js","./Projects-DxKelI5h.css","./Wallet-BHWhLWn9.js","./Wallet-DnIumafl.css","./Organization-DnSa58Tl.js","./Organization-DdOOM4ic.css","./Analytics-C1AnPdMx.js","./Analytics-B4OM8S8X.css","./Templates-l7SvlKuB.js","./Templates-DOY_oZnm.css","./Backup-D31iZX3l.js","./Backup-fZqtfC1m.css","./RssFeed-HSZoRXvS.js","./RssFeed-BlFC20eg.css","./WebAuthn-kWhFYaUK.js","./WebAuthn-CNPl2VQR.css"])))=>i.map(i=>d[i]);
2
+ import{S as B,U as L,V as I,f as T,c as E,o as R,W as O,u as k,X as y,Y as V,Z as x,k as D,R as S,_ as w}from"./vendor-CN0Iv_qZ.js";import{a as g,A as M}from"./antd-D6h4fDFf.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))m(t);new MutationObserver(t=>{for(const o of t)if(o.type==="childList")for(const n of o.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&m(n)}).observe(document,{childList:!0,subtree:!0});function c(t){const o={};return t.integrity&&(o.integrity=t.integrity),t.referrerPolicy&&(o.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?o.credentials="include":t.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function m(t){if(t.ep)return;t.ep=!0;const o=c(t);fetch(t.href,o)}})();const C="modulepreload",N=function(s,a){return new URL(s,a).href},P={},e=function(a,c,m){let t=Promise.resolve();if(c&&c.length>0){let b=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(p=>({status:"fulfilled",value:p}),p=>({status:"rejected",reason:p}))))};const n=document.getElementsByTagName("link"),r=document.querySelector("meta[property=csp-nonce]"),u=r?.nonce||r?.getAttribute("nonce");t=b(c.map(i=>{if(i=N(i,m),i in P)return;P[i]=!0;const d=i.endsWith(".css"),p=d?'[rel="stylesheet"]':"";if(m)for(let f=n.length-1;f>=0;f--){const _=n[f];if(_.href===i&&(!d||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${p}`))return;const l=document.createElement("link");if(l.rel=d?"stylesheet":C,d||(l.as="script"),l.crossOrigin="",l.href=i,u&&l.setAttribute("nonce",u),document.head.appendChild(l),d)return new Promise((f,_)=>{l.addEventListener("load",f),l.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${i}`)))})}))}function o(n){const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=n,window.dispatchEvent(r),!r.defaultPrevented)throw n}return t.then(n=>{for(const r of n||[])r.status==="rejected"&&o(r.reason);return a().catch(o)})},U=[{path:"/",component:()=>e(()=>import("./AppLayout-YdvJBMHH.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"Dashboard",component:()=>e(()=>import("./Dashboard-HPh9FcPt.js"),__vite__mapDeps([6,1,2,7,3,4,8]),import.meta.url)},{path:"chat",name:"Chat",component:()=>e(()=>import("./Chat-DiXJ3TuK.js"),__vite__mapDeps([9,1,10,4,7,2,3,11,12]),import.meta.url)},{path:"cowork",name:"Cowork",component:()=>e(()=>import("./Cowork-BnrHWwZw.js"),__vite__mapDeps([13,1,10,4,2,7,3,14,12]),import.meta.url)},{path:"services",name:"Services",component:()=>e(()=>import("./Services-D2EsLq-v.js"),__vite__mapDeps([15,2,1,3,4,16]),import.meta.url)},{path:"logs",name:"Logs",component:()=>e(()=>import("./Logs-4D9p6PRM.js"),__vite__mapDeps([17,2,1,3,4,18]),import.meta.url)},{path:"skills",name:"Skills",component:()=>e(()=>import("./Skills-C9v-f3vZ.js"),__vite__mapDeps([19,1,2,20,7,3,4,21]),import.meta.url)},{path:"providers",name:"Providers",component:()=>e(()=>import("./Providers-DAwgG5KV.js"),__vite__mapDeps([22,1,2,20,3,4,23]),import.meta.url)},{path:"mcp",name:"McpTools",component:()=>e(()=>import("./McpTools-CyAUjbbs.js"),__vite__mapDeps([24,2,1,3,4,25]),import.meta.url)},{path:"notes",name:"Notes",component:()=>e(()=>import("./Notes-Cmas8i4E.js"),__vite__mapDeps([26,2,1,3,4,27]),import.meta.url)},{path:"memory",name:"Memory",component:()=>e(()=>import("./Memory-BMqOR7S-.js"),__vite__mapDeps([28,2,1,3,4,29]),import.meta.url)},{path:"cron",name:"Cron",component:()=>e(()=>import("./Cron-DBt1ueXh.js"),__vite__mapDeps([30,2,1,4]),import.meta.url)},{path:"tasks",name:"Tasks",component:()=>e(()=>import("./Tasks-yMEcU0n7.js"),__vite__mapDeps([31,1,2,3,4,32]),import.meta.url)},{path:"security",name:"Security",component:()=>e(()=>import("./Security-Cz17qBny.js"),__vite__mapDeps([33,2,1,3,4,34]),import.meta.url)},{path:"permissions",name:"Permissions",component:()=>e(()=>import("./Permissions-Bq5Qn2s3.js"),__vite__mapDeps([35,2,1,3,4,36]),import.meta.url)},{path:"p2p",name:"P2P",component:()=>e(()=>import("./P2P-BxksIBWs.js"),__vite__mapDeps([37,2,1,3,4,38]),import.meta.url)},{path:"git",name:"Git",component:()=>e(()=>import("./Git-hwQ1oZHj.js"),__vite__mapDeps([39,2,1,3,4,40]),import.meta.url)},{path:"projects",name:"Projects",component:()=>e(()=>import("./Projects-B7EM0uPg.js"),__vite__mapDeps([41,2,1,3,4,42]),import.meta.url)},{path:"wallet",name:"Wallet",component:()=>e(()=>import("./Wallet-BHWhLWn9.js"),__vite__mapDeps([43,2,1,3,4,44]),import.meta.url)},{path:"organization",name:"Organization",component:()=>e(()=>import("./Organization-DnSa58Tl.js"),__vite__mapDeps([45,1,2,3,4,46]),import.meta.url)},{path:"analytics",name:"Analytics",component:()=>e(()=>import("./Analytics-C1AnPdMx.js"),__vite__mapDeps([47,2,1,3,4,48]),import.meta.url)},{path:"templates",name:"Templates",component:()=>e(()=>import("./Templates-l7SvlKuB.js"),__vite__mapDeps([49,1,2,3,4,50]),import.meta.url)},{path:"backup",name:"Backup",component:()=>e(()=>import("./Backup-D31iZX3l.js"),__vite__mapDeps([51,2,1,3,4,52]),import.meta.url)},{path:"rssfeed",name:"RssFeed",component:()=>e(()=>import("./RssFeed-HSZoRXvS.js"),__vite__mapDeps([53,1,2,3,4,54]),import.meta.url)},{path:"webauthn",name:"WebAuthn",component:()=>e(()=>import("./WebAuthn-kWhFYaUK.js"),__vite__mapDeps([55,2,1,3,4,56]),import.meta.url)}]}],F=B({history:L(),routes:U}),A="cc_theme",v={dark:{label:"暗黑",icon:"🌑",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#1677ff",colorBgBase:"#141414",colorBgContainer:"#1f1f1f",colorBgElevated:"#2a2a2a",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#1c1c1c",headerBg:"#1c1c1c",bodyBg:"#141414"},Menu:{darkItemBg:"#1c1c1c",darkSubMenuItemBg:"#171717"}}},vars:{"--bg-base":"#141414","--bg-sidebar":"#1c1c1c","--bg-header":"#1c1c1c","--bg-card":"#1f1f1f","--bg-card-hover":"#262626","--border-color":"#252525","--border-subtle":"#1e1e1e","--text-primary":"#e0e0e0","--text-secondary":"#888","--text-muted":"#444","--logo-text":"#ffffff","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,0,0,.45)","--group-title":"#3a3a3a"}},light:{label:"亮白",icon:"☀️",antd:{algorithm:g.defaultAlgorithm,token:{colorPrimary:"#1677ff",colorBgBase:"#ffffff",colorBgContainer:"#ffffff",colorBgElevated:"#ffffff",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#ffffff",headerBg:"#ffffff",bodyBg:"#f4f6fb"},Menu:{itemBg:"#ffffff"}}},vars:{"--bg-base":"#f4f6fb","--bg-sidebar":"#ffffff","--bg-header":"#ffffff","--bg-card":"#ffffff","--bg-card-hover":"#f0f4ff","--border-color":"#e8edf5","--border-subtle":"#f0f0f0","--text-primary":"#1a1a2e","--text-secondary":"#5a6474","--text-muted":"#b0b8c8","--logo-text":"#1a1a2e","--menu-mode":"light","--shadow-card":"0 2px 12px rgba(0,0,0,.07)","--group-title":"#aab0bc"}},blue:{label:"深蓝",icon:"🌊",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#2f80ed",colorBgBase:"#0d1117",colorBgContainer:"#161b22",colorBgElevated:"#1c2230",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#0f1923",headerBg:"#0f1923",bodyBg:"#0d1117"},Menu:{darkItemBg:"#0f1923",darkSubMenuItemBg:"#0b1520"}}},vars:{"--bg-base":"#0d1117","--bg-sidebar":"#0f1923","--bg-header":"#0f1923","--bg-card":"#161b22","--bg-card-hover":"#1c2230","--border-color":"#21303f","--border-subtle":"#182030","--text-primary":"#c9d8ef","--text-secondary":"#6e8caa","--text-muted":"#2d4060","--logo-text":"#e0eeff","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,40,80,.5)","--group-title":"#2d4060"}},green:{label:"翠绿",icon:"🌿",antd:{algorithm:g.darkAlgorithm,token:{colorPrimary:"#29a270",colorBgBase:"#0a1a12",colorBgContainer:"#0f2318",colorBgElevated:"#152e20",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#0c1e14",headerBg:"#0c1e14",bodyBg:"#0a1a12"},Menu:{darkItemBg:"#0c1e14",darkSubMenuItemBg:"#091810"}}},vars:{"--bg-base":"#0a1a12","--bg-sidebar":"#0c1e14","--bg-header":"#0c1e14","--bg-card":"#0f2318","--bg-card-hover":"#152e20","--border-color":"#1a3828","--border-subtle":"#122a1c","--text-primary":"#c0e8c8","--text-secondary":"#5a9a6a","--text-muted":"#1e4028","--logo-text":"#d8f0e0","--menu-mode":"dark","--shadow-card":"0 2px 8px rgba(0,40,20,.5)","--group-title":"#1e4028"}}},j=I("theme",()=>{const s=T(localStorage.getItem(A)||"light"),a=E(()=>v[s.value]||v.dark),c=E(()=>a.value.antd),m=E(()=>s.value!=="light");function t(){const r=a.value.vars,u=document.documentElement;for(const[b,i]of Object.entries(r))u.style.setProperty(b,i);u.setAttribute("data-theme",s.value)}function o(r){v[r]&&(s.value=r,localStorage.setItem(A,r),t())}function n(){t()}return{current:s,config:a,antdTheme:c,isDark:m,setTheme:o,init:n}}),W={__name:"App",setup(s){const a=j();return R(()=>a.init()),(c,m)=>{const t=y("router-view"),o=y("a-config-provider");return V(),O(o,{theme:k(a).antdTheme},{default:x(()=>[D(t)]),_:1},8,["theme"])}}},h=S(W);h.use(w());h.use(F);h.use(M);h.mount("#app");export{v as T,j as u};
@@ -1,4 +1,4 @@
1
- import{g as Yc}from"./antd-BQNxIyr-.js";function Ni(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let He=Ni();function Mc(a){He=a}const Lc=/[&<>"']/,qc=new RegExp(Lc.source,"g"),xc=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Hc=new RegExp(xc.source,"g"),Vc={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},$i=a=>Vc[a];function Ne(a,e){if(e){if(Lc.test(a))return a.replace(qc,$i)}else if(xc.test(a))return a.replace(Hc,$i);return a}const zc=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Wc(a){return a.replace(zc,(e,t)=>(t=t.toLowerCase(),t==="colon"?":":t.charAt(0)==="#"?t.charAt(1)==="x"?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const $c=/(^|[^\[])\^/g;function Z(a,e){let t=typeof a=="string"?a:a.source;e=e||"";const n={replace:(r,i)=>{let o=typeof i=="string"?i:i.source;return o=o.replace($c,"$1"),t=t.replace(r,o),n},getRegex:()=>new RegExp(t,e)};return n}function Ki(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const pt={exec:()=>null};function Qi(a,e){const t=a.replace(/\|/g,(i,o,s)=>{let l=!1,_=o;for(;--_>=0&&s[_]==="\\";)l=!l;return l?"|":" |"}),n=t.split(/ \|/);let r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(/\\\|/g,"|");return n}function yt(a,e,t){const n=a.length;if(n===0)return"";let r=0;for(;r<n&&a.charAt(n-r-1)===e;)r++;return a.slice(0,n-r)}function Kc(a,e){if(a.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<a.length;n++)if(a[n]==="\\")n++;else if(a[n]===e[0])t++;else if(a[n]===e[1]&&(t--,t<0))return n;return-1}function Xi(a,e,t,n){const r=e.href,i=e.title?Ne(e.title):null,o=a[1].replace(/\\([\[\]])/g,"$1");if(a[0].charAt(0)!=="!"){n.state.inLink=!0;const s={type:"link",raw:t,href:r,title:i,text:o,tokens:n.inlineTokens(o)};return n.state.inLink=!1,s}return{type:"image",raw:t,href:r,title:i,text:Ne(o)}}function Qc(a,e){const t=a.match(/^(\s+)(?:```)/);if(t===null)return e;const n=t[1];return e.split(`
1
+ import{g as Yc}from"./antd-D6h4fDFf.js";function Ni(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let He=Ni();function Mc(a){He=a}const Lc=/[&<>"']/,qc=new RegExp(Lc.source,"g"),xc=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Hc=new RegExp(xc.source,"g"),Vc={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},$i=a=>Vc[a];function Ne(a,e){if(e){if(Lc.test(a))return a.replace(qc,$i)}else if(xc.test(a))return a.replace(Hc,$i);return a}const zc=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Wc(a){return a.replace(zc,(e,t)=>(t=t.toLowerCase(),t==="colon"?":":t.charAt(0)==="#"?t.charAt(1)==="x"?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const $c=/(^|[^\[])\^/g;function Z(a,e){let t=typeof a=="string"?a:a.source;e=e||"";const n={replace:(r,i)=>{let o=typeof i=="string"?i:i.source;return o=o.replace($c,"$1"),t=t.replace(r,o),n},getRegex:()=>new RegExp(t,e)};return n}function Ki(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const pt={exec:()=>null};function Qi(a,e){const t=a.replace(/\|/g,(i,o,s)=>{let l=!1,_=o;for(;--_>=0&&s[_]==="\\";)l=!l;return l?"|":" |"}),n=t.split(/ \|/);let r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(/\\\|/g,"|");return n}function yt(a,e,t){const n=a.length;if(n===0)return"";let r=0;for(;r<n&&a.charAt(n-r-1)===e;)r++;return a.slice(0,n-r)}function Kc(a,e){if(a.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<a.length;n++)if(a[n]==="\\")n++;else if(a[n]===e[0])t++;else if(a[n]===e[1]&&(t--,t<0))return n;return-1}function Xi(a,e,t,n){const r=e.href,i=e.title?Ne(e.title):null,o=a[1].replace(/\\([\[\]])/g,"$1");if(a[0].charAt(0)!=="!"){n.state.inLink=!0;const s={type:"link",raw:t,href:r,title:i,text:o,tokens:n.inlineTokens(o)};return n.state.inLink=!1,s}return{type:"image",raw:t,href:r,title:i,text:Ne(o)}}function Qc(a,e){const t=a.match(/^(\s+)(?:```)/);if(t===null)return e;const n=t[1];return e.split(`
2
2
  `).map(r=>{const i=r.match(/^\s+/);if(i===null)return r;const[o]=i;return o.length>=n.length?r.slice(n.length):r}).join(`
3
3
  `)}class Lt{options;rules;lexer;constructor(e){this.options=e||He}space(e){const t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:yt(n,`
4
4
  `)}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const n=t[0],r=Qc(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(/#$/.test(n)){const r=yt(n,"#");(this.options.pedantic||!r||/ $/.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let n=t[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,`
@@ -8,9 +8,9 @@
8
8
  // Injected by web-ui-server.js at serve time
9
9
  window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
10
10
  </script>
11
- <script type="module" crossorigin src="./assets/index-BYqeR6ME.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-ByUk2Wmr.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-CN0Iv_qZ.js">
13
- <link rel="modulepreload" crossorigin href="./assets/antd-BQNxIyr-.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/antd-D6h4fDFf.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-CyGyEIVX.css">
15
15
  </head>
16
16
  <body>
@@ -1,3 +1,6 @@
1
+ // Track running cowork tasks for cancellation
2
+ const _runningTasks = new Map();
3
+
1
4
  export async function handleCoworkTask(server, id, ws, message) {
2
5
  const { templateId = null, userMessage, files = [] } = message;
3
6
 
@@ -11,6 +14,10 @@ export async function handleCoworkTask(server, id, ws, message) {
11
14
  return;
12
15
  }
13
16
 
17
+ const ac = new AbortController();
18
+ const trackingId = `cowork-${id}`;
19
+ _runningTasks.set(trackingId, ac);
20
+
14
21
  try {
15
22
  const { runCoworkTask } = await import("../../lib/cowork-task-runner.js");
16
23
 
@@ -18,6 +25,7 @@ export async function handleCoworkTask(server, id, ws, message) {
18
25
  id,
19
26
  type: "cowork:started",
20
27
  templateId,
28
+ trackingId,
21
29
  });
22
30
 
23
31
  const result = await runCoworkTask({
@@ -26,6 +34,17 @@ export async function handleCoworkTask(server, id, ws, message) {
26
34
  files,
27
35
  cwd: server.projectRoot || process.cwd(),
28
36
  llmOptions: {},
37
+ signal: ac.signal,
38
+ onProgress: (progress) => {
39
+ server._send(ws, {
40
+ id,
41
+ type: "cowork:progress",
42
+ event: progress.type,
43
+ tool: progress.tool,
44
+ iterationCount: progress.iterationCount,
45
+ tokenCount: progress.tokenCount,
46
+ });
47
+ },
29
48
  });
30
49
 
31
50
  server._send(ws, {
@@ -39,6 +58,7 @@ export async function handleCoworkTask(server, id, ws, message) {
39
58
  artifacts: result.result?.artifacts || [],
40
59
  toolsUsed: result.result?.toolsUsed || [],
41
60
  iterationCount: result.result?.iterationCount || 0,
61
+ tokenCount: result.result?.tokenCount || 0,
42
62
  });
43
63
  } catch (err) {
44
64
  server._send(ws, {
@@ -47,6 +67,36 @@ export async function handleCoworkTask(server, id, ws, message) {
47
67
  code: "COWORK_FAILED",
48
68
  message: err.message,
49
69
  });
70
+ } finally {
71
+ _runningTasks.delete(trackingId);
72
+ }
73
+ }
74
+
75
+ export function handleCoworkCancel(server, id, ws, message) {
76
+ const { trackingId } = message;
77
+
78
+ if (!trackingId) {
79
+ server._send(ws, {
80
+ id,
81
+ type: "error",
82
+ code: "INVALID_MESSAGE",
83
+ message: "trackingId field required",
84
+ });
85
+ return;
86
+ }
87
+
88
+ const ac = _runningTasks.get(trackingId);
89
+ if (ac) {
90
+ ac.abort();
91
+ _runningTasks.delete(trackingId);
92
+ server._send(ws, { id, type: "cowork:cancelled", trackingId });
93
+ } else {
94
+ server._send(ws, {
95
+ id,
96
+ type: "error",
97
+ code: "TASK_NOT_FOUND",
98
+ message: `No running cowork task: ${trackingId}`,
99
+ });
50
100
  }
51
101
  }
52
102
 
@@ -67,6 +117,57 @@ export function handleSlashCommand(server, id, ws, message) {
67
117
  handler.handleSlashCommand(command, id);
68
118
  }
69
119
 
120
+ export async function handleCoworkHistory(server, id, ws, message) {
121
+ const { limit = 50 } = message;
122
+ const cwd = server.projectRoot || process.cwd();
123
+
124
+ try {
125
+ const { readFileSync, existsSync } = await import("node:fs");
126
+ const { join } = await import("node:path");
127
+ const histPath = join(cwd, ".chainlesschain", "cowork", "history.jsonl");
128
+
129
+ if (!existsSync(histPath)) {
130
+ server._send(ws, { id, type: "cowork:history", entries: [] });
131
+ return;
132
+ }
133
+
134
+ const lines = readFileSync(histPath, "utf-8").split("\n").filter(Boolean);
135
+ const entries = [];
136
+ for (const line of lines.slice(-limit)) {
137
+ try {
138
+ entries.push(JSON.parse(line));
139
+ } catch (_e) {
140
+ // skip malformed lines
141
+ }
142
+ }
143
+
144
+ server._send(ws, { id, type: "cowork:history", entries });
145
+ } catch (err) {
146
+ server._send(ws, {
147
+ id,
148
+ type: "error",
149
+ code: "HISTORY_FAILED",
150
+ message: err.message,
151
+ });
152
+ }
153
+ }
154
+
155
+ export async function handleCoworkTemplates(server, id, ws) {
156
+ try {
157
+ const { getTemplatesForUI } =
158
+ await import("../../lib/cowork-task-templates.js");
159
+ const templates = getTemplatesForUI();
160
+ server._send(ws, { id, type: "cowork:templates", templates });
161
+ } catch (err) {
162
+ server._send(ws, {
163
+ id,
164
+ type: "error",
165
+ code: "TEMPLATES_FAILED",
166
+ message: err.message,
167
+ });
168
+ }
169
+ }
170
+
70
171
  export async function handleOrchestrate(server, id, ws, message) {
71
172
  const {
72
173
  task,
@@ -44,6 +44,9 @@ export function createWsMessageDispatcher(server) {
44
44
  "host-tool-result": () => server._handleHostToolResult(id, ws, message),
45
45
  orchestrate: () => server._handleOrchestrate(id, ws, message),
46
46
  "cowork-task": () => server._handleCoworkTask(id, ws, message),
47
+ "cowork-cancel": () => server._handleCoworkCancel(id, ws, message),
48
+ "cowork-templates": () => server._handleCoworkTemplates(id, ws),
49
+ "cowork-history": () => server._handleCoworkHistory(id, ws, message),
47
50
  "tasks-list": () => server._handleTasksList(id, ws),
48
51
  "tasks-stop": () => server._handleTasksStop(id, ws, message),
49
52
  "tasks-detail": () => server._handleTaskDetail(id, ws, message),
@@ -52,6 +52,9 @@ import {
52
52
  handleSlashCommand,
53
53
  handleOrchestrate,
54
54
  handleCoworkTask,
55
+ handleCoworkCancel,
56
+ handleCoworkTemplates,
57
+ handleCoworkHistory,
55
58
  } from "./action-protocol.js";
56
59
  import {
57
60
  handleWorktreeDiff,
@@ -303,6 +306,21 @@ export class ChainlessChainWSServer extends EventEmitter {
303
306
  return handleCoworkTask(this, id, ws, message);
304
307
  }
305
308
 
309
+ /** @private — cancel a running cowork task */
310
+ _handleCoworkCancel(id, ws, message) {
311
+ return handleCoworkCancel(this, id, ws, message);
312
+ }
313
+
314
+ /** @private — return cowork templates for UI */
315
+ _handleCoworkTemplates(id, ws) {
316
+ return handleCoworkTemplates(this, id, ws);
317
+ }
318
+
319
+ /** @private — return cowork task history */
320
+ _handleCoworkHistory(id, ws, message) {
321
+ return handleCoworkHistory(this, id, ws, message);
322
+ }
323
+
306
324
  /** @private – list background tasks */
307
325
  async _handleTasksList(id, ws) {
308
326
  try {
@@ -7,9 +7,15 @@
7
7
  * @module cowork-task-runner
8
8
  */
9
9
 
10
+ import { existsSync, mkdirSync, appendFileSync } from "node:fs";
11
+ import { join } from "node:path";
10
12
  import { SubAgentContext } from "./sub-agent-context.js";
11
13
  import { getTemplate } from "./cowork-task-templates.js";
12
14
 
15
+ // ─── Dependencies (overridable for testing) ──────────────────────────────────
16
+
17
+ export const _deps = { existsSync, mkdirSync, appendFileSync };
18
+
13
19
  // ─── Constants ────────────────────────────────────────────────────────────────
14
20
 
15
21
  const DEFAULT_MAX_ITERATIONS = 50;
@@ -41,12 +47,22 @@ export async function runCoworkTask(options = {}) {
41
47
  llmOptions = {},
42
48
  maxIterations = DEFAULT_MAX_ITERATIONS,
43
49
  tokenBudget = DEFAULT_TOKEN_BUDGET,
50
+ onProgress = null,
51
+ signal = null,
44
52
  } = options;
45
53
 
46
54
  if (!userMessage || typeof userMessage !== "string") {
47
55
  throw new Error("userMessage is required");
48
56
  }
49
57
 
58
+ // Validate file paths before starting
59
+ if (files.length > 0) {
60
+ const missing = files.filter((f) => !_deps.existsSync(f));
61
+ if (missing.length > 0) {
62
+ throw new Error(`File(s) not found: ${missing.join(", ")}`);
63
+ }
64
+ }
65
+
50
66
  // Resolve template
51
67
  const template = getTemplate(templateId);
52
68
 
@@ -69,28 +85,35 @@ export async function runCoworkTask(options = {}) {
69
85
  db,
70
86
  llmOptions,
71
87
  cwd,
88
+ onProgress,
89
+ signal,
72
90
  });
73
91
 
74
92
  const taskId = subAgent.id;
75
93
 
76
94
  // Build loop options — pass shell policy overrides if template declares them
77
95
  const loopOptions = {};
78
- if (Array.isArray(template.shellPolicyOverrides) && template.shellPolicyOverrides.length) {
96
+ if (
97
+ Array.isArray(template.shellPolicyOverrides) &&
98
+ template.shellPolicyOverrides.length
99
+ ) {
79
100
  loopOptions.shellPolicyOverrides = template.shellPolicyOverrides;
80
101
  }
81
102
 
82
103
  // Run the agent with the user's message
83
104
  try {
84
105
  const result = await subAgent.run(userMessage, loopOptions);
85
- return {
106
+ const entry = {
86
107
  taskId,
87
108
  status: subAgent.status,
88
109
  templateId: template.id,
89
110
  templateName: template.name,
90
111
  result,
91
112
  };
113
+ _appendHistory(cwd, entry, userMessage);
114
+ return entry;
92
115
  } catch (err) {
93
- return {
116
+ const entry = {
94
117
  taskId,
95
118
  status: "failed",
96
119
  templateId: template.id,
@@ -103,5 +126,28 @@ export async function runCoworkTask(options = {}) {
103
126
  iterationCount: 0,
104
127
  },
105
128
  };
129
+ _appendHistory(cwd, entry, userMessage);
130
+ return entry;
131
+ }
132
+ }
133
+
134
+ // ─── History Persistence ─────────────────────────────────────────────────────
135
+
136
+ function _appendHistory(cwd, entry, userMessage) {
137
+ try {
138
+ const histDir = join(cwd, ".chainlesschain", "cowork");
139
+ _deps.mkdirSync(histDir, { recursive: true });
140
+ const record = {
141
+ ...entry,
142
+ userMessage,
143
+ timestamp: new Date().toISOString(),
144
+ };
145
+ _deps.appendFileSync(
146
+ join(histDir, "history.jsonl"),
147
+ JSON.stringify(record) + "\n",
148
+ "utf-8",
149
+ );
150
+ } catch (_e) {
151
+ // Best-effort — don't fail the task for history write errors
106
152
  }
107
153
  }
@@ -493,3 +493,106 @@ ${ERROR_RECOVERY_PROMPT}`,
493
493
  export function listTemplateIds() {
494
494
  return Object.keys(TASK_TEMPLATES);
495
495
  }
496
+
497
+ // ─── UI Metadata ─────────────────────────────────────────────────────────────
498
+
499
+ const UI_METADATA = {
500
+ "doc-convert": {
501
+ icon: "FileTextOutlined",
502
+ description: "Word、Markdown、HTML、PDF 之间的格式互转",
503
+ examples: [
504
+ "把 report.docx 转成 PDF",
505
+ "合并多个 Markdown 为一个文档",
506
+ "把 Excel 导出为 PDF",
507
+ ],
508
+ },
509
+ "media-process": {
510
+ icon: "PlayCircleOutlined",
511
+ description: "视频压缩、音频提取、格式转换、剪辑",
512
+ examples: [
513
+ "提取 MP4 的音频",
514
+ "压缩视频到 50MB 以内",
515
+ "剪辑 10:30 到 25:00 的片段",
516
+ ],
517
+ },
518
+ "data-analysis": {
519
+ icon: "BarChartOutlined",
520
+ description: "CSV/Excel 分析、统计、可视化图表",
521
+ examples: [
522
+ "分析 sales.csv 的月度趋势",
523
+ "清洗数据去重修复格式",
524
+ "比较两个 CSV 的差异",
525
+ ],
526
+ },
527
+ "web-research": {
528
+ icon: "SearchOutlined",
529
+ description: "网页抓取、API 调用、多源信息汇总",
530
+ examples: ["调研 AI Agent 框架对比", "查询实时汇率", "抓取网页内容并翻译"],
531
+ },
532
+ "image-process": {
533
+ icon: "PictureOutlined",
534
+ description: "批量压缩、格式转换、加水印、OCR",
535
+ examples: ["批量压缩到 500KB", "加水印文字", "识别图上的文字 (OCR)"],
536
+ },
537
+ "code-helper": {
538
+ icon: "CodeOutlined",
539
+ description: "生成脚本、调试代码、自动化任务",
540
+ examples: [
541
+ "写一个批量重命名脚本",
542
+ "调试这段报错代码",
543
+ "生成 REST API 脚手架",
544
+ ],
545
+ },
546
+ "system-admin": {
547
+ icon: "DesktopOutlined",
548
+ description: "磁盘分析、进程管理、日志分析",
549
+ examples: [
550
+ "查看磁盘使用情况",
551
+ "找出最大的 10 个文件",
552
+ "列出占用端口的进程",
553
+ ],
554
+ },
555
+ "file-organize": {
556
+ icon: "FolderOpenOutlined",
557
+ description: "批量重命名、分类整理、查找重复",
558
+ examples: [
559
+ "按文件类型分类整理",
560
+ "批量重命名去空格",
561
+ "打包排除 node_modules",
562
+ ],
563
+ },
564
+ "network-tools": {
565
+ icon: "GlobalOutlined",
566
+ description: "API 调试、网页抓取、网络诊断",
567
+ examples: ["测试 API 接口", "抓取网页图片链接", "ping 测试网络延迟"],
568
+ },
569
+ "learning-assist": {
570
+ icon: "ReadOutlined",
571
+ description: "文档翻译、内容总结、论文分析",
572
+ examples: ["翻译 PDF 摘要", "总结长文档要点", "解释代码工作原理"],
573
+ },
574
+ };
575
+
576
+ /**
577
+ * Get all templates formatted for UI consumption.
578
+ * Returns an array of template objects with id, name, icon, category,
579
+ * description, examples, acceptsFiles, and optional shellPolicyOverrides.
580
+ * @returns {object[]}
581
+ */
582
+ export function getTemplatesForUI() {
583
+ return Object.values(TASK_TEMPLATES).map((tpl) => {
584
+ const ui = UI_METADATA[tpl.id] || {};
585
+ return {
586
+ id: tpl.id,
587
+ name: tpl.name,
588
+ icon: ui.icon || "AppstoreOutlined",
589
+ category: tpl.category,
590
+ description: ui.description || "",
591
+ examples: ui.examples || [],
592
+ acceptsFiles: tpl.acceptsFiles,
593
+ ...(tpl.shellPolicyOverrides
594
+ ? { shellPolicyOverrides: tpl.shellPolicyOverrides }
595
+ : {}),
596
+ };
597
+ });
598
+ }
@@ -101,6 +101,12 @@ export class SubAgentContext {
101
101
  // LLM options for chatWithTools
102
102
  this._llmOptions = options.llmOptions || {};
103
103
 
104
+ // Optional progress callback for streaming events to consumers
105
+ this._onProgress = options.onProgress || null;
106
+
107
+ // Optional abort signal for cancellation
108
+ this._signal = options.signal || null;
109
+
104
110
  // Build isolated system prompt
105
111
  const basePrompt = buildSystemPrompt(this.cwd);
106
112
  const rolePrompt = `\n\n## Sub-Agent Role: ${this.role}\nYou are a focused sub-agent with the role "${this.role}". Your task is:\n${this.task}\n\nStay focused on this specific task. Be concise and return results directly.`;
@@ -253,6 +259,26 @@ export class SubAgentContext {
253
259
  this._tokenCount += Math.ceil((lastContent.length || 0) / 4);
254
260
  }
255
261
 
262
+ // Emit progress to consumer if callback provided
263
+ if (this._onProgress) {
264
+ try {
265
+ this._onProgress({
266
+ type: event.type,
267
+ tool: event.tool || null,
268
+ iterationCount: this._iterationCount,
269
+ tokenCount: this._tokenCount,
270
+ });
271
+ } catch (_e) {
272
+ // Never let progress callback failures break the agent loop
273
+ }
274
+ }
275
+
276
+ // Check abort signal
277
+ if (this._signal?.aborted) {
278
+ this.forceComplete("cancelled");
279
+ break;
280
+ }
281
+
256
282
  // Enforce token budget
257
283
  if (this.tokenBudget && this._tokenCount >= this.tokenBudget) {
258
284
  this.forceComplete("token-budget-exceeded");
@@ -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 G,A as U,a5 as d,a4 as C,W as k,a6 as j,Z as w,a9 as ne,X as S,Y as l,G as N,n as K}from"./vendor-CN0Iv_qZ.js";import{m as W,H as J}from"./markdown-BeVIhIzs.js";/* empty css */import{u as ae}from"./ws-Dma34ig_.js";import{u as x}from"./chat-BYmuDvol.js";import{_ as le}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as P,T as oe,v as Z,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 X=[{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,shellPolicyOverrides:["network-download"]},{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,shellPolicyOverrides:["network-download"]},{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,O()}function O(){_.value=[],p.value=[],h.value=null,v.value=!1,r.value=null}function Q(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={systemPromptExtension:E};u?.shellPolicyOverrides&&(M.shellPolicyOverrides=u.shellPolicyOverrides);const B=await c.createSession("agent",M);r.value=B,await c.sendMessage(B,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 V=D(()=>r.value?x().getMessages(r.value):[]),H=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:V,currentStreaming:H,currentQuestion:b,selectTemplate:I,reset:O,addFile:Q,removeFile:q,execute:L,executeDirectWs:$,sendFollowUp:i,answerQuestion:R,TASK_TEMPLATES:X}}),fe={class:"cowork-root"},ye={class:"template-panel"},ke={class:"template-header"},we={class:"template-list"},Se=["onClick"],xe={class:"card-icon"},Oe={class:"card-body"},Te={class:"card-name"},Ce={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){W.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),O={FileTextOutlined:ge,PlayCircleOutlined:ve,BarChartOutlined:me,SearchOutlined:pe,PictureOutlined:de,CodeOutlined:ue,DesktopOutlined:re,FolderOpenOutlined:Z,GlobalOutlined:ce,ReadOutlined:ie},Q=["把 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 W(i||"")}catch{return i||""}}function $(i){return i.split(/[\\/]/).pop()||i}function V(i){h.value=!1;const e=i.dataTransfer?.files;if(e)for(const c of e)t.addFile(c.path||c.name)}function H(){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,K(()=>b())}return te([A,()=>t.currentStreaming],()=>{K(()=>{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"),B=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(X),s=>(l(),o("div",{key:s.id,class:G(["template-card",{active:n(t).selectedTemplate?.id===s.id}]),onClick:T=>n(t).selectTemplate(s)},[a("div",xe,[(l(),k(j(O[s.icon]||n(P))))]),a("div",Oe,[a("div",Te,d(s.name),1),a("div",Ce,d(s.description),1)])],10,Se))),128)),a("div",{class:G(["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:G(["file-zone",{dragging:h.value}]),onDragover:e[2]||(e[2]=U(s=>h.value=!0,["prevent"])),onDragleave:e[3]||(e[3]=s=>h.value=!1),onDrop:U(V,["prevent"])},[g(n(Z),{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:T=>n(t).removeFile(s),class:"file-tag"},{default:w(()=>[N(d($(s)),1)]),_:2},1032,["onClose"]))),128))])):C("",!0),g(u,{value:r.value,"onUpdate:value":e[1]||(e[1]=s=>r.value=s),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:H},null,8,["value"])],34)):C("",!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(Q,s=>a("div",{key:s,class:"example-chip",onClick:T=>R(s)},d(s),9,Le)),64))])])):n(t).selectedTemplate&&!n(t).agentSessionId?(l(),o("div",$e,[a("div",Re,[(l(),k(j(O[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:T=>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,T)=>(l(),o("div",{key:T,class:G(["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)])):C("",!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)])):C("",!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:T=>n(t).answerQuestion(s)},{default:w(()=>[N(d(s),1)]),_:2},1032,["onClick"]))),128))])):(l(),k(B,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:n(t).answerQuestion},null,8,["onSearch"]))])):C("",!0)],512)),a("div",Ye,[n(t).selectedTemplate?(l(),o("div",et,[g(c,{color:"blue",class:"context-tag"},{default:w(()=>[(l(),k(j(O[n(t).selectedTemplate.icon]||n(P)))),N(" "+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(()=>[N(d($(s)),1)]),_:2},1024))),128))])):C("",!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(U(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}