chainlesschain 0.45.76 → 0.45.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +31 -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-sBrYoc3A.js → Analytics-CoH0P1ux.js} +2 -2
  5. package/src/assets/web-panel/assets/AppLayout-Dk1eV3Xp.js +1 -0
  6. package/src/assets/web-panel/assets/AppLayout-cxfKLu-m.css +1 -0
  7. package/src/assets/web-panel/assets/Backup-Cv97eAjW.js +1 -0
  8. package/src/assets/web-panel/assets/Chat-DSbYaPuD.js +1 -0
  9. package/src/assets/web-panel/assets/Chat-DfR76jyX.css +1 -0
  10. package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +1 -0
  11. package/src/assets/web-panel/assets/Cowork-DY0Jcql7.js +48 -0
  12. package/src/assets/web-panel/assets/{Cron-CNs03iHJ.js → Cron-BcH0ckxq.js} +2 -2
  13. package/src/assets/web-panel/assets/{Dashboard-DanoHPSI.js → Dashboard-DSOE-azo.js} +1 -1
  14. package/src/assets/web-panel/assets/{Git-CCMVr3Y8.js → Git-zd3CuuXJ.js} +2 -2
  15. package/src/assets/web-panel/assets/{Logs-BY6A0UNG.js → Logs-BUKXg48N.js} +2 -2
  16. package/src/assets/web-panel/assets/{McpTools-CrBVYlg6.js → McpTools-WVxDlw0C.js} +2 -2
  17. package/src/assets/web-panel/assets/{Memory-CWx3SpUt.js → Memory-BLFTgTpY.js} +2 -2
  18. package/src/assets/web-panel/assets/{Notes-1LcGD49x.js → Notes-CFypT876.js} +2 -2
  19. package/src/assets/web-panel/assets/{Organization-Dx2DhbkM.js → Organization-BOOqeyu_.js} +4 -4
  20. package/src/assets/web-panel/assets/{P2P-B16fjqfJ.js → P2P-D9xrbb8q.js} +2 -2
  21. package/src/assets/web-panel/assets/{Permissions-BQbC9FzG.js → Permissions-CidrpFWd.js} +3 -3
  22. package/src/assets/web-panel/assets/{Projects-CjhZbNYm.js → Projects-D3Ycn8xG.js} +2 -2
  23. package/src/assets/web-panel/assets/{Providers-ivOAQtHM.js → Providers-D0kMUvHz.js} +2 -2
  24. package/src/assets/web-panel/assets/{RssFeed-BrsErdrU.js → RssFeed-OQLesJxb.js} +1 -1
  25. package/src/assets/web-panel/assets/{Security-DnEvJU5h.js → Security-BR4hAAkF.js} +3 -3
  26. package/src/assets/web-panel/assets/{Services-7jQywNbl.js → Services-BFMDfXE5.js} +1 -1
  27. package/src/assets/web-panel/assets/{Skills-CLlblJcG.js → Skills-BAf_mFKw.js} +1 -1
  28. package/src/assets/web-panel/assets/{Tasks-CmJBC1cf.js → Tasks-DuNOWfjU.js} +1 -1
  29. package/src/assets/web-panel/assets/Templates-buh__Yll.js +1 -0
  30. package/src/assets/web-panel/assets/{Wallet-3iYASEx_.js → Wallet-vgS5USvW.js} +4 -4
  31. package/src/assets/web-panel/assets/{WebAuthn-s3Hzd9db.js → WebAuthn-BoL2UJ5Z.js} +5 -5
  32. package/src/assets/web-panel/assets/{antd-gZyc63Qr.js → antd-BQNxIyr-.js} +82 -82
  33. package/src/assets/web-panel/assets/chat-BwUxWn7i.js +1 -0
  34. package/src/assets/web-panel/assets/github-dark-Dfs9RUU9.css +1 -0
  35. package/src/assets/web-panel/assets/index-CCRLEutJ.js +2 -0
  36. package/src/assets/web-panel/assets/{markdown-Bv7nG63L.js → markdown-BeVIhIzs.js} +1 -1
  37. package/src/assets/web-panel/assets/ws-B4fo9ew1.js +1 -0
  38. package/src/assets/web-panel/index.html +2 -2
  39. package/src/gateways/ws/action-protocol.js +54 -1
  40. package/src/gateways/ws/message-dispatcher.js +1 -0
  41. package/src/gateways/ws/session-protocol.js +2 -0
  42. package/src/gateways/ws/ws-server.js +10 -1
  43. package/src/gateways/ws/ws-session-gateway.js +6 -1
  44. package/src/lib/cowork-task-runner.js +101 -0
  45. package/src/lib/cowork-task-templates.js +493 -0
  46. package/src/assets/web-panel/assets/AppLayout-2RCrdXxl.js +0 -1
  47. package/src/assets/web-panel/assets/AppLayout-D9pBLPC3.css +0 -1
  48. package/src/assets/web-panel/assets/Backup-D68fenbD.js +0 -1
  49. package/src/assets/web-panel/assets/Chat-B2nB8o_F.js +0 -1
  50. package/src/assets/web-panel/assets/Chat-DB46afPg.css +0 -1
  51. package/src/assets/web-panel/assets/Templates-RXT8-DNk.js +0 -1
  52. package/src/assets/web-panel/assets/chat-DWBA4-cl.js +0 -1
  53. package/src/assets/web-panel/assets/index-CyGtHm63.js +0 -2
  54. package/src/assets/web-panel/assets/ws-CU7Gvoom.js +0 -1
