zen-gitsync 2.17.10 → 2.17.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/ui/public/assets/AgentView-DJVwX8Er.js +5 -0
- package/src/ui/public/assets/AgentView-vvVhbIQ5.css +1 -0
- package/src/ui/public/assets/{AppVersionBadge-D5tJzJfa.css → AppVersionBadge-CJrDr7GV.css} +1 -1
- package/src/ui/public/assets/AppVersionBadge-rNwRlkEK.js +2 -0
- package/src/ui/public/assets/BranchSelector-B0eLkAdv.css +1 -0
- package/src/ui/public/assets/BranchSelector-D2JJINuw.js +1 -0
- package/src/ui/public/assets/CommitForm-CQ0K8Yy2.css +1 -0
- package/src/ui/public/assets/CommitForm-CayXdf3-.js +6 -0
- package/src/ui/public/assets/CommonDialog-DF5Vzvi8.js +1 -0
- package/src/ui/public/assets/CommonDialog-jP0E9mco.css +1 -0
- package/src/ui/public/assets/EditorView-Bv-3PWwF.js +1 -0
- package/src/ui/public/assets/EditorView-DZMLvQds.css +1 -0
- package/src/ui/public/assets/FileDiffViewer-B9EkuKdF.css +1 -0
- package/src/ui/public/assets/FileDiffViewer-CUsML3pW.js +15 -0
- package/src/ui/public/assets/FlowExecutionViewer-jNHI5zdm.css +1 -0
- package/src/ui/public/assets/FlowExecutionViewer-n07dZgnE.js +1 -0
- package/src/ui/public/assets/FlowOrchestrationWorkspace-CYGp-PqS.css +1 -0
- package/src/ui/public/assets/FlowOrchestrationWorkspace-CdG8HRux.js +21 -0
- package/src/ui/public/assets/IconButton-GxK-nCF7.js +1 -0
- package/src/ui/public/assets/IconButton-tjkOjzkC.css +1 -0
- package/src/ui/public/assets/LogList-BlJplIi1.css +1 -0
- package/src/ui/public/assets/LogList-CpcpXaIZ.js +7 -0
- package/src/ui/public/assets/MindmapView-BHVJ6OzY.js +2 -0
- package/src/ui/public/assets/MindmapView-BQTqx842.css +1 -0
- package/src/ui/public/assets/MonitorView-DetlFFXq.css +1 -0
- package/src/ui/public/assets/MonitorView-IpfJRJaK.js +1 -0
- package/src/ui/public/assets/ProjectStartupButton-DM2gYw48.js +1 -0
- package/src/ui/public/assets/ProjectStartupButton-QLPltCK5.css +1 -0
- package/src/ui/public/assets/RemoteManagerDialog-BauAeH2w.css +1 -0
- package/src/ui/public/assets/RemoteManagerDialog-DLPnI8Tr.js +4 -0
- package/src/ui/public/assets/RemoteRepoCard-CG-jARTe.css +1 -0
- package/src/ui/public/assets/RemoteRepoCard-D804CRwk.js +7 -0
- package/src/ui/public/assets/SourceMapView-CN4Hkyp4.css +1 -0
- package/src/ui/public/assets/SourceMapView-Ct8J5WA4.js +3 -0
- package/src/ui/public/assets/{SvgIcon-BQ6bR7l0.css → SvgIcon-CDNsk4-Q.css} +1 -1
- package/src/ui/public/assets/SvgIcon-DRYmw37Q.js +1 -0
- package/src/ui/public/assets/TemplateManager-BGEG9EkP.js +1 -0
- package/src/ui/public/assets/TemplateManager-DMuG4i3G.css +1 -0
- package/src/ui/public/assets/UserInputNode-BVgQkB2l.css +1 -0
- package/src/ui/public/assets/UserInputNode-DO4QsmCx.js +1 -0
- package/src/ui/public/assets/WorkbenchView-B1BJhWHi.css +1 -0
- package/src/ui/public/assets/WorkbenchView-D4herpOg.js +51 -0
- package/src/ui/public/assets/_plugin-vue_export-helper-uGHPMZWt.js +19 -0
- package/src/ui/public/assets/configStore-DAZtECRW.js +1 -0
- package/src/ui/public/assets/element-plus-BJ5_9fFh.js +48 -0
- package/src/ui/public/assets/element-plus-C1PloHQu.css +1 -0
- package/src/ui/public/assets/flow-mindmap-9rLOb4W_.js +139 -0
- package/src/ui/public/assets/{gitStore-DMEDMZMk.js → gitStore-BQhrNfOL.js} +4 -4
- package/src/ui/public/assets/{index-CW3xs-af.css → index-B-c23Usy.css} +1 -1
- package/src/ui/public/assets/index-BM9Kz0P0.js +87 -0
- package/src/ui/public/assets/office-docx-BrfnjjUo.js +32 -0
- package/src/ui/public/assets/{office-excel-D-uYLKaA.js → office-excel-C08VoWqf.js} +1 -1
- package/src/ui/public/assets/office-pptx-Cs69NVuQ.js +74 -0
- package/src/ui/public/assets/{previewSandbox-B6Ud9g6a.css → previewSandbox-CgdwPcuW.css} +1 -1
- package/src/ui/public/assets/previewSandbox-D2nklUXY.js +0 -0
- package/src/ui/public/assets/socket-io-BFqQXqAp.js +1 -0
- package/src/ui/public/assets/{toolsStore-CpImRUhI.js → toolsStore-DX4sCU-U.js} +1 -1
- package/src/ui/public/assets/{useThemeObserver-CG8k8U18.js → useThemeObserver-chduV3hr.js} +1 -1
- package/src/ui/public/assets/{vendor-BIgZEtkx.js → vendor-xs0vOPEn.js} +46 -39
- package/src/ui/public/assets/vue-flow-DvidrbDz.js +39 -0
- package/src/ui/public/index.html +25 -25
- package/src/ui/server/routes/remoteRepos.js +73 -19
- package/src/ui/server/routes/remoteRepos.test.js +111 -1
- package/src/ui/server/routes/workbench/agentSessionStore.js +2 -2
- package/src/ui/server/routes/workbench/envContext.test.js +8 -8
- package/src/ui/server/routes/workbench/index.js +32 -736
- package/src/ui/server/routes/workbench/instructionStore.js +3 -113
- package/src/ui/server/routes/workbench/jobStore.js +2 -4
- package/src/ui/server/routes/workbench/jobStore.test.js +1 -1
- package/src/ui/server/routes/workbench/jsonParse.js +6 -143
- package/src/ui/server/routes/workbench/orchestratorStore.js +1 -8
- package/src/ui/server/routes/workbench/projectRegistry.js +6 -29
- package/src/ui/server/routes/workbench/projectRegistry.test.js +33 -56
- package/src/ui/server/routes/workbench/projectTool.js +0 -1
- package/src/ui/server/routes/workbench/projectTool.test.js +2 -3
- package/src/ui/server/routes/workbench/shared.js +2 -7
- package/src/ui/server/routes/workbench/taskRunner.js +18 -180
- package/src/ui/server/routes/workbench.js +4 -5
- package/src/ui/public/assets/AgentView-BV15UtEF.css +0 -1
- package/src/ui/public/assets/AgentView-C-AJo7KS.js +0 -5
- package/src/ui/public/assets/AppVersionBadge-B6R6eN2N.js +0 -2
- package/src/ui/public/assets/BranchSelector-Cj3kMWON.js +0 -1
- package/src/ui/public/assets/BranchSelector-T_rJm-JY.css +0 -1
- package/src/ui/public/assets/CommitForm-DpXuFG-F.js +0 -6
- package/src/ui/public/assets/CommitForm-Oij8R6P-.css +0 -1
- package/src/ui/public/assets/CommonDialog-BLPHDsn0.js +0 -1
- package/src/ui/public/assets/CommonDialog-C_RjF9Mp.css +0 -1
- package/src/ui/public/assets/EditorView-B1OnoXXf.js +0 -1
- package/src/ui/public/assets/EditorView-BgA-_8WV.css +0 -1
- package/src/ui/public/assets/FileDiffViewer-B2_ghtbv.css +0 -1
- package/src/ui/public/assets/FileDiffViewer-BQl0JcWd.js +0 -14
- package/src/ui/public/assets/FlowExecutionViewer-B5kh7VxS.css +0 -1
- package/src/ui/public/assets/FlowExecutionViewer-BgEt5_Hz.js +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-BAQDU9Jd.css +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-CbLmsSF8.js +0 -21
- package/src/ui/public/assets/IconButton-CTwyZrv2.css +0 -1
- package/src/ui/public/assets/IconButton-aM3vaSIN.js +0 -1
- package/src/ui/public/assets/LogList-DlWwSZet.css +0 -1
- package/src/ui/public/assets/LogList-UjoVFZ-H.js +0 -7
- package/src/ui/public/assets/MindmapView-CS2t30Ko.css +0 -1
- package/src/ui/public/assets/MindmapView-D_04v0n4.js +0 -1
- package/src/ui/public/assets/MonitorView-BD1_uzq7.js +0 -1
- package/src/ui/public/assets/MonitorView-CphDOlQu.css +0 -1
- package/src/ui/public/assets/ProjectStartupButton-B7zvqRj_.css +0 -1
- package/src/ui/public/assets/ProjectStartupButton-BTYlVvzh.js +0 -1
- package/src/ui/public/assets/RemoteManagerDialog-20mpQMwu.js +0 -1
- package/src/ui/public/assets/RemoteManagerDialog-bpwaVAvX.css +0 -1
- package/src/ui/public/assets/RemoteRepoCard-CDykPlPj.css +0 -1
- package/src/ui/public/assets/RemoteRepoCard-DOrm17Xd.js +0 -1
- package/src/ui/public/assets/SourceMapView-DjYKJZLj.css +0 -1
- package/src/ui/public/assets/SourceMapView-nUU9bYPh.js +0 -3
- package/src/ui/public/assets/SvgIcon-LUynX3Iq.js +0 -1
- package/src/ui/public/assets/TemplateManager-Bo3Q7J9Y.js +0 -1
- package/src/ui/public/assets/TemplateManager-C0rm8xfC.css +0 -1
- package/src/ui/public/assets/UserInputNode-D5tSXiJz.js +0 -1
- package/src/ui/public/assets/UserInputNode-DDtvv9Iq.css +0 -1
- package/src/ui/public/assets/WorkbenchView-C_Gmzvj1.css +0 -1
- package/src/ui/public/assets/WorkbenchView-UGC334JL.js +0 -13
- package/src/ui/public/assets/_plugin-vue_export-helper-D-D9qkRz.js +0 -19
- package/src/ui/public/assets/configStore-BLRcYJdf.js +0 -1
- package/src/ui/public/assets/element-plus-BWbXh9mk.css +0 -1
- package/src/ui/public/assets/element-plus-DcZ-TVp6.js +0 -28
- package/src/ui/public/assets/flow-mindmap-D1VTkZh3.js +0 -139
- package/src/ui/public/assets/index-S0_gRyiO.js +0 -26
- package/src/ui/public/assets/office-docx-C0g5Oepv.js +0 -31
- package/src/ui/public/assets/office-pptx-De3fnc6M.js +0 -60
- package/src/ui/public/assets/previewSandbox-DXAxqDVu.js +0 -0
- package/src/ui/public/assets/socket-io-TBtw0msS.js +0 -1
- package/src/ui/public/assets/vue-flow-CPCFgenl.js +0 -39
- package/src/ui/server/routes/workbench/sessionStore.js +0 -126
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$n as e,$r as t,A as n,An as r,Ar as i,B as a,Bn as o,Bt as s,C as c,Cn as l,D as u,Dn as d,E as f,F as p,Ft as m,Gt as h,Ht as g,In as _,J as v,Jn as y,Jt as b,K as ee,L as x,Ln as S,M as C,Mn as w,Mt as te,Nn as T,Nt as E,Ot as D,P as ne,Q as O,R as k,Rn as A,Rr as j,Rt as re,Sn as M,Sr as ie,T as ae,Tn as N,Tt as oe,Vt as se,W as ce,Wn as P,Wt as le,X as ue,Y as de,Z as fe,Zn as pe,Zr as F,Zt as me,_n as he,_r as I,a as L,an as ge,at as _e,b as ve,bn as ye,cn as be,ct as xe,dt as Se,f as Ce,fr as R,g as we,ht as Te,i as Ee,jn as z,k as B,kn as V,l as De,mn as H,ni as U,nt as Oe,o as ke,or as Ae,ot as je,p as Me,pr as W,pt as Ne,q as Pe,r as Fe,rr as G,rt as Ie,st as Le,tr as K,ur as q,ut as Re,w as ze,wn as J,wr as Y,wt as Be,x as Ve,xn as He,xt as X,y as Ue,yn as We,yt as Ge}from"./element-plus-DcZ-TVp6.js";import{a as Ke,i as qe,o as Je,r as Ye}from"./vendor-BIgZEtkx.js";import{n as Z,t as Xe}from"./_plugin-vue_export-helper-D-D9qkRz.js";import{t as Ze}from"./SvgIcon-LUynX3Iq.js";import{t as Qe}from"./configStore-BLRcYJdf.js";import{t as $e}from"./toolsStore-CpImRUhI.js";import{t as et}from"./CommonDialog-BLPHDsn0.js";import{T as Q,_ as tt,a as nt,c as rt,d as it,f as at,g as $,h as ot,i as st,l as ct,m as lt,o as ut,p as dt,s as ft,u as pt}from"./index-S0_gRyiO.js";P(),I(),j();var mt={class:`ai-split-direct-pane`},ht={key:0,class:`ai-split-status`},gt={key:1,class:`ai-split-status`},_t={key:1},vt={key:2},yt={key:2,class:`ai-split-status is-error`},bt={key:3,class:`ai-split-idle`},xt={class:`ai-split-idle__title`},St={class:`ai-split-idle__desc`},Ct={class:`ai-split-prompt-actions`},wt={key:0,class:`ai-split-prompt-editor`},Tt={class:`ai-split-prompt-editor__actions`},Et={key:1,class:`ai-split-pre`},Dt={class:`ai-split-subhead`},Ot={class:`ai-split-user-actions`},kt={key:3,class:`ai-split-pre`},At={key:0,class:`ai-split-tab-count`},jt={class:`ai-split-pre ai-split-pre--think`},Mt={key:0,class:`ai-split-tab-count`},Nt={class:`ai-split-parse-error__detail`},Pt={class:`ai-split-parse-error__hint`},Ft={class:`ai-split-parse-error__actions`},It={key:1,class:`ai-split-raw-toolbar`},Lt={class:`ai-split-raw-tip`},Rt={key:0,class:`ai-split-tab-count`},zt={key:0,class:`ai-split-empty`},Bt={key:1,class:`ai-split-list`},Vt={class:`ai-split-list__no`},Ht={class:`ai-split-list__body`},Ut={class:`ai-split-list__title`},Wt={class:`ai-split-list__desc`},Gt={key:5,class:`ai-split-footer-hint`},Kt={class:`ai-split-direct-footer`},qt=Xe(o({__name:`AISplitDirectPane`,props:{title:{},desc:{},taskId:{},promptId:{}},emits:[`confirm`],setup(e,{emit:t}){let n=e,o=t,s=Y(`idle`),c=Y(`prompt`),l=Y(``),u=Y(``),d=Y(``),f=Y(``),p=Y(``),m=Y([]),h=Y(``),g=Y(``),y=Y(``),b=null,ee=0,x=V(()=>d.value.length),C=V(()=>f.value.length),te=V(()=>s.value===`result`&&m.value.length>0),D=V(()=>s.value===`running`),ne=V(()=>s.value===`preview`),O=Y(``),k=Y(!1);function j(){b&&=(b.abort(),null)}function re(){j(),s.value=`idle`,c.value=`prompt`,l.value=``,u.value=``,O.value=``,d.value=``,f.value=``,p.value=``,m.value=[],h.value=``,g.value=``,y.value=``}async function M(){if(!n.title.trim()){L.warning(Z(`@WORKBENCH:请先填写任务标题`));return}re(),s.value=`preview`,c.value=`prompt`,k.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-split-preview`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n.title,desc:n.desc,taskId:n.taskId||``,promptId:n.promptId||``})}).then(e=>e.json());if(!e.success){s.value=`error`,h.value=e.error||Z(`@WORKBENCH:生成预览失败`);return}l.value=e.system||``,u.value=e.user||``,O.value=e.user||``}catch(e){s.value=`error`,h.value=e?.message||String(e)}finally{k.value=!1}}async function ie(){if(!O.value.trim()){L.warning(Z(`@WORKBENCH:提示词不能为空`));return}let e=++ee;j(),d.value=``,f.value=``,p.value=``,m.value=[],g.value=``,y.value=``,h.value=``,s.value=`running`,c.value=`thinking`,u.value=O.value,b=new AbortController;let t=b;try{let r=await fetch(`/api/workbench/tasks/ai-split-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({title:n.title,desc:n.desc,taskId:n.taskId||``,promptId:n.promptId||``,customUserBlock:O.value}),signal:t.signal});if(e!==ee)return;if(!r.ok||!r.body){let e=await r.text().catch(()=>``);throw Error(e||`HTTP ${r.status}`)}let i=r.body.getReader(),a=new TextDecoder(`utf-8`),o=``,u=null;for(;;){let{value:t,done:n}=await i.read();if(e!==ee)return;if(n)break;o+=a.decode(t,{stream:!0});let r=o.split(`
|
|
2
|
-
`);o=r.pop()??``;for(let e of r){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}switch(r.type){case`meta`:l.value=r.prompt?.system||l.value;break;case`thinking`:d.value+=String(r.delta||``);break;case`content`:f.value+=String(r.delta||``);break;case`done`:u=r;break;case`error`:throw Error(r.error||`AI 拆分失败`)}}}if(e!==ee)return;if(!u)throw Error(Z(`@WORKBENCH:AI 未返回结果`));m.value=Array.isArray(u.subtasks)?u.subtasks:[],p.value=u.raw||f.value,g.value=String(u.parseError||``),y.value=String(u.parseStage||``),d.value||=Z(`@WORKBENCH:(当前模型未返回独立的思考内容,可切换到「原始结果」查看完整输出)`),s.value=`result`,c.value=m.value.length>0?`confirm`:`raw`}catch(n){if(e!==ee)return;if(n?.name===`AbortError`||t.signal.aborted){s.value=`preview`,c.value=`prompt`;return}s.value=`error`,h.value=n?.message||String(n)}finally{e===ee&&(b=null)}}function ae(){te.value&&o(`confirm`,m.value.slice())}function oe(){O.value.trim()?ie():M()}function se(){b&&(b.abort(),b=null,L.info(Z(`@WORKBENCH:已停止拆分`)))}let P=Y(!1);async function ue(){if(!f.value.trim()){L.warning(Z(`@WORKBENCH:原始结果为空,无法解析`));return}P.value=!0;try{let e=await fetch(`/api/workbench/tasks/parse-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({raw:f.value})}).then(e=>e.json());if(!e.success){L.error(e.error||Z(`@WORKBENCH:解析失败`));return}m.value=Array.isArray(e.subtasks)?e.subtasks:[],g.value=String(e.parseError||``),y.value=String(e.parseStage||``),p.value=f.value,m.value.length>0?(L.success(Z(`@WORKBENCH:解析成功,已识别 {n} 个子任务`,{n:m.value.length})),c.value=`confirm`):L.warning(Z(`@WORKBENCH:仍未解析到子任务,请继续修改原始结果`))}catch(e){L.error(Z(`@WORKBENCH:解析失败: `)+(e?.message||e))}finally{P.value=!1}}q(()=>n.taskId,()=>{re()});let fe=Y(!1),pe=Y(``),F=Y(!1);function me(){pe.value=l.value,fe.value=!0}async function he(){if(!pe.value.trim()){L.warning(Z(`@WORKBENCH:指令内容不能为空`));return}F.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-subtask-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:pe.value})}).then(e=>e.json());e.success?(L.success(Z(`@WORKBENCH:已保存指令`)),fe.value=!1,M()):L.error(e.error||Z(`@WORKBENCH:保存失败`))}catch(e){L.error(Z(`@WORKBENCH:保存失败: `)+(e?.message||e))}finally{F.value=!1}}function I(){fe.value=!1}return(e,t)=>{let n=de,o=a,p=ce,y=Ce,b=v,ee=Me;return K(),T(`div`,mt,[D.value?(K(),T(`div`,ht,[A(n,{class:`is-loading`},{default:R(()=>[A(i(E))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:AI 正在拆分…`)),1),A(o,{size:`small`,link:``,type:`danger`,class:`ai-split-status__stop`,onClick:se},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:停止拆分`)),1)]),_:1})])):ne.value?(K(),T(`div`,gt,[k.value?(K(),z(n,{key:0,class:`is-loading`},{default:R(()=>[A(i(E))]),_:1})):w(``,!0),k.value?(K(),T(`span`,_t,U(i(Z)(`@WORKBENCH:正在生成提示词预览…`)),1)):(K(),T(`span`,vt,U(i(Z)(`@WORKBENCH:提示词已就绪,可在下方编辑后点「发送给 AI」开始拆分`)),1))])):s.value===`error`?(K(),T(`div`,yt,[A(n,{color:`var(--color-danger)`},{default:R(()=>[A(i(_e))]),_:1}),r(`span`,null,U(h.value),1)])):s.value===`idle`?(K(),T(`div`,bt,[t[5]||=_(`<div class="ai-split-idle__icon" aria-hidden="true" data-v-bff9eaf1><svg viewBox="0 0 24 24" width="36" height="36" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" data-v-bff9eaf1><path d="M12 3v3" data-v-bff9eaf1></path><path d="M12 18v3" data-v-bff9eaf1></path><path d="M3 12h3" data-v-bff9eaf1></path><path d="M18 12h3" data-v-bff9eaf1></path><path d="M5.6 5.6l2.1 2.1" data-v-bff9eaf1></path><path d="M16.3 16.3l2.1 2.1" data-v-bff9eaf1></path><path d="M5.6 18.4l2.1-2.1" data-v-bff9eaf1></path><path d="M16.3 7.7l2.1-2.1" data-v-bff9eaf1></path><circle cx="12" cy="12" r="4" data-v-bff9eaf1></circle></svg></div>`,1),r(`div`,xt,U(i(Z)(`@WORKBENCH:准备用 AI 拆分任务`)),1),r(`div`,St,U(i(Z)(`@WORKBENCH:点击下方按钮开始生成。生成期间可切换到「思考 / 原始结果」实时查看模型输出。`)),1),A(o,{type:`primary`,icon:i(le),onClick:M},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:开始拆分`)),1)]),_:1},8,[`icon`])])):w(``,!0),s.value===`idle`?w(``,!0):(K(),z(ee,{key:4,modelValue:c.value,"onUpdate:modelValue":t[4]||=e=>c.value=e,class:`ai-split-tabs`},{default:R(()=>[A(y,{label:i(Z)(`@WORKBENCH:提示词`),name:`prompt`},{default:R(()=>[r(`div`,Ct,[A(o,{size:`small`,disabled:D.value,onClick:me},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:编辑指令`)),1)]),_:1},8,[`disabled`])]),fe.value?(K(),T(`div`,wt,[A(p,{modelValue:pe.value,"onUpdate:modelValue":t[0]||=e=>pe.value=e,type:`textarea`,rows:12,placeholder:i(Z)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`]),r(`div`,Tt,[A(o,{size:`small`,onClick:I},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:取消`)),1)]),_:1}),A(o,{size:`small`,type:`primary`,loading:F.value,onClick:he},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:保存并重跑`)),1)]),_:1},8,[`loading`])])])):(K(),T(`pre`,Et,U(l.value||`(等待 LLM 启动…)`),1)),r(`h4`,Dt,U(i(Z)(`@WORKBENCH:用户提示词(拼装后)`)),1),ne.value?(K(),T(N,{key:2},[A(p,{modelValue:O.value,"onUpdate:modelValue":t[1]||=e=>O.value=e,type:`textarea`,rows:16,placeholder:i(Z)(`@WORKBENCH:正在生成预览…`),readonly:k.value,class:`ai-split-user-editor`,resize:`none`},null,8,[`modelValue`,`placeholder`,`readonly`]),r(`div`,Ot,[A(o,{size:`small`,disabled:k.value,onClick:re},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:取消`)),1)]),_:1},8,[`disabled`]),A(o,{type:`primary`,icon:i(le),disabled:k.value||!O.value.trim(),onClick:ie},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:发送给 AI`)),1)]),_:1},8,[`icon`,`disabled`])])],64)):(K(),T(`pre`,kt,U(u.value||`(等待 LLM 启动…)`),1))]),_:1},8,[`label`]),A(y,{name:`thinking`},{label:R(()=>[r(`span`,null,[S(U(i(Z)(`@WORKBENCH:思考`))+` `,1),x.value>0?(K(),T(`span`,At,`(`+U(x.value)+`)`,1)):w(``,!0)])]),default:R(()=>[r(`pre`,jt,U(d.value||i(Z)(`@WORKBENCH:(暂无输出)`)),1)]),_:1}),A(y,{name:`raw`},{label:R(()=>[r(`span`,null,[S(U(i(Z)(`@WORKBENCH:原始结果`))+` `,1),C.value>0?(K(),T(`span`,Mt,`(`+U(C.value)+`)`,1)):w(``,!0)])]),default:R(()=>[g.value&&s.value===`result`?(K(),z(b,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`ai-split-parse-error`},{title:R(()=>[S(U(i(Z)(`@WORKBENCH:模型返回内容解析失败,无法识别为有效的子任务 JSON`)),1)]),default:R(()=>[r(`div`,Nt,U(g.value),1),r(`div`,Pt,U(i(Z)(`@WORKBENCH:常见原因:desc 内夹杂了 ASCII 双引号、出现尾随逗号,或输出被截断。可在下方文本框中手动修改后点「重新解析」,或重新生成。`)),1),r(`div`,Ft,[A(o,{size:`small`,type:`primary`,loading:P.value,onClick:ue},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`]),A(o,{size:`small`,onClick:oe},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重新生成`)),1)]),_:1}),A(o,{size:`small`,onClick:t[2]||=e=>c.value=`prompt`},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:去编辑指令`)),1)]),_:1})])]),_:1})):w(``,!0),s.value===`result`||f.value?(K(),T(`div`,It,[r(`span`,Lt,U(i(Z)(`@WORKBENCH:可直接编辑下方文本,修正后点「重新解析」即可入库`)),1),A(o,{size:`small`,type:`primary`,loading:P.value,disabled:!f.value.trim(),onClick:ue},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`,`disabled`])])):w(``,!0),A(p,{modelValue:f.value,"onUpdate:modelValue":t[3]||=e=>f.value=e,type:`textarea`,rows:14,placeholder:i(Z)(`@WORKBENCH:(暂无输出)`),readonly:D.value,class:`ai-split-raw-editor`,resize:`none`},null,8,[`modelValue`,`placeholder`,`readonly`])]),_:1}),A(y,{name:`confirm`,disabled:m.value.length===0},{label:R(()=>[r(`span`,null,[S(U(i(Z)(`@WORKBENCH:确认入库`))+` `,1),m.value.length>0?(K(),T(`span`,Rt,`(`+U(m.value.length)+`)`,1)):w(``,!0)])]),default:R(()=>[m.value.length===0?(K(),T(`div`,zt,U(i(Z)(`@WORKBENCH:(暂无子任务)`)),1)):(K(),T(`ul`,Bt,[(K(!0),T(N,null,G(m.value,(e,t)=>(K(),T(`li`,{key:t,class:`ai-split-list__item`},[r(`div`,Vt,U(t+1),1),r(`div`,Ht,[r(`div`,Ut,U(e.title),1),r(`div`,Wt,U(e.desc),1)])]))),128))]))]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`])),g.value&&s.value===`result`&&m.value.length===0?(K(),T(`div`,Gt,[A(n,{color:`var(--color-warning)`},{default:R(()=>[A(i(_e))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:解析失败,未能从模型输出中提取出子任务 — 请查看「原始结果」`)),1)])):w(``,!0),r(`div`,Kt,[s.value===`error`||s.value===`result`&&g.value&&m.value.length===0?(K(),z(o,{key:0,onClick:oe},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重新生成`)),1)]),_:1})):w(``,!0),s.value===`result`&&m.value.length>0?(K(),z(o,{key:1,onClick:oe},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重新拆分`)),1)]),_:1})):w(``,!0),A(o,{type:`primary`,disabled:!te.value,onClick:ae},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:确认入库`))+` (`+U(m.value.length)+`) `,1)]),_:1},8,[`disabled`])])])}}}),[[`__scopeId`,`data-v-bff9eaf1`]]);P(),I(),j(),H();var Jt={class:`ai-chat-pane`},Yt={key:0,class:`ai-chat-streaming-banner`},Xt={key:1,class:`ai-chat-empty`},Zt={class:`ai-chat-empty__title`},Qt={class:`ai-chat-empty__desc`},$t={key:0,class:`ai-chat-bubble user`},en={class:`ai-chat-content`},tn={key:1,class:`ai-chat-bubble assistant`},nn={class:`ai-chat-pre ai-chat-pre--think`},rn={key:1,class:`ai-chat-content-text`},an={key:2,class:`ai-chat-subtasks`},on={class:`ai-chat-subtasks__head`},sn={class:`ai-chat-subtasks__count`},cn={class:`ai-chat-list`},ln={class:`ai-chat-list__no`},un={class:`ai-chat-list__body`},dn={class:`ai-chat-list__title`},fn={class:`ai-chat-list__desc`},pn={class:`ai-chat-parse-error__detail`},mn={class:`ai-chat-pre`},hn={key:5,class:`ai-chat-turn__actions`},gn={class:`ai-chat-input`},_n={class:`ai-chat-input__actions`},vn={key:0,class:`ai-chat-history__loading`},yn={key:1,class:`ai-chat-history__empty`},bn={key:2,class:`ai-chat-history__list`},xn={class:`ai-chat-history__title`},Sn={class:`ai-chat-history__meta`},Cn={class:`ai-chat-history__actions`},wn=Xe(o({__name:`AISplitChatPane`,props:{title:{},desc:{},taskId:{},promptId:{},initialSessionId:{}},emits:[`confirm`],setup(e,{emit:t}){let o=e,s=t,c=Y(`idle`),u=Y(``),d=Y([]),p=Y(``),m=Y(``),g=null,_=0,v=Y(null),b=V(()=>c.value===`streaming`),ee=V(()=>{if(!b.value)return``;let e=[...d.value].reverse().find(e=>e.role===`assistant`);return e?e.content?Z(`@WORKBENCH:AI 正在输出…`):e.thinking?Z(`@WORKBENCH:AI 正在思考… (已思考 {n} 字)`,{n:e.thinking.length}):Z(`@WORKBENCH:AI 正在思考…`):Z(`@WORKBENCH:AI 正在思考…`)}),x=Y(!1),C=Y(!1),te=Y([]);function D(){v.value&&(v.value.scrollTop=v.value.scrollHeight)}async function ne(){let e=p.value.trim();if(!e||b.value)return;if(!u.value&&!o.title.trim()){L.warning(Z(`@WORKBENCH:请先填写任务标题`));return}let t=++_;g=new AbortController;let n=g,r={role:`user`,content:e};d.value.push(r),p.value=``;let i={role:`assistant`,content:``,thinking:``};d.value.push(i),c.value=`streaming`,await y(),D();try{let r=await fetch(`/api/workbench/tasks/ai-chat-split`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({sessionId:u.value,title:o.title,desc:o.desc,taskId:o.taskId||``,promptId:o.promptId||``,userMessage:e}),signal:n.signal});if(t!==_)return;if(!r.ok||!r.body){let e=await r.text().catch(()=>``);throw Error(e||`HTTP ${r.status}`)}let a=r.body.getReader(),s=new TextDecoder(`utf-8`),l=``,f=null,p=!1;for(;;){let{value:e,done:n}=await a.read();if(t!==_)return;if(n)break;l+=s.decode(e,{stream:!0});let r=l.split(`
|
|
3
|
-
`);l=r.pop()??``;for(let e of r){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}switch(r.type){case`meta`:r.sessionId&&(u.value=r.sessionId);break;case`user_echo`:p=!0;break;case`thinking`:i.thinking=(i.thinking||``)+String(r.delta||``);break;case`content`:i.content+=String(r.delta||``);break;case`done`:f=r;break;case`error`:throw Error(r.error||`对话拆分失败`)}}d.value=[...d.value],await y(),D()}if(t!==_)return;if(!p&&!f)throw Error(Z(`@WORKBENCH:AI 未返回结果`));f&&(i.subtasks=Array.isArray(f.subtasks)?f.subtasks:[],i.raw=String(f.raw||i.content),i.parseError=String(f.parseError||``),i.parseStage=String(f.parseStage||``)),d.value=[...d.value],await y(),D(),c.value=`idle`}catch(e){if(t!==_)return;if(e?.name===`AbortError`||n.signal.aborted){i.content=(i.content||``)+`
|
|
4
|
-
|
|
5
|
-
[已停止]`,d.value=[...d.value],c.value=`idle`;return}c.value=`error`,m.value=e?.message||String(e),L.error(m.value)}finally{t===_&&(g=null)}}function O(){g&&=(g.abort(),null)}function k(){if(b.value){L.warning(Z(`@WORKBENCH:请先停止当前生成`));return}d.value=[],u.value=``,m.value=``,c.value=`idle`}function j(e){if(!e.subtasks||e.subtasks.length===0){L.warning(Z(`@WORKBENCH:当前没有可应用的子任务`));return}s(`confirm`,e.subtasks.slice())}async function re(){x.value=!0,C.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-chat-sessions`).then(e=>e.json());if(!e.success){L.error(e.error||Z(`@WORKBENCH:加载历史会话失败`));return}te.value=Array.isArray(e.sessions)?e.sessions:[]}catch(e){L.error(Z(`@WORKBENCH:加载历史会话失败`)+`: `+(e?.message||e))}finally{C.value=!1}}async function M(e){if(x.value=!1,b.value){L.warning(Z(`@WORKBENCH:请先停止当前生成`));return}try{let t=await fetch(`/api/workbench/tasks/ai-chat-sessions/${encodeURIComponent(e)}`).then(e=>e.json());if(!t.success){L.error(t.error||Z(`@WORKBENCH:加载历史会话失败`));return}let n=t.session;u.value=n.sessionId;let r=(n.messages||[]).filter(e=>e.role===`user`||e.role===`assistant`).map(e=>({role:e.role,content:e.content||``,thinking:``,subtasks:void 0,raw:void 0,parseError:``,parseStage:``})),i=[...r].reverse().find(e=>e.role===`assistant`);i&&Array.isArray(n.latestSubtasks)&&(i.subtasks=n.latestSubtasks,i.raw=n.latestRaw,i.parseStage=n.latestParseStage),d.value=r,c.value=`idle`,L.success(Z(`@WORKBENCH:已恢复历史会话`)),await y(),D()}catch(e){L.error(Z(`@WORKBENCH:加载历史会话失败`)+`: `+(e?.message||e))}}async function ie(e){try{await Ee.confirm(Z(`@WORKBENCH:确认删除该会话`),Z(`@WORKBENCH:删除后无法恢复`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/tasks/ai-chat-sessions/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());if(!t.success){L.error(t.error||Z(`@WORKBENCH:删除失败`));return}te.value=te.value.filter(t=>t.sessionId!==e),L.success(Z(`@WORKBENCH:已删除`))}catch(e){L.error(Z(`@WORKBENCH:删除失败`)+`: `+(e?.message||e))}}function ae(e){if(!e)return``;try{let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}catch{return e}}function oe(e){return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`:`0 B`}return o.initialSessionId&&M(o.initialSessionId),(e,t)=>{let o=de,s=n,c=B,u=a,m=ce,g=f;return K(),T(`div`,Jt,[r(`div`,{ref_key:`streamEl`,ref:v,class:`ai-chat-stream`},[b.value?(K(),T(`div`,Yt,[A(o,{class:`is-loading`},{default:R(()=>[A(i(E))]),_:1}),r(`span`,null,U(ee.value),1)])):w(``,!0),d.value.length===0&&!b.value?(K(),T(`div`,Xt,[A(o,{size:32,color:`var(--text-tertiary)`},{default:R(()=>[A(i(Oe))]),_:1}),r(`div`,Zt,U(i(Z)(`@WORKBENCH:开始与 AI 对话拆分`)),1),r(`div`,Qt,U(i(Z)(`@WORKBENCH:输入你想让 AI 怎么拆分或调整(Enter 发送,Shift+Enter 换行)`)),1)])):w(``,!0),(K(!0),T(N,null,G(d.value,(e,t)=>(K(),T(`div`,{key:t,class:F([`ai-chat-turn`,`ai-chat-turn--${e.role}`])},[e.role===`user`?(K(),T(`div`,$t,[r(`pre`,en,U(e.content),1)])):(K(),T(`div`,tn,[e.thinking?(K(),z(c,{key:0,class:`ai-chat-collapse`},{default:R(()=>[A(s,{title:i(Z)(`@WORKBENCH:思考过程`)+` (${e.thinking.length})`,name:`think`},{default:R(()=>[r(`pre`,nn,U(e.thinking),1)]),_:2},1032,[`title`])]),_:2},1024)):w(``,!0),e.content?(K(),T(`div`,rn,U(e.content),1)):w(``,!0),e.subtasks&&e.subtasks.length>0?(K(),T(`div`,an,[r(`div`,on,[r(`span`,sn,U(i(Z)(`@WORKBENCH:识别到 {n} 个子任务`,{n:e.subtasks.length})),1)]),r(`ul`,cn,[(K(!0),T(N,null,G(e.subtasks,(e,t)=>(K(),T(`li`,{key:t,class:`ai-chat-list__item`},[r(`div`,ln,U(t+1),1),r(`div`,un,[r(`div`,dn,U(e.title),1),r(`div`,fn,U(e.desc),1)])]))),128))])])):w(``,!0),e.parseError&&(!e.subtasks||e.subtasks.length===0)?(K(),z(c,{key:3,class:`ai-chat-collapse`},{default:R(()=>[A(s,{title:i(Z)(`@WORKBENCH:查看解析详情`),name:`diag`},{default:R(()=>[r(`div`,pn,U(e.parseError),1)]),_:2},1032,[`title`])]),_:2},1024)):w(``,!0),e.raw&&e.raw!==e.content?(K(),z(c,{key:4,class:`ai-chat-collapse`},{default:R(()=>[A(s,{title:i(Z)(`@WORKBENCH:查看原始 LLM 输出`),name:`raw`},{default:R(()=>[r(`pre`,mn,U(e.raw),1)]),_:2},1032,[`title`])]),_:2},1024)):w(``,!0),e.subtasks&&e.subtasks.length>0?(K(),T(`div`,hn,[A(u,{type:`primary`,size:`small`,icon:i(le),onClick:t=>j(e)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:应用本轮`))+` (`+U(e.subtasks.length)+`) `,1)]),_:2},1032,[`icon`,`onClick`])])):w(``,!0)]))],2))),128))],512),r(`div`,gn,[A(m,{modelValue:p.value,"onUpdate:modelValue":t[0]||=e=>p.value=e,type:`textarea`,rows:3,disabled:b.value,placeholder:i(Z)(`@WORKBENCH:输入你想让 AI 怎么拆分或调整(Enter 发送,Shift+Enter 换行)`),onKeydown:l(J(ne,[`exact`,`prevent`]),[`enter`])},null,8,[`modelValue`,`disabled`,`placeholder`,`onKeydown`]),r(`div`,_n,[b.value?(K(),z(u,{key:0,type:`danger`,icon:i(_e),onClick:O},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:停止`)),1)]),_:1},8,[`icon`])):(K(),z(u,{key:1,type:`primary`,icon:i(le),disabled:!p.value.trim(),onClick:ne},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:发送`)),1)]),_:1},8,[`icon`,`disabled`])),A(u,{disabled:b.value,icon:i(h),onClick:k},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:清空对话`)),1)]),_:1},8,[`disabled`,`icon`]),A(u,{disabled:b.value,icon:i(Le),onClick:re},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:历史会话`)),1)]),_:1},8,[`disabled`,`icon`])])]),A(g,{modelValue:x.value,"onUpdate:modelValue":t[1]||=e=>x.value=e,title:i(Z)(`@WORKBENCH:历史会话`),direction:`rtl`,size:`420px`},{default:R(()=>[C.value?(K(),T(`div`,vn,[A(o,{class:`is-loading`},{default:R(()=>[A(i(E))]),_:1})])):te.value.length===0?(K(),T(`div`,yn,U(i(Z)(`@WORKBENCH:暂无历史会话`)),1)):(K(),T(`ul`,bn,[(K(!0),T(N,null,G(te.value,e=>(K(),T(`li`,{key:e.sessionId,class:`ai-chat-history__item`},[r(`div`,xn,U(e.title||`(无标题)`),1),r(`div`,Sn,[r(`span`,null,U(ae(e.updatedAt)),1),t[2]||=r(`span`,null,`·`,-1),r(`span`,null,U(e.messageCount)+` 条消息`,1),t[3]||=r(`span`,null,`·`,-1),r(`span`,null,U(e.latestSubtaskCount)+` 个子任务`,1),t[4]||=r(`span`,null,`·`,-1),r(`span`,null,U(oe(e.size)),1)]),r(`div`,Cn,[A(u,{size:`small`,type:`primary`,onClick:t=>M(e.sessionId)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:恢复`)),1)]),_:1},8,[`onClick`]),A(u,{size:`small`,type:`danger`,onClick:t=>ie(e.sessionId)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:删除`)),1)]),_:1},8,[`onClick`])])]))),128))]))]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-3ea1b867`]]);P(),I();var Tn={class:`ai-split-mode-bar`},En=Xe(o({__name:`AISplitDialog`,props:{modelValue:{type:Boolean},title:{},desc:{},taskId:{},promptId:{}},emits:[`update:modelValue`,`confirm`],setup(e,{emit:t}){let n=e,a=t,o=Y(`direct`),s=V(()=>[{label:Z(`@WORKBENCH:直接拆分`),value:`direct`},{label:Z(`@WORKBENCH:对话拆分`),value:`chat`}]);function c(e){a(`confirm`,e),a(`update:modelValue`,!1)}return q(()=>n.modelValue,e=>{e&&(o.value=`direct`)}),(t,n)=>{let l=De,d=u;return K(),z(d,{"model-value":e.modelValue,"onUpdate:modelValue":n[1]||=e=>a(`update:modelValue`,e),title:i(Z)(`@WORKBENCH:AI 拆分任务`),width:`800px`,"close-on-click-modal":!1,"close-on-press-escape":!0,"show-close":!0},{default:R(()=>[r(`div`,Tn,[A(l,{modelValue:o.value,"onUpdate:modelValue":n[0]||=e=>o.value=e,options:s.value,block:!1},null,8,[`modelValue`,`options`])]),o.value===`direct`?(K(),z(qt,{key:0,title:e.title,desc:e.desc,"task-id":e.taskId,"prompt-id":e.promptId,onConfirm:c},null,8,[`title`,`desc`,`task-id`,`prompt-id`])):(K(),z(wn,{key:1,title:e.title,desc:e.desc,"task-id":e.taskId,"prompt-id":e.promptId,onConfirm:c},null,8,[`title`,`desc`,`task-id`,`prompt-id`]))]),_:1},8,[`model-value`,`title`])}}}),[[`__scopeId`,`data-v-2732cf4b`]]);P(),I(),j();var Dn={class:`import-split__strategy`},On={class:`import-split__preview`},kn=Xe(o({__name:`ImportSplitDialog`,props:{modelValue:{type:Boolean},existingCount:{}},emits:[`update:modelValue`,`confirm`],setup(e,{emit:t}){let n=e,o=t,s=Y(`append`),c=Y(``);q(()=>n.modelValue,e=>{e&&(c.value=``,s.value=n.existingCount>0?`append`:`replace`)});function l(e){let t=[],n=0;for(let r of e.split(/\r?\n/)){let e=r.trim();if(!e||e.startsWith(`#`)){n++;continue}let i=e.replace(/^[-*+•·]\s+/,``).replace(/^\[\s*[xX ]?\s*\]\s+/,``).replace(/^\d+[.)、]\s+/,``);t.push(i)}return{titles:t,skipped:n}}let d=V(()=>l(c.value)),f=V(()=>d.value.titles.length>0);function p(){o(`update:modelValue`,!1)}function m(){f.value&&(o(`confirm`,{strategy:s.value,titles:d.value.titles}),o(`update:modelValue`,!1))}return(t,n)=>{let l=C,h=ne,g=ce,_=a,v=u;return K(),z(v,{"model-value":e.modelValue,"onUpdate:modelValue":n[2]||=e=>o(`update:modelValue`,e),title:i(Z)(`@WORKBENCH:导入拆分对话框`),width:`720px`,"close-on-click-modal":!1,"close-on-press-escape":!0,"show-close":!0},{footer:R(()=>[A(_,{onClick:p},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:取消`)),1)]),_:1}),A(_,{type:`primary`,disabled:!f.value,onClick:m},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:导入`)),1)]),_:1},8,[`disabled`])]),default:R(()=>[r(`div`,Dn,[A(h,{modelValue:s.value,"onUpdate:modelValue":n[0]||=e=>s.value=e},{default:R(()=>[A(l,{value:`append`},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:追加`)),1)]),_:1}),A(l,{value:`replace`,disabled:e.existingCount===0},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:替换`)),1)]),_:1},8,[`disabled`]),A(l,{value:`merge`,disabled:e.existingCount===0},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:合并(跳过已存在)`)),1)]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`])]),A(g,{modelValue:c.value,"onUpdate:modelValue":n[1]||=e=>c.value=e,type:`textarea`,rows:12,placeholder:i(Z)(`@WORKBENCH:每行一个子任务,以 # 开头视为注释,空行忽略`),resize:`vertical`},null,8,[`modelValue`,`placeholder`]),r(`div`,On,U(i(Z)(`@WORKBENCH:已解析 N 个子任务,M 行被跳过`,{n:d.value.titles.length,m:d.value.skipped})),1)]),_:1},8,[`model-value`,`title`])}}}),[[`__scopeId`,`data-v-0fe76a16`]]);P(),I(),j(),H();var An={class:`wb-attachments__head`},jn={class:`wb-attachments__label`},Mn={class:`wb-attachments__count`},Nn=[`disabled`],Pn={key:0,class:`wb-attachments__paste-hint`},Fn={key:1,class:`wb-attachments__list`},In=[`title`,`onClick`,`onContextmenu`],Ln=[`src`,`alt`],Rn={key:1},zn={class:`wb-attachment__meta`},Bn=[`title`],Vn=[`onClick`,`title`],Hn=Xe(o({__name:`AttachmentZone`,props:{attachments:{},isImage:{type:Function},humanSize:{type:Function},isUploading:{type:Boolean},isPasteHover:{type:Boolean},maxCount:{},onPick:{type:Function},onRemove:{type:Function},rawBase:{}},emits:[`paste`,`drop`,`dragover`,`dragenter`,`dragleave`],setup(e,{emit:n}){let a=e;function o(e){return`${a.rawBase||`/api/workbench/attachments`}/${e.id}/raw`}let s=n,c=V(()=>a.attachments.filter(e=>a.isImage(e))),l=V(()=>c.value.map(e=>o(e))),u=Y(0),f=Y(!1);function p(e){if(a.isImage(e)){let t=c.value.findIndex(t=>t.id===e.id);u.value=t>=0?t:0,f.value=!0}else window.open(o(e),`_blank`,`noopener`)}function m(){f.value=!1}let h=Y({visible:!1,x:0,y:0,att:null}),g=Y(!1);function _(e,t){if(!a.isImage(e))return;t.preventDefault();let n=window.innerWidth-180,r=window.innerHeight-120;h.value={visible:!0,x:Math.min(t.clientX,n),y:Math.min(t.clientY,r),att:e}}function v(){h.value.visible&&(h.value.visible=!1)}async function y(){let e=h.value.att;if(e&&!g.value){if(v(),!navigator.clipboard||typeof ClipboardItem>`u`){L({type:`warning`,message:Z(`@WORKBENCH:当前浏览器不支持复制图片`)});return}g.value=!0;try{let t=await fetch(o(e),{credentials:`same-origin`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.blob(),r=[`image/png`,`image/jpeg`,`image/webp`,`image/gif`].includes(n.type)?n.type:`image/png`,i=new ClipboardItem({[r]:n});await navigator.clipboard.write([i]),L({type:`success`,message:Z(`@WORKBENCH:图片已复制到剪贴板`),duration:1800})}catch(e){L({type:`error`,message:Z(`@WORKBENCH:复制失败 {error}`,{error:e?.message||``})})}finally{g.value=!1}}}return typeof window<`u`&&(window.addEventListener(`click`,v),window.addEventListener(`scroll`,v,!0),window.addEventListener(`blur`,v)),pe(()=>{typeof window<`u`&&(window.removeEventListener(`click`,v),window.removeEventListener(`scroll`,v,!0),window.removeEventListener(`blur`,v))}),(n,a)=>(K(),T(N,null,[r(`div`,{class:F([`wb-attachments`,{"is-paste-hover":e.isPasteHover}]),onPaste:a[1]||=e=>s(`paste`,e),onDrop:a[2]||=J(e=>s(`drop`,e),[`prevent`]),onDragover:a[3]||=J(e=>s(`dragover`,e),[`prevent`]),onDragenter:a[4]||=J(e=>s(`dragenter`,e),[`prevent`]),onDragleave:a[5]||=e=>s(`dragleave`,e)},[r(`div`,An,[r(`span`,jn,[S(U(i(Z)(`@WORKBENCH:附件`))+` `,1),r(`span`,Mn,U(e.attachments.length)+` / `+U(e.maxCount),1)]),r(`button`,{class:`wb-attachments__add wb-soft-btn`,disabled:e.isUploading||e.attachments.length>=e.maxCount,onClick:a[0]||=(...t)=>e.onPick&&e.onPick(...t)},U(e.isUploading?i(Z)(`@WORKBENCH:上传中…`):i(Z)(`@WORKBENCH:添加附件`)),9,Nn)]),e.isPasteHover?(K(),T(`div`,Pn,U(i(Z)(`@WORKBENCH:粘贴图片以快速添加`)),1)):w(``,!0),e.attachments.length>0?(K(),T(`ul`,Fn,[(K(!0),T(N,null,G(e.attachments,t=>(K(),T(`li`,{key:t.id,class:`wb-attachment`},[r(`button`,{type:`button`,class:`wb-attachment__preview`,title:i(Z)(`@WORKBENCH:点击预览`),onClick:e=>p(t),onContextmenu:e=>_(t,e)},[r(`div`,{class:F([`wb-attachment__icon`,{"wb-attachment__icon--img":e.isImage(t)}])},[e.isImage(t)?(K(),T(`img`,{key:0,src:o(t),alt:t.originalName,loading:`lazy`},null,8,Ln)):(K(),T(`span`,Rn,U(t.ext.toUpperCase()),1))],2),r(`div`,zn,[r(`div`,{class:`wb-attachment__name`,title:`${t.originalName} (${e.humanSize(t.size)})`},U(t.originalName),9,Bn)])],40,In),r(`button`,{class:`wb-attachment__del`,onClick:J(n=>e.onRemove(t),[`stop`]),title:i(Z)(`@WORKBENCH:删除`)},`×`,8,Vn)]))),128))])):w(``,!0)],34),f.value&&l.value.length>0?(K(),z(i(Ve),{key:0,"url-list":l.value,"initial-index":u.value,"hide-on-click-modal":!0,teleported:!0,onClose:m},null,8,[`url-list`,`initial-index`])):w(``,!0),(K(),z(d,{to:`body`},[h.value.visible&&h.value.att&&e.isImage(h.value.att)?(K(),T(`ul`,{key:0,class:`wb-ctx-menu`,style:t({top:h.value.y+`px`,left:h.value.x+`px`}),onContextmenu:a[6]||=J(()=>{},[`prevent`])},[r(`li`,{class:F([`wb-ctx-menu__item`,{"is-disabled":g.value}]),onClick:y},[a[7]||=r(`span`,{class:`wb-ctx-menu__icon`,"aria-hidden":`true`},[r(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[r(`rect`,{x:`9`,y:`9`,width:`11`,height:`11`,rx:`2`}),r(`path`,{d:`M5 15V5a2 2 0 0 1 2-2h10`})])],-1),r(`span`,null,U(i(Z)(`@WORKBENCH:复制图片`)),1)],2)],36)):w(``,!0)]))],64))}}),[[`__scopeId`,`data-v-4713db74`]]),Un=Je(`claude`),Wn=Je(`opencode`);function Gn(e){return e===`opencode`?Wn:Un}var Kn=8192;function qn(e,t){return e.length>t?`…(前文已截断)\n${e.slice(-t)}`:e}function Jn(e,t){let n=e||`done`;return n!==`pending`&&n!==`running`||t===`running`||t===`pending`?n:t===`cancelled`||t===`error`?`error`:`done`}function Yn(e){let t=e?.toolCalls;if(!Array.isArray(t)||t.length===0)return[];let n=e?.status||`done`,r=[];for(let e=0;e<t.length;e++){let i=t[e];if(!i||typeof i!=`object`)continue;let a=Jn(i.status,n),o=typeof i.result==`string`?i.result:``;r.push({id:typeof i.id==`string`&&i.id?i.id:`tool-${e}`,name:typeof i.name==`string`?i.name:``,argsPreview:typeof i.argsPreview==`string`?i.argsPreview:``,arguments:typeof i.arguments==`string`?i.arguments:``,result:o?qn(o,Kn):``,status:a,error:typeof i.error==`string`&&i.error?i.error:void 0})}return r}P(),I(),j(),H();var Xn=[`aria-expanded`],Zn={class:`wb-log-summary__left`},Qn={key:0,class:`wb-log-summary__status wb-log-summary__status--running`},$n={class:`wb-log-summary__label`},er={key:0,class:`wb-log-summary__elapsed`},tr={key:1,class:`wb-log-summary__status wb-log-summary__status--pending`},nr={class:`wb-log-summary__label`},rr={class:`wb-log-summary__icon`},ir={class:`wb-log-summary__label`},ar={key:0,class:`wb-log-summary__elapsed`},or={key:3},sr={class:`wb-log-summary__right`},cr={class:`wb-log-summary__meta`},lr=[`title`,`aria-label`],ur={class:`wb-log-details__body`},dr={key:0,class:`wb-chat__foot`},fr=[`title`,`aria-label`],pr={key:1,class:`wb-log-fullscreen__empty`},mr=65536,hr=Xe(o({__name:`JobLogDetails`,props:{job:{}},emits:[`re-execute`],setup(e,{emit:t}){let n=Qe(),a=e,o=t,s=Y(!1);function c(){s.value=!s.value}let l=V(()=>a.job.status===`running`||a.job.status===`pending`);q(()=>a.job.status,(e,t)=>{t!==`running`&&t!==`pending`&&(e===`running`||e===`pending`)&&(s.value=!1)});function d(){let e=a.job.output||``;return e?e.length<=mr?e:`${Z(`@WORKBENCH:…(前文已截断)`)}\n${e.slice(-65536)}`:``}function f(){let e=a.job.thinking||``;return e?e.length<=mr?e:`${Z(`@WORKBENCH:…(前文已截断)`)}\n${e.slice(-65536)}`:``}async function p(e){try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function m(){let e=[];if(a.job.prompt&&e.push(`## ${Z(`@WORKBENCH:用户提示词`)}\n\n${a.job.prompt}`),a.job.thinking&&e.push(`## ${Z(`@WORKBENCH:Claude 思考`)}\n\n${a.job.thinking}`),a.job.output&&e.push(`## ${Z(`@WORKBENCH:模型返回`)}\n\n${a.job.output}`),!e.length){L.warning(Z(`@WORKBENCH:暂无内容可复制`));return}await p(e.join(`
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
`))?L.success(Z(`@WORKBENCH:已复制到剪贴板`)):L.error(Z(`@WORKBENCH:复制失败`))}let h=V(()=>{let e=a.job.status;return e===`done`||e===`error`||e===`cancelled`}),g=V(()=>a.job.status===`cancelled`?`wb-log-summary__status--cancelled`:a.job.status===`error`?`wb-log-summary__status--error`:`wb-log-summary__status--done`),_=V(()=>a.job.status===`cancelled`?`⏹`:a.job.status===`error`?`✗`:`✓`),v=V(()=>a.job.status===`cancelled`?Z(`@WORKBENCH:已停止`):a.job.status===`error`?Z(`@WORKBENCH:执行出错`):Z(`@WORKBENCH:执行完成`)),b=V(()=>a.job?.agent===`opencode`?`OpenCode`:`Claude`),ee=V(()=>Gn(a.job?.agent));function x(e,t){return e===`running`||e===`pending`?t?`streaming`:`pending`:e===`error`?`error`:`done`}let S=V(()=>{let e=a.job,t=[],n=e.startedAt?new Date(e.startedAt).getTime():Date.now();e.prompt&&t.push({id:`${e.id}-u`,role:`user`,content:e.prompt,status:`done`,createdAt:n});let r=d(),i=f(),o=!!r,s=!!i,c=Yn(e),l=c.length>0,u=o||s||l,p=x(e.status,u);return t.push({id:`${e.id}-a`,role:`assistant`,content:r,reasoning:s?i:void 0,reasoningStatus:s?o?`done`:p===`streaming`?`streaming`:`done`:void 0,toolCalls:l?c:void 0,status:p,error:p===`error`&&e.error||void 0,createdAt:n}),t}),C=Y(null);q(()=>a.job.status,(e,t)=>{e===`running`&&t!==`running`&&(C.value=C.value??Date.now())});let te=V(()=>{if(!C.value)return``;let e=C.value,t=a.job.endedAt?new Date(a.job.endedAt).getTime():Date.now(),n=Math.max(0,Math.floor((t-e)/1e3));return n<60?`${n}s`:`${Math.floor(n/60)}分${(n%60).toString().padStart(2,`0`)}秒`}),E=Y(!1),D=V(()=>!!(a.job.output&&a.job.output.length)),ne=V(()=>a.job.output||``),O=Y(null);q(E,async e=>{e&&(await y(),O.value&&(O.value.scrollTop=O.value.scrollHeight))}),q(()=>(a.job.output||``).length,async()=>{E.value&&(await y(),O.value&&(O.value.scrollTop=O.value.scrollHeight))});function k(){}let j=V(()=>h.value&&!!a.job.prompt);function re(){o(`re-execute`,a.job)}return(t,a)=>{let o=u;return K(),T(`div`,{class:F([`wb-log-details`,{"is-running":l.value,"is-pending":e.job.status===`pending`,"is-finished":h.value}])},[r(`div`,{class:`wb-log-summary`,onClick:c,role:`button`,"aria-expanded":!s.value},[r(`span`,Zn,[e.job.status===`running`?(K(),T(`span`,Qn,[r(`span`,$n,U(i(Z)(`@WORKBENCH:正在执行…`)),1),a[1]||=r(`span`,{class:`wb-log-dots`,"aria-hidden":`true`},[r(`span`,{class:`wb-log-dots__dot`}),r(`span`,{class:`wb-log-dots__dot`}),r(`span`,{class:`wb-log-dots__dot`})],-1),te.value?(K(),T(`span`,er,U(te.value),1)):w(``,!0)])):e.job.status===`pending`?(K(),T(`span`,tr,[r(`span`,nr,U(i(Z)(`@WORKBENCH:排队中…`)),1),a[2]||=r(`span`,{class:`wb-log-dots`,"aria-hidden":`true`},[r(`span`,{class:`wb-log-dots__dot`}),r(`span`,{class:`wb-log-dots__dot`}),r(`span`,{class:`wb-log-dots__dot`})],-1)])):h.value?(K(),T(`span`,{key:2,class:F([`wb-log-summary__status`,g.value])},[r(`span`,rr,U(_.value),1),r(`span`,ir,U(v.value),1),te.value?(K(),T(`span`,ar,U(te.value),1)):w(``,!0)],2)):(K(),T(`span`,or,U(i(Z)(`@WORKBENCH:查看执行日志`)),1))]),r(`span`,sr,[r(`span`,cr,U((e.job.output||``).length)+` `+U(i(Z)(`@WORKBENCH:字符`)),1),r(`button`,{type:`button`,class:`wb-log-copy`,title:i(Z)(`@WORKBENCH:复制全部(含提示词与输出)`),"aria-label":i(Z)(`@WORKBENCH:复制全部`),onClick:J(m,[`stop`])},` ⧉ `,8,lr)])],8,Xn),W(r(`div`,ur,[A(i(qe),{messages:S.value,"assistant-name":b.value,"assistant-avatar":ee.value,"show-avatar":!0,theme:i(n).theme,"tool-calls-config":{group:!0,collapseThreshold:2},class:`wb-job-chat`},null,8,[`messages`,`assistant-name`,`assistant-avatar`,`theme`]),j.value?(K(),T(`footer`,dr,[r(`button`,{type:`button`,class:`wb-chat__action`,title:i(Z)(`@WORKBENCH:用相同的提示词重新执行此任务`),"aria-label":i(Z)(`@WORKBENCH:重新执行`),onClick:re},` ↻ `,8,fr)])):w(``,!0),A(o,{modelValue:E.value,"onUpdate:modelValue":a[0]||=e=>E.value=e,title:i(Z)(`@WORKBENCH:模型返回 - 全屏查看`),fullscreen:``,"close-on-click-modal":!1,class:`wb-log-fullscreen-dialog`,onClosed:k},{default:R(()=>[r(`div`,{ref_key:`fullscreenContainerRef`,ref:O,class:`wb-log-fullscreen`},[D.value?(K(),z(i(Ye),{key:0,source:ne.value,class:`wb-log-fullscreen__render`},null,8,[`source`])):(K(),T(`div`,pr,U(i(Z)(`@WORKBENCH:(暂无输出)`)),1))],512)]),_:1},8,[`modelValue`,`title`])],512),[[M,!s.value]])],2)}}}),[[`__scopeId`,`data-v-50027dc1`]]);function gr(e){switch(e){case`todo`:return Z(`@WORKBENCH:待执行`);case`running`:return Z(`@WORKBENCH:执行中`);case`done`:return Z(`@WORKBENCH:已完成`);case`error`:return Z(`@WORKBENCH:出错`);case`cancelled`:return Z(`@WORKBENCH:已取消`);case`pending`:return Z(`@WORKBENCH:排队中`);default:return e}}function _r(e){switch(e){case`running`:return`var(--color-primary)`;case`done`:return`#22c55e`;case`error`:return`#ef4444`;case`cancelled`:return`#9ca3af`;case`pending`:return`#f59e0b`;default:return`var(--text-tertiary)`}}P(),I(),j(),H();var vr={class:`exec-logs`},yr={class:`exec-logs__head`},br={class:`exec-logs__title-block`},xr={class:`exec-logs__stats`},Sr={class:`exec-logs__head-actions`},Cr={class:`exec-logs__config`},wr={class:`exec-logs__config-label`},Tr={class:`exec-logs__config-field`},Er={class:`exec-logs__config-name`},Dr={class:`exec-logs__config-field`},Or={class:`exec-logs__config-name`},kr={class:`exec-logs__filter`},Ar={key:0,class:`exec-logs__batch-meta`},jr={key:0,class:`exec-logs__batch`},Mr={class:`exec-logs__list`},Nr={key:0,class:`exec-logs__empty`},Pr={class:`exec-logs__empty-art`,"aria-hidden":`true`},Fr={class:`exec-logs__empty-title`},Ir={class:`exec-logs__empty-hint`},Lr={class:`exec-card__head`},Rr=[`title`],zr={class:`exec-card__meta`},Br={key:0,class:`exec-card__task`},Vr={key:1,class:`exec-card__time`},Hr={key:2,class:`exec-card__exit`},Ur=[`title`,`onClick`],Wr={key:0,class:`exec-card__error`},Gr={key:1,class:`exec-logs__pager`},Kr=50,qr=Xe(o({__name:`ExecutionLogManager`,setup(n){function o(e){return e instanceof Error?e.message:String(e)}let s=Y([]),c=Y(0),u=ie({count:0,sizeMB:0,byStatus:{}}),d=Y(!1),f=Y(new Set),m=ie({q:``,status:``,page:1}),g=Y({maxCount:500,maxSizeMB:256}),_=ie({maxCount:500,maxSizeMB:256}),v=Y(!1),y=[{value:`pending`,label:Z(`@WORKBENCH:排队中`)},{value:`running`,label:Z(`@WORKBENCH:执行中`)},{value:`done`,label:Z(`@WORKBENCH:已完成`)},{value:`error`,label:Z(`@WORKBENCH:出错`)},{value:`cancelled`,label:Z(`@WORKBENCH:已取消`)}],b=V(()=>s.value.length>0&&s.value.every(e=>f.value.has(e.id))),ee=V(()=>s.value.some(e=>f.value.has(e.id))&&!b.value);async function C(){d.value=!0;try{let e=new URLSearchParams;m.q&&e.set(`q`,m.q),m.status&&e.set(`status`,m.status),e.set(`limit`,String(Kr)),e.set(`offset`,String((m.page-1)*Kr));let t=await fetch(`/api/workbench/jobs/list?${e.toString()}`).then(e=>e.json());if(!t.success)throw Error(t.error||`list failed`);s.value=t.jobs,c.value=t.total,u.count=t.stats.count,u.sizeMB=t.stats.sizeMB,u.byStatus=t.stats.byStatus;let n=new Set(s.value.map(e=>e.id));for(let e of Array.from(f.value))n.has(e)||f.value.delete(e)}catch(e){L.error(Z(`@WORKBENCH:加载失败`)+`: `+o(e))}finally{d.value=!1}}async function te(){try{let e=await fetch(`/api/workbench/jobs/config`).then(e=>e.json());e.success&&(g.value=e.config,_.maxCount=e.config.maxCount,_.maxSizeMB=e.config.maxSizeMB)}catch{}}async function E(){v.value=!0;try{let e=await fetch(`/api/workbench/jobs/config`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({maxCount:_.maxCount,maxSizeMB:_.maxSizeMB})}).then(e=>e.json());if(!e.success)throw Error(e.error||`save failed`);g.value=e.config,L.success(Z(`@WORKBENCH:已保存策略`)),await C()}catch(e){L.error(Z(`@WORKBENCH:保存失败`)+`: `+o(e))}finally{v.value=!1}}function D(){m.page=1,C()}function ne(){m.q=``,m.status=``,m.page=1,C()}function O(e,t){t?f.value.add(e):f.value.delete(e),f.value=new Set(f.value)}function j(e){if(e)for(let e of s.value)f.value.add(e.id);else for(let e of s.value)f.value.delete(e.id);f.value=new Set(f.value)}function re(e){L.info(Z(`@WORKBENCH:请到工作台主面板的对应任务上点击「重新执行」`))}async function M(e){try{await Ee.confirm(Z(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:1}),Z(`@WORKBENCH:删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/${e}`,{method:`DELETE`}).then(e=>e.json());if(!t.success)throw Error(t.error||`delete failed`);f.value.delete(e),f.value=new Set(f.value),await C()}catch(e){L.error(Z(`@WORKBENCH:保存失败`)+`: `+o(e))}}async function ae(){let e=Array.from(f.value);if(e.length!==0){try{await Ee.confirm(Z(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:e.length}),Z(`@WORKBENCH:批量删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/batch-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({ids:e})}).then(e=>e.json());if(!t.success)throw Error(t.error||`batch delete failed`);L.success(Z(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e.length})),f.value=new Set,await C()}catch(e){L.error(Z(`@WORKBENCH:保存失败`)+`: `+o(e))}}}async function oe(){let e=u.count;if(e!==0){try{await Ee.confirm(Z(`@WORKBENCH:确定要清空所有 {count} 条执行日志吗?此操作不可恢复。`,{count:e}),Z(`@WORKBENCH:清空全部`),{type:`warning`,confirmButtonText:Z(`@WORKBENCH:清空全部`)})}catch{return}try{let t=await fetch(`/api/workbench/jobs/clear`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({confirm:!0})}).then(e=>e.json());if(!t.success)throw Error(t.error||`clear failed`);L.success(Z(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e})),f.value=new Set,await C()}catch(e){L.error(Z(`@WORKBENCH:保存失败`)+`: `+o(e))}}}function se(e,t){if(!e)return``;let n=new Date(e).getTime(),r=t?new Date(t).getTime():Date.now(),i=Math.max(0,r-n);return i<1e3?`${i}ms`:i<6e4?`${(i/1e3).toFixed(1)}s`:i<36e5?`${Math.floor(i/6e4)}m ${Math.floor(i%6e4/1e3)}s`:`${Math.floor(i/36e5)}h ${Math.floor(i%36e5/6e4)}m`}return e(()=>{C(),te()}),(e,n)=>{let o=a,g=ve,te=ce,ie=x,P=k,le=p,ue=de,fe=Ue,pe=ke;return K(),T(`div`,vr,[r(`header`,yr,[r(`div`,br,[r(`span`,xr,U(i(Z)(`@WORKBENCH:共 {count} 条,占 {size} MB`,{count:u.count,size:u.sizeMB})),1)]),r(`div`,Sr,[A(o,{icon:i(h),size:`small`,loading:d.value,onClick:C},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:刷新`)),1)]),_:1},8,[`icon`,`loading`]),A(o,{type:`danger`,plain:``,size:`small`,disabled:u.count===0,onClick:oe},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:清空全部`)),1)]),_:1},8,[`disabled`])])]),r(`div`,Cr,[r(`span`,wr,U(i(Z)(`@WORKBENCH:保存策略`)),1),r(`span`,Tr,[r(`span`,Er,U(i(Z)(`@WORKBENCH:最大条数`)),1),A(g,{modelValue:_.maxCount,"onUpdate:modelValue":n[0]||=e=>_.maxCount=e,min:0,max:1e4,step:50,size:`small`,"controls-position":`right`,style:{width:`130px`}},null,8,[`modelValue`])]),r(`span`,Dr,[r(`span`,Or,U(i(Z)(`@WORKBENCH:最大体积 (MB)`)),1),A(g,{modelValue:_.maxSizeMB,"onUpdate:modelValue":n[1]||=e=>_.maxSizeMB=e,min:0,max:10240,step:32,size:`small`,"controls-position":`right`,style:{width:`140px`}},null,8,[`modelValue`])]),A(o,{type:`primary`,size:`small`,loading:v.value,onClick:E},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:保存策略`)),1)]),_:1},8,[`loading`])]),r(`div`,kr,[A(te,{modelValue:m.q,"onUpdate:modelValue":n[2]||=e=>m.q=e,placeholder:i(Z)(`@WORKBENCH:搜索标题 / 任务`),clearable:``,size:`small`,style:{width:`240px`},onKeyup:l(D,[`enter`]),onClear:D},null,8,[`modelValue`,`placeholder`]),A(P,{modelValue:m.status,"onUpdate:modelValue":n[3]||=e=>m.status=e,placeholder:i(Z)(`@WORKBENCH:全部状态`),clearable:``,size:`small`,style:{width:`130px`},onChange:D},{default:R(()=>[(K(),T(N,null,G(y,e=>A(ie,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`,`placeholder`]),A(o,{size:`small`,onClick:ne},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:重置`)),1)]),_:1}),n[5]||=r(`span`,{class:`exec-logs__filter-spacer`},null,-1),f.value.size>0?(K(),T(`span`,Ar,U(i(Z)(`@WORKBENCH:已选择 {count} 项`,{count:f.value.size})),1)):w(``,!0)]),f.value.size>0?(K(),T(`div`,jr,[A(le,{"model-value":b.value,indeterminate:ee.value,onChange:j},{default:R(()=>[S(U(b.value?i(Z)(`@WORKBENCH:取消全选`):i(Z)(`@WORKBENCH:全选`)),1)]),_:1},8,[`model-value`,`indeterminate`]),A(o,{type:`danger`,size:`small`,onClick:ae},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:批量删除`)),1)]),_:1})])):w(``,!0),W((K(),T(`div`,Mr,[!d.value&&s.value.length===0?(K(),T(`div`,Nr,[r(`div`,Pr,[A(ue,null,{default:R(()=>[A(i(Te))]),_:1})]),r(`div`,Fr,U(i(Z)(`@WORKBENCH:暂无执行日志`)),1),r(`div`,Ir,U(i(Z)(`@WORKBENCH:点击「执行任务」开始一次执行,日志会出现在这里。`)),1)])):w(``,!0),(K(!0),T(N,null,G(s.value,e=>(K(),T(`article`,{key:e.id,class:F([`exec-card`,{"is-selected":f.value.has(e.id)}])},[r(`header`,Lr,[A(le,{"model-value":f.value.has(e.id),onChange:t=>O(e.id,t)},null,8,[`model-value`,`onChange`]),r(`span`,{class:`exec-card__status`,style:t({color:i(_r)(e.status),borderColor:i(_r)(e.status)})},U(i(gr)(e.status)),5),r(`span`,{class:`exec-card__title`,title:e.title||i(Z)(`@WORKBENCH:无标题`)},U(e.title||i(Z)(`@WORKBENCH:无标题`)),9,Rr),n[6]||=r(`span`,{class:`exec-card__spacer`},null,-1),r(`span`,zr,[e.taskTitle?(K(),T(`span`,Br,`📁 `+U(e.taskTitle),1)):w(``,!0),e.startedAt?(K(),T(`span`,Vr,`⏱ `+U(se(e.startedAt,e.endedAt)),1)):w(``,!0),e.exitCode===null?w(``,!0):(K(),T(`span`,Hr,`exit `+U(e.exitCode),1))]),r(`button`,{type:`button`,class:`exec-card__del`,title:i(Z)(`@WORKBENCH:删除`),onClick:t=>M(e.id)},`×`,8,Ur)]),e.error?(K(),T(`p`,Wr,`⚠ `+U(e.error),1)):w(``,!0),A(hr,{job:e,onReExecute:re},null,8,[`job`])],2))),128))])),[[pe,d.value]]),c.value>Kr?(K(),T(`footer`,Gr,[A(fe,{"current-page":m.page,"onUpdate:currentPage":n[4]||=e=>m.page=e,"page-size":Kr,total:c.value,layout:`prev, pager, next, total`,background:``,small:``,onCurrentChange:C},null,8,[`current-page`,`total`])])):w(``,!0)])}}}),[[`__scopeId`,`data-v-b9c0dae0`]]);I();var Jr=new Set([`image/png`,`image/jpeg`,`image/jpg`,`image/gif`,`image/webp`,`image/bmp`,`image/svg+xml`,`application/pdf`,`text/plain`,`text/markdown`,`text/x-markdown`,`text/csv`,`application/json`,`text/json`,`text/x-log`]),Yr=`.png,.jpg,.jpeg,.gif,.webp,.bmp,.svg,.pdf,.txt,.md,.csv,.json,.log`,Xr=20971520,Zr=3840,Qr=new Set([`image/png`,`image/jpeg`,`image/jpg`,`image/webp`,`image/bmp`]);function $r(e){if(e.size<=3670016)return!1;let t=String(e.type||``).toLowerCase();return t?Qr.has(t):/\.(png|jpe?g|webp|bmp)$/i.test(e.name)}function ei(e,t){return`${String(e||`attachment`).replace(/\.[^./\\]+$/,``)}.${t}`}async function ti(e){if(typeof createImageBitmap==`function`)try{let t=await createImageBitmap(e);return{source:t,width:t.width,height:t.height,release:()=>t.close()}}catch{}return await new Promise(t=>{let n=URL.createObjectURL(e),r=new Image;r.onload=()=>t({source:r,width:r.naturalWidth,height:r.naturalHeight,release:()=>URL.revokeObjectURL(n)}),r.onerror=()=>{URL.revokeObjectURL(n),t(null)},r.src=n})}function ni(e,t,n){return new Promise(r=>{try{e.toBlob(e=>r(e&&e.type===t?e:null),t,n)}catch{r(null)}})}async function ri(e){let t=await ti(e);if(!t)return null;try{let n=[{edge:Zr,quality:.95},{edge:Zr,quality:.85},{edge:2560,quality:.85},{edge:1920,quality:.8}],r=null;for(let e of n){let n=Math.min(1,e.edge/Math.max(t.width,t.height)),i=Math.max(1,Math.round(t.width*n)),a=Math.max(1,Math.round(t.height*n)),o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);if(!s)return null;s.drawImage(t.source,0,0,i,a);let c=await ni(o,`image/webp`,e.quality)||await ni(o,`image/jpeg`,e.quality);if(!c)return null;if((!r||c.size<r.size)&&(r=c),c.size<=3670016)break}return!r||r.size>=e.size?null:{blob:r,ext:r.type===`image/webp`?`webp`:`jpg`}}catch{return null}finally{t.release()}}function ii(){let e=Y({}),t=Y(null);function n(t){return!!e.value[t]}function r(e,t){if(e instanceof File)return e;let n=e.type||`application/octet-stream`;return new File([e],t,{type:n})}function i(e){return e.kind===`draft`?`draft`:e.kind===`task`?`task-${e.task?.id??``}`:`sub-${e.sub.id}`}function a(e){if(e.kind===`draft`)return e.list;let t=e.kind===`task`?e.task?.attachments:e.sub.attachments;return Array.isArray(t)?t:[]}function o(e,t){if(e.kind===`draft`){e.replace(t);return}e.kind===`task`?e.task&&(e.task.attachments=t):e.sub.attachments=t}function s(e){return e.kind===`draft`?`/api/workbench/orchestrator/attachments`:e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments`:`/api/workbench/subtasks/${e.sub.id}/attachments`}function c(e,t){return e.kind===`draft`?`/api/workbench/orchestrator/attachments/${t}`:e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments/${t}`:`/api/workbench/subtasks/${e.sub.id}/attachments/${t}`}function l(e,t){if(!e.clipboardData)return;let n=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&e.type.startsWith(`image/`));if(n.length>0){e.preventDefault();for(let e of n){let n=e.getAsFile();if(!n)continue;let i=(n.type.split(`/`)[1]||`png`).replace(`jpeg`,`jpg`);d(t,r(n,`paste-${new Date().toISOString().replace(/[:.]/g,`-`)}.${i}`))}return}let i=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&!e.type.startsWith(`image/`));if(i.length>0){e.preventDefault();for(let e of i){let n=e.getAsFile();n&&d(t,r(n,n.name||`pasted-file`))}}}function u(e,n){t.value=null,Array.from(e.dataTransfer?.files||[]).forEach(e=>d(n,e))}async function d(t,n){if(!Jr.has(n.type)&&!n.name.match(/\.(png|jpg|jpeg|gif|webp|bmp|svg|pdf|txt|md|markdown|csv|json|log)$/i)){L.error(`${Z(`@WORKBENCH:不支持的文件类型`)}(${n.name})`);return}let c=a(t);if(c.length>=9){L.error(Z(`@WORKBENCH:单个任务最多 9 个附件`));return}if(c.find(e=>e.originalName===n.name&&e.size===n.size)){L.info(`${n.name} ${Z(`@WORKBENCH:已存在,已复用`)}`);return}let l=i(t);e.value[l]=!0;try{let e=n;if($r(n)){let t=await ri(n);t&&(e=r(t.blob,ei(n.name,t.ext)),L.info(Z(`@WORKBENCH:图片过大,已压缩后上传:{from} → {to}`,{from:g(n.size),to:g(e.size)})))}if(e.size>20971520){L.error(`「${n.name}」${Z(`@WORKBENCH:超过 {size} 限制`,{size:g(Xr)})}`);return}let i=await fetch(s(t),{method:`POST`,headers:{"Content-Type":`application/octet-stream`,"X-Original-Name":e.name,"X-Mime-Type":e.type||`application/octet-stream`},body:e}).then(e=>e.json());if(i.success){let n=a(t);n.push(i.attachment),o(t,n),L.success(`${Z(`@WORKBENCH:已添加:`)}${e.name}`)}else L.error(i.error||Z(`@WORKBENCH:上传失败`))}catch(e){L.error(Z(`@WORKBENCH:上传失败`)+`:`+(e&&e.message||e))}finally{e.value[l]=!1}}async function f(e,t){try{await Ee.confirm(Z(`@WORKBENCH:删除附件「{name}」?`,{name:t.originalName}),Z(`@WORKBENCH:确认`),{type:`warning`})}catch{return}let n=await fetch(c(e,t.id),{method:`DELETE`}).then(e=>e.json());n.success?(o(e,a(e).filter(e=>e.id!==t.id)),L.success(Z(`@WORKBENCH:已删除`))):L.error(n.error||Z(`@WORKBENCH:删除失败`))}function p(e){let t=document.createElement(`input`);t.type=`file`,t.accept=Yr,t.multiple=!0,t.onchange=()=>{Array.from(t.files||[]).forEach(t=>d(e,t))},t.click()}let m=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`]);function h(e){let t=String(e?.ext||``).toLowerCase();if(t&&m.has(t)||String(e?.mimeType||``).toLowerCase().startsWith(`image/`))return!0;let n=String(e?.originalName||``).toLowerCase();return/\.(png|jpe?g|gif|webp|bmp|svg)$/.test(n)}function g(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`}return{uploadingTargets:e,pasteHoverId:t,isUploading:n,ensureFile:r,isImageAttachment:h,humanSize:g,targetKey:i,targetAttachments:a,setTargetAttachments:o,targetUploadUrl:s,targetDeleteUrl:c,onAttachmentPaste:l,onAttachmentDrop:u,uploadAttachment:d,removeAttachment:f,pickAttachmentFile:p}}P();var ai=`__simple`,oi=65536;function si(e,t){function n(t){if(!t)return[];let n=`${t.id}${ai}`;return e.value.filter(e=>e.subId===n||e.subId.startsWith(`${n}__r`)).sort((e,t)=>{let n=e.startedAt||``,r=t.startedAt||``;return n&&r?n.localeCompare(r):n?-1:+!!r})}function r(e){if(!e)return null;let t=n(e);return t.length>0?t[t.length-1]:null}function i(e){return e?e.status===`pending`||e.status===`running`?`running`:e.status===`done`?`done`:e.status===`cancelled`?`cancelled`:`error`:`idle`}return{simpleConversationMessages:V(()=>{if(!t.value)return[];let e=n(t.value);if(e.length===0)return[];let r=[];return e.forEach((t,n)=>{let i=n===e.length-1,a=t.startedAt?new Date(t.startedAt).getTime():Date.now();t.prompt&&r.push({id:`${t.id}-u`,role:`user`,content:t.prompt,status:`done`,createdAt:a});let o=t.output||``,s=t.thinking||``,c=o.length>oi?`\u2026(前文已截断)\n${o.slice(-65536)}`:o,l=s.length>oi?`\u2026(前文已截断)\n${s.slice(-65536)}`:s,u=!!c,d=!!l,f=Yn(t),p=f.length>0,m=u||d||p,h;if(!i)h=`done`;else{let e=t.status;h=e===`running`||e===`pending`?m?`streaming`:`pending`:e===`error`?`error`:`done`}r.push({id:`${t.id}-a`,role:`assistant`,content:c,reasoning:d?l:void 0,reasoningStatus:d?!i&&u||u?`done`:h===`streaming`?`streaming`:`done`:void 0,toolCalls:p?f:void 0,status:h,error:h===`error`&&t.error||void 0,createdAt:a})}),r}),simpleAllJobsFor:n,simpleJobFor:r,simpleJobState:i,SIMPLE_SUB_ID_SUFFIX:ai,MAX_LOG_DISPLAY_SIMPLE:oi}}function ci(e,t,n,r){function i(){return{executor:r.getExecutor()}}async function a(a){if(a.type===`simple`)return o(a);if(!a.subtasks||a.subtasks.length===0){L.warning(Z(`@WORKBENCH:请先拆分任务`));return}if(n.value&&n.value.id===a.id){let e=t.value.find(e=>e.id===a.id);if((!e||e.title!==n.value.title||e.desc!==n.value.desc||JSON.stringify(e.subtasks)!==JSON.stringify(n.value.subtasks)||e.promptId!==n.value.promptId)&&!await r.persistTask(!1))return}let s=a.subtasks.filter(e=>e.status===`done`);if(s.length>0){let t=`close`;try{await Ee.confirm(Z(`@WORKBENCH:该任务有 {n} 个子任务已 done,如何处理?`,{n:s.length})+`
|
|
10
|
-
|
|
11
|
-
`+Z(`@WORKBENCH:点"确定"将重置全部 done 为 todo,从头跑一遍(会消耗 token)`)+`
|
|
12
|
-
`+Z(`@WORKBENCH:点"取消"将保留 done 状态,只跑未完成的 sub`),Z(`@WORKBENCH:检测到已完成子任务`),{confirmButtonText:Z(`@WORKBENCH:重置全部并重跑`),cancelButtonText:Z(`@WORKBENCH:只跑未完成`),type:`warning`,distinguishCancelAndClose:!0,showClose:!0}),t=`confirm`}catch(e){t=e===`cancel`?`cancel`:`close`}if(t===`close`)return;if(t===`confirm`){let t=await fetch(`/api/workbench/tasks/${encodeURIComponent(a.id)}/clear-execution`,{method:`POST`,headers:{"Content-Type":`application/json`}}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));if(!t?.success){L.error(t?.error||Z(`@WORKBENCH:清空失败`));return}if(Array.isArray(a.subtasks))for(let e of a.subtasks)e.status=`todo`,e.error&&delete e.error;e.value=e.value.filter(e=>e.taskId!==a.id),r.syncRunningCount(),L.success(t.message||Z(`@WORKBENCH:已重置,准备从头执行`))}}await r.clearNonDoneJobsByTask(a.id);let c=await fetch(`/api/workbench/tasks/${a.id}/run`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i())}).then(e=>e.json());c.success?L.success(c.message||Z(`@WORKBENCH:已加入执行队列`)):L.error(c.error||Z(`@WORKBENCH:执行失败`))}async function o(e){if(n.value&&n.value.id===e.id){let i=t.value.find(t=>t.id===e.id);if((!i||i.title!==n.value.title||i.desc!==n.value.desc||i.promptId!==n.value.promptId||(i.simpleOverride||``)!==(n.value.simpleOverride||``))&&!await r.persistTask(!1))return}await r.clearJobsByTask(e.id);let a=await fetch(`/api/workbench/tasks/${e.id}/run-simple`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i())}).then(e=>e.json());a.success?L.success(a.message||Z(`@WORKBENCH:已加入执行队列`)):L.error(a.error||Z(`@WORKBENCH:执行失败`))}async function s(e,t){let n=r.simpleAllJobsFor(e).slice(-1)[0];if(!n){L.error(Z(`@WORKBENCH:没有可续接的会话`));return}let i=Array.isArray(e.attachments)?e.attachments:[],a=await fetch(`/api/workbench/jobs/${n.id}/continue`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({userMessage:t,attachments:i})}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));a.success?L.success(a.message||Z(`@WORKBENCH:已加入续接队列`)):L.error(a.error||Z(`@WORKBENCH:续接失败`))}async function c(e,t){let n=t.text.trim();if(n){for(let n of t.files)await r.uploadAttachment({kind:`task`,task:e},n.file);await s(e,n)}}async function l(e){let n=e.subId||``,a=n.match(/^(.+)__simple(?:__r\d+)?$/);if(a){let e=a[1],n=t.value.find(t=>t.id===e);if(!n){L.error(Z(`@WORKBENCH:任务不存在,无法重新执行`));return}await o(n);return}for(let e of t.value){let t=(e.subtasks||[]).find(e=>e.id===n);if(t){let e=r.jobOf(t.id);if(e&&(e.status===`running`||e.status===`pending`)){L.warning(Z(`@WORKBENCH:该子任务正在执行中`));return}let n=await fetch(`/api/workbench/subtasks/${t.id}/run`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i())}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));n.success?L.success(n.message||Z(`@WORKBENCH:已开始执行子任务`)):L.error(n.error||Z(`@WORKBENCH:执行失败`));return}}L.error(Z(`@WORKBENCH:找不到对应任务,无法重新执行`))}async function u(e){if(!n.value)return;let a=n.value,o=r.jobOf(e.id);if(o&&(o.status===`running`||o.status===`pending`)){L.warning(Z(`@WORKBENCH:该子任务正在执行中`));return}let s=t.value.find(e=>e.id===a.id);if((!s||s.title!==a.title||s.desc!==a.desc||JSON.stringify(s.subtasks)!==JSON.stringify(a.subtasks)||s.promptId!==a.promptId)&&!await r.persistTask(!1))return;let c=await fetch(`/api/workbench/subtasks/${e.id}/run`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i())}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));c.success?L.success(c.message||Z(`@WORKBENCH:已开始执行子任务`)):L.error(c.error||Z(`@WORKBENCH:执行失败`))}function d(e){if(e.status===`done`)return!1;let t=r.jobOf(e.id);return!t||t.status!==`running`&&t.status!==`pending`}function f(e){if(!d(e)||!n.value)return!1;let t=n.value.subtasks||[],r=t.findIndex(t=>t.id===e.id);return!(r<0||r===t.length-1)}async function p(e){if(!n.value)return;let a=n.value,o=(a.subtasks||[]).findIndex(t=>t.id===e.id);if(o<0)return;let s=t.value.find(e=>e.id===a.id);if((!s||s.title!==a.title||s.desc!==a.desc||JSON.stringify(s.subtasks)!==JSON.stringify(a.subtasks)||s.promptId!==a.promptId)&&!await r.persistTask(!1))return;let c=await fetch(`/api/workbench/tasks/${a.id}/run-from`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({startSubIndex:o,...i()})}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));c.success?L.success(c.message||Z(`@WORKBENCH:已从此处开始执行`)):L.error(c.error||Z(`@WORKBENCH:执行失败`))}async function m(e){try{await Ee.confirm(Z(`@WORKBENCH:确认停止执行?已输出的内容会保留。`),Z(`@WORKBENCH:停止执行`),{confirmButtonText:Z(`@WORKBENCH:停止`),cancelButtonText:Z(`@WORKBENCH:取消`),type:`warning`})}catch{return}let t=await fetch(`/api/workbench/jobs/${e.id}/cancel`,{method:`POST`}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));t.success?L.success(Z(`@WORKBENCH:已发送停止信号`)):L.error(t.error||Z(`@WORKBENCH:停止失败`))}async function h(e,t){n.value&&(e.status=`todo`,await t(!1))}async function g(){if(!n.value)return;let t=n.value,i=Array.isArray(t.subtasks)?t.subtasks:[],a=i.filter(e=>e.status===`done`).length,o=i.filter(e=>e.status===`error`).length,s=i.filter(e=>e.status===`running`).length,c=e.value.filter(e=>e.taskId===t.id),l=a+o===0?Z(`@WORKBENCH:当前任务还没有执行内容,确认仍要清空?`):Z(`@WORKBENCH:将清空 {n} 个已执行/失败的子任务和 {m} 条执行记录,任务拆分/描述/附件保留。`,{n:a+o,m:c.length});try{await Ee.confirm(l,Z(`@WORKBENCH:清空执行内容`),{confirmButtonText:Z(`@WORKBENCH:清空`),cancelButtonText:Z(`@WORKBENCH:取消`),type:`warning`})}catch{return}if(s>0){L.warning(Z(`@WORKBENCH:有 {n} 个子任务正在执行,请先停止`,{n:s}));return}let u=await fetch(`/api/workbench/tasks/${encodeURIComponent(t.id)}/clear-execution`,{method:`POST`,headers:{"Content-Type":`application/json`}}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));if(u?.success){if(Array.isArray(t.subtasks))for(let e of t.subtasks)e.status=`todo`,e.error&&delete e.error;e.value=e.value.filter(e=>e.taskId!==t.id),r.syncRunningCount(),L.success(u.message||Z(`@WORKBENCH:已清空执行内容`))}else L.error(u?.error||Z(`@WORKBENCH:清空失败`))}async function _(t){if(!n.value)return;let i=n.value,a=Array.isArray(i.subtasks)?i.subtasks.length:0;if(a===0){L.warning(Z(`@WORKBENCH:当前任务没有子任务`));return}if(e.value.find(e=>e.taskId===i.id&&(e.status===`running`||e.status===`pending`))){L.warning(Z(`@WORKBENCH:有子任务正在执行,请先停止`));return}try{await Ee.confirm(Z(`@WORKBENCH:将删除 {n} 个子任务,任务描述/附件/标题保留,确认?`,{n:a}),Z(`@WORKBENCH:清空子任务`),{confirmButtonText:Z(`@WORKBENCH:清空`),cancelButtonText:Z(`@WORKBENCH:取消`),type:`warning`})}catch{return}let o=await fetch(`/api/workbench/tasks/${encodeURIComponent(i.id)}/clear-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`}}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));o?.success?(i.subtasks=[],t(),e.value=e.value.filter(e=>e.taskId!==i.id),r.syncRunningCount(),L.success(o.message||Z(`@WORKBENCH:已清空子任务`))):L.error(o?.error||Z(`@WORKBENCH:清空失败`))}return{runTask:a,runSimpleTask:o,continueChat:s,onContinueSendFromChat:c,onReExecuteJob:l,runSubtask:u,canRunSubtask:d,canRunFromHere:f,runFromHere:p,cancelJob:m,cancelDone:h,clearExecutionForSelectedTask:g,clearSubtasksForSelectedTask:_}}I();function li(){let e=Y([]),t=Y([]),n=Y([]),r=Y({path:``,name:``}),i=st();function a(){i.setRunning(n.value.filter(e=>e.status===`running`).length)}function o(e){return n.value.find(t=>t.subId===e)||null}function s(e,r){if(e===`hello`){n.value=r.jobs||[],a();return}if(e===`job:update`){let e=r,t=n.value.findIndex(t=>t.id===e.id);t>=0?n.value[t]=e:n.value.push(e),a();return}if(e===`job:thinking-delta`||e===`job:output-delta`){let t=e===`job:thinking-delta`?`thinking`:`output`,i=r?.delta||``;if(!i)return;let a=n.value.findIndex(e=>e.id===r.id);if(a<0)return;let o=n.value[a][t]||``;n.value[a][t]=o+i;return}if(e===`job:toolcalls`){let e=Array.isArray(r?.updates)?r.updates:[];if(!e.length)return;let t=n.value.findIndex(e=>e.id===r.id);if(t<0)return;let i=n.value[t];for(let t of e){if(!t||!t.id)continue;Array.isArray(i.toolCalls)||(i.toolCalls=[]);let e=i.toolCalls.findIndex(e=>e.id===t.id);e>=0?i.toolCalls[e]={...i.toolCalls[e],...t}:i.toolCalls.push(t)}return}if(e===`sub:update`){let e=t.value.find(e=>e.id===r.taskId);if(e){let t=e.subtasks.findIndex(e=>e.id===r.sub.id);t>=0&&(e.subtasks[t]=r.sub)}}if(e===`task:update`){let e=t.value.findIndex(e=>e.id===r.id);e>=0&&(t.value[e]=r)}if(e===`tasks:reordered`){if(Array.isArray(r?.tasks)){if(r.tasks.length<t.value.length){console.warn(`[SSE tasks:reordered] 数据丢失风险:当前 ${t.value.length} 个任务,服务端只返回 ${r.tasks.length} 个,拒绝覆盖`);return}t.value=r.tasks}return}e===`task:error`&&L.error(r.error||Z(`@WORKBENCH:执行出错`))}let c=null;function l(){c&&=(c.close(),null),c=new EventSource(`/api/workbench/events`),c.onmessage=e=>{try{let t=JSON.parse(e.data);s(t.event,t.payload)}catch{}},c.onerror=()=>{c&&=(c.close(),null),setTimeout(l,3e3)}}function u(){c&&=(c.close(),null)}async function d(){let t=await fetch(`/api/workbench/prompts`).then(e=>e.json()).catch(()=>({prompts:[]}));e.value=t.prompts||[]}async function f(e){let n=await fetch(`/api/workbench/tasks`).then(e=>e.json()).catch(()=>({tasks:[]}));t.value=n.tasks||[],e?.()}async function p(){let e=await fetch(`/api/workbench/current-project`).then(e=>e.json()).catch(()=>({}));e&&typeof e.projectPath==`string`&&(r.value={path:e.projectPath,name:e.projectName||``})}async function m(){let e=await fetch(`/api/workbench/jobs`).then(e=>e.json()).catch(()=>({jobs:[]}));n.value=e.jobs||[],a()}async function h(e){try{let t=await fetch(`/api/workbench/jobs/by-task/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());return t?.success?(n.value=n.value.filter(t=>t.taskId!==e),a(),t.removed||0):(console.warn(`[clearJobsByTask] failed:`,t?.error),0)}catch(e){return console.warn(`[clearJobsByTask] error:`,e),0}}async function g(e){try{let t=await fetch(`/api/workbench/jobs/by-task/${encodeURIComponent(e)}?keepDone=true`,{method:`DELETE`}).then(e=>e.json());if(!t?.success)return console.warn(`[clearNonDoneJobsByTask] failed:`,t?.error),0;let r=new Set(t.ids||[]);return n.value=n.value.filter(t=>!(t.taskId===e&&r.has(t.id))),a(),t.removed||0}catch(e){return console.warn(`[clearNonDoneJobsByTask] error:`,e),0}}async function _(e){let t={title:``,desc:``,promptId:null,type:`simple`,simpleOverride:``,subtasks:[]};e&&(t.projectPath=e);try{let e=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>e.json());return e.success?e.task||null:(L.error(e.error||Z(`@WORKBENCH:保存失败`)),null)}catch{return L.error(Z(`@WORKBENCH:保存失败`)),null}}return{prompts:e,tasks:t,jobs:n,currentProject:r,syncRunningCount:a,jobOf:o,applyJobEvent:s,connectSSE:l,disconnectSSE:u,loadPrompts:d,loadTasks:f,loadCurrentProject:p,loadJobs:m,clearJobsByTask:h,clearNonDoneJobsByTask:g,createTask:_}}I(),P();var ui=`__no_project__`,di=`wb.collapsedGroupPaths.v1`,fi=`wb.seenGroupPaths.v1`;function pi(e){try{let t=localStorage.getItem(e);if(!t)return new Set;let n=JSON.parse(t);return new Set(Array.isArray(n)?n.filter(e=>typeof e==`string`):[])}catch{return new Set}}function mi(e,t){try{localStorage.setItem(e,JSON.stringify(Array.from(t)))}catch{}}function hi(e,t){let n=Y(pi(di)),r=Y(pi(fi));q(n,e=>mi(di,e),{deep:!1}),q(r,e=>mi(fi,e),{deep:!1});function i(e){return n.value.has(e)}function a(e){n.value.has(e)?n.value.delete(e):n.value.add(e),n.value=new Set(n.value);let t=new Set(r.value);t.add(e),r.value=t}let o=V(()=>{let r=e.value,i=new Map;for(let e of r){let t=Q(e.projectPath)||ui;i.has(t)||i.set(t,[]),i.get(t).push(e)}let a=Q(t.value.path),o=Array.from(i.keys()).sort((e,t)=>e===a?-1:t===a||e===ui?1:t===ui?-1:e.localeCompare(t));return{groups:o.map(e=>({path:e,label:e===ui?Z(`@WORKBENCH:未关联项目`):e,tasks:i.get(e)})),hasMultiple:o.length>1||o.length===1&&n.value.has(o[0])}});function s(e){if(!e||e===ui)return e;let t=e.split(/[\\/]/).filter(Boolean);return t.length<=1?e:t.slice(-2).join(`/`)}let c=V(()=>`${Q(t.value.path)}|${o.value.groups.map(e=>e.path).join(`
|
|
13
|
-
`)}`);return q(c,()=>{let e=Q(t.value.path);if(!e)return;let i=new Set(n.value),a=new Set(r.value),s=!1;for(let t of o.value.groups)a.has(t.path)||(a.add(t.path),t.path!==e&&(i.add(t.path),s=!0));s&&(n.value=i),r.value=a},{immediate:!0}),{groupedTasksList:o,isGroupCollapsed:i,toggleGroupCollapsed:a,shortProjectLabel:s}}P(),I(),j(),H();var gi={class:`wb-sidebar`},_i={class:`wb-section`},vi=[`disabled`],yi=[`aria-expanded`,`title`,`onClick`,`onKeydown`],bi=[`title`],xi={class:`wb-pill wb-task-group__count`},Si=[`data-task-id`,`data-group-path`,`title`,`onClick`,`onMousedown`],Ci={class:`wb-task-item__body`},wi=[`title`],Ti=[`title`],Ei={class:`wb-task-item__action-group`},Di=[`title`,`aria-label`,`onClick`],Oi=[`onClick`,`title`,`aria-label`],ki={key:0,class:`wb-empty wb-empty--rich`},Ai={class:`wb-empty__art`,"aria-hidden":`true`},ji={class:`wb-empty__title`},Mi={class:`wb-empty__hint`},Ni={class:`wb-empty__cta`},Pi={class:`wb-section`},Fi={class:`wb-section__head`},Ii={class:`wb-section__tag wb-section__tag--accent`},Li={class:`wb-section__title`},Ri={class:`wb-pill wb-section__count`},zi=[`title`,`aria-label`],Bi={class:`wb-prompt-list`},Vi={class:`wb-prompt-item__icon`},Hi=[`onClick`,`title`],Ui=[`title`],Wi=[`title`],Gi=[`onClick`,`title`,`aria-label`],Ki={key:0,class:`wb-empty wb-empty--compact`},qi=5,Ji=Xe(o({__name:`WorkbenchSidebar`,props:{tasks:{},prompts:{},selectedTaskId:{},currentProject:{},creatingTask:{type:Boolean},isTaskRunning:{type:Function}},emits:[`select-task`,`delete-task`,`copy-task`,`create-task`,`open-create-prompt`,`open-edit-prompt`,`delete-prompt`,`reorder-tasks`],setup(e,{emit:t}){let n=e,o=t,s=V(()=>n.currentProject),{groupedTasksList:c,isGroupCollapsed:u,toggleGroupCollapsed:d,shortProjectLabel:f}=hi(V(()=>n.tasks),s),p=V(()=>Q(n.currentProject.path));function h(e){return!!e.projectPath&&Q(e.projectPath)!==p.value}let _=V(()=>{let e=p.value;return n.prompts.filter(t=>!t.projectPath||Q(t.projectPath)===e)});function v(e){return(e.title||``).trim()||(e.desc||``).replace(/\s+/g,` `).trim()}function y(e){let t=v(e),n=Z(`@WORKBENCH:拖动排序提示`);return t?`${t} · ${n}`:n}function b(e){return n.isTaskRunning(e)}let ee=Y(null),x=Y(null),C=Y(null),te=Y(null),E=Y(null),D=null;function ne(){ee.value=null,x.value=null,C.value=null,te.value=null,E.value=null,D=null}function k(e,t,n,r){e.button===0&&(D={pointerY:e.clientY,li:r,taskId:t.id,groupPath:n},window.addEventListener(`mousemove`,j),window.addEventListener(`mouseup`,re,{once:!0}))}function j(e){if(!D)return;if(ee.value===null){if(Math.abs(e.clientY-D.pointerY)<qi)return;ee.value=D.taskId,x.value=D.groupPath,window.getSelection()?.removeAllRanges(),document.body.style.userSelect=`none`}let t=document.elementFromPoint(e.clientX,e.clientY);if(!t)return;let n=t.closest(`.wb-task-item`);if(!n){C.value=null,te.value=null,E.value=null;return}let r=n.getAttribute(`data-task-id`),i=n.getAttribute(`data-group-path`);if(!r||!i)return;if(i!==x.value){C.value=null,te.value=null,E.value=null;return}let a=n.getBoundingClientRect(),o=a.top+a.height/2;C.value=r,te.value=i,E.value=e.clientY<o?`before`:`after`}function re(e){if(window.removeEventListener(`mousemove`,j),document.body.style.userSelect=``,!D){ne();return}let t=D.groupPath,n=D.taskId,r=C.value,i=E.value,a=te.value;if(ne(),!r||!i||a!==t)return;let s=c.value.groups.find(e=>e.path===t);if(!s)return;let l=s.tasks.map(e=>e.id),u=l.indexOf(n);if(u<0)return;l.splice(u,1);let d=l.indexOf(r)+ +(i===`after`);l.splice(d,0,n),o(`reorder-tasks`,{groupPath:t,orderedIds:l})}return(t,n)=>{let s=de,x=a;return K(),T(`aside`,gi,[r(`section`,_i,[r(`button`,{class:`wb-new-btn`,disabled:e.creatingTask,onClick:n[0]||=e=>o(`create-task`)},[A(s,{class:`wb-new-btn__icon`},{default:R(()=>[A(i(g))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:新建任务`)),1),n[3]||=r(`span`,{class:`wb-new-btn__shortcut`},`N`,-1)],8,vi),r(`ul`,{class:F([`wb-task-list`,{"is-grouped":i(c).hasMultiple}])},[(K(!0),T(N,null,G(i(c).groups,t=>(K(),T(N,{key:t.path},[i(c).hasMultiple?(K(),T(`li`,{key:0,class:F([`wb-task-group__head`,{"is-current":t.path===p.value,"is-collapsed":i(u)(t.path)}]),role:`button`,tabindex:`0`,"aria-expanded":!i(u)(t.path),title:i(u)(t.path)?i(Z)(`@WORKBENCH:展开`):i(Z)(`@WORKBENCH:收起`),onClick:e=>i(d)(t.path),onKeydown:[l(J(e=>i(d)(t.path),[`prevent`]),[`enter`]),l(J(e=>i(d)(t.path),[`prevent`]),[`space`])]},[A(s,{class:`wb-task-group__caret`},{default:R(()=>[(K(),z(Ae(i(u)(t.path)?i(O):i(ue))))]),_:2},1024),A(s,{class:`wb-task-group__icon`},{default:R(()=>[A(i(Be))]),_:1}),r(`span`,{class:`wb-task-group__name`,title:t.path===p.value?e.currentProject.path:t.label},U(t.path===p.value?e.currentProject.name:i(f)(t.label)),9,bi),r(`span`,xi,U(t.tasks.length),1)],42,yi)):w(``,!0),i(u)(t.path)?w(``,!0):(K(!0),T(N,{key:1},G(t.tasks,n=>(K(),T(`li`,{key:n.id,class:F([`wb-task-item`,{active:n.id===e.selectedTaskId,"is-other-project":h(n),"is-running":b(n),"is-dragging":ee.value===n.id,"is-drop-before":C.value===n.id&&E.value===`before`,"is-drop-after":C.value===n.id&&E.value===`after`}]),"data-task-id":n.id,"data-group-path":t.path,title:y(n),onClick:e=>o(`select-task`,n),onMousedown:e=>k(e,n,t.path,e.currentTarget)},[r(`div`,Ci,[r(`div`,{class:`wb-task-item__title`,title:v(n)},U(v(n)),9,wi)]),b(n)?(K(),T(`span`,{key:0,class:`wb-task-item__running-dot`,title:i(Z)(`@WORKBENCH:执行中`),"aria-hidden":`true`},null,8,Ti)):w(``,!0),r(`div`,Ei,[r(`button`,{class:`wb-task-item__copy`,title:i(Z)(`@WORKBENCH:复制任务`),"aria-label":i(Z)(`@WORKBENCH:复制任务`),onClick:J(e=>o(`copy-task`,n),[`stop`])},[A(s,null,{default:R(()=>[A(i(Re))]),_:1})],8,Di),b(n)?w(``,!0):(K(),T(`button`,{key:0,class:`wb-task-item__del`,onClick:J(e=>o(`delete-task`,n),[`stop`]),title:i(Z)(`@WORKBENCH:删除`),"aria-label":i(Z)(`@WORKBENCH:删除`)},[A(s,null,{default:R(()=>[A(i(xe))]),_:1})],8,Oi))])],42,Si))),128))],64))),128)),e.tasks.length===0?(K(),T(`li`,ki,[r(`div`,Ai,[A(s,null,{default:R(()=>[A(i(Ne))]),_:1})]),r(`div`,ji,U(i(Z)(`@WORKBENCH:暂无任务`)),1),r(`div`,Mi,U(i(Z)(`@WORKBENCH:点击上方按钮新建`)),1),r(`div`,Ni,[A(x,{type:`primary`,size:`small`,icon:i(g),loading:e.creatingTask,onClick:n[1]||=e=>o(`create-task`)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`,`loading`])])])):w(``,!0)],2)]),r(`section`,Pi,[r(`header`,Fi,[r(`span`,Ii,U(i(Z)(`@WORKBENCH:提示`)),1),r(`h3`,Li,U(i(Z)(`@WORKBENCH:预置提示词`)),1),r(`span`,Ri,U(_.value.length),1),r(`button`,{class:`wb-section__action`,onClick:n[2]||=e=>o(`open-create-prompt`),title:i(Z)(`@WORKBENCH:新建提示词`),"aria-label":i(Z)(`@WORKBENCH:新建提示词`)},[A(s,null,{default:R(()=>[A(i(g))]),_:1})],8,zi)]),r(`ul`,Bi,[(K(!0),T(N,null,G(_.value,e=>(K(),T(`li`,{key:e.id,class:`wb-prompt-item`},[r(`div`,Vi,[A(s,null,{default:R(()=>[A(i(m))]),_:1})]),r(`span`,{class:`wb-prompt-item__name`,onClick:t=>o(`open-edit-prompt`,e),title:e.content},U(e.name),9,Hi),e.projectPath?(K(),T(`span`,{key:1,class:`wb-prompt-item__tag wb-prompt-item__tag--project`,title:e.projectPath},U(i(f)(e.projectPath)),9,Wi)):(K(),T(`span`,{key:0,class:`wb-prompt-item__tag`,title:i(Z)(`@WORKBENCH:全局(所有项目可用)`)},U(i(Z)(`@WORKBENCH:全局(所有项目可用)`)),9,Ui)),r(`button`,{class:`wb-prompt-item__del`,onClick:t=>o(`delete-prompt`,e),title:i(Z)(`@WORKBENCH:删除`),"aria-label":i(Z)(`@WORKBENCH:删除`)},[A(s,null,{default:R(()=>[A(i(xe))]),_:1})],8,Gi)]))),128)),_.value.length===0?(K(),T(`li`,Ki,U(i(Z)(`@WORKBENCH:暂无提示词`)),1)):w(``,!0)])])])}}}),[[`__scopeId`,`data-v-26907b44`]]);I();function Yi(){let e=Y([]),t=Y([]),n=Y(``),r=Y(!1),i=Y(!1);async function a(a=!1){a||(r.value=!0);try{let r=await fetch(`/api/workbench/projects`,{cache:`no-store`}).then(e=>e.json());return r?.success?(e.value=Array.isArray(r.projects)?r.projects:[],t.value=Array.isArray(r.tasks)?r.tasks:[],n.value=r.currentProjectPath||``,i.value=!0,!0):(a||L.error(r?.error||Z(`@WORKBENCH:读取项目列表失败`)),!1)}catch(e){return a||L.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}finally{r.value=!1}}return{projects:e,boardTasks:t,currentProjectPath:n,loading:r,loaded:i,loadProjects:a}}I();function Xi(){let e=Y(!0),t=Y([]),n=Y([]),r=Y([]),i=Y(null),a=Y(!1),o=Y(!1),s=Y(!1),c=Y(``),l=Y({});async function u(o=!1){try{let s=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return s?.success?(e.value=s.active!==!1,t.value=Array.isArray(s.instructions)?s.instructions:[],n.value=Array.isArray(s.activity)?s.activity:[],r.value=Array.isArray(s.running)?s.running:[],i.value=s.updatedAt||null,c.value=typeof s.defaultPrompt==`string`?s.defaultPrompt:``,l.value=s.projectPrompts&&typeof s.projectPrompts==`object`?s.projectPrompts:{},a.value=!0,!0):(o||L.error(s?.error||Z(`@WORKBENCH:读取编排状态失败`)),!1)}catch(e){return o||L.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function d(e){try{let t=await fetch(`/api/workbench/orchestrator/default-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e})}).then(e=>e.json());return t?.success?(c.value=typeof t.defaultPrompt==`string`?t.defaultPrompt:``,L.success(Z(`@WORKBENCH:已保存全局默认提示词`)),!0):(L.error(t?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return L.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function f(e,t){try{let n=await fetch(`/api/workbench/orchestrator/project-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectPath:e,prompt:t})}).then(e=>e.json());return n?.success?(l.value=n.projectPrompts&&typeof n.projectPrompts==`object`?n.projectPrompts:{},L.success(Z(`@WORKBENCH:已保存项目默认提示词`)),!0):(L.error(n?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return L.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function p(t){if(o.value)return!1;let n=e.value;e.value=t,o.value=!0;try{let r=await fetch(`/api/workbench/orchestrator/state`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({active:t})}).then(e=>e.json());return r?.success?(e.value=r.active!==!1,L.success(e.value?Z(`@WORKBENCH:已恢复调度`):Z(`@WORKBENCH:已暂停调度,派发将只建任务不执行`)),!0):(e.value=n,L.error(r?.error||Z(`@WORKBENCH:切换调度状态失败`)),!1)}catch(t){return e.value=n,L.error(Z(`@WORKBENCH:网络错误: `)+(t?.message||t)),!1}finally{o.value=!1}}async function m(e){if(s.value)return null;s.value=!0;try{let t=await fetch(`/api/workbench/orchestrator/dispatch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({text:e.text,projectPath:e.projectPath||``,autoRun:e.autoRun!==!1,useDefaultPrompt:e.useDefaultPrompt!==!1,executor:e.executor,attachments:(e.attachments||[]).map(e=>({id:e.id,ext:e.ext,originalName:e.originalName}))})}).then(e=>e.json());return t?.success?(await u(!0),{task:t.task||null,ran:!!t.ran}):(L.error(t?.error||Z(`@WORKBENCH:派发失败`)),null)}catch(e){return L.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{s.value=!1}}return{active:e,instructions:t,activity:n,running:r,updatedAt:i,loaded:a,togglingSchedule:o,dispatching:s,defaultPrompt:c,projectPrompts:l,loadOrchestrator:u,setSchedulingActive:p,dispatch:m,saveDefaultPrompt:d,saveProjectPrompt:f}}var Zi=6e4,Qi=60*Zi,$i=24*Qi;function ea(e,t=Date.now()){if(!e)return``;let n=new Date(e).getTime();if(Number.isNaN(n))return``;let r=Math.max(0,t-n);return r<Zi?Z(`@WORKBENCH:刚刚`):r<Qi?Z(`@WORKBENCH:N 分钟前`,{n:Math.floor(r/Zi)}):r<$i?Z(`@WORKBENCH:N 小时前`,{n:Math.floor(r/Qi)}):r<30*$i?Z(`@WORKBENCH:N 天前`,{n:Math.floor(r/$i)}):new Date(n).toLocaleDateString()}function ta(e,t,n=Date.now()){if(!e)return``;let r=new Date(e).getTime();if(Number.isNaN(r))return``;let i=t?new Date(t).getTime():n;if(Number.isNaN(i))return``;let a=Math.max(0,i-r),o=Math.floor(a/1e3),s=Math.floor(o/3600),c=Math.floor(o%3600/60),l=o%60;return s>0?Z(`@WORKBENCH:N 小时 M 分`,{n:s,m:c}):c>0?Z(`@WORKBENCH:N 分 M 秒`,{n:c,m:l}):Z(`@WORKBENCH:N 秒`,{n:l})}function na(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function ra(e,t=Date.now()){if(!e)return``;let n=new Date(e);if(Number.isNaN(n.getTime()))return``;let r=e=>String(e).padStart(2,`0`),i=`${r(n.getHours())}:${r(n.getMinutes())}:${r(n.getSeconds())}`,a=new Date(t);if(na(n,a))return i;if(na(n,new Date(a.getFullYear(),a.getMonth(),a.getDate()-1)))return Z(`@WORKBENCH:昨天 {time}`,{time:i});let o=`${n.getMonth()+1}/${n.getDate()}`;return n.getFullYear()===a.getFullYear()?`${o} ${i}`:`${n.getFullYear()}/${o} ${i}`}P(),I(),j(),H();var ia={class:`proj`},aa={class:`proj__head`},oa={class:`proj__title`},sa={class:`proj__count`},ca={key:0,class:`proj__tools`},la={class:`proj__search`},ua=[`placeholder`,`aria-label`],da={class:`proj__toggles`},fa=[`aria-pressed`,`title`],pa=[`aria-pressed`,`title`],ma={class:`proj__list`},ha=[`title`],ga={class:`proj-item__row1`},_a={class:`proj-item__name`},va={key:0,class:`proj-item__running`,"aria-hidden":`true`},ya={class:`proj-item__num`},ba={class:`proj-item__row2`},xa={key:0,class:`proj-item__running-text`},Sa={key:0,class:`proj-item__row3`},Ca={class:`proj-item__bar`,"aria-hidden":`true`},wa={class:`proj-item__progress-text`},Ta=[`title`,`onClick`,`onKeydown`],Ea={class:`proj-item__row1`},Da={class:`proj-item__name`},Oa={class:`proj-item__signals`},ka={key:0,class:`proj-item__running`,"aria-hidden":`true`},Aa={key:1,class:`proj-item__badge`},ja={class:`proj-item__row2`},Ma={key:0,class:`proj-chip proj-chip--missing`},Na={key:0,class:`proj-item__branch`},Pa={class:`proj-item__branch-name`},Fa={key:1,class:`proj-chip proj-chip--ahead`},Ia={key:2,class:`proj-chip proj-chip--behind`},La={key:3,class:`proj-chip proj-chip--dirty`},Ra={class:`proj-item__time`},za={key:0,class:`proj-item__row3`},Ba={class:`proj-item__bar`,"aria-hidden":`true`},Va={class:`proj-item__progress-text`},Ha={key:1,class:`proj-item__actions`},Ua=[`title`,`aria-label`,`onClick`],Wa=[`title`,`aria-label`,`aria-expanded`,`onClick`],Ga=[`aria-label`],Ka=[`onClick`,`onKeydown`],qa={class:`proj-menu__icon`},Ja={class:`proj-menu__label`},Ya=[`onClick`,`onKeydown`],Xa={class:`proj-menu__icon`},Za={class:`proj-menu__label`},Qa=[`onClick`,`onKeydown`],$a={class:`proj-menu__icon`},eo={class:`proj-menu__label`},to={class:`proj-menu__title`,role:`presentation`},no=[`onClick`,`onKeydown`],ro={class:`proj-menu__icon`},io={class:`proj-menu__label`},ao={key:0,class:`proj-menu__hint`},oo=[`onClick`,`onKeydown`],so={class:`proj-menu__icon`},co=[`src`],lo={class:`proj-menu__label`},uo={class:`proj-menu__hint`},fo=[`onClick`,`onKeydown`],po={class:`proj-menu__icon`},mo=[`src`],ho={class:`proj-menu__label`},go={key:0,class:`proj-empty`},_o={class:`proj-empty__title`},vo={class:`proj-empty__hint`},yo={key:1,class:`proj-empty`},bo={class:`proj-empty__title`},xo=Xe(o({__name:`WorkbenchProjectPanel`,props:{projects:{},selectedKey:{},loading:{type:Boolean}},emits:[`select`],setup(n,{emit:a}){let o=n,c=a,u=V(()=>[...o.projects].sort((e,t)=>{if(e.stats.runningJobs>0!=t.stats.runningJobs>0)return e.stats.runningJobs>0?-1:1;let n=e.stats.lastActiveAt||``,r=t.stats.lastActiveAt||``;return n===r?e.name.localeCompare(t.name):r.localeCompare(n)})),d=Y(``),f=Y(!1),p=Y(!1),m=V(()=>!!d.value.trim()||f.value||p.value),h=V(()=>{let e=d.value.trim().toLowerCase();return u.value.filter(t=>f.value&&t.stats.total===0||p.value&&t.git&&t.git.isGitRepo===!1?!1:!e||t.name.toLowerCase().includes(e)||t.path.toLowerCase().includes(e))});function g(){d.value=``,f.value=!1,p.value=!1}let _=V(()=>o.projects.reduce((e,t)=>({running:e.running+t.stats.runningJobs,done:e.done+t.stats.done,total:e.total+t.stats.total}),{running:0,done:0,total:0})),v=V(()=>_.value.total>0?Math.round(_.value.done/_.value.total*100):0);function y(e){return e.git?e.git.isGitRepo===null?Z(`@WORKBENCH:未知`):e.git.isGitRepo?e.git.detached?Z(`@WORKBENCH:游离 HEAD`):e.git.branch||Z(`@WORKBENCH:未知`):``:``}function ee(e){return!!(e.git&&e.git.isGitRepo&&(e.git.detached||e.git.branch))}let x=Y(null),C=Y(null);function te(e,t){if(x.value===e.key){x.value=null;return}C.value=t.currentTarget,x.value=e.key}function E(){x.value=null}function ne(e){if(!x.value)return;let t=e.target;if(t&&!C.value?.contains(t)){for(let e of Array.from(document.querySelectorAll(`.proj-open-menu`)))if(e.contains(t))return;x.value=null}}e(()=>document.addEventListener(`mousedown`,ne,!0)),pe(()=>document.removeEventListener(`mousedown`,ne,!0));let O=$e(),k=Y(!1),j=Y(null);function M(e){return O.lastCheckedAt!==null&&!O.isToolAvailable(e)}async function ie(e){E();let t=await dt(e.path);t.success?L.success(t.message||Z(`@WORKBENCH:已在文件管理器中打开文件夹`)):L.error(t.error||Z(`@WORKBENCH:打开文件夹失败`))}async function ae(e){E();let t=await lt(e.path);t.success?L.success(t.message||Z(`@67CE7:已在终端中打开目录`)):L.error(t.error||Z(`@WORKBENCH:打开终端失败`))}async function se(e){E();let t=await at(e.path);t.success?L.success(Z(`@WORKBENCH:已在新标签页启动 g ui`)):L.error(t.error||Z(`@WORKBENCH:启动 g ui 失败`))}async function ce(e,t,n){if(E(),!await it()){L.warning(Z(`@67CE7:工具检测失败,请稍后重试`));return}if(!O.isToolAvailable(t)){j.value=t,k.value=!0;return}let r=await ot(t,e.path,n);r.success?L.success(r.message||Z(`@67CE7:已用 {tool} 打开目录`,{tool:pt[t]})):L.error(`${Z(`@67CE7:打开失败: `)}${r.error??``}`)}return(e,a)=>{let o=de,u=Fe;return K(),T(`section`,ia,[r(`header`,aa,[r(`h3`,oa,U(i(Z)(`@WORKBENCH:项目列表`)),1),r(`span`,sa,[m.value?(K(),T(N,{key:0},[S(U(i(Z)(`@WORKBENCH:匹配 {n}/{total} 个项目`,{n:h.value.length,total:n.projects.length})),1)],64)):(K(),T(N,{key:1},[S(U(n.projects.length),1)],64))])]),n.projects.length>0?(K(),T(`div`,ca,[r(`div`,la,[A(o,{class:`proj__search-icon`,"aria-hidden":`true`},{default:R(()=>[A(i(b))]),_:1}),W(r(`input`,{"onUpdate:modelValue":a[0]||=e=>d.value=e,class:`proj__search-input`,type:`search`,placeholder:i(Z)(`@WORKBENCH:搜索项目名称或路径`),"aria-label":i(Z)(`@WORKBENCH:搜索项目名称或路径`),onKeydown:a[1]||=l(e=>d.value=``,[`esc`])},null,40,ua),[[He,d.value]])]),r(`div`,da,[r(`button`,{type:`button`,class:F([`proj__toggle`,{"is-on":f.value}]),"aria-pressed":f.value,title:i(Z)(`@WORKBENCH:只显示有任务的项目`),onClick:a[2]||=e=>f.value=!f.value},[r(`span`,null,U(i(Z)(`@WORKBENCH:只看有任务`)),1)],10,fa),r(`button`,{type:`button`,class:F([`proj__toggle`,{"is-on":p.value}]),"aria-pressed":p.value,title:i(Z)(`@WORKBENCH:只显示 Git 仓库`),onClick:a[3]||=e=>p.value=!p.value},[r(`span`,null,U(i(Z)(`@WORKBENCH:隐藏非 Git`)),1)],10,pa)])])):w(``,!0),r(`ul`,ma,[r(`li`,{class:F([`proj-item proj-item--all`,{"is-active":n.selectedKey===``}]),role:`button`,tabindex:`0`,title:i(Z)(`@WORKBENCH:全部项目`),onClick:a[4]||=e=>c(`select`,null),onKeydown:[a[5]||=l(J(e=>c(`select`,null),[`prevent`]),[`enter`]),a[6]||=l(J(e=>c(`select`,null),[`prevent`]),[`space`])]},[r(`div`,ga,[A(o,{class:`proj-item__icon`},{default:R(()=>[A(i(D))]),_:1}),r(`span`,_a,U(i(Z)(`@WORKBENCH:全部项目`)),1),_.value.running>0?(K(),T(`span`,va)):w(``,!0),r(`span`,ya,U(n.projects.length),1)]),r(`div`,ba,[r(`span`,null,U(i(Z)(`@WORKBENCH:{n} 个项目`,{n:n.projects.length})),1),_.value.running>0?(K(),T(`span`,xa,U(i(Z)(`@WORKBENCH:{n} 个执行中`,{n:_.value.running})),1)):w(``,!0)]),_.value.total>0?(K(),T(`div`,Sa,[r(`span`,Ca,[r(`i`,{class:`proj-item__bar-fill`,style:t({width:v.value+`%`})},null,4)]),r(`span`,wa,U(i(Z)(`@WORKBENCH:{done}/{total} 任务完成`,{done:_.value.done,total:_.value.total})),1)])):w(``,!0)],42,ha),(K(!0),T(N,null,G(h.value,e=>(K(),T(`li`,{key:e.key,class:F([`proj-item`,{"is-active":e.key===n.selectedKey,"is-running":e.stats.runningJobs>0,"is-missing":e.exists===!1}]),role:`button`,tabindex:`0`,title:e.path,onClick:t=>c(`select`,e),onKeydown:[l(J(t=>c(`select`,e),[`self`,`prevent`]),[`enter`]),l(J(t=>c(`select`,e),[`self`,`prevent`]),[`space`])]},[r(`div`,Ea,[A(o,{class:`proj-item__icon`},{default:R(()=>[A(i(Be))]),_:1}),r(`span`,Da,U(e.name),1),r(`span`,Oa,[e.stats.runningJobs>0?(K(),T(`span`,ka)):w(``,!0),e.isCurrent?(K(),T(`span`,Aa,U(i(Z)(`@WORKBENCH:当前`)),1)):w(``,!0)])]),r(`div`,ja,[e.exists===!1?(K(),T(`span`,Ma,U(i(Z)(`@WORKBENCH:目录不存在`)),1)):(K(),T(N,{key:1},[y(e)?(K(),T(`span`,Na,[ee(e)?(K(),z(Ze,{key:0,"icon-class":`git-branch`,"class-name":`proj-item__branch-icon`})):w(``,!0),r(`span`,Pa,U(y(e)),1)])):w(``,!0),e.git&&e.git.ahead>0?(K(),T(`span`,Fa,`↑`+U(e.git.ahead),1)):w(``,!0),e.git&&e.git.behind>0?(K(),T(`span`,Ia,`↓`+U(e.git.behind),1)):w(``,!0),e.git&&e.git.changed>0?(K(),T(`span`,La,`●`+U(e.git.changed),1)):w(``,!0)],64)),r(`span`,Ra,U(i(ea)(e.stats.lastActiveAt)),1)]),e.stats.total>0?(K(),T(`div`,za,[r(`span`,Ba,[r(`i`,{class:`proj-item__bar-fill`,style:t({width:e.stats.progress+`%`})},null,4)]),r(`span`,Va,U(i(Z)(`@WORKBENCH:{done}/{total} 任务完成`,{done:e.stats.done,total:e.stats.total})),1)])):w(``,!0),e.exists===!1?w(``,!0):(K(),T(`div`,Ha,[r(`button`,{type:`button`,class:`proj-item__action`,title:i(Z)(`@WORKBENCH:打开文件夹`),"aria-label":`${i(Z)(`@WORKBENCH:打开文件夹`)} ${e.name}`,onClick:J(t=>ie(e),[`stop`])},[A(o,{"aria-hidden":`true`},{default:R(()=>[A(i(oe))]),_:1})],8,Ua),A(u,{visible:x.value===e.key,trigger:`manual`,placement:`right-start`,width:272,"show-arrow":!1,offset:6,"popper-class":`proj-open-menu`},{reference:R(()=>[r(`button`,{type:`button`,class:F([`proj-item__action`,{"is-open":x.value===e.key}]),title:i(Z)(`@WORKBENCH:打开方式`),"aria-label":`${i(Z)(`@WORKBENCH:打开方式`)} ${e.name}`,"aria-expanded":x.value===e.key,"aria-haspopup":`menu`,onClick:J(t=>te(e,t),[`stop`])},[A(o,{"aria-hidden":`true`},{default:R(()=>[A(i(s))]),_:1})],10,Wa)]),default:R(()=>[x.value===e.key?(K(),T(`ul`,{key:0,class:`proj-menu`,role:`menu`,"aria-label":i(Z)(`@WORKBENCH:打开方式`)},[r(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:t=>ie(e),onKeydown:[l(J(t=>ie(e),[`prevent`]),[`enter`]),l(J(t=>ie(e),[`prevent`]),[`space`])]},[r(`span`,qa,[A(o,{"aria-hidden":`true`},{default:R(()=>[A(i(oe))]),_:1})]),r(`span`,Ja,U(i(Z)(`@WORKBENCH:在文件管理器中打开`)),1)],40,Ka),r(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:t=>ae(e),onKeydown:[l(J(t=>ae(e),[`prevent`]),[`enter`]),l(J(t=>ae(e),[`prevent`]),[`space`])]},[r(`span`,Xa,[A(o,{"aria-hidden":`true`},{default:R(()=>[A(i(re))]),_:1})]),r(`span`,Za,U(i(Z)(`@WORKBENCH:在终端中打开`)),1)],40,Ya),r(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:t=>se(e),onKeydown:[l(J(t=>se(e),[`prevent`]),[`enter`]),l(J(t=>se(e),[`prevent`]),[`space`])]},[r(`span`,$a,[A(o,{"aria-hidden":`true`},{default:R(()=>[A(i(le))]),_:1})]),r(`span`,eo,U(i(Z)(`@WORKBENCH:在新标签页启动 g ui`)),1)],40,Qa),a[8]||=r(`li`,{class:`proj-menu__sep`,role:`separator`},null,-1),r(`li`,to,U(i(Z)(`@WORKBENCH:用工具打开`)),1),(K(!0),T(N,null,G(i(ct),t=>(K(),T(`li`,{key:t.id,class:F([`proj-menu__item`,{"is-missing":M(t.id)}]),role:`menuitem`,tabindex:`-1`,onClick:n=>ce(e,t.id),onKeydown:[l(J(n=>ce(e,t.id),[`prevent`]),[`enter`]),l(J(n=>ce(e,t.id),[`prevent`]),[`space`])]},[r(`span`,ro,[A(Ze,{"icon-class":t.icon},null,8,[`icon-class`])]),r(`span`,io,U(i(Z)(t.labelKey)),1),M(t.id)?(K(),T(`span`,ao,U(i(Z)(`@67CE7:未安装`)),1)):w(``,!0)],42,no))),128)),r(`li`,{class:F([`proj-menu__item`,{"is-missing":M(`claude`)}]),role:`menuitem`,tabindex:`-1`,onClick:t=>ce(e,`claude`),onKeydown:[l(J(t=>ce(e,`claude`),[`prevent`]),[`enter`]),l(J(t=>ce(e,`claude`),[`prevent`]),[`space`])]},[r(`span`,so,[r(`img`,{src:i($),alt:``,class:`proj-menu__img`},null,8,co)]),r(`span`,lo,U(i(Z)(`@67CE7:用 Claude Code 打开`)),1),r(`span`,uo,U(M(`claude`)?i(Z)(`@67CE7:未安装`):i(Z)(`@67CE7:默认权限`)),1)],42,oo),r(`li`,{class:F([`proj-menu__item proj-menu__item--danger`,{"is-missing":M(`claude`)}]),role:`menuitem`,tabindex:`-1`,onClick:t=>ce(e,`claude`,`bypassPermissions`),onKeydown:[l(J(t=>ce(e,`claude`,`bypassPermissions`),[`prevent`]),[`enter`]),l(J(t=>ce(e,`claude`,`bypassPermissions`),[`prevent`]),[`space`])]},[r(`span`,po,[r(`img`,{src:i($),alt:``,class:`proj-menu__img`},null,8,mo)]),r(`span`,ho,U(i(Z)(`@67CE7:用 Claude Code 打开(完全批准)`)),1)],42,fo)],8,Ga)):w(``,!0)]),_:2},1032,[`visible`])]))],42,Ta))),128)),!n.loading&&n.projects.length===0?(K(),T(`li`,go,[r(`p`,_o,U(i(Z)(`@WORKBENCH:尚无项目`)),1),r(`p`,vo,U(i(Z)(`@WORKBENCH:常用目录与建过任务的目录都会出现在这里`)),1)])):w(``,!0),!n.loading&&n.projects.length>0&&h.value.length===0?(K(),T(`li`,yo,[r(`p`,bo,U(i(Z)(`@WORKBENCH:没有匹配的项目`)),1),r(`button`,{type:`button`,class:`proj-empty__clear`,onClick:g},U(i(Z)(`@WORKBENCH:清除筛选`)),1)])):w(``,!0)]),A(tt,{modelValue:k.value,"onUpdate:modelValue":a[7]||=e=>k.value=e,tool:j.value},null,8,[`modelValue`,`tool`])])}}}),[[`__scopeId`,`data-v-b59bea3c`]]);P(),I(),j();var So={class:`agents`},Co={class:`agents__head`},wo={class:`agents__title`},To={class:`agents__list`},Eo={class:`agent-item__row1`},Do=[`title`],Oo={class:`agent-item__status`},ko=[`title`],Ao=[`title`],jo={class:`agent-item__row3`},Mo={key:0,class:`agent-item__pid`},No={class:`agent-item__elapsed`},Po={key:0,class:`agents-empty`},Fo=Xe(o({__name:`WorkbenchAgentPanel`,props:{running:{}},setup(e){let t=e,n=Y(Date.now()),a=null;function o(){a&&=(clearInterval(a),null)}function s(){if(t.running.length>0){if(a)return;n.value=Date.now(),a=setInterval(()=>{n.value=Date.now()},1e3)}else o()}q(()=>t.running.length,s,{immediate:!0}),pe(o);let c=V(()=>t.running.map(e=>({...e,elapsed:ta(e.startedAt,null,n.value)})));return(t,n)=>(K(),T(`section`,So,[r(`header`,Co,[r(`h3`,wo,U(i(Z)(`@WORKBENCH:执行监控`)),1),r(`span`,{class:F([`agents__count`,{"is-live":e.running.length>0}])},U(i(Z)(`@WORKBENCH:{n} 个执行中`,{n:e.running.length})),3)]),r(`ul`,To,[(K(!0),T(N,null,G(c.value,e=>(K(),T(`li`,{key:e.jobId,class:`agent-item`},[r(`div`,Eo,[r(`span`,{class:F([`agent-item__dot`,{"is-pending":e.status===`pending`}]),"aria-hidden":`true`},null,2),r(`span`,{class:`agent-item__project`,title:e.projectName},U(e.projectName||`—`),9,Do),r(`span`,Oo,U(e.status===`pending`?i(Z)(`@WORKBENCH:排队中`):i(Z)(`@WORKBENCH:执行中`)),1)]),r(`p`,{class:`agent-item__task`,title:e.taskTitle},U(e.taskTitle||i(Z)(`@WORKBENCH:未命名任务`)),9,ko),e.subTitle?(K(),T(`p`,{key:0,class:`agent-item__sub`,title:e.subTitle},U(e.subTitle),9,Ao)):w(``,!0),r(`div`,jo,[e.pid?(K(),T(`span`,Mo,`PID `+U(e.pid),1)):w(``,!0),r(`span`,No,U(e.elapsed),1)])]))),128)),e.running.length===0?(K(),T(`li`,Po,U(i(Z)(`@WORKBENCH:暂无执行中的任务`)),1)):w(``,!0)])]))}}),[[`__scopeId`,`data-v-9e83f1ec`]]);P(),I(),j(),H();var Io={class:`kb`},Lo={class:`kb__toolbar`},Ro={class:`kb__views`,role:`tablist`},zo=[`aria-selected`],Bo=[`aria-selected`],Vo={class:`kb__filters`},Ho=[`aria-label`],Uo={value:`all`},Wo={value:`simple`},Go={value:`complex`},Ko=[`title`],qo={class:`kb__search`},Jo=[`placeholder`],Yo={class:`kb-col__head`},Xo={class:`kb-col__title`},Zo={class:`kb-col__count`},Qo={class:`kb-col__list`},$o=[`onClick`],es={class:`kb-card__row1`},ts={key:0,class:`kb-card__running`,"aria-hidden":`true`},ns={key:1,class:`kb-card__type`},rs={key:2,class:`kb-card__error`},is={class:`kb-card__time`},as=[`title`],os={key:0,class:`kb-card__project`},ss={key:1,class:`kb-card__progress`},cs={class:`kb-card__bar`,"aria-hidden":`true`},ls={class:`kb-card__progress-text`},us={class:`kb-card__actions`},ds=[`title`,`onClick`],fs=[`title`,`aria-label`,`onClick`],ps={key:0,class:`kb-col__empty`},ms={key:1},hs={key:1,class:`kb__table-wrap`},gs={class:`kb-table`},_s={class:`kb-table__th`},vs={class:`kb-table__th kb-table__th--narrow`},ys={class:`kb-table__th kb-table__th--narrow`},bs={class:`kb-table__th kb-table__th--narrow`},xs={class:`kb-table__th kb-table__th--narrow`},Ss=[`onClick`],Cs={class:`kb-table__td`},ws={class:`kb-table__name`},Ts={key:0,class:`kb-table__project`},Es={class:`kb-table__td`},Ds={class:`kb-table__td`},Os={class:`kb-table__td kb-table__td--num`},ks={class:`kb-table__td kb-table__td--num`},As={key:0},js={class:`kb-table__td kb-table__empty`,colspan:`5`},Ms=`wb.boardView.v1`,Ns=Xe(o({__name:`WorkbenchKanban`,props:{tasks:{},projectLabels:{},showProjectLabel:{type:Boolean}},emits:[`open-task`,`run-task`,`delete-task`,`create-task`],setup(e,{emit:n}){let a=e,o=n,s=Y((()=>{try{return localStorage.getItem(Ms)===`list`?`list`:`kanban`}catch{return`kanban`}})());q(s,e=>{try{localStorage.setItem(Ms,e)}catch{}});let c=Y(``),l=Y(`all`),u=Y(!1),d=[{key:`todo`,labelKey:`@WORKBENCH:待处理`},{key:`doing`,labelKey:`@WORKBENCH:进行中`},{key:`done`,labelKey:`@WORKBENCH:已完成`}],f=V(()=>{let e=c.value.trim().toLowerCase();return a.tasks.filter(t=>l.value!==`all`&&t.type!==l.value||u.value&&t.subtaskErrorCount===0&&t.lastJobStatus!==`error`?!1:!e||(t.title||``).toLowerCase().includes(e)||(t.desc||``).toLowerCase().includes(e))}),p=V(()=>d.map(e=>e.key===`done`?{...e,tasks:f.value.filter(t=>t.column===e.key).sort(h)}:{...e,tasks:f.value.filter(t=>t.column===e.key)}));function m(e){return String(e.lastJobEndedAt||e.updatedAt||e.createdAt||``)}function h(e,t){return m(t).localeCompare(m(e))}function g(e){return e.column===`done`?m(e):e.updatedAt||e.createdAt||``}let _=V(()=>({gridTemplateColumns:`repeat(${p.value.length}, minmax(0, 1fr))`}));function v(e){return(e.title||``).trim()||(e.desc||``).replace(/\s+/g,` `).trim()}function y(e){return a.projectLabels[e.projectPath]||``}function ee(e){return e.subtaskErrorCount>0||e.lastJobStatus===`error`}return(n,a)=>{let m=de;return K(),T(`div`,Io,[r(`div`,Lo,[r(`div`,Ro,[r(`button`,{type:`button`,role:`tab`,class:F([`kb__view-btn`,{"is-active":s.value===`kanban`}]),"aria-selected":s.value===`kanban`,onClick:a[0]||=e=>s.value=`kanban`},U(i(Z)(`@WORKBENCH:看板视图`)),11,zo),r(`button`,{type:`button`,role:`tab`,class:F([`kb__view-btn`,{"is-active":s.value===`list`}]),"aria-selected":s.value===`list`,onClick:a[1]||=e=>s.value=`list`},U(i(Z)(`@WORKBENCH:列表视图`)),11,Bo)]),r(`div`,Vo,[W(r(`select`,{class:`kb__select`,"onUpdate:modelValue":a[2]||=e=>l.value=e,"aria-label":i(Z)(`@WORKBENCH:任务类型`)},[r(`option`,Uo,U(i(Z)(`@WORKBENCH:全部类型`)),1),r(`option`,Wo,U(i(Z)(`@WORKBENCH:简单`)),1),r(`option`,Go,U(i(Z)(`@WORKBENCH:复杂`)),1)],8,Ho),[[ye,l.value]]),r(`label`,{class:`kb__check`,title:i(Z)(`@WORKBENCH:只显示子任务或最近一次执行报错的任务`)},[W(r(`input`,{type:`checkbox`,"onUpdate:modelValue":a[3]||=e=>u.value=e},null,512),[[he,u.value]]),r(`span`,null,U(i(Z)(`@WORKBENCH:仅看报错`)),1)],8,Ko),r(`div`,qo,[A(m,{class:`kb__search-icon`},{default:R(()=>[A(i(b))]),_:1}),W(r(`input`,{class:`kb__search-input`,type:`search`,"onUpdate:modelValue":a[4]||=e=>c.value=e,placeholder:i(Z)(`@WORKBENCH:搜索任务标题或描述`)},null,8,Jo),[[He,c.value]])])])]),s.value===`kanban`?(K(),T(`div`,{key:0,class:`kb__columns`,style:t(_.value)},[(K(!0),T(N,null,G(p.value,n=>(K(),T(`section`,{key:n.key,class:F([`kb-col`,`kb-col--`+n.key])},[r(`header`,Yo,[a[6]||=r(`span`,{class:`kb-col__dot`,"aria-hidden":`true`},null,-1),r(`h3`,Xo,U(i(Z)(n.labelKey)),1),r(`span`,Zo,U(n.tasks.length),1)]),r(`ul`,Qo,[(K(!0),T(N,null,G(n.tasks,n=>(K(),T(`li`,{key:n.id,class:F([`kb-card`,{"is-running":n.runningJobs>0,"has-error":ee(n)}]),onClick:e=>o(`open-task`,n)},[r(`div`,es,[n.runningJobs>0?(K(),T(`span`,ts)):w(``,!0),n.type===`simple`?(K(),T(`span`,ns,U(i(Z)(`@WORKBENCH:简单`)),1)):w(``,!0),n.subtaskErrorCount>0?(K(),T(`span`,rs,U(i(Z)(`@WORKBENCH:{n} 个子任务报错`,{n:n.subtaskErrorCount})),1)):w(``,!0),r(`span`,is,U(i(ea)(g(n))),1)]),r(`p`,{class:`kb-card__title`,title:v(n)},U(v(n)||i(Z)(`@WORKBENCH:未命名任务`)),9,as),e.showProjectLabel&&y(n)?(K(),T(`p`,os,U(y(n)),1)):w(``,!0),n.subtaskCount>0?(K(),T(`div`,ss,[r(`span`,cs,[r(`i`,{class:`kb-card__bar-fill`,style:t({width:Math.round(n.subtaskDoneCount/n.subtaskCount*100)+`%`})},null,4)]),r(`span`,ls,U(n.subtaskDoneCount)+`/`+U(n.subtaskCount),1)])):w(``,!0),r(`div`,us,[n.runningJobs===0?(K(),T(`button`,{key:0,type:`button`,class:`kb-card__btn`,title:i(Z)(`@WORKBENCH:执行`),onClick:J(e=>o(`run-task`,n),[`stop`])},U(i(Z)(`@WORKBENCH:执行`)),9,ds)):w(``,!0),r(`button`,{type:`button`,class:`kb-card__btn kb-card__btn--danger`,title:i(Z)(`@WORKBENCH:删除`),"aria-label":i(Z)(`@WORKBENCH:删除`),onClick:J(e=>o(`delete-task`,n),[`stop`])},`×`,8,fs)])],10,$o))),128)),n.tasks.length===0?(K(),T(`li`,ps,[n.key===`todo`?(K(),T(`button`,{key:0,type:`button`,class:`kb-col__empty-btn`,onClick:a[5]||=e=>o(`create-task`)},U(i(Z)(`@WORKBENCH:新建任务`)),1)):(K(),T(`span`,ms,U(i(Z)(`@WORKBENCH:暂无任务`)),1))])):w(``,!0)])],2))),128))],4)):(K(),T(`div`,hs,[r(`table`,gs,[r(`thead`,null,[r(`tr`,null,[r(`th`,_s,U(i(Z)(`@WORKBENCH:任务`)),1),r(`th`,vs,U(i(Z)(`@WORKBENCH:状态`)),1),r(`th`,ys,U(i(Z)(`@WORKBENCH:类型`)),1),r(`th`,bs,U(i(Z)(`@WORKBENCH:子任务`)),1),r(`th`,xs,U(i(Z)(`@WORKBENCH:更新时间`)),1)])]),r(`tbody`,null,[(K(!0),T(N,null,G(f.value,t=>(K(),T(`tr`,{key:t.id,class:`kb-table__row`,onClick:e=>o(`open-task`,t)},[r(`td`,Cs,[r(`span`,ws,U(v(t)||i(Z)(`@WORKBENCH:未命名任务`)),1),e.showProjectLabel&&y(t)?(K(),T(`span`,Ts,U(y(t)),1)):w(``,!0)]),r(`td`,Es,[r(`span`,{class:F([`kb-table__status`,`is-`+t.column])},U(i(Z)(d.find(e=>e.key===t.column).labelKey)),3)]),r(`td`,Ds,U(t.type===`simple`?i(Z)(`@WORKBENCH:简单`):i(Z)(`@WORKBENCH:复杂`)),1),r(`td`,Os,[t.subtaskCount>0?(K(),T(N,{key:0},[S(U(t.subtaskDoneCount)+`/`+U(t.subtaskCount),1)],64)):(K(),T(N,{key:1},[S(`—`)],64))]),r(`td`,ks,U(i(ea)(t.updatedAt||t.createdAt)),1)],8,Ss))),128)),f.value.length===0?(K(),T(`tr`,As,[r(`td`,js,U(i(Z)(`@WORKBENCH:暂无任务`)),1)])):w(``,!0)])])]))])}}}),[[`__scopeId`,`data-v-1ac24489`]]);P(),I(),j(),H();var Ps=[`title`,`aria-label`],Fs={class:`oc__rail-text`},Is={class:`oc__head`},Ls={class:`oc__title`},Rs=[`disabled`,`title`],zs=[`title`,`aria-label`],Bs={class:`oc__state-label`},Vs={class:`oc__state-value`},Hs={class:`oc__state-meta`},Us={class:`oc__feed`},Ws={class:`oc__feed-title`},Gs={class:`oc__feed-list`},Ks={class:`oc-row__head`},qs={class:`oc-row__kind`},Js={class:`oc-row__time`},Ys={class:`oc-row__text`},Xs={key:0,class:`oc-row__note`},Zs={key:1,class:`oc-row__note`},Qs={key:0},$s={key:2,class:`oc-row__note`},ec=[`title`],tc={key:4,class:`oc-row__note`},nc={key:0,class:`oc-empty`},rc={class:`oc__git`},ic={class:`oc__feed-title`},ac={class:`oc__git-name`},oc={class:`oc__git-list`},sc={class:`oc__git-label`},cc={class:`oc__git-label`},lc={class:`oc__git-value`},uc={class:`oc__git-label`},dc={class:`oc__git-value`},fc=[`placeholder`],pc={class:`oc__compose-foot`},mc=[`disabled`,`title`,`aria-label`],hc=[`title`,`aria-label`],gc=[`title`],_c=[`title`],vc=[`title`,`aria-label`],yc={class:`oc__executor-item`},bc={class:`oc__executor-item__name`},xc={key:1,class:`oc__executor-item__missing`},Sc=[`disabled`],Cc={class:`oc__hint`},wc=`/api/workbench/orchestrator/attachments`,Tc=Xe(o({__name:`OrchestratorConsole`,props:{active:{type:Boolean},activity:{},runningCount:{},selectedProject:{},dispatching:{type:Boolean},togglingSchedule:{type:Boolean},todayDone:{},collapsed:{type:Boolean},defaultPrompt:{},projectPrompts:{}},emits:[`toggle-schedule`,`toggle-collapse`,`open-prompt-settings`,`dispatch`],setup(e,{expose:t,emit:n}){let a=e,o=n,s=Y(``),l=Y(!0),u=Y(!0),d=$e(),f=V(()=>({claude:d.claudeAvailable,opencode:d.opencodeAvailable})),p=Y(ft());function m(){if(f.value[p.value]){rt(p.value);return}let e=Object.keys(f.value).find(e=>f.value[e]);e&&(p.value=e)}function h(e){return ut.find(t=>t.id===e)?.name||e}function g(e){p.value=e,m()}let _=Y([]),v=V(()=>({kind:`draft`,list:_.value,replace:e=>{_.value=e}})),{isUploading:y,isImageAttachment:b,humanSize:ee,onAttachmentPaste:x,onAttachmentDrop:C,removeAttachment:te,pickAttachmentFile:E}=ii(),D=V(()=>y(`draft`)),ne=Y(!1);function O(e){e.stopPropagation(),x(e,v.value)}function k(e){ne.value=!1,C(e,v.value)}function j(){E(v.value)}function re(e){te(v.value,e)}function ie(){_.value=[]}t({clearAttachments:ie});let oe=V(()=>a.selectedProject?.key||``),ce=V(()=>(a.defaultPrompt||``).trim()),P=V(()=>{let e=oe.value;return e?(a.projectPrompts?.[e]?.prompt||``).trim():``}),fe=V(()=>Object.values(a.projectPrompts||{}).some(e=>(e?.prompt||``).trim().length>0)),pe=V(()=>!!ce.value||fe.value),I=V(()=>{let e=!!ce.value,t=oe.value?P.value?`project`:`none`:fe.value?`target`:`none`;return Z(e&&t===`project`?`@WORKBENCH:全局 + 本项目`:e&&t===`target`?`@WORKBENCH:全局 + 落点项目`:e?`@WORKBENCH:全局`:t===`project`?`@WORKBENCH:本项目`:t===`target`?`@WORKBENCH:落点项目`:`@WORKBENCH:未设置`)}),L=V(()=>s.value.trim().length>0&&!a.dispatching&&!D.value);function ge(){L.value&&(o(`dispatch`,{text:s.value.trim(),autoRun:l.value,attachments:_.value,projectPath:a.selectedProject?a.selectedProject.path:``,useDefaultPrompt:u.value,executor:p.value}),s.value=``)}function _e(e){e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||(e.preventDefault(),ge())}function ve(e){let t=e.taskTitle||e.subTitle||Z(`@WORKBENCH:未命名任务`),n=e.projectName||`—`;switch(e.kind){case`user`:return e.text||``;case`dispatch`:return Z(`@WORKBENCH:派发「{task}」至 {project}`,{task:t,project:n});case`done`:return Z(`@WORKBENCH:「{task}」执行完成`,{task:t});case`error`:return Z(`@WORKBENCH:「{task}」执行出错`,{task:t});case`cancelled`:return Z(`@WORKBENCH:「{task}」已取消`,{task:t});default:return t}}let ye={user:`@WORKBENCH:用户派发`,dispatch:`@WORKBENCH:派发`,done:`@WORKBENCH:完成`,error:`@WORKBENCH:出错`,cancelled:`@WORKBENCH:取消`};function be(e){return e.kind===`user`?e.instructionStatus===`accepted`?Z(`@WORKBENCH:已建任务并开始执行`):e.instructionStatus===`rejected`?Z(`@WORKBENCH:被拒绝:{reason}`,{reason:e.reason||``}):e.reason||Z(`@WORKBENCH:已建任务(未执行)`):``}function xe(e){switch(e.targetSource){case`mention`:return Z(`@WORKBENCH:指令里提到了它`);case`agent`:return Z(`@WORKBENCH:主 Agent 判断`);case`default`:return Z(`@WORKBENCH:没识别出项目,用了默认项目`);default:return``}}function Se(e){switch(e.promptSource){case`global`:return Z(`@WORKBENCH:附带全局默认提示词`);case`project`:return Z(`@WORKBENCH:附带项目默认提示词`);case`both`:return Z(`@WORKBENCH:附带全局 + 项目默认提示词`);default:return``}}let Ce=V(()=>{let e=a.selectedProject;if(!e)return[];let t=[];if(e.exists===!1)return t.push({label:Z(`@WORKBENCH:工作区`),value:Z(`@WORKBENCH:目录不存在`),tone:`danger`}),t;let n=e.git;return!n||n.isGitRepo===null?(t.push({label:Z(`@WORKBENCH:Git 状态`),value:Z(`@WORKBENCH:未知`),tone:``}),t):n.isGitRepo?(t.push({label:Z(`@WORKBENCH:分支`),value:n.detached?Z(`@WORKBENCH:游离 HEAD`):n.branch||Z(`@WORKBENCH:未知`),tone:``}),t.push({label:Z(`@WORKBENCH:工作区`),value:n.changed>0?Z(`@WORKBENCH:未提交 {n} 项`,{n:n.changed}):Z(`@WORKBENCH:干净`),tone:n.changed>0?`warn`:``}),n.hasUpstream&&(n.ahead>0||n.behind>0)&&t.push({label:Z(`@WORKBENCH:与上游`),value:Z(`@WORKBENCH:领先 {ahead} / 落后 {behind}`,{ahead:n.ahead,behind:n.behind}),tone:n.behind>0?`warn`:``}),t):(t.push({label:Z(`@WORKBENCH:Git 状态`),value:Z(`@WORKBENCH:不是 Git 仓库`),tone:``}),t)});return(t,n)=>{let a=de,d=ze,m=ae,v=c;return K(),T(`aside`,{class:F([`oc`,{"is-collapsed":e.collapsed}])},[e.collapsed?(K(),T(`button`,{key:0,type:`button`,class:`oc__rail`,title:i(Z)(`@WORKBENCH:展开主 Agent 控制台`),"aria-label":i(Z)(`@WORKBENCH:展开主 Agent 控制台`),"aria-expanded":!1,onClick:n[0]||=e=>o(`toggle-collapse`)},[A(a,{class:`oc__rail-icon`},{default:R(()=>[A(i(X))]),_:1}),r(`span`,{class:F([`oc__rail-live`,{"is-off":!e.active}]),"aria-hidden":`true`},null,2),r(`span`,Fs,U(i(Z)(`@WORKBENCH:主 Agent 控制台`)),1)],8,Ps)):w(``,!0),W(r(`header`,Is,[r(`span`,{class:F([`oc__live`,{"is-off":!e.active}]),"aria-hidden":`true`},null,2),r(`h3`,Ls,U(i(Z)(`@WORKBENCH:主 Agent 控制台`)),1),r(`button`,{type:`button`,class:`oc__toggle`,disabled:e.togglingSchedule,title:e.active?i(Z)(`@WORKBENCH:暂停后派发只建任务,不会自动执行`):i(Z)(`@WORKBENCH:恢复后派发会自动执行`),onClick:n[1]||=t=>o(`toggle-schedule`,!e.active)},U(e.active?i(Z)(`@WORKBENCH:暂停调度`):i(Z)(`@WORKBENCH:恢复调度`)),9,Rs),r(`button`,{type:`button`,class:`oc__collapse`,title:i(Z)(`@WORKBENCH:收起主 Agent 控制台`),"aria-label":i(Z)(`@WORKBENCH:收起主 Agent 控制台`),"aria-expanded":!0,onClick:n[2]||=e=>o(`toggle-collapse`)},[A(a,null,{default:R(()=>[A(i(Ge))]),_:1})],8,zs)],512),[[M,!e.collapsed]]),W(r(`div`,{class:F([`oc__state`,{"is-paused":!e.active}])},[r(`span`,Bs,U(i(Z)(`@WORKBENCH:调度状态`)),1),r(`span`,Vs,U(e.active?i(Z)(`@WORKBENCH:调度中`):i(Z)(`@WORKBENCH:已暂停`)),1),r(`span`,Hs,U(i(Z)(`@WORKBENCH:{n} 个执行中`,{n:e.runningCount})),1)],2),[[M,!e.collapsed]]),W(r(`div`,Us,[r(`p`,Ws,U(i(Z)(`@WORKBENCH:活动日志`)),1),r(`ul`,Gs,[(K(!0),T(N,null,G(e.activity,e=>(K(),T(`li`,{key:e.id,class:F([`oc-row`,`oc-row--`+e.kind])},[r(`div`,Ks,[r(`span`,qs,U(i(Z)(ye[e.kind]||`@WORKBENCH:派发`)),1),r(`span`,Js,U(i(ra)(e.at)),1)]),r(`p`,Ys,U(ve(e)),1),be(e)?(K(),T(`p`,Xs,U(be(e)),1)):w(``,!0),e.kind===`user`&&e.projectName?(K(),T(`p`,Zs,[S(U(i(Z)(`@WORKBENCH:落点「{name}」`,{name:e.projectName}))+` `,1),xe(e)?(K(),T(`span`,Qs,`· `+U(xe(e)),1)):w(``,!0)])):w(``,!0),e.kind===`user`&&Se(e)?(K(),T(`p`,$s,U(Se(e)),1)):w(``,!0),e.kind===`error`&&e.error?(K(),T(`p`,{key:3,class:`oc-row__error`,title:e.error},U(e.error),9,ec)):w(``,!0),e.kind===`done`&&e.projectName?(K(),T(`p`,tc,U(e.projectName),1)):w(``,!0)],2))),128)),e.activity.length===0?(K(),T(`li`,nc,U(i(Z)(`@WORKBENCH:暂无活动记录`)),1)):w(``,!0)])],512),[[M,!e.collapsed]]),W(r(`div`,rc,[r(`p`,ic,[S(U(i(Z)(`@WORKBENCH:项目概览`))+` `,1),r(`span`,ac,U(e.selectedProject?e.selectedProject.name:i(Z)(`@WORKBENCH:全部项目`)),1)]),r(`dl`,oc,[(K(!0),T(N,null,G(Ce.value,e=>(K(),T(N,{key:e.label},[r(`dt`,sc,U(e.label),1),r(`dd`,{class:F([`oc__git-value`,{"is-warn":e.tone===`warn`,"is-danger":e.tone===`danger`}])},U(e.value),3)],64))),128)),r(`dt`,cc,U(i(Z)(`@WORKBENCH:今日完成`)),1),r(`dd`,lc,U(e.todayDone),1),r(`dt`,uc,U(i(Z)(`@WORKBENCH:最后活跃`)),1),r(`dd`,dc,U(e.selectedProject&&i(ea)(e.selectedProject.stats.lastActiveAt)||`—`),1)])],512),[[M,!e.collapsed]]),W(r(`div`,{class:`oc__compose`,onPaste:O,onDrop:J(k,[`prevent`]),onDragover:n[10]||=J(e=>ne.value=!0,[`prevent`]),onDragleave:n[11]||=e=>ne.value=!1},[W(r(`textarea`,{class:`oc__input`,"onUpdate:modelValue":n[3]||=e=>s.value=e,rows:`3`,placeholder:i(Z)(`@WORKBENCH:给主 Agent 下一条指令,例如:把登录模块的错误处理重构一遍`),onKeydown:_e,onPaste:O},null,40,fc),[[He,s.value]]),_.value.length>0||D.value?(K(),z(Hn,{key:0,attachments:_.value,"is-image":i(b),"human-size":i(ee),"is-uploading":D.value,"is-paste-hover":ne.value,"max-count":9,"on-pick":j,"on-remove":re,"raw-base":wc,onPaste:O,onDrop:k,onDragover:n[4]||=J(e=>ne.value=!0,[`prevent`]),onDragenter:n[5]||=J(e=>ne.value=!0,[`prevent`]),onDragleave:n[6]||=e=>ne.value=!1},null,8,[`attachments`,`is-image`,`human-size`,`is-uploading`,`is-paste-hover`])):w(``,!0),r(`div`,pc,[r(`button`,{type:`button`,class:`oc__attach`,disabled:D.value||_.value.length>=9,title:i(Z)(`@WORKBENCH:添加附件(也可直接粘贴或拖入文件)`),"aria-label":i(Z)(`@WORKBENCH:添加附件`),onClick:j},[A(a,null,{default:R(()=>[A(i(se))]),_:1})],8,mc),r(`button`,{type:`button`,class:F([`oc__attach`,{"is-on":pe.value}]),title:i(Z)(`@WORKBENCH:设置派发时自动附加的默认提示词(全局 / 各项目)`),"aria-label":i(Z)(`@WORKBENCH:默认提示词设置`),onClick:n[7]||=e=>o(`open-prompt-settings`)},[A(a,null,{default:R(()=>[A(i(me))]),_:1})],10,hc),r(`label`,{class:`oc__autorn`,title:i(Z)(`@WORKBENCH:取消勾选则只建任务草稿,不自动执行`)},[W(r(`input`,{type:`checkbox`,"onUpdate:modelValue":n[8]||=e=>l.value=e},null,512),[[he,l.value]]),r(`span`,null,U(i(Z)(`@WORKBENCH:立即执行`)),1)],8,gc),pe.value?(K(),T(`label`,{key:0,class:`oc__autorn`,title:i(Z)(`@WORKBENCH:取消勾选则本次派发的任务不带默认提示词(设置本身不受影响)`)},[W(r(`input`,{type:`checkbox`,"onUpdate:modelValue":n[9]||=e=>u.value=e},null,512),[[he,u.value]]),r(`span`,null,U(i(Z)(`@WORKBENCH:默认提示词({state})`,{state:I.value})),1)],8,_c)):w(``,!0),A(v,{trigger:`click`,class:`oc__executor`,onCommand:g},{dropdown:R(()=>[A(m,null,{default:R(()=>[(K(!0),T(N,null,G(i(ut),e=>(K(),z(d,{key:e.id,command:e.id,disabled:!f.value[e.id]},{default:R(()=>[r(`span`,yc,[A(nt,{executor:e.id,class:`oc__executor-item__icon`},null,8,[`executor`]),r(`span`,bc,U(e.name),1),p.value===e.id?(K(),z(a,{key:0,class:`oc__executor-item__check`},{default:R(()=>[A(i(Ie))]),_:1})):f.value[e.id]?w(``,!0):(K(),T(`span`,xc,U(i(Z)(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:R(()=>[r(`button`,{type:`button`,class:`oc__executor-btn`,title:i(Z)(`@WORKBENCH:本次派发使用的执行器(与执行按钮的临时切换共用)`),"aria-label":i(Z)(`@WORKBENCH:任务执行器`)},[A(nt,{executor:p.value,class:`oc__executor-btn__icon`},null,8,[`executor`]),r(`span`,null,U(h(p.value)),1),A(a,{class:`oc__executor-btn__caret`},{default:R(()=>[A(i(ue))]),_:1})],8,vc)]),_:1}),r(`button`,{type:`button`,class:`oc__send`,disabled:!L.value,onClick:ge},[A(a,{class:`oc__send-icon`},{default:R(()=>[A(i(le))]),_:1}),r(`span`,null,U(e.dispatching?i(Z)(`@WORKBENCH:派发中…`):i(Z)(`@WORKBENCH:派发`)),1)],8,Sc)]),r(`p`,Cc,[e.selectedProject?(K(),T(N,{key:0},[S(U(i(Z)(`@WORKBENCH:指令会在「{name}」下新建一个任务;Enter 派发,Shift+Enter 换行`,{name:e.selectedProject.name})),1)],64)):(K(),T(N,{key:1},[S(U(i(Z)(`@WORKBENCH:指令落到哪个项目由主 Agent 判断;Enter 派发,Shift+Enter 换行`)),1)],64))])],544),[[M,!e.collapsed]])],2)}}}),[[`__scopeId`,`data-v-c680e2a1`]]);P(),I(),j(),H();var Ec={class:`pd`},Dc={class:`pd__intro`},Oc={class:`pd__field`},kc={class:`pd__head`},Ac={class:`pd__label`,for:`pd-global`},jc={class:`pd__count`},Mc=[`placeholder`],Nc={class:`pd__field`},Pc={class:`pd__head`},Fc={class:`pd__label`,for:`pd-project`},Ic={key:0,class:`pd__count`},Lc=[`disabled`,`placeholder`],Rc={class:`pd__hint`},zc={class:`pd__foot`},Bc=[`disabled`],Vc=4e3,Hc=Xe(o({__name:`WorkbenchDefaultPromptDialog`,props:{modelValue:{type:Boolean},defaultPrompt:{},projectPath:{},projectName:{},projectPrompt:{},saving:{type:Boolean}},emits:[`update:modelValue`,`save`],setup(e,{emit:t}){let n=e,a=t,o=Y(``),s=Y(``);q(()=>n.modelValue,e=>{e&&(o.value=n.defaultPrompt||``,s.value=n.projectPrompt||``)});let c=V(()=>!!n.projectPath),l=V(()=>o.value.trim()!==(n.defaultPrompt||``).trim()||c.value&&s.value.trim()!==(n.projectPrompt||``).trim());function u(){n.saving||a(`save`,{globalPrompt:o.value,projectPrompt:s.value})}function d(){a(`update:modelValue`,!1)}return(t,n)=>(K(),z(et,{"model-value":e.modelValue,title:i(Z)(`@WORKBENCH:默认提示词`),width:`min(640px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[2]||=e=>a(`update:modelValue`,e)},{footer:R(()=>[r(`div`,zc,[r(`button`,{type:`button`,class:`pd__btn`,onClick:d},U(i(Z)(`@WORKBENCH:取消`)),1),n[3]||=r(`span`,{class:`pd__foot-spacer`},null,-1),r(`button`,{type:`button`,class:`pd__btn pd__btn--primary`,disabled:e.saving||!l.value,onClick:u},U(e.saving?i(Z)(`@WORKBENCH:保存中…`):i(Z)(`@WORKBENCH:保存`)),9,Bc)])]),default:R(()=>[r(`div`,Ec,[r(`p`,Dc,U(i(Z)(`@WORKBENCH:派发指令时自动附加在指令之前,让每个任务都带上这些约束。只影响之后派发的任务,不会改动已经建好的任务。`)),1),r(`div`,Oc,[r(`div`,kc,[r(`label`,Ac,U(i(Z)(`@WORKBENCH:全局默认提示词`)),1),r(`span`,jc,U(o.value.length)+` / `+U(Vc),1)]),W(r(`textarea`,{id:`pd-global`,"onUpdate:modelValue":n[0]||=e=>o.value=e,class:`pd__area`,rows:`5`,maxlength:Vc,placeholder:i(Z)(`@WORKBENCH:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,Mc),[[He,o.value]])]),r(`div`,Nc,[r(`div`,Pc,[r(`label`,Fc,U(c.value?i(Z)(`@WORKBENCH:「{name}」的项目提示词`,{name:e.projectName}):i(Z)(`@WORKBENCH:项目提示词`)),1),c.value?(K(),T(`span`,Ic,U(s.value.length)+` / `+U(Vc),1)):w(``,!0)]),W(r(`textarea`,{id:`pd-project`,"onUpdate:modelValue":n[1]||=e=>s.value=e,class:`pd__area`,rows:`5`,maxlength:Vc,disabled:!c.value,placeholder:c.value?i(Z)(`@WORKBENCH:只在这个项目派发时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):i(Z)(`@WORKBENCH:先在左侧选中一个具体项目,才能设置它的提示词`)},null,8,Lc),[[He,s.value]]),r(`p`,Rc,U(c.value?i(Z)(`@WORKBENCH:项目提示词追加在全局提示词之后(不覆盖全局),派发到「{name}」时一起带上`,{name:e.projectName}):i(Z)(`@WORKBENCH:选中的是「全部项目」,落点由主 Agent 判断 —— 想给某个项目单设提示词,先选中它`)),1)])])]),_:1},8,[`model-value`,`title`]))}}),[[`__scopeId`,`data-v-eddf8c4d`]]);P(),I(),j(),H();var Uc={class:`nc`},Wc={class:`nc__field`},Gc={class:`nc__label`,for:`nc-project`},Kc={value:``},qc=[`value`],Jc=[`title`],Yc={class:`nc__field`},Xc={class:`nc__label`,for:`nc-title`},Zc=[`placeholder`],Qc={class:`nc__field`},$c={class:`nc__label`,for:`nc-desc`},el=[`placeholder`],tl={class:`nc__field`},nl={class:`nc__label`},rl={class:`nc__radios`},il={class:`nc__radio-name`},al={class:`nc__radio-desc`},ol={class:`nc__radio-name`},sl={class:`nc__radio-desc`},cl={key:0,class:`nc__error`},ll={class:`nc__foot`},ul=[`disabled`],dl=[`disabled`],fl=Xe(o({__name:`WorkbenchTaskCreateDialog`,props:{modelValue:{type:Boolean},projects:{},defaultProjectPath:{}},emits:[`update:modelValue`,`created`],setup(e,{emit:t}){let n=e,a=t,o=Y(``),s=Y(``),c=Y(`complex`),u=Y(``),d=Y(!1),f=Y(``);function p(e){let t=Q(e);if(!t)return``;let r=n.projects.find(e=>Q(e.path)===t);return r?r.path:``}q(()=>n.modelValue,e=>{e&&(o.value=``,s.value=``,c.value=`complex`,u.value=p(n.defaultProjectPath),f.value=``,d.value=!1)});let m=V(()=>n.projects),h=V(()=>!d.value&&(o.value.trim().length>0||s.value.trim().length>0)),g=V(()=>{let e=Q(u.value);if(!e)return``;let t=m.value.find(t=>Q(t.path)===e);return t?t.name:``});async function _(e){if(h.value){d.value=!0,f.value=``;try{let t={title:o.value.trim(),desc:s.value,type:c.value,promptId:null,simpleOverride:``,subtasks:[]};u.value&&(t.projectPath=u.value);let n=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>e.json()).catch(()=>null);if(!n?.success){f.value=n?.error||Z(`@WORKBENCH:保存失败`);return}a(`update:modelValue`,!1),a(`created`,{task:n.task,openEditor:e})}finally{d.value=!1}}}return(t,n)=>(K(),z(et,{"model-value":e.modelValue,title:i(Z)(`@WORKBENCH:新建开发任务`),width:`min(600px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[11]||=e=>a(`update:modelValue`,e)},{footer:R(()=>[r(`div`,ll,[r(`button`,{type:`button`,class:`nc__btn`,onClick:n[8]||=e=>a(`update:modelValue`,!1)},U(i(Z)(`@WORKBENCH:取消`)),1),n[12]||=r(`span`,{class:`nc__foot-spacer`},null,-1),r(`button`,{type:`button`,class:`nc__btn`,disabled:!h.value,onClick:n[9]||=e=>_(!0)},U(i(Z)(`@WORKBENCH:创建并打开编辑器`)),9,ul),r(`button`,{type:`button`,class:`nc__btn nc__btn--primary`,disabled:!h.value,onClick:n[10]||=e=>_(!1)},U(d.value?i(Z)(`@WORKBENCH:创建中…`):i(Z)(`@WORKBENCH:创建`)),9,dl)])]),default:R(()=>[r(`div`,Uc,[r(`div`,Wc,[r(`label`,Gc,U(i(Z)(`@WORKBENCH:项目`)),1),W(r(`select`,{id:`nc-project`,"onUpdate:modelValue":n[0]||=e=>u.value=e,class:`nc__select`},[r(`option`,Kc,U(i(Z)(`@WORKBENCH:跟随当前项目`)),1),(K(!0),T(N,null,G(m.value,e=>(K(),T(`option`,{key:e.key,value:e.path},U(e.name)+U(e.exists===!1?` · ${i(Z)(`@WORKBENCH:目录不存在`)}`:``),9,qc))),128))],512),[[ye,u.value]]),r(`p`,{class:`nc__hint`,title:u.value},U(g.value?i(Z)(`@WORKBENCH:任务会在「{name}」目录下执行`,{name:g.value}):i(Z)(`@WORKBENCH:任务会跟随应用当前的工作目录`)),9,Jc)]),r(`div`,Yc,[r(`label`,Xc,U(i(Z)(`@WORKBENCH:标题`)),1),W(r(`input`,{id:`nc-title`,"onUpdate:modelValue":n[1]||=e=>o.value=e,class:`nc__input`,type:`text`,maxlength:`200`,placeholder:i(Z)(`@WORKBENCH:一句话说清要做什么`),onKeydown:n[2]||=l(J(e=>_(!1),[`prevent`]),[`enter`])},null,40,Zc),[[He,o.value]])]),r(`div`,Qc,[r(`label`,$c,U(i(Z)(`@WORKBENCH:描述`)),1),W(r(`textarea`,{id:`nc-desc`,"onUpdate:modelValue":n[3]||=e=>s.value=e,class:`nc__input nc__input--area`,rows:`6`,placeholder:i(Z)(`@WORKBENCH:把背景、验收标准、相关文件路径写进来,执行时用它当上下文`),onKeydown:[n[4]||=l(J(e=>_(!1),[`ctrl`,`prevent`]),[`enter`]),n[5]||=l(J(e=>_(!1),[`meta`,`prevent`]),[`enter`])]},null,40,el),[[He,s.value]])]),r(`div`,tl,[r(`span`,nl,U(i(Z)(`@WORKBENCH:类型`)),1),r(`div`,rl,[r(`label`,{class:F([`nc__radio`,{"is-on":c.value===`complex`}])},[W(r(`input`,{"onUpdate:modelValue":n[6]||=e=>c.value=e,type:`radio`,value:`complex`},null,512),[[We,c.value]]),r(`span`,il,U(i(Z)(`@WORKBENCH:复杂`)),1),r(`span`,al,U(i(Z)(`@WORKBENCH:先拆成子任务再逐个执行,适合一次改多处`)),1)],2),r(`label`,{class:F([`nc__radio`,{"is-on":c.value===`simple`}])},[W(r(`input`,{"onUpdate:modelValue":n[7]||=e=>c.value=e,type:`radio`,value:`simple`},null,512),[[We,c.value]]),r(`span`,ol,U(i(Z)(`@WORKBENCH:简单`)),1),r(`span`,sl,U(i(Z)(`@WORKBENCH:直接跑一条提示词,提示词要在编辑器里填`)),1)],2)])]),f.value?(K(),T(`p`,cl,U(f.value),1)):w(``,!0)])]),_:1},8,[`model-value`,`title`]))}}),[[`__scopeId`,`data-v-ab5f9d80`]]);P(),I(),j(),H();var pl={class:`board__top`},ml=[`title`,`aria-label`,`aria-expanded`],hl={class:`board__brand`},gl={class:`board__brand-text`},_l={class:`board__title`},vl={class:`board__subtitle`},yl={class:`board__stats`},bl={class:`board__stat`},xl={class:`board__stat-label`},Sl={class:`board__stat-value`},Cl={class:`board__stat`},wl={class:`board__stat-label`},Tl={class:`board__stat-value`},El={class:`board__stat`},Dl={class:`board__stat-label`},Ol={class:`board__stat`},kl={class:`board__stat-label`},Al={class:`board__stat-value`},jl={class:`board__actions`},Ml=[`title`,`aria-label`],Nl=[`title`],Pl=[`title`],Fl={class:`board__main`},Il={class:`board__main-head`},Ll={class:`board__main-title`},Rl={class:`board__project-name`},zl=[`title`],Bl={key:1,class:`board__project-path`},Vl={key:0,class:`board__project-meta`},Hl=[`title`],Ul=`wb.boardProject.v1`,Wl=5e3,Gl=`wb.boardLayout.v1`,Kl=180,ql=420,Jl=260,Yl=560,Xl=.26,Zl=.36,Ql=120,$l=560,eu=.5,tu=Xe(o({__name:`WorkbenchBoard`,emits:[`open-task`],setup(n,{emit:o}){let s=o,{projects:c,boardTasks:u,currentProjectPath:d,loading:f,loadProjects:p}=Yi(),{active:m,activity:_,running:v,dispatching:y,togglingSchedule:b,defaultPrompt:ee,projectPrompts:x,loadOrchestrator:C,setSchedulingActive:te,dispatch:E,saveDefaultPrompt:D,saveProjectPrompt:ne}=Xi(),O=Y((()=>{try{return localStorage.getItem(Ul)||``}catch{return``}})());q(O,e=>{try{localStorage.setItem(Ul,e)}catch{}});let k=V(()=>O.value&&c.value.find(e=>e.key===O.value)||null);q(c,e=>{O.value&&(e.some(e=>e.key===O.value)||(O.value=``))});let j=V(()=>{let e=new Map(c.value.map(e=>[e.key,e.name])),t={};for(let n of u.value)n.projectPath&&(t[n.projectPath]=e.get(Q(n.projectPath))||``);return t}),re=V(()=>{if(!O.value)return u.value;let e=O.value;return u.value.filter(t=>Q(t.projectPath)===e)}),M=V(()=>{let e=new Date;e.setHours(0,0,0,0);let t=e.getTime();return{projects:c.value.length,tasks:u.value.length,running:v.value.length,todayDone:_.value.filter(e=>e.kind===`done`&&e.at&&new Date(e.at).getTime()>=t).length}});function ae(e){s(`open-task`,{taskId:e.id,projectPath:e.projectPath})}let N=null,oe=!1;async function se(e=!0){if(!oe){oe=!0;try{await Promise.all([p(e),C(e)])}finally{oe=!1}}}function ce(){document.hidden||se(!0)}e(async()=>{window.addEventListener(`resize`,he),await se(!1),N=setInterval(()=>{document.hidden||se(!0)},Wl),document.addEventListener(`visibilitychange`,ce)}),pe(()=>{window.removeEventListener(`resize`,he),N&&=(clearInterval(N),null),document.removeEventListener(`visibilitychange`,ce)});let P=ie({left:null,right:null,agentH:null,leftCollapsed:!1,rightCollapsed:!1});function le(){try{let e=localStorage.getItem(Gl);if(!e)return;let t=JSON.parse(e);typeof t.left==`number`&&Number.isFinite(t.left)&&(P.left=t.left),typeof t.right==`number`&&Number.isFinite(t.right)&&(P.right=t.right),typeof t.agentH==`number`&&Number.isFinite(t.agentH)&&(P.agentH=t.agentH),P.leftCollapsed=t.leftCollapsed===!0,P.rightCollapsed=t.rightCollapsed===!0}catch{}}le();function ue(){try{localStorage.setItem(Gl,JSON.stringify(P))}catch{}}let fe=Y(typeof window>`u`?1920:window.innerWidth),me=Y(typeof window>`u`?1080:window.innerHeight);function he(){fe.value=window.innerWidth,me.value=window.innerHeight}let I=V(()=>fe.value<=1024),ge=V(()=>fe.value<=860);function _e(e,t){let n=e===`left`?Kl:Jl,r=Math.min(e===`left`?ql:Yl,fe.value*(e===`left`?Xl:Zl));return Math.round(Math.min(Math.max(t,n),Math.max(n,r)))}function ve(e){let t=Math.min($l,me.value*eu);return Math.round(Math.min(Math.max(e,Ql),Math.max(Ql,t)))}let ye=V(()=>{let e={};return P.left!=null&&(e[`--wb-left-w`]=_e(`left`,P.left)+`px`),P.right!=null&&!ge.value&&(e[`--wb-right-w`]=_e(`right`,P.right)+`px`),e}),be=V(()=>{let e={};return P.agentH!=null&&(e[`--wb-agents-h`]=ve(P.agentH)+`px`),e}),xe=Y(null),Se=Y(null),Ce=Y(null);function we(e){return xe.value?.querySelector(e===`left`?`.board__left`:`.oc`)}function Te(e){window.removeEventListener(`mousemove`,e),document.body.style.userSelect=``,document.body.style.cursor=``,Ce.value=null,ue()}function B(e,t){if(e===`left`?I.value:ge.value)return;let n=we(e);if(!n)return;t.preventDefault();let r=t.clientX,i=n.getBoundingClientRect().width;Ce.value=e,document.body.style.userSelect=`none`,document.body.style.cursor=`col-resize`;let a=t=>{let n=(t.clientX-r)*(e===`left`?1:-1);P[e]=_e(e,i+n)};window.addEventListener(`mousemove`,a),window.addEventListener(`mouseup`,()=>Te(a),{once:!0})}function De(e){P[e]=null,ue()}function H(){return Se.value?.querySelector(`.agents`)}function Oe(e){let t=H();if(!t)return;e.preventDefault();let n=e.clientY,r=t.getBoundingClientRect().height;Ce.value=`agents`,document.body.style.userSelect=`none`,document.body.style.cursor=`row-resize`;let i=e=>{P.agentH=ve(r+(n-e.clientY))};window.addEventListener(`mousemove`,i),window.addEventListener(`mouseup`,()=>Te(i),{once:!0})}function ke(){P.agentH=null,ue()}let Ae=Y(!1),je=V(()=>I.value?!Ae.value:P.leftCollapsed);function Me(){if(I.value){Ae.value=!Ae.value;return}P.leftCollapsed=!P.leftCollapsed,ue()}function W(){I.value&&(Ae.value=!1)}let Ne=V(()=>P.rightCollapsed&&!ge.value);function Pe(){P.rightCollapsed=!P.rightCollapsed,ue()}function Fe(e){O.value=e?e.key:``,Ae.value=!1}let G=Y(!1);function Ie(){G.value=!0}async function Le(e){if(await se(!0),e.openEditor){s(`open-task`,{taskId:e.task.id,projectPath:e.task.projectPath||``});return}L.success(Z(`@WORKBENCH:已创建任务`))}async function Re(e){if(e.runningJobs>0)return;if(e.type!==`simple`&&e.subtaskCount===0){L.warning(Z(`@WORKBENCH:复杂任务要先拆出子任务,打开编辑器添加后再执行`));return}let t=$e(),n={claude:t.claudeAvailable,opencode:t.opencodeAvailable},r=ft();n[r]||(r=r===`claude`?`opencode`:`claude`);let i=e.type===`simple`?`/api/workbench/tasks/${encodeURIComponent(e.id)}/run-simple`:`/api/workbench/tasks/${encodeURIComponent(e.id)}/run`,a=await fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({executor:r})}).then(e=>e.json()).catch(()=>null);if(!a?.success){L.error(a?.error||Z(`@WORKBENCH:执行失败`));return}L.success(Z(`@WORKBENCH:已开始执行`)),await se(!0)}async function ze(e){let t=(e.title||``).trim()||Z(`@WORKBENCH:未命名任务`);try{await Ee.confirm(Z(`@WORKBENCH:删除任务「{title}」及其所有子任务?`,{title:t}),Z(`@WORKBENCH:确认`),{type:`warning`})}catch{return}let n=await fetch(`/api/workbench/tasks/${encodeURIComponent(e.id)}`,{method:`DELETE`}).then(e=>e.json()).catch(()=>null);if(n&&n.success===!1){L.error(n.error||Z(`@WORKBENCH:删除失败`));return}await se(!0)}let J=Y(null),Be=V(()=>k.value?.path||d.value);async function Ve(e){let t=await E({text:e.text,projectPath:e.projectPath,autoRun:e.autoRun,attachments:e.attachments,useDefaultPrompt:e.useDefaultPrompt,executor:e.executor});t&&(J.value?.clearAttachments(),L.success(t.ran?Z(`@WORKBENCH:已派发并开始执行`):Z(`@WORKBENCH:已派发(只建任务未执行)`)),await se(!0))}async function He(e){await te(e)}let Ue=Y(!1),We=Y(!1),Ke=V(()=>{let e=k.value?.key;return e&&x.value?.[e]?.prompt||``});async function qe(e){if(We.value)return;let t=e.globalPrompt.trim(),n=e.projectPrompt.trim(),r=k.value;We.value=!0;try{let e=!0;t!==(ee.value||``).trim()&&(e=await D(t)),e&&r&&n!==Ke.value.trim()&&(e=await ne(r.path,n)),e&&(Ue.value=!1)}finally{We.value=!1}}return(e,n)=>{let o=de,s=a;return K(),T(`div`,{class:`board`,style:t(ye.value)},[r(`header`,pl,[r(`button`,{type:`button`,class:F([`board__icon-btn board__fold-btn`,{"is-on":!je.value}]),title:je.value?i(Z)(`@WORKBENCH:展开项目列表`):i(Z)(`@WORKBENCH:收起项目列表`),"aria-label":je.value?i(Z)(`@WORKBENCH:展开项目列表`):i(Z)(`@WORKBENCH:收起项目列表`),"aria-expanded":!je.value,onClick:Me},[je.value?(K(),z(o,{key:1},{default:R(()=>[A(i(Ge))]),_:1})):(K(),z(o,{key:0},{default:R(()=>[A(i(X))]),_:1}))],10,ml),r(`div`,hl,[r(`span`,{class:F([`board__live`,{"is-off":!i(m)}]),"aria-hidden":`true`},null,2),r(`div`,gl,[r(`h1`,_l,U(i(Z)(`@WORKBENCH:多项目编排台`)),1),r(`p`,vl,U(i(m)?i(Z)(`@WORKBENCH:主 Agent 调度中`):i(Z)(`@WORKBENCH:主 Agent 已暂停`)),1)])]),r(`div`,yl,[r(`span`,bl,[r(`span`,xl,U(i(Z)(`@WORKBENCH:项目`)),1),r(`strong`,Sl,U(M.value.projects),1)]),r(`span`,Cl,[r(`span`,wl,U(i(Z)(`@WORKBENCH:任务`)),1),r(`strong`,Tl,U(M.value.tasks),1)]),r(`span`,El,[r(`span`,Dl,U(i(Z)(`@WORKBENCH:活跃执行`)),1),r(`strong`,{class:F([`board__stat-value`,{"is-live":M.value.running>0}])},U(M.value.running),3)]),r(`span`,Ol,[r(`span`,kl,U(i(Z)(`@WORKBENCH:今日完成`)),1),r(`strong`,Al,U(M.value.todayDone),1)])]),r(`div`,jl,[r(`button`,{type:`button`,class:`board__icon-btn`,title:i(Z)(`@WORKBENCH:刷新`),"aria-label":i(Z)(`@WORKBENCH:刷新`),onClick:n[0]||=e=>se(!1)},[A(o,null,{default:R(()=>[A(i(h))]),_:1})],8,Ml),A(s,{type:`primary`,size:`small`,icon:i(g),onClick:Ie},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:新建开发任务`)),1)]),_:1},8,[`icon`])])]),r(`div`,{ref_key:`colsRef`,ref:xe,class:F([`board__cols`,{"is-resizing":Ce.value!==null}])},[r(`div`,{class:F([`board__scrim`,{"is-on":Ae.value}]),"aria-hidden":`true`,onClick:n[1]||=e=>Ae.value=!1},null,2),r(`aside`,{ref_key:`leftRef`,ref:Se,class:F([`board__left`,{"is-collapsed":je.value}]),style:t(be.value),onKeydown:l(W,[`esc`])},[A(xo,{projects:i(c),"selected-key":O.value,loading:i(f),onSelect:Fe},null,8,[`projects`,`selected-key`,`loading`]),r(`div`,{class:`board__splitter board__splitter--h`,role:`separator`,"aria-orientation":`horizontal`,title:i(Z)(`@WORKBENCH:上下拖动调整执行监控高度,双击恢复默认`),onMousedown:Oe,onDblclick:ke},null,40,Nl),A(Fo,{running:i(v)},null,8,[`running`])],38),je.value?w(``,!0):(K(),T(`div`,{key:0,class:`board__splitter board__splitter--left`,role:`separator`,"aria-orientation":`vertical`,title:i(Z)(`@WORKBENCH:拖动调整项目列表宽度,双击恢复默认`),onMousedown:n[2]||=e=>B(`left`,e),onDblclick:n[3]||=e=>De(`left`)},null,40,Pl)),r(`main`,Fl,[r(`div`,Il,[r(`div`,Ll,[r(`h2`,Rl,U(k.value?k.value.name:i(Z)(`@WORKBENCH:全部项目`)),1),k.value?(K(),T(`span`,{key:0,class:`board__project-path`,title:k.value.path},U(k.value.path),9,zl)):(K(),T(`span`,Bl,U(i(Z)(`@WORKBENCH:共 {n} 个项目的任务`,{n:i(c).length})),1))]),k.value?(K(),T(`span`,Vl,U(i(Z)(`@WORKBENCH:{done}/{total} 任务完成`,{done:k.value.stats.done,total:k.value.stats.total})),1)):w(``,!0)]),A(Ns,{tasks:re.value,"project-labels":j.value,"show-project-label":!k.value,onOpenTask:ae,onRunTask:Re,onDeleteTask:ze,onCreateTask:Ie},null,8,[`tasks`,`project-labels`,`show-project-label`])]),!Ne.value&&!ge.value?(K(),T(`div`,{key:1,class:`board__splitter board__splitter--right`,role:`separator`,"aria-orientation":`vertical`,title:i(Z)(`@WORKBENCH:拖动调整主 Agent 控制台宽度,双击恢复默认`),onMousedown:n[4]||=e=>B(`right`,e),onDblclick:n[5]||=e=>De(`right`)},null,40,Hl)):w(``,!0),A(Tc,{ref_key:`consoleRef`,ref:J,active:i(m),activity:i(_),"running-count":i(v).length,"selected-project":k.value,dispatching:i(y),"toggling-schedule":i(b),"today-done":M.value.todayDone,collapsed:Ne.value,"default-prompt":i(ee),"project-prompts":i(x),onToggleCollapse:Pe,onToggleSchedule:He,onDispatch:Ve,onOpenPromptSettings:n[6]||=e=>Ue.value=!0},null,8,[`active`,`activity`,`running-count`,`selected-project`,`dispatching`,`toggling-schedule`,`today-done`,`collapsed`,`default-prompt`,`project-prompts`])],2),A(Hc,{modelValue:Ue.value,"onUpdate:modelValue":n[7]||=e=>Ue.value=e,"default-prompt":i(ee),"project-path":k.value?.path||``,"project-name":k.value?.name||``,"project-prompt":Ke.value,saving:We.value,onSave:qe},null,8,[`modelValue`,`default-prompt`,`project-path`,`project-name`,`project-prompt`,`saving`]),A(fl,{modelValue:G.value,"onUpdate:modelValue":n[8]||=e=>G.value=e,projects:i(c),"default-project-path":Be.value,onCreated:Le},null,8,[`modelValue`,`projects`,`default-project-path`])],4)}}}),[[`__scopeId`,`data-v-2d791819`]]);P(),I(),j(),H();var nu={class:`workbench`},ru={class:`wb-editor`},iu={class:`wb-editor-bar`},au=[`title`],ou=[`title`],su=[`title`],cu={class:`wb-editor-bar__hint`},lu={class:`workbench__editor-row`},uu=[`title`],du={class:`wb-split`},fu={key:0,class:`wb-placeholder`},pu={class:`wb-split__header`},mu={class:`wb-split__title-wrap`},hu=[`placeholder`],gu=[`title`,`aria-label`],_u=[`title`],vu={key:0,class:`wb-meta-save__dot`},yu={key:1,class:`wb-meta-save__check`},bu={key:2,class:`wb-meta-save__bang`},xu={key:3,class:`wb-meta-save__dot`},Su={value:null},Cu=[`value`],wu=[`aria-label`],Tu=[`aria-selected`],Eu=[`aria-selected`],Du=[`disabled`,`title`],Ou={class:`wb-executor-split__hint`},ku={class:`wb-executor-item`},Au={class:`wb-executor-item__name`},ju={key:1,class:`wb-executor-item__missing`},Mu={key:3,class:`wb-no-claude-hint`,role:`status`},Nu={class:`wb-no-claude-hint__text`},Pu={class:`wb-no-claude-hint__link`,href:`https://docs.claude.com/en/docs/claude-code/setup`,target:`_blank`,rel:`noopener noreferrer`},Fu=[`title`,`aria-label`],Iu=[`title`,`aria-label`],Lu=[`open`],Ru={class:`wb-task-desc__summary`},zu={class:`wb-task-desc__label`},Bu=[`title`,`aria-label`],Vu={key:0,class:`wb-task-desc__tag`},Hu={key:0},Uu={key:1,class:`wb-task-desc__tag-attachment`},Wu=[`placeholder`],Gu={key:0,class:`wb-exec-list`},Ku={class:`wb-exec-list__header`},qu={class:`wb-exec-list__title`},Ju={class:`wb-split__sub-actions`},Yu={key:0,class:`wb-dirty-badge`},Xu={class:`wb-exec-sub-list`},Zu=[`onClick`],Qu={class:`wb-exec-sub-item__row1`},$u=[`title`],ed={class:`wb-sub-error`},td={class:`wb-sub-error__head`},nd={class:`wb-sub-error__title`},rd={key:0,class:`wb-sub-error__time`},id={class:`wb-sub-error__msg`},ad={class:`wb-sub-error__actions`},od=[`title`],sd=[`title`],cd={key:2,class:`wb-exec-sub-item__dirty-dot`,title:`未保存`},ld={class:`wb-exec-sub-item__row2`},ud={key:0,class:`wb-sub-item__pid`},dd={class:`wb-exec-sub-item__actions`},fd=[`title`,`onClick`],pd=[`title`,`onClick`],md=[`title`,`onClick`],hd=[`title`,`disabled`,`onClick`],gd=[`title`,`disabled`,`onClick`],_d={class:`wb-exec-detail`},vd={key:0,class:`wb-empty wb-empty--rich wb-empty--full`},yd={class:`wb-empty__art`,"aria-hidden":`true`},bd={class:`wb-empty__title`},xd={class:`wb-empty__hint`},Sd={class:`wb-empty__cta`},Cd={key:1,class:`wb-placeholder`},wd={class:`wb-exec-detail__head`},Td=[`placeholder`],Ed=[`title`],Dd=[`placeholder`],Od={class:`wb-form-item__label wb-simple__override-summary`},kd=[`title`],Ad=[`disabled`],jd=[`placeholder`],Md={key:0,class:`wb-simple-chat-wrap`},Nd={key:0,class:`wb-simple-chat__footer`},Pd={style:{display:`flex`,gap:`8px`,"align-items":`center`}},Fd=`wb.lastTaskByProject.v1`,Id=`__no_project__`,Ld=`wb.sidebarWidth.v1`,Rd=200,zd=480,Bd=268,Vd=52,Hd=320,Ud=500,Wd=Xe(o({__name:`WorkbenchView`,setup(n){let o=Qe(),s=$e(),l=Y((()=>{try{let e=parseInt(localStorage.getItem(Ld)||``,10);return Number.isFinite(e)?Math.min(zd,Math.max(Rd,e)):Bd}catch{return Bd}})());function d(e){e.preventDefault();let t=e.clientX,n=l.value;document.body.style.userSelect=`none`,document.body.style.cursor=`col-resize`;let r=e=>{l.value=Math.min(zd,Math.max(Rd,n+e.clientX-t))};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,()=>{window.removeEventListener(`mousemove`,r),document.body.style.userSelect=``,document.body.style.cursor=``;try{localStorage.setItem(Ld,String(l.value))}catch{}},{once:!0})}function f(){try{let e=localStorage.getItem(Fd),t=e?JSON.parse(e):{};return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function p(e){try{localStorage.setItem(Fd,JSON.stringify(e))}catch{}}function m(e,t){let n=f();n[e||Id]=t,p(n)}let h=Y(!1);function _(){h.value=!1}async function v(e){await he(),Ce.value=e.taskId,Le(),B.value&&m(Q(D.value.path),e.taskId),h.value=!0}let{prompts:b,tasks:C,jobs:E,currentProject:D,syncRunningCount:ne,jobOf:j,connectSSE:re,disconnectSSE:M,loadPrompts:oe,loadCurrentProject:se,loadJobs:P,clearJobsByTask:le,clearNonDoneJobsByTask:me,loadTasks:he}=li();function I(){let e=Q(D.value.path),t=C.value.filter(t=>!t.projectPath||Q(t.projectPath)===e),n=f(),r=e&&n[e]||!e&&n[Id]||``,i=r?C.value.find(e=>e.id===r):null,a=t[0]||C.value[0]||null,o=i&&i.projectPath&&Q(i.projectPath)!==e?null:i?i.id:a?a.id:null;Ce.value=o,Le()}async function _e(){let e=Ce.value;if(await he(),e&&C.value.some(t=>t.id===e)){Le();return}I()}async function ve(){await he(),I()}let xe=Y(!1),Ce=Y(null),B=V(()=>C.value.find(e=>e.id===Ce.value)||null),De=V(()=>{let e=B.value?.projectPath||``;return!e||Q(e)===Q(D.value.path)?null:{name:e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e,path:e}}),H=V(()=>B.value?.type===`simple`),Oe=Y(null),ke=V(()=>!B.value||H.value||!Oe.value?null:B.value.subtasks.find(e=>e.id===Oe.value)||null),Me=Y(new Map),Ne=Y({title:``,desc:``,promptId:null,simpleOverride:``});function Le(){let e=new Map;if(B.value)for(let t of B.value.subtasks)e.set(t.id,{id:t.id,title:t.title,desc:t.desc,promptOverride:t.promptOverride});Me.value=e,B.value?Ne.value={title:B.value.title,desc:B.value.desc,promptId:B.value.promptId,simpleOverride:B.value.simpleOverride||``}:Ne.value={title:``,desc:``,promptId:null,simpleOverride:``}}let Be=V(()=>{let e=new Set;if(!B.value)return e;for(let t of B.value.subtasks){let n=Me.value.get(t.id);if(!n){e.add(t.id);continue}(n.title!==t.title||n.desc!==t.desc||n.promptOverride!==t.promptOverride)&&e.add(t.id)}return e}),Ve=V(()=>Be.value.size>0),X=Y(`idle`),Ue=Y(0),We=null,Ge=V(()=>{if(!B.value)return!1;let e=B.value;return Ne.value.title!==e.title||Ne.value.desc!==e.desc||Ne.value.promptId!==e.promptId||Ne.value.simpleOverride!==(e.simpleOverride||``)});function Je(){We!==null&&(clearTimeout(We),We=null)}function Ye(e){return!(!e||(e.title||``).trim()||(e.desc||``).trim()||e.promptId||(e.simpleOverride||``).trim()||Array.isArray(e.subtasks)&&e.subtasks.length>0||Array.isArray(e.attachments)&&e.attachments.length>0)}async function Xe(e){try{await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`})}catch{}let t=C.value.findIndex(t=>t.id===e.id);t!==-1&&C.value.splice(t,1)}async function Ze(){let e=C.value.filter(e=>e.id!==Ce.value&&Ye(e));for(let t of e)await Xe(t)}async function tt(){if(!B.value)return!1;if(!Ge.value)return!0;if(X.value=`saving`,await Yt(!1))return Ue.value=Date.now(),X.value=`saved`,setTimeout(()=>{X.value===`saved`&&Date.now()-Ue.value>=4e3&&(X.value=`idle`)},4e3),!0;X.value=`error`;let e=Date.now();return setTimeout(()=>{X.value===`error`&&Date.now()-e>=4e3&&(X.value=`idle`)},4e3),!1}q(()=>B.value?{id:B.value.id,title:B.value.title,desc:B.value.desc,promptId:B.value.promptId,simpleOverride:B.value.simpleOverride||``,sequential:B.value.sequential!==!1}:null,(e,t)=>{e&&t&&e.id===t.id&&(We!==null&&clearTimeout(We),We=window.setTimeout(()=>{tt()},1500))},{deep:!0}),q(Ce,async(e,t)=>{Je(),B.value&&Ge.value&&await tt()}),q(Ce,()=>{$t.value=!1}),q(D,async e=>{if(!e.path)return;let t=Q(e.path),n=B.value;n&&n.projectPath&&Q(n.projectPath)!==t&&await ve()});function it(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function at(){B.value&&Ge.value&&!Ye(B.value)&&it(B.value)}let $=ie({visible:!1,editing:null,name:``,content:``,aiLoading:!1,projectPath:``}),ot=ie({visible:!1,text:``,loading:!1,saving:!1}),st=Y(!0),ct=V(()=>{let e=Q(D.value.path);return b.value.filter(t=>!t.projectPath||Q(t.projectPath)===e)});async function lt(e){try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}function dt(e){if(!e)return``;let t=new Date(e);if(Number.isNaN(t.getTime()))return``;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}async function pt(e){let t=await lt(`[${e.title||Z(`@WORKBENCH:未命名子任务`)}]\n${e.error||``}`);L[t?`success`:`error`](Z(t?`@WORKBENCH:已复制错误信息`:`@WORKBENCH:复制失败`))}let mt=Y(null),ht=Y(null);async function gt(e){if(e){if(!await lt((e.title||``).trim()||Z(`@WORKBENCH:未命名任务`))){L.error(Z(`@WORKBENCH:复制失败`));return}mt.value=e.id,L.success(Z(`@WORKBENCH:已复制任务标题`)),window.setTimeout(()=>{mt.value===e.id&&(mt.value=null)},1500)}}async function _t(e){if(!e)return;let t=(e.desc||``).trim();if(!t){L.warning(Z(`@WORKBENCH:任务描述为空,无需复制`));return}if(!await lt(t)){L.error(Z(`@WORKBENCH:复制失败`));return}ht.value=e.id,L.success(Z(`@WORKBENCH:已复制任务描述`)),window.setTimeout(()=>{ht.value===e.id&&(ht.value=null)},1500)}function vt(e){Oe.value=e.id,xe.value=!0}let{simpleConversationMessages:yt,simpleAllJobsFor:bt,simpleJobFor:xt,simpleJobState:St}=si(E,B);function Ct(e){if(!e)return!1;if(e.type!==`simple`)return Array.isArray(e.subtasks)&&e.subtasks.some(e=>e&&e.status===`running`);let t=xt(e);return!!t&&(t.status===`running`||t.status===`pending`)}async function wt(){if(!B.value)return;let e=B.value,t=Array.isArray(e.subtasks)?e.subtasks.length:0;if(t===0){L.warning(Z(`@WORKBENCH:当前任务没有子任务`));return}if(E.value.find(t=>t.taskId===e.id&&(t.status===`running`||t.status===`pending`))){L.warning(Z(`@WORKBENCH:有子任务正在执行,请先停止`));return}try{await Ee.confirm(Z(`@WORKBENCH:将删除 {n} 个子任务,任务描述/附件/标题保留,确认?`,{n:t}),Z(`@WORKBENCH:清空子任务`),{confirmButtonText:Z(`@WORKBENCH:清空`),cancelButtonText:Z(`@WORKBENCH:取消`),type:`warning`})}catch{return}let n=await fetch(`/api/workbench/tasks/${encodeURIComponent(e.id)}/clear-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`}}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));n?.success?(e.subtasks=[],Oe.value=null,Be.value.clear(),Me.value.clear(),E.value=E.value.filter(t=>t.taskId!==e.id),ne(),L.success(n.message||Z(`@WORKBENCH:已清空子任务`))):L.error(n?.error||Z(`@WORKBENCH:清空失败`))}function Tt(){$.editing=null,$.name=``,$.content=``,$.aiLoading=!1,$.projectPath=(D.value.path||``).trim(),$.visible=!0}function Et(e){$.editing=e,$.name=e.name,$.content=e.content,$.aiLoading=!1,$.projectPath=(e.projectPath||``).trim(),$.visible=!0}async function Dt(){if(!$.aiLoading){$.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?($.name=e.name||$.name,$.content=e.result||``,L.success(Z(`@WORKBENCH:已生成,可继续编辑`))):L.error(e.error||Z(`@WORKBENCH:生成失败`))}catch(e){L.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{$.aiLoading=!1}}}async function Ot(){ot.visible=!0,ot.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?ot.text=e.instruction||``:L.error(e.error||Z(`@WORKBENCH:读取指令失败`))}catch(e){L.error(Z(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{ot.loading=!1}}async function kt(){if(!ot.text.trim()){L.warning(Z(`@WORKBENCH:指令内容不能为空`));return}ot.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:ot.text})}).then(e=>e.json());e.success?(L.success(Z(`@WORKBENCH:已保存指令`)),ot.visible=!1):L.error(e.error||Z(`@WORKBENCH:保存失败`))}catch(e){L.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{ot.saving=!1}}async function At(){if(!$.name.trim()||!$.content.trim()){L.warning(Z(`@WORKBENCH:名称和内容不能为空`));return}let e={id:$.editing?.id,name:$.name.trim(),content:$.content,projectPath:($.projectPath||``).trim()},t=await fetch(`/api/workbench/prompts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());t.success?(L.success(Z(`@WORKBENCH:已保存`)),$.visible=!1,oe()):L.error(t.error||Z(`@WORKBENCH:保存失败`))}async function jt(e){await Ee.confirm(Z(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),oe();for(let t of C.value)t.promptId===e.id&&(t.promptId=null,await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}));await _e()}let Mt=Y(!1),Nt=Y(null),Pt=Y(null);function Ft(e){let t=e?.currentTarget||Pt.value;if(!t)return;t.style.height=`auto`;let n=document.activeElement===t?Ud:Hd,r=Math.min(Math.max(t.scrollHeight,Vd),n);t.style.height=`${r}px`,t.style.overflowY=t.scrollHeight>n?`auto`:`hidden`}q(st,async e=>{e&&(await y(),Ft())}),q(()=>B.value?.id,async()=>{st.value&&(await y(),Ft())});async function It(){if(Mt.value)return;Mt.value=!0;let e={title:``,desc:``,promptId:null,type:`simple`,simpleOverride:``,subtasks:[]};D.value.path&&(e.projectPath=D.value.path);try{let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());if(!t.success){L.error(t.error||Z(`@WORKBENCH:保存失败`));return}Je(),B.value&&Ye(B.value)?await Xe(B.value):B.value&&Ge.value&&await tt(),await ve(),t.task?.id&&(Ce.value=t.task.id,Le(),L.success(Z(`@WORKBENCH:已新建任务`)),await y(),Nt.value?.focus())}finally{Mt.value=!1}}async function Lt(e,t){if(e.type===t)return;let n=e.type===`complex`&&t===`simple`&&(e.subtasks?.length??0)>0;if(n)try{await Ee.confirm(Z(`@WORKBENCH:任务「{title}」当前有 {n} 个子任务,切换为简单任务后会清空这些子任务,确认继续?`,{title:e.title,n:e.subtasks.length}),Z(`@WORKBENCH:切换任务类型`),{type:`warning`,confirmButtonText:Z(`@WORKBENCH:切换并清空`),cancelButtonText:Z(`@WORKBENCH:取消`)})}catch{return}let r={id:e.id,title:e.title,desc:e.desc,promptId:e.promptId,type:t,simpleOverride:e.simpleOverride||``,sequential:e.sequential!==!1,subtasks:n?[]:e.subtasks||[]},i=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(r)}).then(e=>e.json());if(!i.success){L.error(i.error||Z(`@WORKBENCH:保存失败`));return}await _e(),L.success(Z(t===`simple`?`@WORKBENCH:已切换为简单任务`:`@WORKBENCH:已切换为复杂任务`))}async function Rt(e){B.value&&await Lt(B.value,e)}async function zt(e){await Ee.confirm(Z(`@WORKBENCH:删除任务「{title}」及其所有子任务?`,{title:e.title}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),Ce.value===e.id&&(Ce.value=null),ve()}async function Bt(e){let t=(e.title||Z(`@WORKBENCH:未命名任务`)).trim(),n=Z(`@WORKBENCH:{title} (副本)`,{title:t}),r=Array.isArray(e.subtasks)?e.subtasks.map(e=>({id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:e.title,desc:e.desc||``,status:`todo`,promptOverride:e.promptOverride||``,attachments:[]})):[],i={title:n,desc:e.desc||``,promptId:e.promptId||null,type:e.type||`complex`,simpleOverride:e.simpleOverride||``,subtasks:r};D.value.path&&(i.projectPath=D.value.path);try{let e=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)}).then(e=>e.json());if(!e.success){L.error(e.error||Z(`@WORKBENCH:复制失败`));return}await ve(),e.task?.id&&(Ce.value=e.task.id,Le()),L.success(Z(`@WORKBENCH:已复制任务`))}catch(e){L.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}}async function Vt(e){if(Ce.value===e.id)return;Je();let t=B.value;t&&Ye(t)?await Xe(t):t&&Ge.value&&await tt(),Ce.value=e.id,Le(),m(Q(D.value.path),e.id)}async function Ht(e){let{groupPath:t,orderedIds:n}=e;if(!Array.isArray(n)||n.length===0)return;let r=C.value.slice(),i=Ut(C.value,t,n);if(i!==C.value){C.value=i;try{let e=await fetch(`/api/workbench/tasks/reorder`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({orderedIds:n,groupPath:t})}).then(e=>e.json()).catch(()=>({success:!1,error:Z(`@WORKBENCH:排序保存失败`)}));e?.success||(C.value=r,L.error(e?.error||Z(`@WORKBENCH:排序保存失败`)))}catch(e){C.value=r,L.error(Z(`@WORKBENCH:排序保存失败`)+`: `+(e?.message||e))}}}function Ut(e,t,n){let r=e=>Q(e)||Id,i=e.filter(e=>r(e.projectPath)===t).map(e=>e.id),a=new Set(i);if(n.length!==a.size||n.some(e=>!a.has(e)))return e;let o=new Map(e.map(e=>[e.id,e])),s=n.map(e=>o.get(e)).filter(Boolean),c=[],l=0;for(let n of e)r(n.projectPath)===t?c.push(s[l++]):c.push(n);return c}q(()=>B.value,e=>{if(!e||e.type===`simple`){Oe.value=null;return}let t=e.subtasks.find(e=>e.status===`running`);Oe.value=t?.id||e.subtasks[0]?.id||null},{immediate:!0}),q(()=>B.value?.subtasks?.length,()=>{B.value&&!H.value&&(!Oe.value||!B.value.subtasks.find(e=>e.id===Oe.value))&&(Oe.value=B.value.subtasks[0]?.id||null)}),q(()=>B.value?.subtasks?.map(e=>({id:e.id,status:e.status}))||[],()=>{if(!B.value||H.value)return;let e=B.value.subtasks,t=e.find(e=>e.id===Oe.value);if(!t||t.status!==`running`){let t=e.find(e=>e.status===`running`);t&&t.id!==Oe.value&&(Oe.value=t.id)}});let Wt=Y(new Set);function Gt(e){return Wt.value.has(e)}function Kt(e,t){t?Wt.value.add(e):Wt.value.delete(e),Wt.value=new Set(Wt.value)}async function qt(){if(!B.value)return;let e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:Z(`@WORKBENCH:新子任务`),desc:``,status:`todo`,promptOverride:``};B.value.subtasks.push(e),Oe.value=e.id,Kt(e.id,!0);try{await Yt(!1)}finally{Kt(e.id,!1)}}async function Jt(e){if(B.value){B.value.subtasks=B.value.subtasks.filter(t=>t.id!==e.id),Kt(e.id,!0);try{await Yt(!1)}finally{Kt(e.id,!1)}}}async function Yt(e){if(!B.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(B.value)}).then(e=>e.json());return t.success?(e&&L.success(Z(`@WORKBENCH:已保存拆分`)),await _e(),!0):(L.error(t.error||Z(`@WORKBENCH:保存失败`)),!1)}async function Xt(){await Yt(!0)}let Zt=Y(!1);async function Qt(e){if(!B.value||!e.titles.length)return;let{strategy:t,titles:n}=e;t===`replace`&&(B.value.subtasks=[]);let r=n.map(e=>({id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:e,desc:``,status:`todo`,promptOverride:``}));if(t===`append`||t===`replace`)B.value.subtasks.push(...r);else if(t===`merge`){let e=new Set(B.value.subtasks.map(e=>e.title.trim())),t=r.filter(t=>!e.has(t.title.trim()));B.value.subtasks.push(...t);let n=r.length-t.length;n>0&&L.info(Z(`@WORKBENCH:跳过 N 个已存在的子任务`,{n}))}await Yt(!0),L.success(Z(`@WORKBENCH:已导入 N 个子任务`,{n:r.length}))}let $t=Y(!1);function en(){if(B.value){if(!(B.value.title||``).trim()){L.warning(Z(`@WORKBENCH:请先填写任务标题`));return}$t.value=!0}}function tn(e){if(B.value){for(let t of e)B.value.subtasks.push({id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:t.title,desc:t.desc||``,status:`todo`,promptOverride:``,attachments:[]});L.success(Z(`@WORKBENCH:已生成 {n} 个子任务,请审阅后保存`,{n:e.length}))}}async function nn(e){if(B.value&&!Gt(e.id)){Kt(e.id,!0);try{let t=Me.value.get(e.id);t&&Me.value.set(e.id,{...t,status:`todo`}),e.status=`todo`,await Yt(!1)}finally{Kt(e.id,!1)}}}e(async()=>{await Promise.all([oe(),ve(),se(),P()]),await Ze(),re(),window.addEventListener(`beforeunload`,at)}),pe(()=>{M(),window.removeEventListener(`beforeunload`,at),B.value&&Ge.value&&!Ye(B.value)&&it(B.value)});let{pasteHoverId:rn,isUploading:an,isImageAttachment:on,humanSize:sn,onAttachmentPaste:cn,onAttachmentDrop:ln,uploadAttachment:un,removeAttachment:dn,pickAttachmentFile:fn}=ii(),{runTask:pn,onContinueSendFromChat:mn,onReExecuteJob:hn,runSubtask:gn,canRunSubtask:_n,canRunFromHere:vn,runFromHere:yn,cancelJob:bn,clearExecutionForSelectedTask:xn}=ci(E,C,B,{syncRunningCount:ne,jobOf:j,simpleAllJobsFor:bt,clearJobsByTask:le,clearNonDoneJobsByTask:me,persistTask:Yt,loadTasks:he,uploadAttachment:un,getExecutor:()=>Sn.value}),Sn=Y(ft()),Cn=V(()=>({claude:s.claudeAvailable,opencode:s.opencodeAvailable})),wn=V(()=>Cn.value.claude||Cn.value.opencode);q(Cn,e=>{if(e[Sn.value])return;let t=Object.keys(e).find(t=>e[t]);t&&(Sn.value=t)},{immediate:!0});function Tn(e){Cn.value[e]&&(Sn.value=e,rt(e))}function Dn(e){return ut.find(t=>t.id===e)?.name||e}let On=V(()=>bt(B.value).slice(-1)[0]),An=V(()=>On.value?.agent===`opencode`?`OpenCode`:`Claude`),jn=V(()=>Gn(On.value?.agent));return(e,n)=>{let s=de,f=ze,p=ae,m=c,y=we,E=a,ne=Fe,re=u,M=ce,ie=Pe,oe=x,se=k,P=ee;return K(),T(`div`,nu,[A(tu,{onOpenTask:v}),A(et,{modelValue:h.value,"onUpdate:modelValue":n[39]||=e=>h.value=e,title:i(Z)(`@WORKBENCH:任务拆分与执行`),type:`flex`,"height-mode":`fixed`,"height-offset":`88px`,top:`2vh`,width:`min(1520px, 96vw)`},{default:R(()=>[r(`div`,ru,[r(`div`,iu,[r(`button`,{type:`button`,class:`wb-back-btn`,title:i(Z)(`@WORKBENCH:返回看板`),onClick:_},[A(s,{class:`wb-back-btn__icon`},{default:R(()=>[A(i(fe))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:返回看板`)),1)],8,au),r(`span`,{class:`wb-editor-bar__project`,title:i(D).path},U(i(D).name),9,ou),De.value?(K(),T(`span`,{key:0,class:`wb-editor-bar__repo`,title:De.value.path},U(i(Z)(`@WORKBENCH:执行于 {name}`,{name:De.value.name})),9,su)):w(``,!0),r(`span`,cu,U(i(Z)(`@WORKBENCH:任务拆分与执行`)),1)]),r(`div`,lu,[A(Ji,{style:t({width:l.value+`px`}),tasks:i(C),prompts:i(b),"selected-task-id":Ce.value,"current-project":i(D),"creating-task":Mt.value,"is-task-running":Ct,onSelectTask:Vt,onDeleteTask:zt,onCopyTask:Bt,onCreateTask:It,onOpenCreatePrompt:Tt,onOpenEditPrompt:Et,onDeletePrompt:jt,onReorderTasks:Ht},null,8,[`style`,`tasks`,`prompts`,`selected-task-id`,`current-project`,`creating-task`]),r(`div`,{class:`wb-splitter`,role:`separator`,"aria-orientation":`vertical`,title:i(Z)(`@WORKBENCH:拖动调整侧边栏宽度`),onMousedown:d},null,40,uu),r(`section`,du,[B.value?(K(),T(N,{key:1},[r(`div`,pu,[r(`div`,mu,[W(r(`input`,{ref_key:`titleInputRef`,ref:Nt,class:`wb-input wb-input--title`,"onUpdate:modelValue":n[0]||=e=>B.value.title=e,placeholder:i(Z)(`@WORKBENCH:任务标题`)},null,8,hu),[[He,B.value.title]]),r(`button`,{type:`button`,class:F([`wb-copy-btn`,{"is-flash":mt.value===B.value.id}]),title:i(Z)(`@WORKBENCH:复制任务标题`),"aria-label":i(Z)(`@WORKBENCH:复制任务标题`),onClick:n[1]||=e=>gt(B.value)},[mt.value===B.value.id?(K(),z(s,{key:1,class:`wb-copy-btn__icon wb-copy-btn__icon--check`},{default:R(()=>[...n[51]||=[S(`✓`,-1)]]),_:1})):(K(),z(s,{key:0,class:`wb-copy-btn__icon`},{default:R(()=>[A(i(Re))]),_:1}))],10,gu)]),X.value!==`idle`||Ge.value?(K(),T(`span`,{key:0,class:F([`wb-meta-save`,{"is-saving":X.value===`saving`,"is-saved":X.value===`saved`,"is-error":X.value===`error`,"is-dirty":Ge.value&&X.value===`idle`}]),title:X.value===`saving`?i(Z)(`@WORKBENCH:保存中…`):X.value===`error`?i(Z)(`@WORKBENCH:保存失败`):X.value===`saved`?i(Z)(`@WORKBENCH:已保存`):``},[X.value===`saving`?(K(),T(`span`,vu)):X.value===`saved`?(K(),T(`span`,yu,`✓`)):X.value===`error`?(K(),T(`span`,bu,`!`)):(K(),T(`span`,xu)),S(` `+U(X.value===`saving`?i(Z)(`@WORKBENCH:保存中…`):X.value===`saved`?i(Z)(`@WORKBENCH:已保存`):X.value===`error`?i(Z)(`@WORKBENCH:保存失败`):i(Z)(`@WORKBENCH:有未保存的更改`)),1)],10,_u)):w(``,!0),W(r(`select`,{class:`wb-select`,"onUpdate:modelValue":n[2]||=e=>B.value.promptId=e},[r(`option`,Su,U(i(Z)(`@WORKBENCH:不绑定预置提示词`)),1),(K(!0),T(N,null,G(ct.value,e=>(K(),T(`option`,{key:e.id,value:e.id},U(e.name),9,Cu))),128))],512),[[ye,B.value.promptId]]),r(`div`,{class:`wb-mode-switch`,role:`tablist`,"aria-label":i(Z)(`@WORKBENCH:任务类型`)},[r(`button`,{type:`button`,role:`tab`,class:F([`wb-mode-switch__btn`,{"is-active":!H.value}]),"aria-selected":!H.value,onClick:n[3]||=e=>Rt(`complex`)},U(i(Z)(`@WORKBENCH:复杂`)),11,Tu),r(`button`,{type:`button`,role:`tab`,class:F([`wb-mode-switch__btn`,{"is-active":H.value}]),"aria-selected":H.value,onClick:n[4]||=e=>Rt(`simple`)},U(i(Z)(`@WORKBENCH:简单`)),11,Eu),r(`span`,{class:F([`wb-mode-switch__indicator`,{"is-right":H.value}]),"aria-hidden":`true`},null,2)],8,wu),H.value?w(``,!0):(K(),T(`button`,{key:1,type:`button`,class:`wb-ai-split-btn`,disabled:!B.value.title||!B.value.title.trim(),title:i(Z)(`@WORKBENCH:AI 拆分`),onClick:en},[n[52]||=r(`svg`,{class:`wb-ai-split-btn__icon`,viewBox:`0 0 16 16`,width:`14`,height:`14`,"aria-hidden":`true`},[r(`path`,{d:`M8 1.5l1.6 3.4 3.4 1.6-3.4 1.6L8 11.5 6.4 8.1 3 6.5l3.4-1.6L8 1.5zM2.5 9.5l.8 1.6 1.6.8-1.6.8-.8 1.6-.8-1.6L.1 11.9l1.6-.8.8-1.6zm11 0l.8 1.6 1.6.8-1.6.8-.8 1.6-.8-1.6-1.6-.8 1.6-.8.8-1.6z`,fill:`currentColor`})],-1),r(`span`,null,U(i(Z)(`@WORKBENCH:AI 拆分`)),1)],8,Du)),wn.value?(K(),z(m,{key:2,"split-button":``,type:`primary`,class:`wb-executor-split`,trigger:`click`,onClick:n[5]||=e=>i(pn)(B.value),onCommand:Tn},{dropdown:R(()=>[A(p,null,{default:R(()=>[(K(!0),T(N,null,G(i(ut),e=>(K(),z(f,{key:e.id,command:e.id,disabled:!Cn.value[e.id]},{default:R(()=>[r(`span`,ku,[A(nt,{executor:e.id,class:`wb-executor-item__icon`},null,8,[`executor`]),r(`span`,Au,U(e.name),1),Sn.value===e.id?(K(),z(s,{key:0,class:`wb-executor-item__check`},{default:R(()=>[A(i(Ie))]),_:1})):Cn.value[e.id]?w(``,!0):(K(),T(`span`,ju,U(i(Z)(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:R(()=>[S(U(H.value?i(Z)(`@WORKBENCH:执行`):i(Z)(`@WORKBENCH:执行任务`))+` `,1),r(`span`,Ou,[A(nt,{executor:Sn.value,class:`wb-executor-split__hint-icon`},null,8,[`executor`]),S(` `+U(Dn(Sn.value)),1)])]),_:1})):(K(),T(`div`,Mu,[A(s,{class:`wb-no-claude-hint__icon`},{default:R(()=>[A(i(be))]),_:1}),r(`span`,Nu,U(i(Z)(`@WORKBENCH:未检测到本地 claude / opencode,无法执行任务`)),1),r(`a`,Pu,U(i(Z)(`@WORKBENCH:查看安装指引`)),1)])),r(`button`,{type:`button`,class:`wb-logs-inline-btn wb-logs-inline-btn--danger`,title:i(Z)(`@WORKBENCH:清空当前任务的所有执行内容`),"aria-label":i(Z)(`@WORKBENCH:清空当前任务的所有执行内容`),onClick:n[6]||=(...e)=>i(xn)&&i(xn)(...e)},[A(s,{class:`wb-logs-inline-btn__icon`},{default:R(()=>[A(i(Se))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:清空执行`)),1)],8,Fu),r(`button`,{type:`button`,class:`wb-logs-inline-btn`,title:i(Z)(`@WORKBENCH:执行日志`),"aria-label":i(Z)(`@WORKBENCH:执行日志`),onClick:n[7]||=e=>xe.value=!0},[A(s,{class:`wb-logs-inline-btn__icon`},{default:R(()=>[A(i(Te))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:执行日志`)),1)],8,Iu)]),r(`details`,{class:`wb-task-desc`,open:st.value,onToggle:n[19]||=e=>st.value=e.target.open},[r(`summary`,Ru,[A(s,{class:`wb-task-desc__caret`},{default:R(()=>[(K(),z(Ae(st.value?i(ue):i(O))))]),_:1}),r(`span`,zu,U(i(Z)(`@WORKBENCH:任务描述(可选)`)),1),r(`button`,{type:`button`,class:F([`wb-copy-btn wb-copy-btn--inline`,{"is-flash":ht.value===B.value.id}]),title:B.value.desc&&B.value.desc.trim()?i(Z)(`@WORKBENCH:复制任务描述`):i(Z)(`@WORKBENCH:任务描述为空,无需复制`),"aria-label":i(Z)(`@WORKBENCH:复制任务描述`),onClick:n[8]||=J(e=>_t(B.value),[`stop`,`prevent`])},[ht.value===B.value.id?(K(),z(s,{key:1,class:`wb-copy-btn__icon wb-copy-btn__icon--check`},{default:R(()=>[...n[53]||=[S(`✓`,-1)]]),_:1})):(K(),z(s,{key:0,class:`wb-copy-btn__icon`},{default:R(()=>[A(i(Re))]),_:1}))],10,Bu),B.value.desc&&B.value.desc.length>0||B.value.attachments&&B.value.attachments.length>0?(K(),T(`span`,Vu,[B.value.desc&&B.value.desc.length>0?(K(),T(`span`,Hu,U(i(Z)(`@WORKBENCH:已填写`)),1)):w(``,!0),B.value.attachments&&B.value.attachments.length>0?(K(),T(`span`,Uu,U(B.value.attachments.length),1)):w(``,!0)])):w(``,!0)]),W(r(`textarea`,{ref_key:`taskDescTextareaRef`,ref:Pt,class:`wb-textarea wb-textarea--autogrow`,"onUpdate:modelValue":n[9]||=e=>B.value.desc=e,placeholder:i(Z)(`@WORKBENCH:任务描述(可选)`),onInput:n[10]||=e=>Ft(e),onFocus:n[11]||=e=>Ft(e),onBlur:n[12]||=e=>Ft(e),onPaste:n[13]||=e=>i(cn)(e,{kind:`task`,task:B.value})},null,40,Wu),[[He,B.value.desc]]),A(Hn,{attachments:B.value.attachments||[],"is-image":i(on),"human-size":i(sn),"is-uploading":i(an)(`task-`+B.value.id),"is-paste-hover":i(rn)===`task-`+B.value.id,"max-count":9,"on-pick":()=>i(fn)({kind:`task`,task:B.value}),"on-remove":e=>i(dn)({kind:`task`,task:B.value},e),onPaste:n[14]||=e=>i(cn)(e,{kind:`task`,task:B.value}),onDrop:n[15]||=J(e=>i(ln)(e,{kind:`task`,task:B.value}),[`prevent`]),onDragover:n[16]||=J(e=>rn.value=`task-`+B.value.id,[`prevent`]),onDragenter:n[17]||=J(e=>rn.value=`task-`+B.value.id,[`prevent`]),onDragleave:n[18]||=e=>rn.value=i(rn)===`task-`+B.value.id?null:i(rn)},null,8,[`attachments`,`is-image`,`human-size`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],40,Lu),r(`div`,{class:F([`wb-execution-body`,{"wb-execution-body--simple":H.value,"wb-execution-body--no-subs":!H.value&&B.value.subtasks.length===0}])},[H.value?w(``,!0):(K(),T(`div`,Gu,[r(`div`,Ku,[r(`h4`,qu,U(i(Z)(`@WORKBENCH:子任务拆分`)),1),A(y,{class:`wb-exec-list__mode-switch`,modelValue:B.value.sequential,"onUpdate:modelValue":n[20]||=e=>B.value.sequential=e,"active-text":i(Z)(`@WORKBENCH:连续`),"inactive-text":i(Z)(`@WORKBENCH:并行`),"inline-prompt":``,title:i(Z)(`@WORKBENCH:连续模式下,任意子任务出错或被手动停止都会终止后续子任务`)},null,8,[`modelValue`,`active-text`,`inactive-text`,`title`]),r(`div`,Ju,[A(E,{size:`small`,plain:``,icon:i(g),disabled:B.value.subtasks.length===0,onClick:qt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`,`disabled`]),A(E,{size:`small`,type:Ve.value?`primary`:`default`,disabled:B.value.subtasks.length===0,onClick:Xt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:保存拆分`))+` `,1),Ve.value?(K(),T(`span`,Yu,U(Be.value.size),1)):w(``,!0)]),_:1},8,[`type`,`disabled`]),A(E,{size:`small`,plain:``,icon:i(ge),onClick:n[21]||=e=>Zt.value=!0},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:导入拆分`)),1)]),_:1},8,[`icon`]),A(E,{size:`small`,type:`danger`,plain:``,icon:i(Se),disabled:!B.value.subtasks||B.value.subtasks.length===0,title:i(Z)(`@WORKBENCH:只清空子任务,任务描述/附件/标题保留`),onClick:wt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:清空子任务`)),1)]),_:1},8,[`icon`,`disabled`,`title`])])]),r(`ul`,Xu,[(K(!0),T(N,null,G(B.value.subtasks,e=>(K(),T(`li`,{key:e.id,class:F([`wb-exec-sub-item`,{"is-selected":Oe.value===e.id,"is-running":e.status===`running`,"is-done":e.status===`done`,"is-dirty":Be.value.has(e.id),"is-persisting":Gt(e.id)}]),onClick:t=>Oe.value=e.id},[r(`div`,Qu,[e.status===`error`&&e.error?(K(),z(ne,{key:0,placement:`right-start`,width:420,trigger:`hover`,"show-after":120,"popper-class":`wb-sub-error-popover`},{reference:R(()=>[r(`span`,{class:`wb-sub-item__status wb-sub-item__status--dot wb-sub-item__status--clickable`,style:t({background:i(_r)(e.status)}),title:i(Z)(`@WORKBENCH:点击查看错误详情`)},[...n[54]||=[r(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1)]],12,$u)]),default:R(()=>[r(`div`,ed,[r(`div`,td,[A(s,{class:`wb-sub-error__icon`},{default:R(()=>[A(i(je))]),_:1}),r(`span`,nd,U(i(Z)(`@WORKBENCH:执行出错`)),1),e.errorAt?(K(),T(`span`,rd,U(dt(e.errorAt)),1)):w(``,!0)]),r(`pre`,id,U(e.error),1),r(`div`,ad,[A(E,{size:`small`,icon:i(Re),onClick:t=>pt(e)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:复制错误信息`)),1)]),_:1},8,[`icon`,`onClick`]),A(E,{size:`small`,type:`primary`,onClick:t=>vt(e)},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:查看执行日志`)),1)]),_:1},8,[`onClick`])])])]),_:2},1024)):(K(),T(`span`,{key:1,class:`wb-sub-item__status wb-sub-item__status--dot`,style:t({background:i(_r)(e.status)}),title:i(Z)(`@WORKBENCH:任务完成状态`)},[...n[55]||=[r(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1)]],12,od)),r(`span`,{class:`wb-exec-sub-item__title`,title:e.title},U(e.title||i(Z)(`@WORKBENCH:未命名子任务`)),9,sd),Be.value.has(e.id)?(K(),T(`span`,cd)):w(``,!0)]),r(`div`,ld,[i(j)(e.id)?(K(),T(`span`,ud,`PID: `+U(i(j)(e.id)?.pid),1)):w(``,!0),r(`span`,dd,[i(_n)(e)?(K(),T(`button`,{key:0,class:`wb-exec-sub-btn wb-exec-sub-btn--run`,title:i(Z)(`@WORKBENCH:单独执行此子任务`),onClick:J(t=>i(gn)(e),[`stop`])},U(i(Z)(`@WORKBENCH:执行`)),9,fd)):w(``,!0),i(vn)(e)?(K(),T(`button`,{key:1,class:`wb-exec-sub-btn wb-exec-sub-btn--run-from`,title:i(Z)(`@WORKBENCH:从此处执行后续子任务`),onClick:J(t=>i(yn)(e),[`stop`])},U(i(Z)(`@WORKBENCH:从此处开始`)),9,pd)):w(``,!0),i(j)(e.id)&&(i(j)(e.id)?.status===`running`||i(j)(e.id)?.status===`pending`)?(K(),T(`button`,{key:2,class:`wb-exec-sub-btn wb-exec-sub-btn--stop`,title:i(Z)(`@WORKBENCH:停止执行`),onClick:J(t=>i(bn)(i(j)(e.id)),[`stop`])},U(i(Z)(`@WORKBENCH:停止`)),9,md)):w(``,!0),e.status===`done`?(K(),T(`button`,{key:3,class:`wb-exec-sub-btn wb-exec-sub-btn--undo`,title:i(Z)(`@WORKBENCH:取消完成`),disabled:Gt(e.id),onClick:J(t=>nn(e),[`stop`])},U(i(Z)(`@WORKBENCH:取消完成`)),9,hd)):w(``,!0),r(`button`,{class:`wb-exec-sub-btn wb-exec-sub-btn--del`,title:i(Z)(`@WORKBENCH:删除`),disabled:Gt(e.id),onClick:J(t=>Jt(e),[`stop`])},`×`,8,gd)])])],10,Zu))),128))])])),r(`div`,_d,[H.value?(K(),T(N,{key:1},[r(`details`,{class:F([`wb-simple__override`,{"has-content":!!(B.value.simpleOverride&&B.value.simpleOverride.trim())}])},[r(`summary`,Od,[A(s,{class:`wb-simple__override-caret`},{default:R(()=>[A(i(O))]),_:1}),r(`span`,null,U(i(Z)(`@WORKBENCH:覆盖预置提示词(可选)`)),1),B.value.simpleOverride&&B.value.simpleOverride.trim()?(K(),T(`span`,{key:0,class:`wb-simple__override-tag`,title:i(Z)(`@WORKBENCH:已填写覆盖内容`)},U(i(Z)(`@WORKBENCH:已填写`)),9,kd)):w(``,!0),i(St)(i(xt)(B.value))===`running`&&i(xt)(B.value)?(K(),T(`button`,{key:1,class:`wb-simple__stop`,disabled:Gt(i(xt)(B.value).id),onClick:n[36]||=J(e=>i(bn)(i(xt)(B.value)),[`stop`])},U(i(Z)(`@WORKBENCH:停止`)),9,Ad)):w(``,!0)]),W(r(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":n[37]||=e=>B.value.simpleOverride=e,placeholder:i(Z)(`@WORKBENCH:留空则使用上方选定的「预置提示词」模板;可用变量同子任务:{{task.title}} {{task.desc}} {{repo.path}} {{branch}}`),rows:`6`},null,8,jd),[[He,B.value.simpleOverride]])],2),i(bt)(B.value).length>0?(K(),T(`div`,Md,[(K(),z(i(qe),{key:B.value.id,messages:i(yt),"assistant-name":An.value,"assistant-avatar":jn.value,"show-avatar":!0,theme:i(o).theme,"tool-calls-config":{group:!0,collapseThreshold:2},class:`wb-simple-chat`},null,8,[`messages`,`assistant-name`,`assistant-avatar`,`theme`])),i(xt)(B.value)&&[`done`,`error`,`cancelled`].includes(i(St)(i(xt)(B.value)))?(K(),T(`div`,Nd,[(K(),z(i(Ke),{key:`input-`+B.value.id,placeholder:i(Z)(`@WORKBENCH:输入后续问题继续对话…(Ctrl+Enter 发送)`),"upload-config":{enabled:!0,accept:i(Yr),multiple:!0,maxCount:Math.max(0,9-(B.value.attachments?.length??0)),maxSize:i(Xr)},class:`wb-simple-chat__input`,onSend:n[38]||=e=>i(mn)(B.value,e)},null,8,[`placeholder`,`upload-config`]))])):w(``,!0)])):w(``,!0)],64)):(K(),T(N,{key:0},[B.value.subtasks.length===0?(K(),T(`div`,vd,[r(`div`,yd,[A(s,null,{default:R(()=>[A(i(te))]),_:1})]),r(`div`,bd,U(i(Z)(`@WORKBENCH:拆分任务,逐项执行`)),1),r(`div`,xd,U(i(Z)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`)),1),r(`div`,Sd,[A(E,{type:`primary`,icon:i(g),onClick:qt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`]),A(E,{icon:i(ge),onClick:n[22]||=e=>Zt.value=!0},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:导入拆分`)),1)]),_:1},8,[`icon`])])])):ke.value?(K(),T(N,{key:2},[r(`div`,wd,[W(r(`input`,{class:`wb-input`,"onUpdate:modelValue":n[23]||=e=>ke.value.title=e,placeholder:i(Z)(`@WORKBENCH:子任务标题`),onClick:n[24]||=J(()=>{},[`stop`]),onPaste:n[25]||=e=>i(cn)(e,{kind:`sub`,task:B.value,sub:ke.value})},null,40,Td),[[He,ke.value.title]]),Be.value.has(ke.value.id)?(K(),T(`span`,{key:0,class:`wb-sub-item__dirty`,title:i(Z)(`@WORKBENCH:有未保存的更改`)},U(i(Z)(`@WORKBENCH:未保存`)),9,Ed)):w(``,!0)]),W(r(`textarea`,{class:`wb-textarea wb-textarea--sm wb-textarea--autogrow`,"onUpdate:modelValue":n[26]||=e=>ke.value.desc=e,placeholder:i(Z)(`@WORKBENCH:子任务描述 / 独立提示词覆盖`),onInput:n[27]||=e=>Ft(e),onFocus:n[28]||=e=>Ft(e),onBlur:n[29]||=e=>Ft(e),onPaste:n[30]||=e=>i(cn)(e,{kind:`sub`,task:B.value,sub:ke.value})},null,40,Dd),[[He,ke.value.desc]]),i(j)(ke.value.id)?(K(),z(hr,{key:0,job:i(j)(ke.value.id),onReExecute:i(hn)},null,8,[`job`,`onReExecute`])):w(``,!0),A(Hn,{attachments:ke.value.attachments||[],"is-image":i(on),"human-size":i(sn),"is-uploading":i(an)(`sub-`+ke.value.id),"is-paste-hover":i(rn)===ke.value.id,"max-count":9,"on-pick":()=>i(fn)({kind:`sub`,task:B.value,sub:ke.value}),"on-remove":e=>i(dn)({kind:`sub`,task:B.value,sub:ke.value},e),onPaste:n[31]||=e=>i(cn)(e,{kind:`sub`,task:B.value,sub:ke.value}),onDrop:n[32]||=J(e=>i(ln)(e,{kind:`sub`,task:B.value,sub:ke.value}),[`prevent`]),onDragover:n[33]||=J(e=>rn.value=ke.value.id,[`prevent`]),onDragenter:n[34]||=J(e=>rn.value=ke.value.id,[`prevent`]),onDragleave:n[35]||=e=>rn.value=i(rn)===ke.value.id?null:i(rn)},null,8,[`attachments`,`is-image`,`human-size`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],64)):(K(),T(`div`,Cd,[r(`p`,null,U(i(Z)(`@WORKBENCH:左侧选择子任务查看详情`)),1)]))],64))])],2)],64)):(K(),T(`div`,fu,[r(`p`,null,U(i(Z)(`@WORKBENCH:左侧选择任务,或新建一个任务开始`)),1)]))])])])]),_:1},8,[`modelValue`,`title`]),A(re,{modelValue:xe.value,"onUpdate:modelValue":n[40]||=e=>xe.value=e,title:i(Z)(`@WORKBENCH:执行日志`),width:`1080px`,"close-on-click-modal":!1,top:`6vh`,class:`wb-logs-dialog`,"append-to-body":``},{default:R(()=>[A(qr)]),_:1},8,[`modelValue`,`title`]),A(re,{modelValue:$.visible,"onUpdate:modelValue":n[45]||=e=>$.visible=e,title:$.editing?i(Z)(`@WORKBENCH:编辑提示词`):i(Z)(`@WORKBENCH:新建提示词`),width:`640px`,"append-to-body":``},{footer:R(()=>[A(E,{onClick:n[44]||=e=>$.visible=!1},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:取消`)),1)]),_:1}),A(E,{type:`primary`,onClick:At},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:保存`)),1)]),_:1})]),default:R(()=>[A(P,{"label-position":`top`},{default:R(()=>[A(ie,{label:i(Z)(`@WORKBENCH:名称`)},{default:R(()=>[A(M,{modelValue:$.name,"onUpdate:modelValue":n[41]||=e=>$.name=e,placeholder:i(Z)(`@WORKBENCH:如:代码审查 / 写测试`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`]),A(ie,{label:i(Z)(`@WORKBENCH:所属项目`)},{default:R(()=>[A(se,{modelValue:$.projectPath,"onUpdate:modelValue":n[42]||=e=>$.projectPath=e,placeholder:i(Z)(`@WORKBENCH:所属项目`),style:{width:`100%`},disabled:!i(D).path},{default:R(()=>[A(oe,{label:i(Z)(`@WORKBENCH:全局(所有项目可用)`),value:``},null,8,[`label`]),i(D).path?(K(),z(oe,{key:i(D).path,label:i(D).name||i(D).path,value:i(D).path},null,8,[`label`,`value`])):w(``,!0)]),_:1},8,[`modelValue`,`placeholder`,`disabled`])]),_:1},8,[`label`]),A(ie,null,{default:R(()=>[r(`div`,Pd,[A(E,{type:`primary`,plain:``,loading:$.aiLoading,onClick:Dt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:AI 生成项目架构说明`)),1)]),_:1},8,[`loading`]),A(E,{onClick:Ot},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:编辑指令`)),1)]),_:1})])]),_:1}),A(ie,{label:i(Z)(`@WORKBENCH:内容`)},{default:R(()=>[A(M,{modelValue:$.content,"onUpdate:modelValue":n[43]||=e=>$.content=e,type:`textarea`,rows:10,placeholder:i(Z)(`@WORKBENCH:可用变量:`)+`{{task.title}} {{task.desc}} {{sub.title}} {{sub.desc}} {{repo.path}} {{branch}}`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),A(re,{modelValue:ot.visible,"onUpdate:modelValue":n[48]||=e=>ot.visible=e,title:i(Z)(`@WORKBENCH:编辑生成指令`),width:`720px`,"append-to-body":``},{footer:R(()=>[A(E,{onClick:n[47]||=e=>ot.visible=!1},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:取消`)),1)]),_:1}),A(E,{type:`primary`,loading:ot.saving,onClick:kt},{default:R(()=>[S(U(i(Z)(`@WORKBENCH:保存`)),1)]),_:1},8,[`loading`])]),default:R(()=>[A(P,{"label-position":`top`},{default:R(()=>[A(ie,{label:i(Z)(`@WORKBENCH:指令内容`)},{default:R(()=>[A(M,{modelValue:ot.text,"onUpdate:modelValue":n[46]||=e=>ot.text=e,type:`textarea`,rows:18,placeholder:i(Z)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),B.value?(K(),z(En,{key:0,modelValue:$t.value,"onUpdate:modelValue":n[49]||=e=>$t.value=e,title:B.value.title,desc:B.value.desc,"task-id":B.value.id,"prompt-id":B.value.promptId,onConfirm:tn},null,8,[`modelValue`,`title`,`desc`,`task-id`,`prompt-id`])):w(``,!0),B.value?(K(),z(kn,{key:1,modelValue:Zt.value,"onUpdate:modelValue":n[50]||=e=>Zt.value=e,"existing-count":B.value.subtasks.length,onConfirm:Qt},null,8,[`modelValue`,`existing-count`])):w(``,!0)])}}}),[[`__scopeId`,`data-v-a08094f9`]]);export{Wd as default};
|