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