@@ -0,0 +1 @@
1
+ import{V as M,f as g,r as w}from"./vendor-CN0Iv_qZ.js";import{u as f}from"./ws-B4fo9ew1.js";const S="新对话",T="新 Agent",b={"assistant.delta":"response-token","assistant.final":"response-complete","assistant.message":"response-complete","tool.call.started":"tool-executing","tool.call.completed":"tool-result","tool.call.failed":"tool-result","slot.filling":"question","approval.requested":"question",error:"error"},U=M("chat",()=>{const c=g([]),p=g(null),i=w({}),a=w({}),m=w({}),d=g(!1);let q=null;const A=new Set;function h(t){return i[t]||(i[t]=[]),i[t]}function y(t){if(!t?.id)return;const e=c.value.find(n=>n.id===t.id);if(e){Object.assign(e,t);return}c.value.unshift(t)}function C(t,e=f()){i[t]||(i[t]=[]),a[t]||(a[t]={content:"",active:!1}),!A.has(t)&&(A.add(t),e.onSession(t,n=>_(t,n)))}function v(t=f()){q||(q=t.onRuntimeEvent(e=>{const n=e.payload||{},s=n.record||{};if(e.type==="session:start"){const o=n.sessionType||s.type||"chat";y({id:n.sessionId,type:o,provider:s.provider||null,model:s.model||null,projectRoot:s.projectRoot||null,status:s.status||"created",title:o==="chat"?S:T,createdAt:Date.now(),messageCount:s.messageCount??0})}else if(e.type==="session:resume"){const o=n.sessionId;if(!o)return;Array.isArray(n.history)&&(i[o]=n.history.map(r=>({role:r.role,content:r.content,timestamp:r.timestamp||Date.now()}))),a[o]||(a[o]={content:"",active:!1}),y({id:o,type:s.type||null,provider:s.provider||null,model:s.model||null,projectRoot:s.projectRoot||null,status:s.status||"resumed",messageCount:s.messageCount??(Array.isArray(n.history)?n.history.length:0)})}else if(e.type==="session:end"){const o=n.sessionId;c.value=c.value.filter(r=>r.id!==o),p.value===o&&(p.value=c.value[0]?.id||null)}}))}async function D(){const t=f();v(t),c.value=await t.listSessions()}async function E(t="chat",e={}){const n=f();v(n);const s=await n.createSession(t,null,e);return y({id:s,type:t,title:t==="chat"?S:T,createdAt:Date.now(),messageCount:0}),C(s,n),p.value=s,s}function _(t,e){const n=h(t),s=b[e.type]||e.type,o=e.payload||{};if(s==="response-token"){a[t]||(a[t]={content:"",active:!0});const r=e.token||o.token||o.delta||o.content||"";a[t].content+=r,a[t].active=!0}else if(s==="response-complete"){const r=e.content||o.content||a[t]?.content||"";n.push({role:"assistant",content:r,timestamp:Date.now()}),a[t]&&(a[t].content="",a[t].active=!1);const l=c.value.find(u=>u.id===t);if(l&&(l.title===S||l.title===T)){const u=n.find(j=>j.role==="user");u&&(l.title=u.content.slice(0,30))}l&&(l.messageCount=n.filter(u=>u.role!=="tool").length),d.value=!1}else if(s==="tool-executing")n.push({role:"tool",tool:e.tool||o.tool||o.toolName||"unknown",input:e.input||o.input||o.args||null,status:"running",timestamp:Date.now()});else if(s==="tool-result"){const r=e.tool||o.tool||o.toolName||"unknown",l=[...n].reverse().find(u=>u.role==="tool"&&u.tool===r);l&&(l.result=e.result||o.result||o.output||null,l.status="done")}else if(s==="question")m[t]={requestId:e.requestId||o.requestId||e.id,question:e.question||o.question||o.message||"",choices:e.choices||o.choices||o.options||[]};else if(s==="error"){const r=e.message||o.message||"Unknown error";n.push({role:"assistant",content:`Error: ${r}`,timestamp:Date.now()}),d.value=!1,a[t]&&(a[t].active=!1)}}async function k(t,e){const n=f();v(n),h(t).push({role:"user",content:e,timestamp:Date.now()}),a[t]||(a[t]={content:"",active:!1}),a[t].active=!0,d.value=!0,n.sendSessionMessage(t,e)}function R(t,e){const n=f(),s=m[t];s&&(n.answerQuestion(t,s.requestId,e),delete m[t])}async function L(t){const e=f();if(v(e),p.value=t,C(t,e),!i[t]||i[t].length===0)try{await e.resumeSession(t)}catch{}}return{sessions:c,currentSessionId:p,messages:i,streaming:a,pendingQuestion:m,isLoading:d,loadSessions:D,createSession:E,sendMessage:k,answerQuestion:R,switchSession:L,getMessages:h}});export{U as u};
@@ -0,0 +1 @@
1
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AppLayout-Dk1eV3Xp.js","./vendor-CN0Iv_qZ.js","./ws-B4fo9ew1.js","./_plugin-vue_export-helper-DlAUqK2U.js","./antd-BQNxIyr-.js","./AppLayout-cxfKLu-m.css","./Dashboard-DSOE-azo.js","./chat-BwUxWn7i.js","./Dashboard-CKeMmCoT.css","./Chat-DSbYaPuD.js","./markdown-BeVIhIzs.js","./Chat-DfR76jyX.css","./github-dark-Dfs9RUU9.css","./Cowork-DY0Jcql7.js","./Cowork-CPqYhoMI.css","./Services-BFMDfXE5.js","./Services-C8Qs6KXv.css","./Logs-BUKXg48N.js","./Logs-Gf_Mv9Nx.css","./Skills-BAf_mFKw.js","./parsers-DftYMnlk.js","./Skills-BdjRyorN.css","./Providers-D0kMUvHz.js","./Providers-BEakqcO5.css","./McpTools-WVxDlw0C.js","./McpTools-CyhSLDwf.css","./Notes-CFypT876.js","./Notes-BG69sJKi.css","./Memory-BLFTgTpY.js","./Memory-DRghrGJr.css","./Cron-BcH0ckxq.js","./Tasks-DuNOWfjU.js","./Tasks-BJjN_YEm.css","./Security-BR4hAAkF.js","./Security-Dwxw7rfP.css","./Permissions-CidrpFWd.js","./Permissions-C9WlkGl-.css","./P2P-D9xrbb8q.js","./P2P-OEzOeMZX.css","./Git-zd3CuuXJ.js","./Git-DGcuBXST.css","./Projects-D3Ycn8xG.js","./Projects-DxKelI5h.css","./Wallet-vgS5USvW.js","./Wallet-DnIumafl.css","./Organization-BOOqeyu_.js","./Organization-DdOOM4ic.css","./Analytics-CoH0P1ux.js","./Analytics-B4OM8S8X.css","./Templates-buh__Yll.js","./Templates-DOY_oZnm.css","./Backup-Cv97eAjW.js","./Backup-fZqtfC1m.css","./RssFeed-OQLesJxb.js","./RssFeed-BlFC20eg.css","./WebAuthn-BoL2UJ5Z.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-Dk1eV3Xp.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"Dashboard",component:()=>e(()=>import("./Dashboard-DSOE-azo.js"),__vite__mapDeps([6,1,2,7,3,4,8]),import.meta.url)},{path:"chat",name:"Chat",component:()=>e(()=>import("./Chat-DSbYaPuD.js"),__vite__mapDeps([9,1,10,4,7,2,3,11,12]),import.meta.url)},{path:"cowork",name:"Cowork",component:()=>e(()=>import("./Cowork-DY0Jcql7.js"),__vite__mapDeps([13,1,10,4,2,7,3,14,12]),import.meta.url)},{path:"services",name:"Services",component:()=>e(()=>import("./Services-BFMDfXE5.js"),__vite__mapDeps([15,2,1,3,4,16]),import.meta.url)},{path:"logs",name:"Logs",component:()=>e(()=>import("./Logs-BUKXg48N.js"),__vite__mapDeps([17,2,1,3,4,18]),import.meta.url)},{path:"skills",name:"Skills",component:()=>e(()=>import("./Skills-BAf_mFKw.js"),__vite__mapDeps([19,1,2,20,7,3,4,21]),import.meta.url)},{path:"providers",name:"Providers",component:()=>e(()=>import("./Providers-D0kMUvHz.js"),__vite__mapDeps([22,1,2,20,3,4,23]),import.meta.url)},{path:"mcp",name:"McpTools",component:()=>e(()=>import("./McpTools-WVxDlw0C.js"),__vite__mapDeps([24,2,1,3,4,25]),import.meta.url)},{path:"notes",name:"Notes",component:()=>e(()=>import("./Notes-CFypT876.js"),__vite__mapDeps([26,2,1,3,4,27]),import.meta.url)},{path:"memory",name:"Memory",component:()=>e(()=>import("./Memory-BLFTgTpY.js"),__vite__mapDeps([28,2,1,3,4,29]),import.meta.url)},{path:"cron",name:"Cron",component:()=>e(()=>import("./Cron-BcH0ckxq.js"),__vite__mapDeps([30,2,1,4]),import.meta.url)},{path:"tasks",name:"Tasks",component:()=>e(()=>import("./Tasks-DuNOWfjU.js"),__vite__mapDeps([31,1,2,3,4,32]),import.meta.url)},{path:"security",name:"Security",component:()=>e(()=>import("./Security-BR4hAAkF.js"),__vite__mapDeps([33,2,1,3,4,34]),import.meta.url)},{path:"permissions",name:"Permissions",component:()=>e(()=>import("./Permissions-CidrpFWd.js"),__vite__mapDeps([35,2,1,3,4,36]),import.meta.url)},{path:"p2p",name:"P2P",component:()=>e(()=>import("./P2P-D9xrbb8q.js"),__vite__mapDeps([37,2,1,3,4,38]),import.meta.url)},{path:"git",name:"Git",component:()=>e(()=>import("./Git-zd3CuuXJ.js"),__vite__mapDeps([39,2,1,3,4,40]),import.meta.url)},{path:"projects",name:"Projects",component:()=>e(()=>import("./Projects-D3Ycn8xG.js"),__vite__mapDeps([41,2,1,3,4,42]),import.meta.url)},{path:"wallet",name:"Wallet",component:()=>e(()=>import("./Wallet-vgS5USvW.js"),__vite__mapDeps([43,2,1,3,4,44]),import.meta.url)},{path:"organization",name:"Organization",component:()=>e(()=>import("./Organization-BOOqeyu_.js"),__vite__mapDeps([45,1,2,3,4,46]),import.meta.url)},{path:"analytics",name:"Analytics",component:()=>e(()=>import("./Analytics-CoH0P1ux.js"),__vite__mapDeps([47,2,1,3,4,48]),import.meta.url)},{path:"templates",name:"Templates",component:()=>e(()=>import("./Templates-buh__Yll.js"),__vite__mapDeps([49,1,2,3,4,50]),import.meta.url)},{path:"backup",name:"Backup",component:()=>e(()=>import("./Backup-Cv97eAjW.js"),__vite__mapDeps([51,2,1,3,4,52]),import.meta.url)},{path:"rssfeed",name:"RssFeed",component:()=>e(()=>import("./RssFeed-OQLesJxb.js"),__vite__mapDeps([53,1,2,3,4,54]),import.meta.url)},{path:"webauthn",name:"WebAuthn",component:()=>e(()=>import("./WebAuthn-BoL2UJ5Z.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-gZyc63Qr.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-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(`
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,`
@@ -0,0 +1 @@
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};
@@ -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-CyGtHm63.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-CCRLEutJ.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-CN0Iv_qZ.js">
13
- <link rel="modulepreload" crossorigin href="./assets/antd-gZyc63Qr.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/antd-BQNxIyr-.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-CyGyEIVX.css">
15
15
  </head>
16
16
  <body>
@@ -1,3 +1,55 @@
1
+ export async function handleCoworkTask(server, id, ws, message) {
2
+ const { templateId = null, userMessage, files = [] } = message;
3
+
4
+ if (!userMessage || typeof userMessage !== "string") {
5
+ server._send(ws, {
6
+ id,
7
+ type: "error",
8
+ code: "INVALID_MESSAGE",
9
+ message: "userMessage field required",
10
+ });
11
+ return;
12
+ }
13
+
14
+ try {
15
+ const { runCoworkTask } = await import("../../lib/cowork-task-runner.js");
16
+
17
+ server._send(ws, {
18
+ id,
19
+ type: "cowork:started",
20
+ templateId,
21
+ });
22
+
23
+ const result = await runCoworkTask({
24
+ templateId,
25
+ userMessage,
26
+ files,
27
+ cwd: server.projectRoot || process.cwd(),
28
+ llmOptions: {},
29
+ });
30
+
31
+ server._send(ws, {
32
+ id,
33
+ type: "cowork:done",
34
+ taskId: result.taskId,
35
+ status: result.status,
36
+ templateId: result.templateId,
37
+ templateName: result.templateName,
38
+ summary: result.result?.summary || "",
39
+ artifacts: result.result?.artifacts || [],
40
+ toolsUsed: result.result?.toolsUsed || [],
41
+ iterationCount: result.result?.iterationCount || 0,
42
+ });
43
+ } catch (err) {
44
+ server._send(ws, {
45
+ id,
46
+ type: "error",
47
+ code: "COWORK_FAILED",
48
+ message: err.message,
49
+ });
50
+ }
51
+ }
52
+
1
53
  export function handleSlashCommand(server, id, ws, message) {
2
54
  const { sessionId, command } = message;
3
55
  const handler = server.sessionHandlers.get(sessionId);
@@ -36,7 +88,8 @@ export async function handleOrchestrate(server, id, ws, message) {
36
88
  }
37
89
 
38
90
  try {
39
- const { Orchestrator, TASK_SOURCE } = await import("../../lib/orchestrator.js");
91
+ const { Orchestrator, TASK_SOURCE } =
92
+ await import("../../lib/orchestrator.js");
40
93
 
41
94
  const orch = new Orchestrator({
42
95
  cwd: cwd || server.projectRoot || process.cwd(),
@@ -43,6 +43,7 @@ export function createWsMessageDispatcher(server) {
43
43
  "session-answer": () => server._handleSessionAnswer(id, ws, message),
44
44
  "host-tool-result": () => server._handleHostToolResult(id, ws, message),
45
45
  orchestrate: () => server._handleOrchestrate(id, ws, message),
46
+ "cowork-task": () => server._handleCoworkTask(id, ws, message),
46
47
  "tasks-list": () => server._handleTasksList(id, ws),
47
48
  "tasks-stop": () => server._handleTasksStop(id, ws, message),
48
49
  "tasks-detail": () => server._handleTaskDetail(id, ws, message),
@@ -81,6 +81,7 @@ export async function handleSessionCreate(server, id, ws, message) {
81
81
  enabledToolNames,
82
82
  hostManagedToolPolicy,
83
83
  worktreeIsolation,
84
+ systemPromptExtension,
84
85
  } = message;
85
86
 
86
87
  try {
@@ -94,6 +95,7 @@ export async function handleSessionCreate(server, id, ws, message) {
94
95
  enabledToolNames,
95
96
  hostManagedToolPolicy,
96
97
  worktreeIsolation,
98
+ systemPromptExtension,
97
99
  });
98
100
 
99
101
  const session = server.sessionManager.getSession(sessionId);
@@ -48,7 +48,11 @@ import {
48
48
  handleTaskGraphAdvance,
49
49
  handleTaskGraphState,
50
50
  } from "./session-protocol.js";
51
- import { handleSlashCommand, handleOrchestrate } from "./action-protocol.js";
51
+ import {
52
+ handleSlashCommand,
53
+ handleOrchestrate,
54
+ handleCoworkTask,
55
+ } from "./action-protocol.js";
52
56
  import {
53
57
  handleWorktreeDiff,
54
58
  handleWorktreeMerge,
@@ -294,6 +298,11 @@ export class ChainlessChainWSServer extends EventEmitter {
294
298
  return handleOrchestrate(this, id, ws, message);
295
299
  }
296
300
 
301
+ /** @private — run a cowork daily task via SubAgentContext */
302
+ async _handleCoworkTask(id, ws, message) {
303
+ return handleCoworkTask(this, id, ws, message);
304
+ }
305
+
297
306
  /** @private – list background tasks */
298
307
  async _handleTasksList(id, ws) {
299
308
  try {
@@ -318,7 +318,12 @@ export class WSSessionManager {
318
318
  }
319
319
 
320
320
  // Build initial system prompt (includes persona + rules.md)
321
- const systemPrompt = buildSystemPrompt(projectRoot);
321
+ let systemPrompt = buildSystemPrompt(projectRoot);
322
+
323
+ // Append optional extension (e.g. cowork template instructions)
324
+ if (options.systemPromptExtension) {
325
+ systemPrompt += "\n\n" + options.systemPromptExtension;
326
+ }
322
327
 
323
328
  const messages = [{ role: "system", content: systemPrompt }];
324
329
 
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Cowork Task Runner — executes daily tasks using SubAgentContext.
3
+ *
4
+ * Creates an isolated sub-agent with a template-specific system prompt,
5
+ * runs the agent loop, and yields progress events for WS consumers.
6
+ *
7
+ * @module cowork-task-runner
8
+ */
9
+
10
+ import { SubAgentContext } from "./sub-agent-context.js";
11
+ import { getTemplate } from "./cowork-task-templates.js";
12
+
13
+ // ─── Constants ────────────────────────────────────────────────────────────────
14
+
15
+ const DEFAULT_MAX_ITERATIONS = 50;
16
+ const DEFAULT_TOKEN_BUDGET = 100_000;
17
+
18
+ // ─── Runner ───────────────────────────────────────────────────────────────────
19
+
20
+ /**
21
+ * Run a cowork task using SubAgentContext.
22
+ *
23
+ * @param {object} options
24
+ * @param {string|null} options.templateId - Template ID (null = free mode)
25
+ * @param {string} options.userMessage - User's task description
26
+ * @param {string[]} [options.files] - File paths provided by user
27
+ * @param {string} [options.cwd] - Working directory
28
+ * @param {object} [options.db] - Database instance
29
+ * @param {object} [options.llmOptions] - LLM provider/model/key
30
+ * @param {number} [options.maxIterations] - Override iteration limit
31
+ * @param {number} [options.tokenBudget] - Override token budget
32
+ * @returns {Promise<{ taskId: string, status: string, result: object }>}
33
+ */
34
+ export async function runCoworkTask(options = {}) {
35
+ const {
36
+ templateId = null,
37
+ userMessage,
38
+ files = [],
39
+ cwd = process.cwd(),
40
+ db = null,
41
+ llmOptions = {},
42
+ maxIterations = DEFAULT_MAX_ITERATIONS,
43
+ tokenBudget = DEFAULT_TOKEN_BUDGET,
44
+ } = options;
45
+
46
+ if (!userMessage || typeof userMessage !== "string") {
47
+ throw new Error("userMessage is required");
48
+ }
49
+
50
+ // Resolve template
51
+ const template = getTemplate(templateId);
52
+
53
+ // Build the task prompt with template context + files
54
+ const taskParts = [template.systemPromptExtension];
55
+
56
+ if (files.length > 0) {
57
+ taskParts.push(`\n## 用户提供的文件\n${files.join("\n")}`);
58
+ }
59
+
60
+ const task = taskParts.join("\n");
61
+
62
+ // Create isolated sub-agent context
63
+ const subAgent = SubAgentContext.create({
64
+ role: `cowork-${template.id}`,
65
+ task,
66
+ inheritedContext: null,
67
+ maxIterations,
68
+ tokenBudget,
69
+ db,
70
+ llmOptions,
71
+ cwd,
72
+ });
73
+
74
+ const taskId = subAgent.id;
75
+
76
+ // Run the agent with the user's message
77
+ try {
78
+ const result = await subAgent.run(userMessage);
79
+ return {
80
+ taskId,
81
+ status: subAgent.status,
82
+ templateId: template.id,
83
+ templateName: template.name,
84
+ result,
85
+ };
86
+ } catch (err) {
87
+ return {
88
+ taskId,
89
+ status: "failed",
90
+ templateId: template.id,
91
+ templateName: template.name,
92
+ result: {
93
+ summary: `Task failed: ${err.message}`,
94
+ artifacts: [],
95
+ tokenCount: 0,
96
+ toolsUsed: [],
97
+ iterationCount: 0,
98
+ },
99
+ };
100
+ }
101
+ }