zen-gitsync 2.17.13 → 2.17.15
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 +211 -185
- package/package.json +2 -2
- package/scripts/release.js +33 -16
- package/src/cli/ai/tools.js +62 -13
- package/src/cli/ai/tools.test.js +35 -1
- package/src/config.js +4 -0
- package/src/gitCommit.js +18 -1
- package/src/ui/public/assets/AgentView-Bz9LFamz.js +5 -0
- package/src/ui/public/assets/{AppVersionBadge-QszUpjxK.js → AppVersionBadge-D5iXcAEV.js} +2 -2
- package/src/ui/public/assets/{BranchSelector-C_j7ayIX.js → BranchSelector-DP4u1f_B.js} +1 -1
- package/src/ui/public/assets/{CommitForm-CH_YTHmd.js → CommitForm-boOw8uGS.js} +1 -1
- package/src/ui/public/assets/{CommonDialog-78tuotW4.js → CommonDialog-B_qUsIGr.js} +1 -1
- package/src/ui/public/assets/{EditorView-CGKjSpRs.js → EditorView-ZULtfIzl.js} +1 -1
- package/src/ui/public/assets/{FileDiffViewer-kQ3WnrlJ.js → FileDiffViewer-C4xxq5S0.js} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-PtAICyWn.js → FlowExecutionViewer-BmfstdaT.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-tyQdIh0A.js → FlowOrchestrationWorkspace-28kErqrn.js} +1 -1
- package/src/ui/public/assets/{IconButton-CNMPSvnE.js → IconButton-DcOAqpq0.js} +1 -1
- package/src/ui/public/assets/{LogList-X739IWXT.js → LogList-FEP7EeJt.js} +2 -2
- package/src/ui/public/assets/MindmapView-8X6z245q.css +1 -0
- package/src/ui/public/assets/MindmapView-NDJvfSCn.js +2 -0
- package/src/ui/public/assets/{MonitorView-C_Jj5hEy.js → MonitorView-DU4aBCK0.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-wjBZWElK.js → ProjectStartupButton-JQk4Etsu.js} +1 -1
- package/src/ui/public/assets/{RemoteManagerDialog-DuS66D7T.js → RemoteManagerDialog-Di2WizMS.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-DgOTYE8p.js → RemoteRepoCard-DxB8Q8yE.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-wrchi7Si.js → SourceMapView-CfmrPMBm.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-BwCRUb-C.js → SvgIcon-yefEMV0-.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-B6pI5C4y.js → TemplateManager-CCy_WcSK.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-Di1kFO5g.js → UserInputNode-3Gv_9YZx.js} +1 -1
- package/src/ui/public/assets/{WorkbenchView-CI_sSeYY.js → WorkbenchView-Dgp6A83v.js} +5 -5
- package/src/ui/public/assets/_plugin-vue_export-helper-B1mHBne9.js +19 -0
- package/src/ui/public/assets/configStore-BDxel6Co.js +1 -0
- package/src/ui/public/assets/element-plus-Cwwq-Gje.css +1 -0
- package/src/ui/public/assets/{flow-mindmap-Dybg7aXu.js → flow-mindmap-BqFb1WO5.js} +1 -1
- package/src/ui/public/assets/gitStore-D5CWxPLv.js +6 -0
- package/src/ui/public/assets/index-CmbatbSR.css +1 -0
- package/src/ui/public/assets/index-gpuX9fhG.js +111 -0
- package/src/ui/public/assets/{office-docx-BZoGgigI.js → office-docx-CZXLkCf5.js} +1 -1
- package/src/ui/public/assets/{office-excel-CWXhvPQt.js → office-excel-CBKszjVA.js} +1 -1
- package/src/ui/public/assets/{office-pptx-Di9Tw3Lc.js → office-pptx-NeUSnN3k.js} +1 -1
- package/src/ui/public/assets/{previewSandbox-DMg4ngSx.js → previewSandbox-qLKxghfr.js} +0 -0
- package/src/ui/public/assets/{useThemeObserver-COR_mDL-.js → useThemeObserver-E7Hk50l3.js} +1 -1
- package/src/ui/public/assets/vendor-C5qX_I8r.css +1 -0
- package/src/ui/public/assets/{vendor-DP-rcIZp.js → vendor-IQQMq-1c.js} +20 -20
- package/src/ui/public/assets/{vue-flow-CLj74gJJ.js → vue-flow-fLUQ0_kE.js} +1 -1
- package/src/ui/public/index.html +18 -19
- package/src/ui/server/index.js +4 -0
- package/src/ui/server/routes/explorerContextMenu.js +208 -0
- package/src/ui/server/routes/explorerContextMenu.test.js +180 -0
- package/src/ui/server/routes/workbench/agentChat.js +11 -1
- package/src/ui/public/assets/AgentView-DHXZJLpl.js +0 -5
- package/src/ui/public/assets/MindmapView-BQTqx842.css +0 -1
- package/src/ui/public/assets/MindmapView-Ci2gttUI.js +0 -2
- package/src/ui/public/assets/_plugin-vue_export-helper-BsV3BiZm.js +0 -19
- package/src/ui/public/assets/configStore-Cubt3KDP.js +0 -1
- package/src/ui/public/assets/element-plus-VKM0Y6Ty.css +0 -1
- package/src/ui/public/assets/gitStore-J2f7bmAs.js +0 -4
- package/src/ui/public/assets/index-BZUAVMg6.css +0 -1
- package/src/ui/public/assets/index-ClPoUp9g.js +0 -102
- package/src/ui/public/assets/toolsStore-B2XGcQx-.js +0 -1
- package/src/ui/public/assets/vendor-4ojsjDYc.css +0 -1
- /package/src/ui/public/assets/{element-plus-CqvO58xa.js → element-plus-DxBPQwL7.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,Bt as t,C as n,Dn as r,E as i,En as a,F as o,Fn as s,It as c,J as l,Jn as u,K as d,Kn as f,L as p,Lt as m,M as h,Mn as g,Nn as _,On as v,P as y,Pr as b,Pt as x,Qn as S,Rt as C,S as w,Sn as T,St as E,Tn as D,Tt as ee,U as te,Un as ne,V as re,Vt as O,W as k,Wt as ie,Xn as A,Y as ae,Yr as j,_ as M,_n as oe,_r as se,a as N,ar as P,at as F,b as ce,bn as I,cr as L,ct as le,et as ue,fr as R,ft as de,gn as z,gt as fe,hn as pe,i as B,in as me,jt as V,pn as H,q as he,qr as U,qt as ge,r as _e,sr as W,st as ve,tr as ye,un as G,ut as be,v as xe,vn as K,vt as Se,w as Ce,wn as q,xt as we,y as Te,yn as J,yr as Y,zn as X}from"./element-plus-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,Bt as t,C as n,Dn as r,E as i,En as a,F as o,Fn as s,It as c,J as l,Jn as u,K as d,Kn as f,L as p,Lt as m,M as h,Mn as g,Nn as _,On as v,P as y,Pr as b,Pt as x,Qn as S,Rt as C,S as w,Sn as T,St as E,Tn as D,Tt as ee,U as te,Un as ne,V as re,Vt as O,W as k,Wt as ie,Xn as A,Y as ae,Yr as j,_ as M,_n as oe,_r as se,a as N,ar as P,at as F,b as ce,bn as I,cr as L,ct as le,et as ue,fr as R,ft as de,gn as z,gt as fe,hn as pe,i as B,in as me,jt as V,pn as H,q as he,qr as U,qt as ge,r as _e,sr as W,st as ve,tr as ye,un as G,ut as be,v as xe,vn as K,vt as Se,w as Ce,wn as q,xt as we,y as Te,yn as J,yr as Y,zn as X}from"./element-plus-DxBPQwL7.js";import{a as Ee,i as De,o as Oe,r as ke}from"./vendor-IQQMq-1c.js";import{n as Z,t as Q}from"./_plugin-vue_export-helper-B1mHBne9.js";import{t as Ae}from"./SvgIcon-yefEMV0-.js";import{t as je}from"./configStore-BDxel6Co.js";import{t as Me}from"./CommonDialog-B_qUsIGr.js";import{E as $,T as Ne,_ as Pe,a as Fe,c as Ie,d as Le,f as Re,g as ze,h as Be,i as Ve,l as He,m as Ue,o as We,p as Ge,s as Ke,u as qe}from"./index-gpuX9fhG.js";X(),R();var Je=s({__name:`AttachmentZone`,props:{attachments:{type:Array,required:!0},isImage:{type:Function,required:!0},humanSize:{type:Function,required:!0},isUploading:{type:Boolean,required:!0},isPasteHover:{type:Boolean,required:!0},maxCount:{type:Number,required:!0},onPick:{type:Function,required:!0},onRemove:{type:Function,required:!0},rawBase:{type:String,required:!1}},emits:[`paste`,`drop`,`dragover`,`dragenter`,`dragleave`],setup(e,{expose:t,emit:n}){t();let r=e;function i(e){return`${r.rawBase||`/api/workbench/attachments`}/${e.id}/raw`}let a=n,o=q(()=>r.attachments.filter(e=>r.isImage(e))),s=q(()=>o.value.map(e=>i(e))),c=Y(0),l=Y(!1);function u(e){if(r.isImage(e)){let t=o.value.findIndex(t=>t.id===e.id);c.value=t>=0?t:0,l.value=!0}else window.open(i(e),`_blank`,`noopener`)}function d(){l.value=!1}let p=Y({visible:!1,x:0,y:0,att:null}),m=Y(!1);function h(e,t){if(!r.isImage(e))return;t.preventDefault();let n=window.innerWidth-180,i=window.innerHeight-120;p.value={visible:!0,x:Math.min(t.clientX,n),y:Math.min(t.clientY,i),att:e}}function g(){p.value.visible&&(p.value.visible=!1)}async function _(){let e=p.value.att;if(e&&!m.value){if(g(),!navigator.clipboard||typeof ClipboardItem>`u`){B({type:`warning`,message:Z(`@WORKBENCH:当前浏览器不支持复制图片`)});return}m.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]),B({type:`success`,message:Z(`@WORKBENCH:图片已复制到剪贴板`),duration:1800})}catch(e){B({type:`error`,message:Z(`@WORKBENCH:复制失败 {error}`,{error:e?.message||``})})}finally{m.value=!1}}}typeof window<`u`&&(window.addEventListener(`click`,g),window.addEventListener(`scroll`,g,!0),window.addEventListener(`blur`,g)),f(()=>{typeof window>`u`||(window.removeEventListener(`click`,g),window.removeEventListener(`scroll`,g,!0),window.removeEventListener(`blur`,g))});let v={props:r,rawOf:i,emit:a,imageList:o,previewUrls:s,previewIndex:c,previewVisible:l,previewAttachment:u,closePreview:d,contextMenu:p,copyBusy:m,openContextMenu:h,closeContextMenu:g,copyImageToClipboard:_,get ElImageViewer(){return ce},get $t(){return Z}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});b(),X(),G();var Ye={class:`wb-attachments__head`},Xe={class:`wb-attachments__label`},Ze={class:`wb-attachments__count`},Qe=[`disabled`],$e={key:0,class:`wb-attachments__paste-hint`},et={key:1,class:`wb-attachments__list`},tt=[`title`,`onClick`,`onContextmenu`],nt=[`src`,`alt`],rt={key:1},it={class:`wb-attachment__meta`},at=[`title`],ot=[`onClick`,`title`];function st(t,n,i,o,s,c){return A(),v(I,null,[D(`div`,{class:U([`wb-attachments`,{"is-paste-hover":i.isPasteHover}]),onPaste:n[1]||=e=>o.emit(`paste`,e),onDrop:n[2]||=J(e=>o.emit(`drop`,e),[`prevent`]),onDragover:n[3]||=J(e=>o.emit(`dragover`,e),[`prevent`]),onDragenter:n[4]||=J(e=>o.emit(`dragenter`,e),[`prevent`]),onDragleave:n[5]||=e=>o.emit(`dragleave`,e)},[D(`div`,Ye,[D(`span`,Xe,[g(e(o.$t(`@WORKBENCH:附件`))+` `,1),D(`span`,Ze,e(i.attachments.length)+` / `+e(i.maxCount),1)]),D(`button`,{class:`wb-attachments__add wb-soft-btn`,disabled:i.isUploading||i.attachments.length>=i.maxCount,onClick:n[0]||=(...e)=>i.onPick&&i.onPick(...e)},e(i.isUploading?o.$t(`@WORKBENCH:上传中…`):o.$t(`@WORKBENCH:添加附件`)),9,Qe)]),i.isPasteHover?(A(),v(`div`,$e,e(o.$t(`@WORKBENCH:粘贴图片以快速添加`)),1)):r(`v-if`,!0),i.attachments.length>0?(A(),v(`ul`,et,[(A(!0),v(I,null,S(i.attachments,t=>(A(),v(`li`,{key:t.id,class:`wb-attachment`},[D(`button`,{type:`button`,class:`wb-attachment__preview`,title:o.$t(`@WORKBENCH:点击预览`),onClick:e=>o.previewAttachment(t),onContextmenu:e=>o.openContextMenu(t,e)},[D(`div`,{class:U([`wb-attachment__icon`,{"wb-attachment__icon--img":i.isImage(t)}])},[i.isImage(t)?(A(),v(`img`,{key:0,src:o.rawOf(t),alt:t.originalName,loading:`lazy`},null,8,nt)):(A(),v(`span`,rt,e(t.ext.toUpperCase()),1))],2),D(`div`,it,[D(`div`,{class:`wb-attachment__name`,title:`${t.originalName} (${i.humanSize(t.size)})`},e(t.originalName),9,at)])],40,tt),D(`button`,{class:`wb-attachment__del`,onClick:J(e=>i.onRemove(t),[`stop`]),title:o.$t(`@WORKBENCH:删除`)},`×`,8,ot)]))),128))])):r(`v-if`,!0)],34),r(`
|
|
2
2
|
el-image-viewer 自己通过内部 <Teleport to="body" :disabled="!teleported"> 把遮罩渲染到 body。
|
|
3
3
|
不要在外面再包一层 <teleport to="body"> —— 嵌套 Teleport 在 element-plus 2.11.x 下会让组件
|
|
4
4
|
的 v-if 容器内残留占位、且内部 Teleport 因找不到正确锚点而不挂载,导致点击图片无反应。
|
|
@@ -17,7 +17,7 @@ import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,Bt as t,C as n,Dn as r,E a
|
|
|
17
17
|
提示词分组保留 header(含 + 新建按钮 + 计数),信息密度不一对齐,后续按需统一。 `),D(`button`,{class:`wb-new-btn`,disabled:i.creatingTask,onClick:n[0]||=e=>o.emit(`create-task`)},[_(l,{class:`wb-new-btn__icon`},{default:W(()=>[_(o.Plus)]),_:1}),D(`span`,null,e(o.$t(`@WORKBENCH:新建任务`)),1),n[3]||=D(`span`,{class:`wb-new-btn__shortcut`},`N`,-1)],8,Kn),D(`ul`,{class:U([`wb-task-list`,{"is-grouped":o.groupedTasksList.hasMultiple}])},[(A(!0),v(I,null,S(o.groupedTasksList.groups,t=>(A(),v(I,{key:t.path},[o.groupedTasksList.hasMultiple?(A(),v(`li`,{key:0,class:U([`wb-task-group__head`,{"is-current":t.path===o.currentProjectKey,"is-collapsed":o.isGroupCollapsed(t.path)}]),role:`button`,tabindex:`0`,"aria-expanded":!o.isGroupCollapsed(t.path),title:o.isGroupCollapsed(t.path)?o.$t(`@WORKBENCH:展开`):o.$t(`@WORKBENCH:收起`),onClick:e=>o.toggleGroupCollapsed(t.path),onKeydown:[K(J(e=>o.toggleGroupCollapsed(t.path),[`prevent`]),[`enter`]),K(J(e=>o.toggleGroupCollapsed(t.path),[`prevent`]),[`space`])]},[_(l,{class:`wb-task-group__caret`},{default:W(()=>[(A(),a(ye(o.isGroupCollapsed(t.path)?o.ArrowRight:o.ArrowDown)))]),_:2},1024),_(l,{class:`wb-task-group__icon`},{default:W(()=>[_(o.Folder)]),_:1}),D(`span`,{class:`wb-task-group__name`,title:t.path===o.currentProjectKey?i.currentProject.path:t.label},e(t.path===o.currentProjectKey?i.currentProject.name:o.shortProjectLabel(t.label)),9,Jn),D(`span`,Yn,e(t.tasks.length),1)],42,qn)):r(`v-if`,!0),o.isGroupCollapsed(t.path)?r(`v-if`,!0):(A(!0),v(I,{key:1},S(t.tasks,n=>(A(),v(`li`,{key:n.id,class:U([`wb-task-item`,{active:n.id===i.selectedTaskId,"is-other-project":o.isOtherProject(n),"is-running":o.taskIsRunning(n),"is-dragging":o.draggingTaskId===n.id,"is-drop-before":o.dragOverTaskId===n.id&&o.dragPosition===`before`,"is-drop-after":o.dragOverTaskId===n.id&&o.dragPosition===`after`}]),"data-task-id":n.id,"data-group-path":t.path,title:o.taskTooltip(n),onClick:e=>o.emit(`select-task`,n),onMousedown:e=>o.onTaskMouseDown(e,n,t.path,e.currentTarget)},[r(` 单行展示:只显示标题;没写标题用任务描述压平后顶上(CSS ellipsis 截断)。
|
|
18
18
|
子任务数 / 附件数 等 meta 行已移除,降噪 `),D(`div`,Zn,[D(`div`,{class:`wb-task-item__title`,title:o.taskDisplayName(n)},e(o.taskDisplayName(n)),9,Qn)]),o.taskIsRunning(n)?(A(),v(`span`,{key:0,class:`wb-task-item__running-dot`,title:o.$t(`@WORKBENCH:执行中`),"aria-hidden":`true`},null,8,$n)):r(`v-if`,!0),D(`div`,er,[D(`button`,{class:`wb-task-item__copy`,title:o.$t(`@WORKBENCH:复制任务`),"aria-label":o.$t(`@WORKBENCH:复制任务`),onClick:J(e=>o.emit(`copy-task`,n),[`stop`])},[_(l,null,{default:W(()=>[_(o.CopyDocument)]),_:1})],8,tr),r(` 执行中不允许删除:避免误杀正在跑的实例(jobs 还在内存里,
|
|
19
19
|
任务从 tasks.json 消失后,runSingleSubtask 读不到 task
|
|
20
|
-
会留一堆孤儿 job)。后端 DELETE 路由也加了同样的 live-job 守卫兜底 `),o.taskIsRunning(n)?r(`v-if`,!0):(A(),v(`button`,{key:0,class:`wb-task-item__del`,onClick:J(e=>o.emit(`delete-task`,n),[`stop`]),title:o.$t(`@WORKBENCH:删除`),"aria-label":o.$t(`@WORKBENCH:删除`)},[_(l,null,{default:W(()=>[_(o.Close)]),_:1})],8,nr))])],42,Xn))),128))],64))),128)),i.tasks.length===0?(A(),v(`li`,rr,[D(`div`,ir,[_(l,null,{default:W(()=>[_(o.DocumentAdd)]),_:1})]),D(`div`,ar,e(o.$t(`@WORKBENCH:暂无任务`)),1),D(`div`,or,e(o.$t(`@WORKBENCH:点击上方按钮新建`)),1),D(`div`,sr,[_(u,{type:`primary`,size:`small`,icon:o.Plus,loading:i.creatingTask,onClick:n[1]||=e=>o.emit(`create-task`)},{default:W(()=>[g(e(o.$t(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`,`loading`])])])):r(`v-if`,!0)],2)]),D(`section`,cr,[D(`header`,lr,[D(`span`,ur,e(o.$t(`@WORKBENCH:提示`)),1),D(`h3`,dr,e(o.$t(`@WORKBENCH:预置提示词`)),1),D(`span`,fr,e(o.availablePrompts.length),1),D(`button`,{class:`wb-section__action`,onClick:n[2]||=e=>o.emit(`open-create-prompt`),title:o.$t(`@WORKBENCH:新建提示词`),"aria-label":o.$t(`@WORKBENCH:新建提示词`)},[_(l,null,{default:W(()=>[_(o.Plus)]),_:1})],8,pr)]),D(`ul`,mr,[(A(!0),v(I,null,S(o.availablePrompts,t=>(A(),v(`li`,{key:t.id,class:`wb-prompt-item`},[D(`div`,hr,[_(l,null,{default:W(()=>[_(o.Memo)]),_:1})]),D(`span`,{class:`wb-prompt-item__name`,onClick:e=>o.emit(`open-edit-prompt`,t),title:t.content},e(t.name),9,gr),t.projectPath?(A(),v(`span`,{key:1,class:`wb-prompt-item__tag wb-prompt-item__tag--project`,title:t.projectPath},e(o.shortProjectLabel(t.projectPath)),9,vr)):(A(),v(`span`,{key:0,class:`wb-prompt-item__tag`,title:o.$t(`@WORKBENCH:全局(所有项目可用)`)},e(o.$t(`@WORKBENCH:全局(所有项目可用)`)),9,_r)),D(`button`,{class:`wb-prompt-item__del`,onClick:e=>o.emit(`delete-prompt`,t),title:o.$t(`@WORKBENCH:删除`),"aria-label":o.$t(`@WORKBENCH:删除`)},[_(l,null,{default:W(()=>[_(o.Close)]),_:1})],8,yr)]))),128)),o.availablePrompts.length===0?(A(),v(`li`,br,e(o.$t(`@WORKBENCH:暂无提示词`)),1)):r(`v-if`,!0)])])])}var Sr=Q(Un,[[`render`,xr],[`__scopeId`,`data-v-458e9455`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchSidebar.vue`]]);R();function Cr(){let e=Y([]),t=Y([]),n=Y(``),r=Y(!1),i=Y(!1);async function a(a=!1){a||(r.value=!0);try{let r=await fetch(`/api/workbench/projects`,{cache:`no-store`}).then(e=>e.json());return r?.success?(e.value=Array.isArray(r.projects)?r.projects:[],t.value=Array.isArray(r.tasks)?r.tasks:[],n.value=r.currentProjectPath||``,i.value=!0,!0):(a||B.error(r?.error||Z(`@WORKBENCH:读取项目列表失败`)),!1)}catch(e){return a||B.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}finally{r.value=!1}}return{projects:e,boardTasks:t,currentProjectPath:n,loading:r,loaded:i,loadProjects:a}}R();function wr(){let e=Y(!0),t=Y([]),n=Y([]),r=Y([]),i=Y(null),a=Y(!1),o=Y(!1),s=Y(!1),c=Y(``),l=Y({});async function u(o=!1){try{let s=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return s?.success?(e.value=s.active!==!1,t.value=Array.isArray(s.instructions)?s.instructions:[],n.value=Array.isArray(s.activity)?s.activity:[],r.value=Array.isArray(s.running)?s.running:[],i.value=s.updatedAt||null,c.value=typeof s.defaultPrompt==`string`?s.defaultPrompt:``,l.value=s.projectPrompts&&typeof s.projectPrompts==`object`?s.projectPrompts:{},a.value=!0,!0):(o||B.error(s?.error||Z(`@WORKBENCH:读取编排状态失败`)),!1)}catch(e){return o||B.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:``,B.success(Z(`@WORKBENCH:已保存全局默认提示词`)),!0):(B.error(t?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return B.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:{},B.success(Z(`@WORKBENCH:已保存项目默认提示词`)),!0):(B.error(n?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return B.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,B.success(e.value?Z(`@WORKBENCH:已恢复调度`):Z(`@WORKBENCH:已暂停调度,派发将只建任务不执行`)),!0):(e.value=n,B.error(r?.error||Z(`@WORKBENCH:切换调度状态失败`)),!1)}catch(t){return e.value=n,B.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}):(B.error(t?.error||Z(`@WORKBENCH:派发失败`)),null)}catch(e){return B.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 Tr=6e4,Er=60*Tr,Dr=24*Er;function Or(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<Tr?Z(`@WORKBENCH:刚刚`):r<Er?Z(`@WORKBENCH:N 分钟前`,{n:Math.floor(r/Tr)}):r<Dr?Z(`@WORKBENCH:N 小时前`,{n:Math.floor(r/Er)}):r<30*Dr?Z(`@WORKBENCH:N 天前`,{n:Math.floor(r/Dr)}):new Date(n).toLocaleDateString()}function kr(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 Ar(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function jr(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(Ar(n,a))return i;if(Ar(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}`}X(),R();var Mr=s({__name:`WorkbenchProjectPanel`,props:{projects:{type:Array,required:!0},selectedKey:{type:String,required:!0},loading:{type:Boolean,required:!0}},emits:[`select`],setup(e,{expose:n,emit:r}){n();let i=e,a=r,o=q(()=>[...i.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)})),s=Y(``),l=Y(!1),d=Y(!1),p=q(()=>!!s.value.trim()||l.value||d.value),m=q(()=>{let e=s.value.trim().toLowerCase();return o.value.filter(t=>l.value&&t.stats.total===0||d.value&&t.git&&t.git.isGitRepo===!1?!1:!e||t.name.toLowerCase().includes(e)||t.path.toLowerCase().includes(e))});function h(){s.value=``,l.value=!1,d.value=!1}let g=q(()=>i.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})),_=q(()=>g.value.total>0?Math.round(g.value.done/g.value.total*100):0);function v(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 y(e){return!!(e.git&&e.git.isGitRepo&&(e.git.detached||e.git.branch))}let b=Y(null),S=Y(null);function C(e,t){if(b.value===e.key){b.value=null;return}S.value=t.currentTarget,b.value=e.key}function w(){b.value=null}function T(e){if(!b.value)return;let t=e.target;if(t&&!S.value?.contains(t)){for(let e of Array.from(document.querySelectorAll(`.proj-open-menu`)))if(e.contains(t))return;b.value=null}}u(()=>document.addEventListener(`mousedown`,T,!0)),f(()=>document.removeEventListener(`mousedown`,T,!0));let D=Me(),te=Y(!1),ne=Y(null);function re(e){return D.lastCheckedAt!==null&&!D.isToolAvailable(e)}async function O(e){w();let t=await Ge(e.path);t.success?B.success(t.message||Z(`@WORKBENCH:已在文件管理器中打开文件夹`)):B.error(t.error||Z(`@WORKBENCH:打开文件夹失败`))}async function k(e){w();let t=await Ue(e.path);t.success?B.success(t.message||Z(`@67CE7:已在终端中打开目录`)):B.error(t.error||Z(`@WORKBENCH:打开终端失败`))}async function A(e){w();let t=await Re(e.path);t.success?B.success(Z(`@WORKBENCH:已在新标签页启动 g ui`)):B.error(t.error||Z(`@WORKBENCH:启动 g ui 失败`))}async function ae(e){if(w(),e.name)try{await navigator.clipboard.writeText(e.name),B.success(Z(`@67CE7:已复制文件夹名称`))}catch{B.error(Z(`@67CE7:复制失败`))}}async function j(e,t,n){if(w(),!await Le()){B.warning(Z(`@67CE7:工具检测失败,请稍后重试`));return}if(!D.isToolAvailable(t)){ne.value=t,te.value=!0;return}let r=await Be(t,e.path,n);r.success?B.success(r.message||Z(`@67CE7:已用 {tool} 打开目录`,{tool:qe[t]})):B.error(`${Z(`@67CE7:打开失败: `)}${r.error??``}`)}let M={props:i,emit:a,ordered:o,query:s,onlyWithTasks:l,hideNonGit:d,filtering:p,visible:m,clearFilters:h,totals:g,overallProgress:_,gitLine:v,hasBranchIcon:y,openMenuKey:b,menuTriggerEl:S,toggleOpenMenu:C,closeOpenMenu:w,onDocumentMouseDown:T,toolsStore:D,installVisible:te,installTool:ne,toolMissing:re,openInFileManager:O,openInTerminal:k,launchGui:A,copyFolderName:ae,openWithTool:j,get $t(){return Z},get CopyDocument(){return ve},get Folder(){return we},get FolderOpened(){return E},get Grid(){return ee},get Monitor(){return x},get MoreFilled(){return c},get Promotion(){return t},get Search(){return ie},SvgIcon:Ae,ToolInstallDialog:Pe,get claudeCodeIcon(){return ze},get OPEN_WITH_TOOLS(){return He},get relativeTimeFromIso(){return Or}};return Object.defineProperty(M,"__isScriptSetup",{enumerable:!1,value:!0}),M}});b(),X(),G();var Nr={class:`proj`},Pr={class:`proj__head`},Fr={class:`proj__title`},Ir={class:`proj__count`},Lr={key:0,class:`proj__tools`},Rr={class:`proj__search`},zr=[`placeholder`,`aria-label`],Br={class:`proj__toggles`},Vr=[`aria-pressed`,`title`],Hr=[`aria-pressed`,`title`],Ur={class:`proj__list`},Wr=[`title`],Gr={class:`proj-item__row1`},Kr={class:`proj-item__name`},qr={key:0,class:`proj-item__running`,"aria-hidden":`true`},Jr={class:`proj-item__num`},Yr={class:`proj-item__row2`},Xr={key:0,class:`proj-item__running-text`},Zr={key:0,class:`proj-item__row3`},Qr={class:`proj-item__bar`,"aria-hidden":`true`},$r={class:`proj-item__progress-text`},ei=[`title`,`onClick`,`onKeydown`],ti={class:`proj-item__row1`},ni={class:`proj-item__name`},ri={class:`proj-item__signals`},ii={key:0,class:`proj-item__running`,"aria-hidden":`true`},ai={key:1,class:`proj-item__badge`},oi={class:`proj-item__row2`},si={key:0,class:`proj-chip proj-chip--missing`},ci={key:0,class:`proj-item__branch`},li={class:`proj-item__branch-name`},ui={key:1,class:`proj-chip proj-chip--ahead`},di={key:2,class:`proj-chip proj-chip--behind`},fi={key:3,class:`proj-chip proj-chip--dirty`},pi={class:`proj-item__time`},mi={key:0,class:`proj-item__row3`},hi={class:`proj-item__bar`,"aria-hidden":`true`},gi={class:`proj-item__progress-text`},_i={key:1,class:`proj-item__actions`},vi=[`title`,`aria-label`,`onClick`],yi=[`title`,`aria-label`,`aria-expanded`,`onClick`],bi=[`aria-label`],xi=[`onClick`,`onKeydown`],Si={class:`proj-menu__icon`},Ci={class:`proj-menu__label`},wi=[`onClick`,`onKeydown`],Ti={class:`proj-menu__icon`},Ei={class:`proj-menu__label`},Di=[`onClick`,`onKeydown`],Oi={class:`proj-menu__icon`},ki={class:`proj-menu__label`},Ai=[`onClick`,`onKeydown`],ji={class:`proj-menu__icon`},Mi={class:`proj-menu__label`},Ni={class:`proj-menu__title`,role:`presentation`},Pi=[`onClick`,`onKeydown`],Fi={class:`proj-menu__icon`},Ii={class:`proj-menu__label`},Li={key:0,class:`proj-menu__hint`},Ri=[`onClick`,`onKeydown`],zi={class:`proj-menu__icon`},Bi=[`src`],Vi={class:`proj-menu__label`},Hi={class:`proj-menu__hint`},Ui=[`onClick`,`onKeydown`],Wi={class:`proj-menu__icon`},Gi=[`src`],Ki={class:`proj-menu__label`},qi={key:0,class:`proj-empty`},Ji={class:`proj-empty__title`},Yi={class:`proj-empty__hint`},Xi={key:1,class:`proj-empty`},Zi={class:`proj-empty__title`};function Qi(t,n,i,o,s,c){let l=d,u=M;return A(),v(`section`,Nr,[D(`header`,Pr,[D(`h3`,Fr,e(o.$t(`@WORKBENCH:项目列表`)),1),D(`span`,Ir,[o.filtering?(A(),v(I,{key:0},[g(e(o.$t(`@WORKBENCH:匹配 {n}/{total} 个项目`,{n:o.visible.length,total:i.projects.length})),1)],64)):(A(),v(I,{key:1},[g(e(i.projects.length),1)],64))])]),r(` 一个项目都没有时不渲染筛选条:没有可筛的东西,这一行只是占位 `),i.projects.length>0?(A(),v(`div`,Lr,[D(`div`,Rr,[_(l,{class:`proj__search-icon`,"aria-hidden":`true`},{default:W(()=>[_(o.Search)]),_:1}),L(D(`input`,{"onUpdate:modelValue":n[0]||=e=>o.query=e,class:`proj__search-input`,type:`search`,placeholder:o.$t(`@WORKBENCH:搜索项目名称或路径`),"aria-label":o.$t(`@WORKBENCH:搜索项目名称或路径`),onKeydown:n[1]||=K(e=>o.query=``,[`esc`])},null,40,zr),[[z,o.query]])]),D(`div`,Br,[D(`button`,{type:`button`,class:U([`proj__toggle`,{"is-on":o.onlyWithTasks}]),"aria-pressed":o.onlyWithTasks,title:o.$t(`@WORKBENCH:只显示有任务的项目`),onClick:n[2]||=e=>o.onlyWithTasks=!o.onlyWithTasks},[D(`span`,null,e(o.$t(`@WORKBENCH:只看有任务`)),1)],10,Vr),D(`button`,{type:`button`,class:U([`proj__toggle`,{"is-on":o.hideNonGit}]),"aria-pressed":o.hideNonGit,title:o.$t(`@WORKBENCH:只显示 Git 仓库`),onClick:n[3]||=e=>o.hideNonGit=!o.hideNonGit},[D(`span`,null,e(o.$t(`@WORKBENCH:隐藏非 Git`)),1)],10,Hr)])])):r(`v-if`,!0),D(`ul`,Ur,[D(`li`,{class:U([`proj-item proj-item--all`,{"is-active":i.selectedKey===``}]),role:`button`,tabindex:`0`,title:o.$t(`@WORKBENCH:全部项目`),onClick:n[4]||=e=>o.emit(`select`,null),onKeydown:[n[5]||=K(J(e=>o.emit(`select`,null),[`prevent`]),[`enter`]),n[6]||=K(J(e=>o.emit(`select`,null),[`prevent`]),[`space`])]},[D(`div`,Gr,[_(l,{class:`proj-item__icon`},{default:W(()=>[_(o.Grid)]),_:1}),D(`span`,Kr,e(o.$t(`@WORKBENCH:全部项目`)),1),o.totals.running>0?(A(),v(`span`,qr)):r(`v-if`,!0),D(`span`,Jr,e(i.projects.length),1)]),D(`div`,Yr,[D(`span`,null,e(o.$t(`@WORKBENCH:{n} 个项目`,{n:i.projects.length})),1),o.totals.running>0?(A(),v(`span`,Xr,e(o.$t(`@WORKBENCH:{n} 个执行中`,{n:o.totals.running})),1)):r(`v-if`,!0)]),r(` 一个任务都没有时整行不渲染(「0/0 任务完成」+ 空进度条是纯噪声) `),o.totals.total>0?(A(),v(`div`,Zr,[D(`span`,Qr,[D(`i`,{class:`proj-item__bar-fill`,style:j({width:o.overallProgress+`%`})},null,4)]),D(`span`,$r,e(o.$t(`@WORKBENCH:{done}/{total} 任务完成`,{done:o.totals.done,total:o.totals.total})),1)])):r(`v-if`,!0)],42,Wr),(A(!0),v(I,null,S(o.visible,t=>(A(),v(`li`,{key:t.key,class:U([`proj-item`,{"is-active":t.key===i.selectedKey,"is-running":t.stats.runningJobs>0,"is-missing":t.exists===!1}]),role:`button`,tabindex:`0`,title:t.path,onClick:e=>o.emit(`select`,t),onKeydown:[K(J(e=>o.emit(`select`,t),[`self`,`prevent`]),[`enter`]),K(J(e=>o.emit(`select`,t),[`self`,`prevent`]),[`space`])]},[D(`div`,ti,[_(l,{class:`proj-item__icon`},{default:W(()=>[_(o.Folder)]),_:1}),D(`span`,ni,e(t.name),1),r(` 运行中 / 当前 这两个信号与 hover 才出现的操作按钮锚在同一个右端点:
|
|
20
|
+
会留一堆孤儿 job)。后端 DELETE 路由也加了同样的 live-job 守卫兜底 `),o.taskIsRunning(n)?r(`v-if`,!0):(A(),v(`button`,{key:0,class:`wb-task-item__del`,onClick:J(e=>o.emit(`delete-task`,n),[`stop`]),title:o.$t(`@WORKBENCH:删除`),"aria-label":o.$t(`@WORKBENCH:删除`)},[_(l,null,{default:W(()=>[_(o.Close)]),_:1})],8,nr))])],42,Xn))),128))],64))),128)),i.tasks.length===0?(A(),v(`li`,rr,[D(`div`,ir,[_(l,null,{default:W(()=>[_(o.DocumentAdd)]),_:1})]),D(`div`,ar,e(o.$t(`@WORKBENCH:暂无任务`)),1),D(`div`,or,e(o.$t(`@WORKBENCH:点击上方按钮新建`)),1),D(`div`,sr,[_(u,{type:`primary`,size:`small`,icon:o.Plus,loading:i.creatingTask,onClick:n[1]||=e=>o.emit(`create-task`)},{default:W(()=>[g(e(o.$t(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`,`loading`])])])):r(`v-if`,!0)],2)]),D(`section`,cr,[D(`header`,lr,[D(`span`,ur,e(o.$t(`@WORKBENCH:提示`)),1),D(`h3`,dr,e(o.$t(`@WORKBENCH:预置提示词`)),1),D(`span`,fr,e(o.availablePrompts.length),1),D(`button`,{class:`wb-section__action`,onClick:n[2]||=e=>o.emit(`open-create-prompt`),title:o.$t(`@WORKBENCH:新建提示词`),"aria-label":o.$t(`@WORKBENCH:新建提示词`)},[_(l,null,{default:W(()=>[_(o.Plus)]),_:1})],8,pr)]),D(`ul`,mr,[(A(!0),v(I,null,S(o.availablePrompts,t=>(A(),v(`li`,{key:t.id,class:`wb-prompt-item`},[D(`div`,hr,[_(l,null,{default:W(()=>[_(o.Memo)]),_:1})]),D(`span`,{class:`wb-prompt-item__name`,onClick:e=>o.emit(`open-edit-prompt`,t),title:t.content},e(t.name),9,gr),t.projectPath?(A(),v(`span`,{key:1,class:`wb-prompt-item__tag wb-prompt-item__tag--project`,title:t.projectPath},e(o.shortProjectLabel(t.projectPath)),9,vr)):(A(),v(`span`,{key:0,class:`wb-prompt-item__tag`,title:o.$t(`@WORKBENCH:全局(所有项目可用)`)},e(o.$t(`@WORKBENCH:全局(所有项目可用)`)),9,_r)),D(`button`,{class:`wb-prompt-item__del`,onClick:e=>o.emit(`delete-prompt`,t),title:o.$t(`@WORKBENCH:删除`),"aria-label":o.$t(`@WORKBENCH:删除`)},[_(l,null,{default:W(()=>[_(o.Close)]),_:1})],8,yr)]))),128)),o.availablePrompts.length===0?(A(),v(`li`,br,e(o.$t(`@WORKBENCH:暂无提示词`)),1)):r(`v-if`,!0)])])])}var Sr=Q(Un,[[`render`,xr],[`__scopeId`,`data-v-458e9455`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchSidebar.vue`]]);R();function Cr(){let e=Y([]),t=Y([]),n=Y(``),r=Y(!1),i=Y(!1);async function a(a=!1){a||(r.value=!0);try{let r=await fetch(`/api/workbench/projects`,{cache:`no-store`}).then(e=>e.json());return r?.success?(e.value=Array.isArray(r.projects)?r.projects:[],t.value=Array.isArray(r.tasks)?r.tasks:[],n.value=r.currentProjectPath||``,i.value=!0,!0):(a||B.error(r?.error||Z(`@WORKBENCH:读取项目列表失败`)),!1)}catch(e){return a||B.error(Z(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}finally{r.value=!1}}return{projects:e,boardTasks:t,currentProjectPath:n,loading:r,loaded:i,loadProjects:a}}R();function wr(){let e=Y(!0),t=Y([]),n=Y([]),r=Y([]),i=Y(null),a=Y(!1),o=Y(!1),s=Y(!1),c=Y(``),l=Y({});async function u(o=!1){try{let s=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return s?.success?(e.value=s.active!==!1,t.value=Array.isArray(s.instructions)?s.instructions:[],n.value=Array.isArray(s.activity)?s.activity:[],r.value=Array.isArray(s.running)?s.running:[],i.value=s.updatedAt||null,c.value=typeof s.defaultPrompt==`string`?s.defaultPrompt:``,l.value=s.projectPrompts&&typeof s.projectPrompts==`object`?s.projectPrompts:{},a.value=!0,!0):(o||B.error(s?.error||Z(`@WORKBENCH:读取编排状态失败`)),!1)}catch(e){return o||B.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:``,B.success(Z(`@WORKBENCH:已保存全局默认提示词`)),!0):(B.error(t?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return B.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:{},B.success(Z(`@WORKBENCH:已保存项目默认提示词`)),!0):(B.error(n?.error||Z(`@WORKBENCH:保存失败`)),!1)}catch(e){return B.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,B.success(e.value?Z(`@WORKBENCH:已恢复调度`):Z(`@WORKBENCH:已暂停调度,派发将只建任务不执行`)),!0):(e.value=n,B.error(r?.error||Z(`@WORKBENCH:切换调度状态失败`)),!1)}catch(t){return e.value=n,B.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}):(B.error(t?.error||Z(`@WORKBENCH:派发失败`)),null)}catch(e){return B.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 Tr=6e4,Er=60*Tr,Dr=24*Er;function Or(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<Tr?Z(`@WORKBENCH:刚刚`):r<Er?Z(`@WORKBENCH:N 分钟前`,{n:Math.floor(r/Tr)}):r<Dr?Z(`@WORKBENCH:N 小时前`,{n:Math.floor(r/Er)}):r<30*Dr?Z(`@WORKBENCH:N 天前`,{n:Math.floor(r/Dr)}):new Date(n).toLocaleDateString()}function kr(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 Ar(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function jr(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(Ar(n,a))return i;if(Ar(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}`}X(),R();var Mr=s({__name:`WorkbenchProjectPanel`,props:{projects:{type:Array,required:!0},selectedKey:{type:String,required:!0},loading:{type:Boolean,required:!0}},emits:[`select`],setup(e,{expose:n,emit:r}){n();let i=e,a=r,o=q(()=>[...i.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)})),s=Y(``),l=Y(!1),d=Y(!1),p=q(()=>!!s.value.trim()||l.value||d.value),m=q(()=>{let e=s.value.trim().toLowerCase();return o.value.filter(t=>l.value&&t.stats.total===0||d.value&&t.git&&t.git.isGitRepo===!1?!1:!e||t.name.toLowerCase().includes(e)||t.path.toLowerCase().includes(e))});function h(){s.value=``,l.value=!1,d.value=!1}let g=q(()=>i.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})),_=q(()=>g.value.total>0?Math.round(g.value.done/g.value.total*100):0);function v(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 y(e){return!!(e.git&&e.git.isGitRepo&&(e.git.detached||e.git.branch))}let b=Y(null),S=Y(null);function C(e,t){if(b.value===e.key){b.value=null;return}S.value=t.currentTarget,b.value=e.key}function w(){b.value=null}function T(e){if(!b.value)return;let t=e.target;if(t&&!S.value?.contains(t)){for(let e of Array.from(document.querySelectorAll(`.proj-open-menu`)))if(e.contains(t))return;b.value=null}}u(()=>document.addEventListener(`mousedown`,T,!0)),f(()=>document.removeEventListener(`mousedown`,T,!0));let D=Ne(),te=Y(!1),ne=Y(null);function re(e){return D.lastCheckedAt!==null&&!D.isToolAvailable(e)}async function O(e){w();let t=await Ge(e.path);t.success?B.success(t.message||Z(`@WORKBENCH:已在文件管理器中打开文件夹`)):B.error(t.error||Z(`@WORKBENCH:打开文件夹失败`))}async function k(e){w();let t=await Ue(e.path);t.success?B.success(t.message||Z(`@67CE7:已在终端中打开目录`)):B.error(t.error||Z(`@WORKBENCH:打开终端失败`))}async function A(e){w();let t=await Re(e.path);t.success?B.success(Z(`@WORKBENCH:已在新标签页启动 g ui`)):B.error(t.error||Z(`@WORKBENCH:启动 g ui 失败`))}async function ae(e){if(w(),e.name)try{await navigator.clipboard.writeText(e.name),B.success(Z(`@67CE7:已复制文件夹名称`))}catch{B.error(Z(`@67CE7:复制失败`))}}async function j(e,t,n){if(w(),!await Le()){B.warning(Z(`@67CE7:工具检测失败,请稍后重试`));return}if(!D.isToolAvailable(t)){ne.value=t,te.value=!0;return}let r=await Be(t,e.path,n);r.success?B.success(r.message||Z(`@67CE7:已用 {tool} 打开目录`,{tool:qe[t]})):B.error(`${Z(`@67CE7:打开失败: `)}${r.error??``}`)}let M={props:i,emit:a,ordered:o,query:s,onlyWithTasks:l,hideNonGit:d,filtering:p,visible:m,clearFilters:h,totals:g,overallProgress:_,gitLine:v,hasBranchIcon:y,openMenuKey:b,menuTriggerEl:S,toggleOpenMenu:C,closeOpenMenu:w,onDocumentMouseDown:T,toolsStore:D,installVisible:te,installTool:ne,toolMissing:re,openInFileManager:O,openInTerminal:k,launchGui:A,copyFolderName:ae,openWithTool:j,get $t(){return Z},get CopyDocument(){return ve},get Folder(){return we},get FolderOpened(){return E},get Grid(){return ee},get Monitor(){return x},get MoreFilled(){return c},get Promotion(){return t},get Search(){return ie},SvgIcon:Ae,ToolInstallDialog:Pe,get claudeCodeIcon(){return ze},get OPEN_WITH_TOOLS(){return He},get relativeTimeFromIso(){return Or}};return Object.defineProperty(M,"__isScriptSetup",{enumerable:!1,value:!0}),M}});b(),X(),G();var Nr={class:`proj`},Pr={class:`proj__head`},Fr={class:`proj__title`},Ir={class:`proj__count`},Lr={key:0,class:`proj__tools`},Rr={class:`proj__search`},zr=[`placeholder`,`aria-label`],Br={class:`proj__toggles`},Vr=[`aria-pressed`,`title`],Hr=[`aria-pressed`,`title`],Ur={class:`proj__list`},Wr=[`title`],Gr={class:`proj-item__row1`},Kr={class:`proj-item__name`},qr={key:0,class:`proj-item__running`,"aria-hidden":`true`},Jr={class:`proj-item__num`},Yr={class:`proj-item__row2`},Xr={key:0,class:`proj-item__running-text`},Zr={key:0,class:`proj-item__row3`},Qr={class:`proj-item__bar`,"aria-hidden":`true`},$r={class:`proj-item__progress-text`},ei=[`title`,`onClick`,`onKeydown`],ti={class:`proj-item__row1`},ni={class:`proj-item__name`},ri={class:`proj-item__signals`},ii={key:0,class:`proj-item__running`,"aria-hidden":`true`},ai={key:1,class:`proj-item__badge`},oi={class:`proj-item__row2`},si={key:0,class:`proj-chip proj-chip--missing`},ci={key:0,class:`proj-item__branch`},li={class:`proj-item__branch-name`},ui={key:1,class:`proj-chip proj-chip--ahead`},di={key:2,class:`proj-chip proj-chip--behind`},fi={key:3,class:`proj-chip proj-chip--dirty`},pi={class:`proj-item__time`},mi={key:0,class:`proj-item__row3`},hi={class:`proj-item__bar`,"aria-hidden":`true`},gi={class:`proj-item__progress-text`},_i={key:1,class:`proj-item__actions`},vi=[`title`,`aria-label`,`onClick`],yi=[`title`,`aria-label`,`aria-expanded`,`onClick`],bi=[`aria-label`],xi=[`onClick`,`onKeydown`],Si={class:`proj-menu__icon`},Ci={class:`proj-menu__label`},wi=[`onClick`,`onKeydown`],Ti={class:`proj-menu__icon`},Ei={class:`proj-menu__label`},Di=[`onClick`,`onKeydown`],Oi={class:`proj-menu__icon`},ki={class:`proj-menu__label`},Ai=[`onClick`,`onKeydown`],ji={class:`proj-menu__icon`},Mi={class:`proj-menu__label`},Ni={class:`proj-menu__title`,role:`presentation`},Pi=[`onClick`,`onKeydown`],Fi={class:`proj-menu__icon`},Ii={class:`proj-menu__label`},Li={key:0,class:`proj-menu__hint`},Ri=[`onClick`,`onKeydown`],zi={class:`proj-menu__icon`},Bi=[`src`],Vi={class:`proj-menu__label`},Hi={class:`proj-menu__hint`},Ui=[`onClick`,`onKeydown`],Wi={class:`proj-menu__icon`},Gi=[`src`],Ki={class:`proj-menu__label`},qi={key:0,class:`proj-empty`},Ji={class:`proj-empty__title`},Yi={class:`proj-empty__hint`},Xi={key:1,class:`proj-empty`},Zi={class:`proj-empty__title`};function Qi(t,n,i,o,s,c){let l=d,u=M;return A(),v(`section`,Nr,[D(`header`,Pr,[D(`h3`,Fr,e(o.$t(`@WORKBENCH:项目列表`)),1),D(`span`,Ir,[o.filtering?(A(),v(I,{key:0},[g(e(o.$t(`@WORKBENCH:匹配 {n}/{total} 个项目`,{n:o.visible.length,total:i.projects.length})),1)],64)):(A(),v(I,{key:1},[g(e(i.projects.length),1)],64))])]),r(` 一个项目都没有时不渲染筛选条:没有可筛的东西,这一行只是占位 `),i.projects.length>0?(A(),v(`div`,Lr,[D(`div`,Rr,[_(l,{class:`proj__search-icon`,"aria-hidden":`true`},{default:W(()=>[_(o.Search)]),_:1}),L(D(`input`,{"onUpdate:modelValue":n[0]||=e=>o.query=e,class:`proj__search-input`,type:`search`,placeholder:o.$t(`@WORKBENCH:搜索项目名称或路径`),"aria-label":o.$t(`@WORKBENCH:搜索项目名称或路径`),onKeydown:n[1]||=K(e=>o.query=``,[`esc`])},null,40,zr),[[z,o.query]])]),D(`div`,Br,[D(`button`,{type:`button`,class:U([`proj__toggle`,{"is-on":o.onlyWithTasks}]),"aria-pressed":o.onlyWithTasks,title:o.$t(`@WORKBENCH:只显示有任务的项目`),onClick:n[2]||=e=>o.onlyWithTasks=!o.onlyWithTasks},[D(`span`,null,e(o.$t(`@WORKBENCH:只看有任务`)),1)],10,Vr),D(`button`,{type:`button`,class:U([`proj__toggle`,{"is-on":o.hideNonGit}]),"aria-pressed":o.hideNonGit,title:o.$t(`@WORKBENCH:只显示 Git 仓库`),onClick:n[3]||=e=>o.hideNonGit=!o.hideNonGit},[D(`span`,null,e(o.$t(`@WORKBENCH:隐藏非 Git`)),1)],10,Hr)])])):r(`v-if`,!0),D(`ul`,Ur,[D(`li`,{class:U([`proj-item proj-item--all`,{"is-active":i.selectedKey===``}]),role:`button`,tabindex:`0`,title:o.$t(`@WORKBENCH:全部项目`),onClick:n[4]||=e=>o.emit(`select`,null),onKeydown:[n[5]||=K(J(e=>o.emit(`select`,null),[`prevent`]),[`enter`]),n[6]||=K(J(e=>o.emit(`select`,null),[`prevent`]),[`space`])]},[D(`div`,Gr,[_(l,{class:`proj-item__icon`},{default:W(()=>[_(o.Grid)]),_:1}),D(`span`,Kr,e(o.$t(`@WORKBENCH:全部项目`)),1),o.totals.running>0?(A(),v(`span`,qr)):r(`v-if`,!0),D(`span`,Jr,e(i.projects.length),1)]),D(`div`,Yr,[D(`span`,null,e(o.$t(`@WORKBENCH:{n} 个项目`,{n:i.projects.length})),1),o.totals.running>0?(A(),v(`span`,Xr,e(o.$t(`@WORKBENCH:{n} 个执行中`,{n:o.totals.running})),1)):r(`v-if`,!0)]),r(` 一个任务都没有时整行不渲染(「0/0 任务完成」+ 空进度条是纯噪声) `),o.totals.total>0?(A(),v(`div`,Zr,[D(`span`,Qr,[D(`i`,{class:`proj-item__bar-fill`,style:j({width:o.overallProgress+`%`})},null,4)]),D(`span`,$r,e(o.$t(`@WORKBENCH:{done}/{total} 任务完成`,{done:o.totals.done,total:o.totals.total})),1)])):r(`v-if`,!0)],42,Wr),(A(!0),v(I,null,S(o.visible,t=>(A(),v(`li`,{key:t.key,class:U([`proj-item`,{"is-active":t.key===i.selectedKey,"is-running":t.stats.runningJobs>0,"is-missing":t.exists===!1}]),role:`button`,tabindex:`0`,title:t.path,onClick:e=>o.emit(`select`,t),onKeydown:[K(J(e=>o.emit(`select`,t),[`self`,`prevent`]),[`enter`]),K(J(e=>o.emit(`select`,t),[`self`,`prevent`]),[`space`])]},[D(`div`,ti,[_(l,{class:`proj-item__icon`},{default:W(()=>[_(o.Folder)]),_:1}),D(`span`,ni,e(t.name),1),r(` 运行中 / 当前 这两个信号与 hover 才出现的操作按钮锚在同一个右端点:
|
|
21
21
|
hover 时整组淡出让位给按钮,而不是让图标压在徽标上 `),D(`span`,ri,[t.stats.runningJobs>0?(A(),v(`span`,ii)):r(`v-if`,!0),t.isCurrent?(A(),v(`span`,ai,e(o.$t(`@WORKBENCH:当前`)),1)):r(`v-if`,!0)])]),D(`div`,oi,[t.exists===!1?(A(),v(`span`,si,e(o.$t(`@WORKBENCH:目录不存在`)),1)):(A(),v(I,{key:1},[r(` gitLine 为空即"不是 Git 仓库":不给文字,也不给图标 `),o.gitLine(t)?(A(),v(`span`,ci,[o.hasBranchIcon(t)?(A(),a(o.SvgIcon,{key:0,"icon-class":`git-branch`,"class-name":`proj-item__branch-icon`})):r(`v-if`,!0),D(`span`,li,e(o.gitLine(t)),1)])):r(`v-if`,!0),t.git&&t.git.ahead>0?(A(),v(`span`,ui,`↑`+e(t.git.ahead),1)):r(`v-if`,!0),t.git&&t.git.behind>0?(A(),v(`span`,di,`↓`+e(t.git.behind),1)):r(`v-if`,!0),t.git&&t.git.changed>0?(A(),v(`span`,fi,`●`+e(t.git.changed),1)):r(`v-if`,!0)],64)),D(`span`,pi,e(o.relativeTimeFromIso(t.stats.lastActiveAt)),1)]),r(` 同上:这个项目一个任务都没有就不给进度行 `),t.stats.total>0?(A(),v(`div`,mi,[D(`span`,hi,[D(`i`,{class:`proj-item__bar-fill`,style:j({width:t.stats.progress+`%`})},null,4)]),D(`span`,gi,e(o.$t(`@WORKBENCH:{done}/{total} 任务完成`,{done:t.stats.done,total:t.stats.total})),1)])):r(`v-if`,!0),r(` 打开动作:与行主体平级,绝对定位锚在 row1 右端(不占位,否则「当前」徽标
|
|
22
22
|
永远离右边缘一条);.stop 阻止冒泡到行的选中逻辑。目录都不存在了就不渲染——
|
|
23
23
|
点了只会弹一个「无法打开目录」的报错。
|
|
@@ -31,18 +31,18 @@ import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,Bt as t,C as n,Dn as r,E a
|
|
|
31
31
|
空着会让人以为项目列表坏了,而"没有匹配"和"一个项目都没有"是两件事。
|
|
32
32
|
刻意写成两个互斥的 v-if(而不是 v-else-if):条件里带上了 projects.length,
|
|
33
33
|
读代码时不用回头找上一段才敢确定它们不重叠。 `),!i.loading&&i.projects.length>0&&o.visible.length===0?(A(),v(`li`,Xi,[D(`p`,Zi,e(o.$t(`@WORKBENCH:没有匹配的项目`)),1),D(`button`,{type:`button`,class:`proj-empty__clear`,onClick:o.clearFilters},e(o.$t(`@WORKBENCH:清除筛选`)),1)])):r(`v-if`,!0)]),r(` 未安装的工具:复用顶栏那套安装引导(同一个组件),不在这里另写一份说明。
|
|
34
|
-
挂在面板根上只渲染一份,而不是每行一个 —— 同时最多只可能开一个。 `),_(o.ToolInstallDialog,{modelValue:o.installVisible,"onUpdate:modelValue":n[7]||=e=>o.installVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])}var $i=Q(Mr,[[`render`,Qi],[`__scopeId`,`data-v-de1af726`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchProjectPanel.vue`]]);X(),R();var ea=s({__name:`WorkbenchAgentPanel`,props:{running:{type:Array,required:!0}},setup(e,{expose:t}){t();let n=e,r=Y(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()}P(()=>n.running.length,o,{immediate:!0}),f(a);let s={props:n,now:r,get timer(){return i},set timer(e){i=e},stopTimer:a,syncTimer:o,rows:q(()=>n.running.map(e=>({...e,elapsed:kr(e.startedAt,null,r.value)}))),get $t(){return Z}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}});b(),X();var ta={class:`agents`},na={class:`agents__head`},ra={class:`agents__title`},ia={class:`agents__list`},aa={class:`agent-item__row1`},oa=[`title`],sa={class:`agent-item__status`},ca=[`title`],la={class:`agent-item__row3`},ua={key:0,class:`agent-item__pid`},da={class:`agent-item__elapsed`},fa={key:0,class:`agents-empty`};function pa(t,n,i,a,o,s){return A(),v(`section`,ta,[D(`header`,na,[D(`h3`,ra,e(a.$t(`@WORKBENCH:执行监控`)),1),D(`span`,{class:U([`agents__count`,{"is-live":i.running.length>0}])},e(a.$t(`@WORKBENCH:{n} 个执行中`,{n:i.running.length})),3)]),D(`ul`,ia,[(A(!0),v(I,null,S(a.rows,t=>(A(),v(`li`,{key:t.jobId,class:`agent-item`},[D(`div`,aa,[D(`span`,{class:U([`agent-item__dot`,{"is-pending":t.status===`pending`}]),"aria-hidden":`true`},null,2),D(`span`,{class:`agent-item__project`,title:t.projectName},e(t.projectName||`—`),9,oa),D(`span`,sa,e(t.status===`pending`?a.$t(`@WORKBENCH:排队中`):a.$t(`@WORKBENCH:执行中`)),1)]),D(`p`,{class:`agent-item__task`,title:t.taskTitle},e(t.taskTitle||a.$t(`@WORKBENCH:未命名任务`)),9,ca),D(`div`,la,[t.pid?(A(),v(`span`,ua,`PID `+e(t.pid),1)):r(`v-if`,!0),D(`span`,da,e(t.elapsed),1)])]))),128)),i.running.length===0?(A(),v(`li`,fa,e(a.$t(`@WORKBENCH:暂无执行中的任务`)),1)):r(`v-if`,!0)])])}var ma=Q(ea,[[`render`,pa],[`__scopeId`,`data-v-09820e5d`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchAgentPanel.vue`]]);X(),R();var ha=`wb.boardView.v1`,ga=s({__name:`WorkbenchKanban`,props:{tasks:{type:Array,required:!0},projectLabels:{type:Object,required:!0},showProjectLabel:{type:Boolean,required:!0}},emits:[`open-task`,`run-task`,`delete-task`,`create-task`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y((()=>{try{return localStorage.getItem(ha)===`list`?`list`:`kanban`}catch{return`kanban`}})());P(a,e=>{try{localStorage.setItem(ha,e)}catch{}});let o=Y(``),s=Y(!1),c=[{key:`todo`,labelKey:`@WORKBENCH:待处理`},{key:`doing`,labelKey:`@WORKBENCH:进行中`},{key:`done`,labelKey:`@WORKBENCH:已完成`}],l=q(()=>{let e=o.value.trim().toLowerCase();return r.tasks.filter(t=>s.value&&t.lastJobStatus!==`error`?!1:!e||(t.title||``).toLowerCase().includes(e)||(t.desc||``).toLowerCase().includes(e))}),u=q(()=>c.map(e=>e.key===`done`?{...e,tasks:l.value.filter(t=>t.column===e.key).sort(f)}:{...e,tasks:l.value.filter(t=>t.column===e.key)}));function d(e){return String(e.lastJobEndedAt||e.updatedAt||e.createdAt||``)}function f(e,t){return d(t).localeCompare(d(e))}function p(e){return e.column===`done`?d(e):e.updatedAt||e.createdAt||``}let m=q(()=>({gridTemplateColumns:`repeat(${u.value.length}, minmax(0, 1fr))`}));function h(e){return(e.title||``).trim()||(e.desc||``).replace(/\s+/g,` `).trim()}function g(e){return r.projectLabels[e.projectPath]||``}function _(e){return e.lastJobStatus===`error`}let v={props:r,emit:i,VIEW_KEY:ha,view:a,search:o,onlyErrors:s,COLUMNS:c,filtered:l,columns:u,doneAt:d,byDoneAtDesc:f,cardTime:p,columnsStyle:m,cardTitle:h,projectLabel:g,hasError:_,get $t(){return Z},get Search(){return ie},get relativeTimeFromIso(){return Or}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});b(),X(),G();var _a={class:`kb`},va={class:`kb__toolbar`},ya={class:`kb__views`,role:`tablist`},ba=[`aria-selected`],xa=[`aria-selected`],Sa={class:`kb__filters`},Ca=[`title`],wa={class:`kb__search`},Ta=[`placeholder`],Ea={class:`kb-col__head`},Da={class:`kb-col__title`},Oa={class:`kb-col__count`},ka={class:`kb-col__list`},Aa=[`onClick`],ja={class:`kb-card__row1`},Ma={key:0,class:`kb-card__running`,"aria-hidden":`true`},Na={class:`kb-card__time`},Pa=[`title`],Fa={key:0,class:`kb-card__project`},Ia={class:`kb-card__actions`},La=[`title`,`onClick`],Ra=[`title`,`aria-label`,`onClick`],za={key:0,class:`kb-col__empty`},Ba={key:1},Va={class:`kb__table-wrap`},Ha={class:`kb-table`},Ua={class:`kb-table__th`},Wa={class:`kb-table__th kb-table__th--narrow`},Ga={class:`kb-table__th kb-table__th--narrow`},Ka=[`onClick`],qa={class:`kb-table__td`},Ja={class:`kb-table__name`},Ya={key:0,class:`kb-table__project`},Xa={class:`kb-table__td`},Za={class:`kb-table__td kb-table__td--num`},Qa={key:0},$a={class:`kb-table__td kb-table__empty`,colspan:`3`};function eo(t,n,i,a,o,s){let c=d;return A(),v(`div`,_a,[D(`div`,va,[D(`div`,ya,[D(`button`,{type:`button`,role:`tab`,class:U([`kb__view-btn`,{"is-active":a.view===`kanban`}]),"aria-selected":a.view===`kanban`,onClick:n[0]||=e=>a.view=`kanban`},e(a.$t(`@WORKBENCH:看板视图`)),11,ba),D(`button`,{type:`button`,role:`tab`,class:U([`kb__view-btn`,{"is-active":a.view===`list`}]),"aria-selected":a.view===`list`,onClick:n[1]||=e=>a.view=`list`},e(a.$t(`@WORKBENCH:列表视图`)),11,xa)]),D(`div`,Sa,[D(`label`,{class:`kb__check`,title:a.$t(`@WORKBENCH:只显示最近一次执行报错的任务`)},[L(D(`input`,{type:`checkbox`,"onUpdate:modelValue":n[2]||=e=>a.onlyErrors=e},null,512),[[H,a.onlyErrors]]),D(`span`,null,e(a.$t(`@WORKBENCH:仅看报错`)),1)],8,Ca),D(`div`,wa,[_(c,{class:`kb__search-icon`},{default:W(()=>[_(a.Search)]),_:1}),L(D(`input`,{class:`kb__search-input`,type:`search`,"onUpdate:modelValue":n[3]||=e=>a.search=e,placeholder:a.$t(`@WORKBENCH:搜索任务标题或描述`)},null,8,Ta),[[z,a.search]])])])]),r(` 看板视图 `),a.view===`kanban`?(A(),v(`div`,{key:0,class:`kb__columns`,style:j(a.columnsStyle)},[(A(!0),v(I,null,S(a.columns,t=>(A(),v(`section`,{key:t.key,class:U([`kb-col`,`kb-col--`+t.key])},[D(`header`,Ea,[n[5]||=D(`span`,{class:`kb-col__dot`,"aria-hidden":`true`},null,-1),D(`h3`,Da,e(a.$t(t.labelKey)),1),D(`span`,Oa,e(t.tasks.length),1)]),D(`ul`,ka,[(A(!0),v(I,null,S(t.tasks,t=>(A(),v(`li`,{key:t.id,class:U([`kb-card`,{"is-running":t.runningJobs>0,"has-error":a.hasError(t)}]),onClick:e=>a.emit(`open-task`,t)},[D(`div`,ja,[t.runningJobs>0?(A(),v(`span`,Ma)):r(`v-if`,!0),D(`span`,Na,e(a.relativeTimeFromIso(a.cardTime(t))),1)]),D(`p`,{class:`kb-card__title`,title:a.cardTitle(t)},e(a.cardTitle(t)||a.$t(`@WORKBENCH:未命名任务`)),9,Pa),i.showProjectLabel&&a.projectLabel(t)?(A(),v(`p`,Fa,e(a.projectLabel(t)),1)):r(`v-if`,!0),D(`div`,Ia,[t.runningJobs===0?(A(),v(`button`,{key:0,type:`button`,class:`kb-card__btn`,title:a.$t(`@WORKBENCH:执行`),onClick:J(e=>a.emit(`run-task`,t),[`stop`])},e(a.$t(`@WORKBENCH:执行`)),9,La)):r(`v-if`,!0),D(`button`,{type:`button`,class:`kb-card__btn kb-card__btn--danger`,title:a.$t(`@WORKBENCH:删除`),"aria-label":a.$t(`@WORKBENCH:删除`),onClick:J(e=>a.emit(`delete-task`,t),[`stop`])},`×`,8,Ra)])],10,Aa))),128)),t.tasks.length===0?(A(),v(`li`,za,[t.key===`todo`?(A(),v(`button`,{key:0,type:`button`,class:`kb-col__empty-btn`,onClick:n[4]||=e=>a.emit(`create-task`)},e(a.$t(`@WORKBENCH:新建任务`)),1)):(A(),v(`span`,Ba,e(a.$t(`@WORKBENCH:暂无任务`)),1))])):r(`v-if`,!0)])],2))),128))],4)):(A(),v(I,{key:1},[r(` 列表视图 `),D(`div`,Va,[D(`table`,Ha,[D(`thead`,null,[D(`tr`,null,[D(`th`,Ua,e(a.$t(`@WORKBENCH:任务`)),1),D(`th`,Wa,e(a.$t(`@WORKBENCH:状态`)),1),D(`th`,Ga,e(a.$t(`@WORKBENCH:更新时间`)),1)])]),D(`tbody`,null,[(A(!0),v(I,null,S(a.filtered,t=>(A(),v(`tr`,{key:t.id,class:`kb-table__row`,onClick:e=>a.emit(`open-task`,t)},[D(`td`,qa,[D(`span`,Ja,e(a.cardTitle(t)||a.$t(`@WORKBENCH:未命名任务`)),1),i.showProjectLabel&&a.projectLabel(t)?(A(),v(`span`,Ya,e(a.projectLabel(t)),1)):r(`v-if`,!0)]),D(`td`,Xa,[D(`span`,{class:U([`kb-table__status`,`is-`+t.column])},e(a.$t(a.COLUMNS.find(e=>e.key===t.column).labelKey)),3)]),D(`td`,Za,e(a.relativeTimeFromIso(t.updatedAt||t.createdAt)),1)],8,Ka))),128)),a.filtered.length===0?(A(),v(`tr`,Qa,[D(`td`,$a,e(a.$t(`@WORKBENCH:暂无任务`)),1)])):r(`v-if`,!0)])])])],2112))])}var to=Q(ga,[[`render`,eo],[`__scopeId`,`data-v-0b8fc27c`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchKanban.vue`]]);X(),R();var no=`/api/workbench/orchestrator/attachments`,ro=`wb.ocInputHeight.v1`,io=76,ao=20,oo=s({__name:`OrchestratorConsole`,props:{active:{type:Boolean,required:!0},activity:{type:Array,required:!0},runningCount:{type:Number,required:!0},selectedProject:{type:[Object,null],required:!0},dispatching:{type:Boolean,required:!0},togglingSchedule:{type:Boolean,required:!0},todayDone:{type:Number,required:!0},collapsed:{type:Boolean,required:!1},defaultPrompt:{type:String,required:!1},projectPrompts:{type:Object,required:!1}},emits:[`toggle-schedule`,`toggle-collapse`,`open-prompt-settings`,`dispatch`],setup(e,{expose:n,emit:r}){let i=e,a=r,o=Y(``),s=Y(!0),c=Y(!0),l=Me(),d=q(()=>({claude:l.claudeAvailable,opencode:l.opencodeAvailable})),p=Y(Ke());function h(){if(d.value[p.value]){Ie(p.value);return}let e=Object.keys(d.value).find(e=>d.value[e]);e&&(p.value=e)}function g(e){return We.find(t=>t.id===e)?.name||e}function _(e){p.value=e,h()}let v=Y([]),y=q(()=>({kind:`draft`,list:v.value,replace:e=>{v.value=e}})),{isUploading:b,isImageAttachment:x,humanSize:S,onAttachmentPaste:C,onAttachmentDrop:w,removeAttachment:T,pickAttachmentFile:E}=An(),D=q(()=>b(`draft`)),ee=Y(!1);function te(e){e.stopPropagation(),C(e,y.value)}function ne(e){ee.value=!1,w(e,y.value)}function re(){E(y.value)}function O(e){T(y.value,e)}function k(){v.value=[]}n({clearAttachments:k});let ie=q(()=>i.selectedProject?.key||``),A=q(()=>(i.defaultPrompt||``).trim()),ae=q(()=>{let e=ie.value;return e?(i.projectPrompts?.[e]?.prompt||``).trim():``}),j=q(()=>Object.values(i.projectPrompts||{}).some(e=>(e?.prompt||``).trim().length>0)),M=q(()=>!!A.value||j.value),oe=q(()=>{let e=!!A.value,t=ie.value?ae.value?`project`:`none`:j.value?`target`:`none`;return Z(e&&t===`project`?`@WORKBENCH:全局 + 本项目`:e&&t===`target`?`@WORKBENCH:全局 + 落点项目`:e?`@WORKBENCH:全局`:t===`project`?`@WORKBENCH:本项目`:t===`target`?`@WORKBENCH:落点项目`:`@WORKBENCH:未设置`)}),se=q(()=>o.value.trim().length>0&&!i.dispatching&&!D.value);function N(){se.value&&(a(`dispatch`,{text:o.value.trim(),autoRun:s.value,attachments:v.value,projectPath:i.selectedProject?i.selectedProject.path:``,useDefaultPrompt:c.value,executor:p.value}),o.value=``)}function P(e){e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||(e.preventDefault(),N())}function F(){try{let e=localStorage.getItem(ro);if(!e)return null;let t=Number(e);return Number.isFinite(t)&&t>=io?Math.round(t):null}catch{return null}}let ce=Y(null),I=Y(F()),L=q(()=>{let e={};return I.value&&(e.height=`${I.value}px`),e}),le=null,R=!1,de=!0;function z(e){let t=ce.value;if(!t)return;let n=t.getBoundingClientRect();R=n.right-e.clientX<=ao&&n.bottom-e.clientY<=ao}function pe(){R=!1}function B(e){let t=Math.round(e.offsetHeight);if(!(t<io||t===I.value)){I.value=t;try{localStorage.setItem(ro,String(t))}catch{}}}u(()=>{let e=ce.value;e&&(window.addEventListener(`mouseup`,pe),!(typeof ResizeObserver>`u`)&&(le=new ResizeObserver(()=>{if(de){de=!1;return}let t=parseFloat(getComputedStyle(e).maxHeight),n=Number.isFinite(t)&&e.offsetHeight>=t-1;(R||!n)&&B(e)}),le.observe(e)))}),f(()=>{window.removeEventListener(`mouseup`,pe),le?.disconnect(),le=null});function me(e){let t=e.taskTitle||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 V={user:`@WORKBENCH:用户派发`,dispatch:`@WORKBENCH:派发`,done:`@WORKBENCH:完成`,error:`@WORKBENCH:出错`,cancelled:`@WORKBENCH:取消`};function H(e){return e.kind===`user`?e.instructionStatus===`accepted`?Z(`@WORKBENCH:已建任务并开始执行`):e.instructionStatus===`rejected`?Z(`@WORKBENCH:被拒绝:{reason}`,{reason:e.reason||``}):e.reason||Z(`@WORKBENCH:已建任务(未执行)`):``}function U(e){switch(e.targetSource){case`mention`:return Z(`@WORKBENCH:指令里提到了它`);case`agent`:return Z(`@WORKBENCH:主 Agent 判断`);case`default`:return Z(`@WORKBENCH:没识别出项目,用了默认项目`);default:return``}}function _e(e){switch(e.promptSource){case`global`:return Z(`@WORKBENCH:附带全局默认提示词`);case`project`:return Z(`@WORKBENCH:附带项目默认提示词`);case`both`:return Z(`@WORKBENCH:附带全局 + 项目默认提示词`);default:return``}}let W={props:i,emit:a,draft:o,autoRun:s,useDefaultPrompt:c,toolsStore:l,executorAvailability:d,selectedExecutor:p,onExecutorChange:h,executorName:g,onExecutorPick:_,draftAttachments:v,DRAFT_RAW_BASE:no,attachTarget:y,isUploading:b,isImageAttachment:x,humanSize:S,onAttachmentPaste:C,onAttachmentDrop:w,removeAttachment:T,pickAttachmentFile:E,attachBusy:D,attachDragging:ee,onPaste:te,onDrop:ne,onPickAttachment:re,onRemoveAttachment:O,clearAttachments:k,projectKey:ie,globalPromptText:A,projectPromptText:ae,anyProjectPrompt:j,anyPromptConfigured:M,promptStateLabel:oe,canSend:se,send:N,onInputKeydown:P,INPUT_H_KEY:ro,OC_INPUT_MIN_H:io,readInputH:F,inputRef:ce,inputH:I,inputStyle:L,get inputRO(){return le},set inputRO(e){le=e},get inputDragging(){return R},set inputDragging(e){R=e},get inputROFirst(){return de},set inputROFirst(e){de=e},INPUT_GRIP_PX:ao,onInputMouseDown:z,onWindowMouseUp:pe,commitInputH:B,describe:me,KIND_LABEL:V,instructionNote:H,targetReason:U,promptNote:_e,gitSummary:q(()=>{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)}),get $t(){return Z},get Paperclip(){return m},get Promotion(){return t},get Expand(){return fe},get Fold(){return Se},get Setting(){return ge},get ArrowDown(){return he},get Check(){return ue},TaskExecutorIcon:Fe,get clockFromIso(){return jr},get relativeTimeFromIso(){return Or},AttachmentZone:ct,get TASK_EXECUTOR_OPTIONS(){return We}};return Object.defineProperty(W,"__isScriptSetup",{enumerable:!1,value:!0}),W}});X(),b(),G();var so=[`title`,`aria-label`],co={class:`oc__rail-text`},lo={class:`oc__head`},uo={class:`oc__title`},fo=[`disabled`,`title`],po=[`title`,`aria-label`],mo={class:`oc__state-label`},ho={class:`oc__state-value`},go={class:`oc__state-meta`},_o={class:`oc__feed`},vo={class:`oc__feed-title`},yo={class:`oc__feed-list`},bo={class:`oc-row__head`},xo={class:`oc-row__kind`},So={class:`oc-row__time`},Co={class:`oc-row__text`},wo={key:0,class:`oc-row__note`},To={key:1,class:`oc-row__note`},Eo={key:0},Do={key:2,class:`oc-row__note`},Oo=[`title`],ko={key:4,class:`oc-row__note`},Ao={key:0,class:`oc-empty`},jo={class:`oc__git`},Mo={class:`oc__feed-title`},No={class:`oc__git-name`},Po={class:`oc__git-list`},Fo={class:`oc__git-label`},Io={class:`oc__git-label`},Lo={class:`oc__git-value`},Ro={class:`oc__git-label`},zo={class:`oc__git-value`},Bo=[`placeholder`],Vo={class:`oc__compose-foot`},Ho=[`disabled`,`title`,`aria-label`],Uo=[`title`,`aria-label`],Wo=[`title`],Go=[`title`],Ko=[`title`,`aria-label`],qo={class:`oc__executor-item`},Jo={class:`oc__executor-item__name`},Yo={key:1,class:`oc__executor-item__missing`},Xo=[`disabled`],Zo={class:`oc__hint`};function Qo(t,i,o,s,c,l){let u=d,f=n,p=Ce,m=w;return A(),v(`aside`,{class:U([`oc`,{"is-collapsed":o.collapsed}])},[r(` 折叠后的收纳条:只剩一枚展开按钮 + 竖排标题,宽度收到 32px。
|
|
34
|
+
挂在面板根上只渲染一份,而不是每行一个 —— 同时最多只可能开一个。 `),_(o.ToolInstallDialog,{modelValue:o.installVisible,"onUpdate:modelValue":n[7]||=e=>o.installVisible=e,tool:o.installTool},null,8,[`modelValue`,`tool`])])}var $i=Q(Mr,[[`render`,Qi],[`__scopeId`,`data-v-de1af726`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchProjectPanel.vue`]]);X(),R();var ea=s({__name:`WorkbenchAgentPanel`,props:{running:{type:Array,required:!0}},setup(e,{expose:t}){t();let n=e,r=Y(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()}P(()=>n.running.length,o,{immediate:!0}),f(a);let s={props:n,now:r,get timer(){return i},set timer(e){i=e},stopTimer:a,syncTimer:o,rows:q(()=>n.running.map(e=>({...e,elapsed:kr(e.startedAt,null,r.value)}))),get $t(){return Z}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}});b(),X();var ta={class:`agents`},na={class:`agents__head`},ra={class:`agents__title`},ia={class:`agents__list`},aa={class:`agent-item__row1`},oa=[`title`],sa={class:`agent-item__status`},ca=[`title`],la={class:`agent-item__row3`},ua={key:0,class:`agent-item__pid`},da={class:`agent-item__elapsed`},fa={key:0,class:`agents-empty`};function pa(t,n,i,a,o,s){return A(),v(`section`,ta,[D(`header`,na,[D(`h3`,ra,e(a.$t(`@WORKBENCH:执行监控`)),1),D(`span`,{class:U([`agents__count`,{"is-live":i.running.length>0}])},e(a.$t(`@WORKBENCH:{n} 个执行中`,{n:i.running.length})),3)]),D(`ul`,ia,[(A(!0),v(I,null,S(a.rows,t=>(A(),v(`li`,{key:t.jobId,class:`agent-item`},[D(`div`,aa,[D(`span`,{class:U([`agent-item__dot`,{"is-pending":t.status===`pending`}]),"aria-hidden":`true`},null,2),D(`span`,{class:`agent-item__project`,title:t.projectName},e(t.projectName||`—`),9,oa),D(`span`,sa,e(t.status===`pending`?a.$t(`@WORKBENCH:排队中`):a.$t(`@WORKBENCH:执行中`)),1)]),D(`p`,{class:`agent-item__task`,title:t.taskTitle},e(t.taskTitle||a.$t(`@WORKBENCH:未命名任务`)),9,ca),D(`div`,la,[t.pid?(A(),v(`span`,ua,`PID `+e(t.pid),1)):r(`v-if`,!0),D(`span`,da,e(t.elapsed),1)])]))),128)),i.running.length===0?(A(),v(`li`,fa,e(a.$t(`@WORKBENCH:暂无执行中的任务`)),1)):r(`v-if`,!0)])])}var ma=Q(ea,[[`render`,pa],[`__scopeId`,`data-v-09820e5d`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchAgentPanel.vue`]]);X(),R();var ha=`wb.boardView.v1`,ga=s({__name:`WorkbenchKanban`,props:{tasks:{type:Array,required:!0},projectLabels:{type:Object,required:!0},showProjectLabel:{type:Boolean,required:!0}},emits:[`open-task`,`run-task`,`delete-task`,`create-task`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y((()=>{try{return localStorage.getItem(ha)===`list`?`list`:`kanban`}catch{return`kanban`}})());P(a,e=>{try{localStorage.setItem(ha,e)}catch{}});let o=Y(``),s=Y(!1),c=[{key:`todo`,labelKey:`@WORKBENCH:待处理`},{key:`doing`,labelKey:`@WORKBENCH:进行中`},{key:`done`,labelKey:`@WORKBENCH:已完成`}],l=q(()=>{let e=o.value.trim().toLowerCase();return r.tasks.filter(t=>s.value&&t.lastJobStatus!==`error`?!1:!e||(t.title||``).toLowerCase().includes(e)||(t.desc||``).toLowerCase().includes(e))}),u=q(()=>c.map(e=>e.key===`done`?{...e,tasks:l.value.filter(t=>t.column===e.key).sort(f)}:{...e,tasks:l.value.filter(t=>t.column===e.key)}));function d(e){return String(e.lastJobEndedAt||e.updatedAt||e.createdAt||``)}function f(e,t){return d(t).localeCompare(d(e))}function p(e){return e.column===`done`?d(e):e.updatedAt||e.createdAt||``}let m=q(()=>({gridTemplateColumns:`repeat(${u.value.length}, minmax(0, 1fr))`}));function h(e){return(e.title||``).trim()||(e.desc||``).replace(/\s+/g,` `).trim()}function g(e){return r.projectLabels[e.projectPath]||``}function _(e){return e.lastJobStatus===`error`}let v={props:r,emit:i,VIEW_KEY:ha,view:a,search:o,onlyErrors:s,COLUMNS:c,filtered:l,columns:u,doneAt:d,byDoneAtDesc:f,cardTime:p,columnsStyle:m,cardTitle:h,projectLabel:g,hasError:_,get $t(){return Z},get Search(){return ie},get relativeTimeFromIso(){return Or}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}});b(),X(),G();var _a={class:`kb`},va={class:`kb__toolbar`},ya={class:`kb__views`,role:`tablist`},ba=[`aria-selected`],xa=[`aria-selected`],Sa={class:`kb__filters`},Ca=[`title`],wa={class:`kb__search`},Ta=[`placeholder`],Ea={class:`kb-col__head`},Da={class:`kb-col__title`},Oa={class:`kb-col__count`},ka={class:`kb-col__list`},Aa=[`onClick`],ja={class:`kb-card__row1`},Ma={key:0,class:`kb-card__running`,"aria-hidden":`true`},Na={class:`kb-card__time`},Pa=[`title`],Fa={key:0,class:`kb-card__project`},Ia={class:`kb-card__actions`},La=[`title`,`onClick`],Ra=[`title`,`aria-label`,`onClick`],za={key:0,class:`kb-col__empty`},Ba={key:1},Va={class:`kb__table-wrap`},Ha={class:`kb-table`},Ua={class:`kb-table__th`},Wa={class:`kb-table__th kb-table__th--narrow`},Ga={class:`kb-table__th kb-table__th--narrow`},Ka=[`onClick`],qa={class:`kb-table__td`},Ja={class:`kb-table__name`},Ya={key:0,class:`kb-table__project`},Xa={class:`kb-table__td`},Za={class:`kb-table__td kb-table__td--num`},Qa={key:0},$a={class:`kb-table__td kb-table__empty`,colspan:`3`};function eo(t,n,i,a,o,s){let c=d;return A(),v(`div`,_a,[D(`div`,va,[D(`div`,ya,[D(`button`,{type:`button`,role:`tab`,class:U([`kb__view-btn`,{"is-active":a.view===`kanban`}]),"aria-selected":a.view===`kanban`,onClick:n[0]||=e=>a.view=`kanban`},e(a.$t(`@WORKBENCH:看板视图`)),11,ba),D(`button`,{type:`button`,role:`tab`,class:U([`kb__view-btn`,{"is-active":a.view===`list`}]),"aria-selected":a.view===`list`,onClick:n[1]||=e=>a.view=`list`},e(a.$t(`@WORKBENCH:列表视图`)),11,xa)]),D(`div`,Sa,[D(`label`,{class:`kb__check`,title:a.$t(`@WORKBENCH:只显示最近一次执行报错的任务`)},[L(D(`input`,{type:`checkbox`,"onUpdate:modelValue":n[2]||=e=>a.onlyErrors=e},null,512),[[H,a.onlyErrors]]),D(`span`,null,e(a.$t(`@WORKBENCH:仅看报错`)),1)],8,Ca),D(`div`,wa,[_(c,{class:`kb__search-icon`},{default:W(()=>[_(a.Search)]),_:1}),L(D(`input`,{class:`kb__search-input`,type:`search`,"onUpdate:modelValue":n[3]||=e=>a.search=e,placeholder:a.$t(`@WORKBENCH:搜索任务标题或描述`)},null,8,Ta),[[z,a.search]])])])]),r(` 看板视图 `),a.view===`kanban`?(A(),v(`div`,{key:0,class:`kb__columns`,style:j(a.columnsStyle)},[(A(!0),v(I,null,S(a.columns,t=>(A(),v(`section`,{key:t.key,class:U([`kb-col`,`kb-col--`+t.key])},[D(`header`,Ea,[n[5]||=D(`span`,{class:`kb-col__dot`,"aria-hidden":`true`},null,-1),D(`h3`,Da,e(a.$t(t.labelKey)),1),D(`span`,Oa,e(t.tasks.length),1)]),D(`ul`,ka,[(A(!0),v(I,null,S(t.tasks,t=>(A(),v(`li`,{key:t.id,class:U([`kb-card`,{"is-running":t.runningJobs>0,"has-error":a.hasError(t)}]),onClick:e=>a.emit(`open-task`,t)},[D(`div`,ja,[t.runningJobs>0?(A(),v(`span`,Ma)):r(`v-if`,!0),D(`span`,Na,e(a.relativeTimeFromIso(a.cardTime(t))),1)]),D(`p`,{class:`kb-card__title`,title:a.cardTitle(t)},e(a.cardTitle(t)||a.$t(`@WORKBENCH:未命名任务`)),9,Pa),i.showProjectLabel&&a.projectLabel(t)?(A(),v(`p`,Fa,e(a.projectLabel(t)),1)):r(`v-if`,!0),D(`div`,Ia,[t.runningJobs===0?(A(),v(`button`,{key:0,type:`button`,class:`kb-card__btn`,title:a.$t(`@WORKBENCH:执行`),onClick:J(e=>a.emit(`run-task`,t),[`stop`])},e(a.$t(`@WORKBENCH:执行`)),9,La)):r(`v-if`,!0),D(`button`,{type:`button`,class:`kb-card__btn kb-card__btn--danger`,title:a.$t(`@WORKBENCH:删除`),"aria-label":a.$t(`@WORKBENCH:删除`),onClick:J(e=>a.emit(`delete-task`,t),[`stop`])},`×`,8,Ra)])],10,Aa))),128)),t.tasks.length===0?(A(),v(`li`,za,[t.key===`todo`?(A(),v(`button`,{key:0,type:`button`,class:`kb-col__empty-btn`,onClick:n[4]||=e=>a.emit(`create-task`)},e(a.$t(`@WORKBENCH:新建任务`)),1)):(A(),v(`span`,Ba,e(a.$t(`@WORKBENCH:暂无任务`)),1))])):r(`v-if`,!0)])],2))),128))],4)):(A(),v(I,{key:1},[r(` 列表视图 `),D(`div`,Va,[D(`table`,Ha,[D(`thead`,null,[D(`tr`,null,[D(`th`,Ua,e(a.$t(`@WORKBENCH:任务`)),1),D(`th`,Wa,e(a.$t(`@WORKBENCH:状态`)),1),D(`th`,Ga,e(a.$t(`@WORKBENCH:更新时间`)),1)])]),D(`tbody`,null,[(A(!0),v(I,null,S(a.filtered,t=>(A(),v(`tr`,{key:t.id,class:`kb-table__row`,onClick:e=>a.emit(`open-task`,t)},[D(`td`,qa,[D(`span`,Ja,e(a.cardTitle(t)||a.$t(`@WORKBENCH:未命名任务`)),1),i.showProjectLabel&&a.projectLabel(t)?(A(),v(`span`,Ya,e(a.projectLabel(t)),1)):r(`v-if`,!0)]),D(`td`,Xa,[D(`span`,{class:U([`kb-table__status`,`is-`+t.column])},e(a.$t(a.COLUMNS.find(e=>e.key===t.column).labelKey)),3)]),D(`td`,Za,e(a.relativeTimeFromIso(t.updatedAt||t.createdAt)),1)],8,Ka))),128)),a.filtered.length===0?(A(),v(`tr`,Qa,[D(`td`,$a,e(a.$t(`@WORKBENCH:暂无任务`)),1)])):r(`v-if`,!0)])])])],2112))])}var to=Q(ga,[[`render`,eo],[`__scopeId`,`data-v-0b8fc27c`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchKanban.vue`]]);X(),R();var no=`/api/workbench/orchestrator/attachments`,ro=`wb.ocInputHeight.v1`,io=76,ao=20,oo=s({__name:`OrchestratorConsole`,props:{active:{type:Boolean,required:!0},activity:{type:Array,required:!0},runningCount:{type:Number,required:!0},selectedProject:{type:[Object,null],required:!0},dispatching:{type:Boolean,required:!0},togglingSchedule:{type:Boolean,required:!0},todayDone:{type:Number,required:!0},collapsed:{type:Boolean,required:!1},defaultPrompt:{type:String,required:!1},projectPrompts:{type:Object,required:!1}},emits:[`toggle-schedule`,`toggle-collapse`,`open-prompt-settings`,`dispatch`],setup(e,{expose:n,emit:r}){let i=e,a=r,o=Y(``),s=Y(!0),c=Y(!0),l=Ne(),d=q(()=>({claude:l.claudeAvailable,opencode:l.opencodeAvailable})),p=Y(Ke());function h(){if(d.value[p.value]){Ie(p.value);return}let e=Object.keys(d.value).find(e=>d.value[e]);e&&(p.value=e)}function g(e){return We.find(t=>t.id===e)?.name||e}function _(e){p.value=e,h()}let v=Y([]),y=q(()=>({kind:`draft`,list:v.value,replace:e=>{v.value=e}})),{isUploading:b,isImageAttachment:x,humanSize:S,onAttachmentPaste:C,onAttachmentDrop:w,removeAttachment:T,pickAttachmentFile:E}=An(),D=q(()=>b(`draft`)),ee=Y(!1);function te(e){e.stopPropagation(),C(e,y.value)}function ne(e){ee.value=!1,w(e,y.value)}function re(){E(y.value)}function O(e){T(y.value,e)}function k(){v.value=[]}n({clearAttachments:k});let ie=q(()=>i.selectedProject?.key||``),A=q(()=>(i.defaultPrompt||``).trim()),ae=q(()=>{let e=ie.value;return e?(i.projectPrompts?.[e]?.prompt||``).trim():``}),j=q(()=>Object.values(i.projectPrompts||{}).some(e=>(e?.prompt||``).trim().length>0)),M=q(()=>!!A.value||j.value),oe=q(()=>{let e=!!A.value,t=ie.value?ae.value?`project`:`none`:j.value?`target`:`none`;return Z(e&&t===`project`?`@WORKBENCH:全局 + 本项目`:e&&t===`target`?`@WORKBENCH:全局 + 落点项目`:e?`@WORKBENCH:全局`:t===`project`?`@WORKBENCH:本项目`:t===`target`?`@WORKBENCH:落点项目`:`@WORKBENCH:未设置`)}),se=q(()=>o.value.trim().length>0&&!i.dispatching&&!D.value);function N(){se.value&&(a(`dispatch`,{text:o.value.trim(),autoRun:s.value,attachments:v.value,projectPath:i.selectedProject?i.selectedProject.path:``,useDefaultPrompt:c.value,executor:p.value}),o.value=``)}function P(e){e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||(e.preventDefault(),N())}function F(){try{let e=localStorage.getItem(ro);if(!e)return null;let t=Number(e);return Number.isFinite(t)&&t>=io?Math.round(t):null}catch{return null}}let ce=Y(null),I=Y(F()),L=q(()=>{let e={};return I.value&&(e.height=`${I.value}px`),e}),le=null,R=!1,de=!0;function z(e){let t=ce.value;if(!t)return;let n=t.getBoundingClientRect();R=n.right-e.clientX<=ao&&n.bottom-e.clientY<=ao}function pe(){R=!1}function B(e){let t=Math.round(e.offsetHeight);if(!(t<io||t===I.value)){I.value=t;try{localStorage.setItem(ro,String(t))}catch{}}}u(()=>{let e=ce.value;e&&(window.addEventListener(`mouseup`,pe),!(typeof ResizeObserver>`u`)&&(le=new ResizeObserver(()=>{if(de){de=!1;return}let t=parseFloat(getComputedStyle(e).maxHeight),n=Number.isFinite(t)&&e.offsetHeight>=t-1;(R||!n)&&B(e)}),le.observe(e)))}),f(()=>{window.removeEventListener(`mouseup`,pe),le?.disconnect(),le=null});function me(e){let t=e.taskTitle||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 V={user:`@WORKBENCH:用户派发`,dispatch:`@WORKBENCH:派发`,done:`@WORKBENCH:完成`,error:`@WORKBENCH:出错`,cancelled:`@WORKBENCH:取消`};function H(e){return e.kind===`user`?e.instructionStatus===`accepted`?Z(`@WORKBENCH:已建任务并开始执行`):e.instructionStatus===`rejected`?Z(`@WORKBENCH:被拒绝:{reason}`,{reason:e.reason||``}):e.reason||Z(`@WORKBENCH:已建任务(未执行)`):``}function U(e){switch(e.targetSource){case`mention`:return Z(`@WORKBENCH:指令里提到了它`);case`agent`:return Z(`@WORKBENCH:主 Agent 判断`);case`default`:return Z(`@WORKBENCH:没识别出项目,用了默认项目`);default:return``}}function _e(e){switch(e.promptSource){case`global`:return Z(`@WORKBENCH:附带全局默认提示词`);case`project`:return Z(`@WORKBENCH:附带项目默认提示词`);case`both`:return Z(`@WORKBENCH:附带全局 + 项目默认提示词`);default:return``}}let W={props:i,emit:a,draft:o,autoRun:s,useDefaultPrompt:c,toolsStore:l,executorAvailability:d,selectedExecutor:p,onExecutorChange:h,executorName:g,onExecutorPick:_,draftAttachments:v,DRAFT_RAW_BASE:no,attachTarget:y,isUploading:b,isImageAttachment:x,humanSize:S,onAttachmentPaste:C,onAttachmentDrop:w,removeAttachment:T,pickAttachmentFile:E,attachBusy:D,attachDragging:ee,onPaste:te,onDrop:ne,onPickAttachment:re,onRemoveAttachment:O,clearAttachments:k,projectKey:ie,globalPromptText:A,projectPromptText:ae,anyProjectPrompt:j,anyPromptConfigured:M,promptStateLabel:oe,canSend:se,send:N,onInputKeydown:P,INPUT_H_KEY:ro,OC_INPUT_MIN_H:io,readInputH:F,inputRef:ce,inputH:I,inputStyle:L,get inputRO(){return le},set inputRO(e){le=e},get inputDragging(){return R},set inputDragging(e){R=e},get inputROFirst(){return de},set inputROFirst(e){de=e},INPUT_GRIP_PX:ao,onInputMouseDown:z,onWindowMouseUp:pe,commitInputH:B,describe:me,KIND_LABEL:V,instructionNote:H,targetReason:U,promptNote:_e,gitSummary:q(()=>{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)}),get $t(){return Z},get Paperclip(){return m},get Promotion(){return t},get Expand(){return fe},get Fold(){return Se},get Setting(){return ge},get ArrowDown(){return he},get Check(){return ue},TaskExecutorIcon:Fe,get clockFromIso(){return jr},get relativeTimeFromIso(){return Or},AttachmentZone:ct,get TASK_EXECUTOR_OPTIONS(){return We}};return Object.defineProperty(W,"__isScriptSetup",{enumerable:!1,value:!0}),W}});X(),b(),G();var so=[`title`,`aria-label`],co={class:`oc__rail-text`},lo={class:`oc__head`},uo={class:`oc__title`},fo=[`disabled`,`title`],po=[`title`,`aria-label`],mo={class:`oc__state-label`},ho={class:`oc__state-value`},go={class:`oc__state-meta`},_o={class:`oc__feed`},vo={class:`oc__feed-title`},yo={class:`oc__feed-list`},bo={class:`oc-row__head`},xo={class:`oc-row__kind`},So={class:`oc-row__time`},Co={class:`oc-row__text`},wo={key:0,class:`oc-row__note`},To={key:1,class:`oc-row__note`},Eo={key:0},Do={key:2,class:`oc-row__note`},Oo=[`title`],ko={key:4,class:`oc-row__note`},Ao={key:0,class:`oc-empty`},jo={class:`oc__git`},Mo={class:`oc__feed-title`},No={class:`oc__git-name`},Po={class:`oc__git-list`},Fo={class:`oc__git-label`},Io={class:`oc__git-label`},Lo={class:`oc__git-value`},Ro={class:`oc__git-label`},zo={class:`oc__git-value`},Bo=[`placeholder`],Vo={class:`oc__compose-foot`},Ho=[`disabled`,`title`,`aria-label`],Uo=[`title`,`aria-label`],Wo=[`title`],Go=[`title`],Ko=[`title`,`aria-label`],qo={class:`oc__executor-item`},Jo={class:`oc__executor-item__name`},Yo={key:1,class:`oc__executor-item__missing`},Xo=[`disabled`],Zo={class:`oc__hint`};function Qo(t,i,o,s,c,l){let u=d,f=n,p=Ce,m=w;return A(),v(`aside`,{class:U([`oc`,{"is-collapsed":o.collapsed}])},[r(` 折叠后的收纳条:只剩一枚展开按钮 + 竖排标题,宽度收到 32px。
|
|
35
35
|
折叠不是"把宽度压成 0"—— 那样就再没有能点回来的地方了。 `),o.collapsed?(A(),v(`button`,{key:0,type:`button`,class:`oc__rail`,title:s.$t(`@WORKBENCH:展开主 Agent 控制台`),"aria-label":s.$t(`@WORKBENCH:展开主 Agent 控制台`),"aria-expanded":!1,onClick:i[0]||=e=>s.emit(`toggle-collapse`)},[_(u,{class:`oc__rail-icon`},{default:W(()=>[_(s.Fold)]),_:1}),D(`span`,{class:U([`oc__rail-live`,{"is-off":!o.active}]),"aria-hidden":`true`},null,2),D(`span`,co,e(s.$t(`@WORKBENCH:主 Agent 控制台`)),1)],8,so)):r(`v-if`,!0),r(` 折叠时这几块整体隐藏而不是销毁(v-show 而不是 v-if):
|
|
36
36
|
草稿指令和已贴的附件都还留着,展开回来能接着发 `),L(D(`header`,lo,[D(`span`,{class:U([`oc__live`,{"is-off":!o.active}]),"aria-hidden":`true`},null,2),D(`h3`,uo,e(s.$t(`@WORKBENCH:主 Agent 控制台`)),1),D(`button`,{type:`button`,class:`oc__toggle`,disabled:o.togglingSchedule,title:o.active?s.$t(`@WORKBENCH:暂停后派发只建任务,不会自动执行`):s.$t(`@WORKBENCH:恢复后派发会自动执行`),onClick:i[1]||=e=>s.emit(`toggle-schedule`,!o.active)},e(o.active?s.$t(`@WORKBENCH:暂停调度`):s.$t(`@WORKBENCH:恢复调度`)),9,fo),D(`button`,{type:`button`,class:`oc__collapse`,title:s.$t(`@WORKBENCH:收起主 Agent 控制台`),"aria-label":s.$t(`@WORKBENCH:收起主 Agent 控制台`),"aria-expanded":!0,onClick:i[2]||=e=>s.emit(`toggle-collapse`)},[_(u,null,{default:W(()=>[_(s.Expand)]),_:1})],8,po)],512),[[oe,!o.collapsed]]),L(D(`div`,{class:U([`oc__state`,{"is-paused":!o.active}])},[D(`span`,mo,e(s.$t(`@WORKBENCH:调度状态`)),1),D(`span`,ho,e(o.active?s.$t(`@WORKBENCH:调度中`):s.$t(`@WORKBENCH:已暂停`)),1),D(`span`,go,e(s.$t(`@WORKBENCH:{n} 个执行中`,{n:o.runningCount})),1)],2),[[oe,!o.collapsed]]),L(D(`div`,_o,[D(`p`,vo,e(s.$t(`@WORKBENCH:活动日志`)),1),D(`ul`,yo,[(A(!0),v(I,null,S(o.activity,t=>(A(),v(`li`,{key:t.id,class:U([`oc-row`,`oc-row--`+t.kind])},[D(`div`,bo,[D(`span`,xo,e(s.$t(s.KIND_LABEL[t.kind]||`@WORKBENCH:派发`)),1),r(` 时间走 clockFromIso:非当天会带上日期前缀,避免跨天记录看起来像今天刚发生 `),D(`span`,So,e(s.clockFromIso(t.at)),1)]),D(`p`,Co,e(s.describe(t)),1),s.instructionNote(t)?(A(),v(`p`,wo,e(s.instructionNote(t)),1)):r(`v-if`,!0),r(` 落点 + 依据。判断错了,用户至少要能看出是"没识别出来、退了默认"
|
|
37
37
|
还是"模型猜的",否则只能对着一个错误项目名干瞪眼 `),t.kind===`user`&&t.projectName?(A(),v(`p`,To,[g(e(s.$t(`@WORKBENCH:落点「{name}」`,{name:t.projectName}))+` `,1),s.targetReason(t)?(A(),v(`span`,Eo,`· `+e(s.targetReason(t)),1)):r(`v-if`,!0)])):r(`v-if`,!0),r(` 提示词单独占一行:它解释的是"任务正文里多出来的那段话是哪来的",
|
|
38
38
|
和落点是两件事,挤在一行会看不清 `),t.kind===`user`&&s.promptNote(t)?(A(),v(`p`,Do,e(s.promptNote(t)),1)):r(`v-if`,!0),t.kind===`error`&&t.error?(A(),v(`p`,{key:3,class:`oc-row__error`,title:t.error},e(t.error),9,Oo)):r(`v-if`,!0),t.kind===`done`&&t.projectName?(A(),v(`p`,ko,e(t.projectName),1)):r(`v-if`,!0)],2))),128)),o.activity.length===0?(A(),v(`li`,Ao,e(s.$t(`@WORKBENCH:暂无活动记录`)),1)):r(`v-if`,!0)])],512),[[oe,!o.collapsed]]),L(D(`div`,jo,[D(`p`,Mo,[g(e(s.$t(`@WORKBENCH:项目概览`))+` `,1),r(` 无选中项目即「全部项目」:显式标出来,否则底下只剩「今日完成」一行,看着像数据没加载出来 `),D(`span`,No,e(o.selectedProject?o.selectedProject.name:s.$t(`@WORKBENCH:全部项目`)),1)]),D(`dl`,Po,[(A(!0),v(I,null,S(s.gitSummary,t=>(A(),v(I,{key:t.label},[D(`dt`,Fo,e(t.label),1),D(`dd`,{class:U([`oc__git-value`,{"is-warn":t.tone===`warn`,"is-danger":t.tone===`danger`}])},e(t.value),3)],64))),128)),D(`dt`,Io,e(s.$t(`@WORKBENCH:今日完成`)),1),D(`dd`,Lo,e(o.todayDone),1),D(`dt`,Ro,e(s.$t(`@WORKBENCH:最后活跃`)),1),D(`dd`,zo,e(o.selectedProject&&s.relativeTimeFromIso(o.selectedProject.stats.lastActiveAt)||`—`),1)])],512),[[oe,!o.collapsed]]),L(D(`div`,{class:`oc__compose`,onPaste:s.onPaste,onDrop:J(s.onDrop,[`prevent`]),onDragover:i[10]||=J(e=>s.attachDragging=!0,[`prevent`]),onDragleave:i[11]||=e=>s.attachDragging=!1},[r(` 粘贴事件必须同时挂在 textarea 上:在输入框里按 Ctrl+V 时事件只到 textarea,
|
|
39
39
|
不会冒泡经过下面的附件区 `),L(D(`textarea`,{ref:`inputRef`,class:`oc__input`,"onUpdate:modelValue":i[3]||=e=>s.draft=e,style:j(s.inputStyle),rows:`4`,placeholder:s.$t(`@WORKBENCH:给主 Agent 下一条指令,例如:把登录模块的错误处理重构一遍`),onKeydown:s.onInputKeydown,onPaste:s.onPaste,onMousedown:s.onInputMouseDown},null,44,Bo),[[z,s.draft]]),s.draftAttachments.length>0||s.attachBusy?(A(),a(s.AttachmentZone,{key:0,attachments:s.draftAttachments,"is-image":s.isImageAttachment,"human-size":s.humanSize,"is-uploading":s.attachBusy,"is-paste-hover":s.attachDragging,"max-count":9,"on-pick":s.onPickAttachment,"on-remove":s.onRemoveAttachment,"raw-base":s.DRAFT_RAW_BASE,onPaste:s.onPaste,onDrop:s.onDrop,onDragover:i[4]||=J(e=>s.attachDragging=!0,[`prevent`]),onDragenter:i[5]||=J(e=>s.attachDragging=!0,[`prevent`]),onDragleave:i[6]||=e=>s.attachDragging=!1},null,8,[`attachments`,`is-image`,`human-size`,`is-uploading`,`is-paste-hover`])):r(`v-if`,!0),D(`div`,Vo,[D(`button`,{type:`button`,class:`oc__attach`,disabled:s.attachBusy||s.draftAttachments.length>=9,title:s.$t(`@WORKBENCH:添加附件(也可直接粘贴或拖入文件)`),"aria-label":s.$t(`@WORKBENCH:添加附件`),onClick:s.onPickAttachment},[_(u,null,{default:W(()=>[_(s.Paperclip)]),_:1})],8,Ho),r(` 默认提示词设置入口:图标按钮按项目惯例不加底色,
|
|
40
40
|
有没有设过看右侧"附加默认提示词"那个勾选(它是真实生效状态,这个只是入口) `),D(`button`,{type:`button`,class:U([`oc__attach`,{"is-on":s.anyPromptConfigured}]),title:s.$t(`@WORKBENCH:设置派发时自动附加的默认提示词(全局 / 各项目)`),"aria-label":s.$t(`@WORKBENCH:默认提示词设置`),onClick:i[7]||=e=>s.emit(`open-prompt-settings`)},[_(u,null,{default:W(()=>[_(s.Setting)]),_:1})],10,Uo),D(`label`,{class:`oc__autorn`,title:s.$t(`@WORKBENCH:取消勾选则只建任务草稿,不自动执行`)},[L(D(`input`,{type:`checkbox`,"onUpdate:modelValue":i[8]||=e=>s.autoRun=e},null,512),[[H,s.autoRun]]),D(`span`,null,e(s.$t(`@WORKBENCH:立即执行`)),1)],8,Wo),r(` 一条都没设过时不出现:一个永远勾着、点了也没区别的开关只会占地方 `),s.anyPromptConfigured?(A(),v(`label`,{key:0,class:`oc__autorn`,title:s.$t(`@WORKBENCH:取消勾选则本次派发的任务不带默认提示词(设置本身不受影响)`)},[L(D(`input`,{type:`checkbox`,"onUpdate:modelValue":i[9]||=e=>s.useDefaultPrompt=e},null,512),[[H,s.useDefaultPrompt]]),D(`span`,null,e(s.$t(`@WORKBENCH:默认提示词({state})`,{state:s.promptStateLabel})),1)],8,Go)):r(`v-if`,!0),r(` 执行器:与执行按钮共用同一份临时选择,派发时覆盖设置里的默认值。
|
|
41
|
-
不用原生 select —— option 里塞不了品牌图标,el-dropdown 才有精致度 `),_(m,{trigger:`click`,class:`oc__executor`,onCommand:s.onExecutorPick},{dropdown:W(()=>[_(p,null,{default:W(()=>[(A(!0),v(I,null,S(s.TASK_EXECUTOR_OPTIONS,t=>(A(),a(f,{key:t.id,command:t.id,disabled:!s.executorAvailability[t.id]},{default:W(()=>[D(`span`,qo,[_(s.TaskExecutorIcon,{executor:t.id,class:`oc__executor-item__icon`},null,8,[`executor`]),D(`span`,Jo,e(t.name),1),s.selectedExecutor===t.id?(A(),a(u,{key:0,class:`oc__executor-item__check`},{default:W(()=>[_(s.Check)]),_:1})):s.executorAvailability[t.id]?r(`v-if`,!0):(A(),v(`span`,Yo,e(s.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:W(()=>[D(`button`,{type:`button`,class:`oc__executor-btn`,title:s.$t(`@WORKBENCH:本次派发使用的执行器(与执行按钮的临时切换共用)`),"aria-label":s.$t(`@WORKBENCH:任务执行器`)},[_(s.TaskExecutorIcon,{executor:s.selectedExecutor,class:`oc__executor-btn__icon`},null,8,[`executor`]),D(`span`,null,e(s.executorName(s.selectedExecutor)),1),_(u,{class:`oc__executor-btn__caret`},{default:W(()=>[_(s.ArrowDown)]),_:1})],8,Ko)]),_:1}),D(`button`,{type:`button`,class:`oc__send`,disabled:!s.canSend,onClick:s.send},[_(u,{class:`oc__send-icon`},{default:W(()=>[_(s.Promotion)]),_:1}),D(`span`,null,e(o.dispatching?s.$t(`@WORKBENCH:派发中…`):s.$t(`@WORKBENCH:派发`)),1)],8,Xo)]),D(`p`,Zo,[o.selectedProject?(A(),v(I,{key:0},[g(e(s.$t(`@WORKBENCH:指令会在「{name}」下新建一个任务;Enter 派发,Shift+Enter 换行`,{name:o.selectedProject.name})),1)],64)):(A(),v(I,{key:1},[g(e(s.$t(`@WORKBENCH:指令落到哪个项目由主 Agent 判断;Enter 派发,Shift+Enter 换行`)),1)],64))])],544),[[oe,!o.collapsed]])],2)}var $o=Q(oo,[[`render`,Qo],[`__scopeId`,`data-v-4c030231`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/OrchestratorConsole.vue`]]);X(),R();var es=4e3,ts=s({__name:`WorkbenchDefaultPromptDialog`,props:{modelValue:{type:Boolean,required:!0},defaultPrompt:{type:String,required:!0},projectPath:{type:String,required:!0},projectName:{type:String,required:!0},projectPrompt:{type:String,required:!0},saving:{type:Boolean,required:!0}},emits:[`update:modelValue`,`save`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y(``),o=Y(``);P(()=>r.modelValue,e=>{e&&(a.value=r.defaultPrompt||``,o.value=r.projectPrompt||``)});let s=q(()=>!!r.projectPath),c=q(()=>a.value.trim()!==(r.defaultPrompt||``).trim()||s.value&&o.value.trim()!==(r.projectPrompt||``).trim());function l(){r.saving||i(`save`,{globalPrompt:a.value,projectPrompt:o.value})}function u(){i(`update:modelValue`,!1)}let d={props:r,emit:i,MAX_CHARS:es,globalDraft:a,projectDraft:o,hasProject:s,dirty:c,submit:l,close:u,get $t(){return Z},CommonDialog:Ne};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}});b(),X(),G();var ns={class:`pd`},rs={class:`pd__intro`},is={class:`pd__field`},as={class:`pd__head`},os={class:`pd__label`,for:`pd-global`},ss={class:`pd__count`},cs=[`placeholder`],ls={class:`pd__field`},us={class:`pd__head`},ds={class:`pd__label`,for:`pd-project`},fs={key:0,class:`pd__count`},ps=[`disabled`,`placeholder`],ms={class:`pd__hint`},hs={class:`pd__foot`},gs=[`disabled`];function _s(t,n,i,o,s,c){return A(),a(o.CommonDialog,{"model-value":i.modelValue,title:o.$t(`@WORKBENCH:默认提示词`),width:`min(640px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[2]||=e=>o.emit(`update:modelValue`,e)},{footer:W(()=>[D(`div`,hs,[D(`button`,{type:`button`,class:`pd__btn`,onClick:o.close},e(o.$t(`@WORKBENCH:取消`)),1),n[3]||=D(`span`,{class:`pd__foot-spacer`},null,-1),D(`button`,{type:`button`,class:`pd__btn pd__btn--primary`,disabled:i.saving||!o.dirty,onClick:o.submit},e(i.saving?o.$t(`@WORKBENCH:保存中…`):o.$t(`@WORKBENCH:保存`)),9,gs)])]),default:W(()=>[D(`div`,ns,[D(`p`,rs,e(o.$t(`@WORKBENCH:派发指令时自动附加在指令之前,让每个任务都带上这些约束。只影响之后派发的任务,不会改动已经建好的任务。`)),1),D(`div`,is,[D(`div`,as,[D(`label`,os,e(o.$t(`@WORKBENCH:全局默认提示词`)),1),D(`span`,ss,e(o.globalDraft.length)+` / `+e(o.MAX_CHARS),1)]),L(D(`textarea`,{id:`pd-global`,"onUpdate:modelValue":n[0]||=e=>o.globalDraft=e,class:`pd__area`,rows:`5`,maxlength:o.MAX_CHARS,placeholder:o.$t(`@WORKBENCH:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,cs),[[z,o.globalDraft]])]),D(`div`,ls,[D(`div`,us,[D(`label`,ds,e(o.hasProject?o.$t(`@WORKBENCH:「{name}」的项目提示词`,{name:i.projectName}):o.$t(`@WORKBENCH:项目提示词`)),1),o.hasProject?(A(),v(`span`,fs,e(o.projectDraft.length)+` / `+e(o.MAX_CHARS),1)):r(`v-if`,!0)]),L(D(`textarea`,{id:`pd-project`,"onUpdate:modelValue":n[1]||=e=>o.projectDraft=e,class:`pd__area`,rows:`5`,maxlength:o.MAX_CHARS,disabled:!o.hasProject,placeholder:o.hasProject?o.$t(`@WORKBENCH:只在这个项目派发时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):o.$t(`@WORKBENCH:先在左侧选中一个具体项目,才能设置它的提示词`)},null,8,ps),[[z,o.projectDraft]]),D(`p`,ms,e(o.hasProject?o.$t(`@WORKBENCH:项目提示词追加在全局提示词之后(不覆盖全局),派发到「{name}」时一起带上`,{name:i.projectName}):o.$t(`@WORKBENCH:选中的是「全部项目」,落点由主 Agent 判断 —— 想给某个项目单设提示词,先选中它`)),1)])])]),_:1},8,[`model-value`,`title`])}var vs=Q(ts,[[`render`,_s],[`__scopeId`,`data-v-766f470f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchDefaultPromptDialog.vue`]]);X(),R();var ys=s({__name:`WorkbenchTaskCreateDialog`,props:{modelValue:{type:Boolean,required:!0},projects:{type:Array,required:!0},defaultProjectPath:{type:String,required:!0}},emits:[`update:modelValue`,`created`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y(``),o=Y(``),s=Y(``),c=Y(!1),l=Y(``);function u(e){let t=$(e);if(!t)return``;let n=r.projects.find(e=>$(e.path)===t);return n?n.path:``}P(()=>r.modelValue,e=>{e&&(a.value=``,o.value=``,s.value=u(r.defaultProjectPath),l.value=``,c.value=!1)});let d=q(()=>r.projects),f=q(()=>!c.value&&(a.value.trim().length>0||o.value.trim().length>0)),p=q(()=>{let e=$(s.value);if(!e)return``;let t=d.value.find(t=>$(t.path)===e);return t?t.name:``});async function m(e){if(f.value){c.value=!0,l.value=``;try{let t={title:a.value.trim(),desc:o.value,promptId:null,simpleOverride:``};s.value&&(t.projectPath=s.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){l.value=n?.error||Z(`@WORKBENCH:保存失败`);return}i(`update:modelValue`,!1),i(`created`,{task:n.task,openEditor:e})}finally{c.value=!1}}}let h={props:r,emit:i,title:a,desc:o,projectPath:s,submitting:c,error:l,matchOptionPath:u,projectOptions:d,canSubmit:f,projectName:p,submit:m,get $t(){return Z},CommonDialog:Ne};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});b(),X(),G();var bs={class:`nc`},xs={class:`nc__field`},Ss={class:`nc__label`,for:`nc-project`},Cs={value:``},ws=[`value`],Ts=[`title`],Es={class:`nc__field`},Ds={class:`nc__label`,for:`nc-title`},Os=[`placeholder`],ks={class:`nc__field`},As={class:`nc__label`,for:`nc-desc`},js=[`placeholder`],Ms={key:0,class:`nc__error`},Ns={class:`nc__foot`},Ps=[`disabled`],Fs=[`disabled`];function Is(t,n,i,o,s,c){return A(),a(o.CommonDialog,{"model-value":i.modelValue,title:o.$t(`@WORKBENCH:新建开发任务`),width:`min(600px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[9]||=e=>o.emit(`update:modelValue`,e)},{footer:W(()=>[D(`div`,Ns,[D(`button`,{type:`button`,class:`nc__btn`,onClick:n[6]||=e=>o.emit(`update:modelValue`,!1)},e(o.$t(`@WORKBENCH:取消`)),1),n[10]||=D(`span`,{class:`nc__foot-spacer`},null,-1),D(`button`,{type:`button`,class:`nc__btn`,disabled:!o.canSubmit,onClick:n[7]||=e=>o.submit(!0)},e(o.$t(`@WORKBENCH:创建并打开编辑器`)),9,Ps),D(`button`,{type:`button`,class:`nc__btn nc__btn--primary`,disabled:!o.canSubmit,onClick:n[8]||=e=>o.submit(!1)},e(o.submitting?o.$t(`@WORKBENCH:创建中…`):o.$t(`@WORKBENCH:创建`)),9,Fs)])]),default:W(()=>[D(`div`,bs,[D(`div`,xs,[D(`label`,Ss,e(o.$t(`@WORKBENCH:项目`)),1),L(D(`select`,{id:`nc-project`,"onUpdate:modelValue":n[0]||=e=>o.projectPath=e,class:`nc__select`},[D(`option`,Cs,e(o.$t(`@WORKBENCH:跟随当前项目`)),1),(A(!0),v(I,null,S(o.projectOptions,t=>(A(),v(`option`,{key:t.key,value:t.path},e(t.name)+e(t.exists===!1?` · ${o.$t(`@WORKBENCH:目录不存在`)}`:``),9,ws))),128))],512),[[pe,o.projectPath]]),D(`p`,{class:`nc__hint`,title:o.projectPath},e(o.projectName?o.$t(`@WORKBENCH:任务会在「{name}」目录下执行`,{name:o.projectName}):o.$t(`@WORKBENCH:任务会跟随应用当前的工作目录`)),9,Ts)]),D(`div`,Es,[D(`label`,Ds,e(o.$t(`@WORKBENCH:标题`)),1),L(D(`input`,{id:`nc-title`,"onUpdate:modelValue":n[1]||=e=>o.title=e,class:`nc__input`,type:`text`,maxlength:`200`,placeholder:o.$t(`@WORKBENCH:一句话说清要做什么`),onKeydown:n[2]||=K(J(e=>o.submit(!1),[`prevent`]),[`enter`])},null,40,Os),[[z,o.title]])]),D(`div`,ks,[D(`label`,As,e(o.$t(`@WORKBENCH:描述`)),1),L(D(`textarea`,{id:`nc-desc`,"onUpdate:modelValue":n[3]||=e=>o.desc=e,class:`nc__input nc__input--area`,rows:`6`,placeholder:o.$t(`@WORKBENCH:把背景、验收标准、相关文件路径写进来,执行时用它当上下文`),onKeydown:[n[4]||=K(J(e=>o.submit(!1),[`ctrl`,`prevent`]),[`enter`]),n[5]||=K(J(e=>o.submit(!1),[`meta`,`prevent`]),[`enter`])]},null,40,js),[[z,o.desc]])]),o.error?(A(),v(`p`,Ms,e(o.error),1)):r(`v-if`,!0)])]),_:1},8,[`model-value`,`title`])}var Ls=Q(ys,[[`render`,Is],[`__scopeId`,`data-v-c60e660a`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchTaskCreateDialog.vue`]]);X(),R();var Rs=`wb.boardProject.v1`,zs=5e3,Bs=`wb.boardLayout.v1`,Vs=180,Hs=420,Us=260,Ws=900,Gs=.26,Ks=.46,qs=120,Js=560,Ys=.5,Xs=s({__name:`WorkbenchBoard`,emits:[`open-task`],setup(e,{expose:t,emit:n}){t();let r=n,{projects:i,boardTasks:a,currentProjectPath:o,loading:s,loadProjects:c}=Cr(),{active:l,activity:d,running:p,dispatching:m,togglingSchedule:h,defaultPrompt:g,projectPrompts:_,loadOrchestrator:v,setSchedulingActive:y,dispatch:b,saveDefaultPrompt:x,saveProjectPrompt:S}=wr(),w=Y((()=>{try{return localStorage.getItem(Rs)||``}catch{return``}})());P(w,e=>{try{localStorage.setItem(Rs,e)}catch{}});let T=q(()=>w.value&&i.value.find(e=>e.key===w.value)||null);P(i,e=>{w.value&&(e.some(e=>e.key===w.value)||(w.value=``))});let E=q(()=>{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($(n.projectPath))||``);return t}),D=q(()=>{if(!w.value)return a.value;let e=w.value;return a.value.filter(t=>$(t.projectPath)===e)}),ee=q(()=>{let e=new Date;e.setHours(0,0,0,0);let t=e.getTime();return{projects:i.value.length,tasks:a.value.length,running:p.value.length,todayDone:d.value.filter(e=>e.kind===`done`&&e.at&&new Date(e.at).getTime()>=t).length}});function te(e){r(`open-task`,{taskId:e.id,projectPath:e.projectPath})}let ne=null,re=!1;async function k(e=!0){if(!re){re=!0;try{await Promise.all([c(e),v(e)])}finally{re=!1}}}function ie(){document.hidden||k(!0)}u(async()=>{window.addEventListener(`resize`,N),await k(!1),ne=setInterval(()=>{document.hidden||k(!0)},zs),document.addEventListener(`visibilitychange`,ie)}),f(()=>{window.removeEventListener(`resize`,N),ne&&=(clearInterval(ne),null),document.removeEventListener(`visibilitychange`,ie)});let A=se({left:null,right:null,agentH:null,leftCollapsed:!1,rightCollapsed:!1});function ae(){try{let e=localStorage.getItem(Bs);if(!e)return;let t=JSON.parse(e);typeof t.left==`number`&&Number.isFinite(t.left)&&(A.left=t.left),typeof t.right==`number`&&Number.isFinite(t.right)&&(A.right=t.right),typeof t.agentH==`number`&&Number.isFinite(t.agentH)&&(A.agentH=t.agentH),A.leftCollapsed=t.leftCollapsed===!0,A.rightCollapsed=t.rightCollapsed===!0}catch{}}ae();function j(){try{localStorage.setItem(Bs,JSON.stringify(A))}catch{}}let M=Y(typeof window>`u`?1920:window.innerWidth),oe=Y(typeof window>`u`?1080:window.innerHeight);function N(){M.value=window.innerWidth,oe.value=window.innerHeight}let F=q(()=>M.value<=1024),ce=q(()=>M.value<=860);function I(e,t){let n=e===`left`?Vs:Us,r=Math.min(e===`left`?Hs:Ws,M.value*(e===`left`?Gs:Ks));return Math.round(Math.min(Math.max(t,n),Math.max(n,r)))}function L(e){let t=Math.min(Js,oe.value*Ys);return Math.round(Math.min(Math.max(e,qs),Math.max(qs,t)))}let le=q(()=>{let e={};return A.left!=null&&(e[`--wb-left-w`]=I(`left`,A.left)+`px`),A.right!=null&&!ce.value&&(e[`--wb-right-w`]=I(`right`,A.right)+`px`),e}),ue=q(()=>{let e={};return A.agentH!=null&&(e[`--wb-agents-h`]=L(A.agentH)+`px`),e}),R=Y(null),de=Y(null),z=Y(null);function pe(e){return R.value?.querySelector(e===`left`?`.board__left`:`.oc`)}function me(e){window.removeEventListener(`mousemove`,e),document.body.style.userSelect=``,document.body.style.cursor=``,z.value=null,j()}function V(e,t){if(e===`left`?F.value:ce.value)return;let n=pe(e);if(!n)return;t.preventDefault();let r=t.clientX,i=n.getBoundingClientRect().width;z.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);A[e]=I(e,i+n)};window.addEventListener(`mousemove`,a),window.addEventListener(`mouseup`,()=>me(a),{once:!0})}function H(e){A[e]=null,j()}function he(){return de.value?.querySelector(`.agents`)}function U(e){let t=he();if(!t)return;e.preventDefault();let n=e.clientY,r=t.getBoundingClientRect().height;z.value=`agents`,document.body.style.userSelect=`none`,document.body.style.cursor=`row-resize`;let i=e=>{A.agentH=L(r+(n-e.clientY))};window.addEventListener(`mousemove`,i),window.addEventListener(`mouseup`,()=>me(i),{once:!0})}function ge(){A.agentH=null,j()}let W=Y(!1),ve=q(()=>F.value?!W.value:A.leftCollapsed);function ye(){if(F.value){W.value=!W.value;return}A.leftCollapsed=!A.leftCollapsed,j()}function G(){F.value&&(W.value=!1)}let be=q(()=>A.rightCollapsed&&!ce.value);function xe(){A.rightCollapsed=!A.rightCollapsed,j()}function K(e){w.value=e?e.key:``,W.value=!1}let Ce=Y(!1);function we(){Ce.value=!0}async function Te(e){if(await k(!0),e.openEditor){r(`open-task`,{taskId:e.task.id,projectPath:e.task.projectPath||``});return}B.success(Z(`@WORKBENCH:已创建任务`))}async function J(e){if(e.runningJobs>0)return;let t=Me(),n={claude:t.claudeAvailable,opencode:t.opencodeAvailable},r=Ke();n[r]||(r=r===`claude`?`opencode`:`claude`);let i=`/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){B.error(a?.error||Z(`@WORKBENCH:执行失败`));return}B.success(Z(`@WORKBENCH:已开始执行`)),await k(!0)}async function X(e){let t=(e.title||``).trim()||Z(`@WORKBENCH:未命名任务`);try{await _e.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){B.error(n.error||Z(`@WORKBENCH:删除失败`));return}await k(!0)}let Ee=Y(null),De=q(()=>T.value?.path||o.value);async function Oe(e){let t=await b({text:e.text,projectPath:e.projectPath,autoRun:e.autoRun,attachments:e.attachments,useDefaultPrompt:e.useDefaultPrompt,executor:e.executor});t&&(Ee.value?.clearAttachments(),B.success(t.ran?Z(`@WORKBENCH:已派发并开始执行`):Z(`@WORKBENCH:已派发(只建任务未执行)`)),await k(!0))}async function ke(e){await y(e)}let Q=Y(!1),Ae=Y(!1),je=q(()=>{let e=T.value?.key;return e&&_.value?.[e]?.prompt||``});async function Ne(e){if(Ae.value)return;let t=e.globalPrompt.trim(),n=e.projectPrompt.trim(),r=T.value;Ae.value=!0;try{let e=!0;t!==(g.value||``).trim()&&(e=await x(t)),e&&r&&n!==je.value.trim()&&(e=await S(r.path,n)),e&&(Q.value=!1)}finally{Ae.value=!1}}let Pe={emit:r,projects:i,boardTasks:a,currentProjectPath:o,loading:s,loadProjects:c,active:l,activity:d,running:p,dispatching:m,togglingSchedule:h,defaultPrompt:g,projectPrompts:_,loadOrchestrator:v,setSchedulingActive:y,dispatch:b,saveDefaultPrompt:x,saveProjectPrompt:S,SELECTED_KEY:Rs,selectedKey:w,selectedProject:T,projectLabels:E,visibleTasks:D,headerStats:ee,onOpenTask:te,POLL_MS:zs,get pollTimer(){return ne},set pollTimer(e){ne=e},get inFlight(){return re},set inFlight(e){re=e},refresh:k,onVisibilityChange:ie,LAYOUT_KEY:Bs,LEFT_W_MIN:Vs,LEFT_W_MAX:Hs,RIGHT_W_MIN:Us,RIGHT_W_MAX:Ws,LEFT_W_SHARE:Gs,RIGHT_W_SHARE:Ks,AGENT_H_MIN:qs,AGENT_H_MAX:Js,AGENT_H_SHARE:Ys,layout:A,readLayout:ae,saveLayout:j,viewportW:M,viewportH:oe,onWindowResize:N,isNarrow:F,isStacked:ce,clampWidth:I,clampAgentH:L,boardStyle:le,leftStyle:ue,colsRef:R,leftRef:de,dragging:z,panelEl:pe,endDrag:me,onSplitterMouseDown:V,onSplitterDblClick:H,agentEl:he,onAgentSplitterMouseDown:U,onAgentSplitterDblClick:ge,leftDrawerOpen:W,leftHidden:ve,toggleLeft:ye,onLeftEsc:G,rightHidden:be,toggleRight:xe,onSelectProject:K,createOpen:Ce,onCreateClick:we,onTaskCreated:Te,runTask:J,deleteTask:X,consoleRef:Ee,defaultProjectPath:De,onDispatch:Oe,onToggleSchedule:ke,promptDialogOpen:Q,savingPrompt:Ae,selectedProjectPrompt:je,onSavePromptDraft:Ne,get $t(){return Z},get Plus(){return C},get Refresh(){return O},get Fold(){return Se},get Expand(){return fe},WorkbenchProjectPanel:$i,WorkbenchAgentPanel:ma,WorkbenchKanban:to,OrchestratorConsole:$o,WorkbenchDefaultPromptDialog:vs,WorkbenchTaskCreateDialog:Ls};return Object.defineProperty(Pe,"__isScriptSetup",{enumerable:!1,value:!0}),Pe}});X(),b(),G();var Zs={class:`board__top`},Qs=[`title`,`aria-label`,`aria-expanded`],$s={class:`board__brand`},ec={class:`board__brand-text`},tc={class:`board__title`},nc={class:`board__subtitle`},rc={class:`board__stats`},ic={class:`board__stat`},ac={class:`board__stat-label`},oc={class:`board__stat-value`},sc={class:`board__stat`},cc={class:`board__stat-label`},lc={class:`board__stat-value`},uc={class:`board__stat`},dc={class:`board__stat-label`},fc={class:`board__stat`},pc={class:`board__stat-label`},mc={class:`board__stat-value`},hc={class:`board__actions`},gc=[`title`,`aria-label`],_c=[`title`],vc=[`title`],yc={class:`board__main`},bc={class:`board__main-head`},xc={class:`board__main-title`},Sc={class:`board__project-name`},Cc=[`title`],wc={key:1,class:`board__project-path`},Tc={key:0,class:`board__project-meta`},Ec=[`title`];function Dc(t,n,i,o,s,c){let l=d,u=p;return A(),v(`div`,{class:`board`,style:j(o.boardStyle)},[D(`header`,Zs,[r(` 左栏的开合。宽屏=收起/展开常驻那一栏;窄屏=抽屉 `),D(`button`,{type:`button`,class:U([`board__icon-btn board__fold-btn`,{"is-on":!o.leftHidden}]),title:o.leftHidden?o.$t(`@WORKBENCH:展开项目列表`):o.$t(`@WORKBENCH:收起项目列表`),"aria-label":o.leftHidden?o.$t(`@WORKBENCH:展开项目列表`):o.$t(`@WORKBENCH:收起项目列表`),"aria-expanded":!o.leftHidden,onClick:o.toggleLeft},[o.leftHidden?(A(),a(l,{key:1},{default:W(()=>[_(o.Expand)]),_:1})):(A(),a(l,{key:0},{default:W(()=>[_(o.Fold)]),_:1}))],10,Qs),D(`div`,$s,[D(`span`,{class:U([`board__live`,{"is-off":!o.active}]),"aria-hidden":`true`},null,2),D(`div`,ec,[D(`h1`,tc,e(o.$t(`@WORKBENCH:多项目编排台`)),1),D(`p`,nc,e(o.active?o.$t(`@WORKBENCH:主 Agent 调度中`):o.$t(`@WORKBENCH:主 Agent 已暂停`)),1)])]),D(`div`,rc,[D(`span`,ic,[D(`span`,ac,e(o.$t(`@WORKBENCH:项目`)),1),D(`strong`,oc,e(o.headerStats.projects),1)]),D(`span`,sc,[D(`span`,cc,e(o.$t(`@WORKBENCH:任务`)),1),D(`strong`,lc,e(o.headerStats.tasks),1)]),D(`span`,uc,[D(`span`,dc,e(o.$t(`@WORKBENCH:活跃执行`)),1),D(`strong`,{class:U([`board__stat-value`,{"is-live":o.headerStats.running>0}])},e(o.headerStats.running),3)]),D(`span`,fc,[D(`span`,pc,e(o.$t(`@WORKBENCH:今日完成`)),1),D(`strong`,mc,e(o.headerStats.todayDone),1)])]),D(`div`,hc,[D(`button`,{type:`button`,class:`board__icon-btn`,title:o.$t(`@WORKBENCH:刷新`),"aria-label":o.$t(`@WORKBENCH:刷新`),onClick:n[0]||=e=>o.refresh(!1)},[_(l,null,{default:W(()=>[_(o.Refresh)]),_:1})],8,gc),_(u,{type:`primary`,size:`small`,icon:o.Plus,onClick:o.onCreateClick},{default:W(()=>[g(e(o.$t(`@WORKBENCH:新建开发任务`)),1)]),_:1},8,[`icon`])])]),D(`div`,{ref:`colsRef`,class:U([`board__cols`,{"is-resizing":o.dragging!==null}])},[r(` 抽屉打开时的点击捕获层:点空白处收起。
|
|
41
|
+
不用原生 select —— option 里塞不了品牌图标,el-dropdown 才有精致度 `),_(m,{trigger:`click`,class:`oc__executor`,onCommand:s.onExecutorPick},{dropdown:W(()=>[_(p,null,{default:W(()=>[(A(!0),v(I,null,S(s.TASK_EXECUTOR_OPTIONS,t=>(A(),a(f,{key:t.id,command:t.id,disabled:!s.executorAvailability[t.id]},{default:W(()=>[D(`span`,qo,[_(s.TaskExecutorIcon,{executor:t.id,class:`oc__executor-item__icon`},null,8,[`executor`]),D(`span`,Jo,e(t.name),1),s.selectedExecutor===t.id?(A(),a(u,{key:0,class:`oc__executor-item__check`},{default:W(()=>[_(s.Check)]),_:1})):s.executorAvailability[t.id]?r(`v-if`,!0):(A(),v(`span`,Yo,e(s.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:W(()=>[D(`button`,{type:`button`,class:`oc__executor-btn`,title:s.$t(`@WORKBENCH:本次派发使用的执行器(与执行按钮的临时切换共用)`),"aria-label":s.$t(`@WORKBENCH:任务执行器`)},[_(s.TaskExecutorIcon,{executor:s.selectedExecutor,class:`oc__executor-btn__icon`},null,8,[`executor`]),D(`span`,null,e(s.executorName(s.selectedExecutor)),1),_(u,{class:`oc__executor-btn__caret`},{default:W(()=>[_(s.ArrowDown)]),_:1})],8,Ko)]),_:1}),D(`button`,{type:`button`,class:`oc__send`,disabled:!s.canSend,onClick:s.send},[_(u,{class:`oc__send-icon`},{default:W(()=>[_(s.Promotion)]),_:1}),D(`span`,null,e(o.dispatching?s.$t(`@WORKBENCH:派发中…`):s.$t(`@WORKBENCH:派发`)),1)],8,Xo)]),D(`p`,Zo,[o.selectedProject?(A(),v(I,{key:0},[g(e(s.$t(`@WORKBENCH:指令会在「{name}」下新建一个任务;Enter 派发,Shift+Enter 换行`,{name:o.selectedProject.name})),1)],64)):(A(),v(I,{key:1},[g(e(s.$t(`@WORKBENCH:指令落到哪个项目由主 Agent 判断;Enter 派发,Shift+Enter 换行`)),1)],64))])],544),[[oe,!o.collapsed]])],2)}var $o=Q(oo,[[`render`,Qo],[`__scopeId`,`data-v-4c030231`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/OrchestratorConsole.vue`]]);X(),R();var es=4e3,ts=s({__name:`WorkbenchDefaultPromptDialog`,props:{modelValue:{type:Boolean,required:!0},defaultPrompt:{type:String,required:!0},projectPath:{type:String,required:!0},projectName:{type:String,required:!0},projectPrompt:{type:String,required:!0},saving:{type:Boolean,required:!0}},emits:[`update:modelValue`,`save`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y(``),o=Y(``);P(()=>r.modelValue,e=>{e&&(a.value=r.defaultPrompt||``,o.value=r.projectPrompt||``)});let s=q(()=>!!r.projectPath),c=q(()=>a.value.trim()!==(r.defaultPrompt||``).trim()||s.value&&o.value.trim()!==(r.projectPrompt||``).trim());function l(){r.saving||i(`save`,{globalPrompt:a.value,projectPrompt:o.value})}function u(){i(`update:modelValue`,!1)}let d={props:r,emit:i,MAX_CHARS:es,globalDraft:a,projectDraft:o,hasProject:s,dirty:c,submit:l,close:u,get $t(){return Z},CommonDialog:Me};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}});b(),X(),G();var ns={class:`pd`},rs={class:`pd__intro`},is={class:`pd__field`},as={class:`pd__head`},os={class:`pd__label`,for:`pd-global`},ss={class:`pd__count`},cs=[`placeholder`],ls={class:`pd__field`},us={class:`pd__head`},ds={class:`pd__label`,for:`pd-project`},fs={key:0,class:`pd__count`},ps=[`disabled`,`placeholder`],ms={class:`pd__hint`},hs={class:`pd__foot`},gs=[`disabled`];function _s(t,n,i,o,s,c){return A(),a(o.CommonDialog,{"model-value":i.modelValue,title:o.$t(`@WORKBENCH:默认提示词`),width:`min(640px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[2]||=e=>o.emit(`update:modelValue`,e)},{footer:W(()=>[D(`div`,hs,[D(`button`,{type:`button`,class:`pd__btn`,onClick:o.close},e(o.$t(`@WORKBENCH:取消`)),1),n[3]||=D(`span`,{class:`pd__foot-spacer`},null,-1),D(`button`,{type:`button`,class:`pd__btn pd__btn--primary`,disabled:i.saving||!o.dirty,onClick:o.submit},e(i.saving?o.$t(`@WORKBENCH:保存中…`):o.$t(`@WORKBENCH:保存`)),9,gs)])]),default:W(()=>[D(`div`,ns,[D(`p`,rs,e(o.$t(`@WORKBENCH:派发指令时自动附加在指令之前,让每个任务都带上这些约束。只影响之后派发的任务,不会改动已经建好的任务。`)),1),D(`div`,is,[D(`div`,as,[D(`label`,os,e(o.$t(`@WORKBENCH:全局默认提示词`)),1),D(`span`,ss,e(o.globalDraft.length)+` / `+e(o.MAX_CHARS),1)]),L(D(`textarea`,{id:`pd-global`,"onUpdate:modelValue":n[0]||=e=>o.globalDraft=e,class:`pd__area`,rows:`5`,maxlength:o.MAX_CHARS,placeholder:o.$t(`@WORKBENCH:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,cs),[[z,o.globalDraft]])]),D(`div`,ls,[D(`div`,us,[D(`label`,ds,e(o.hasProject?o.$t(`@WORKBENCH:「{name}」的项目提示词`,{name:i.projectName}):o.$t(`@WORKBENCH:项目提示词`)),1),o.hasProject?(A(),v(`span`,fs,e(o.projectDraft.length)+` / `+e(o.MAX_CHARS),1)):r(`v-if`,!0)]),L(D(`textarea`,{id:`pd-project`,"onUpdate:modelValue":n[1]||=e=>o.projectDraft=e,class:`pd__area`,rows:`5`,maxlength:o.MAX_CHARS,disabled:!o.hasProject,placeholder:o.hasProject?o.$t(`@WORKBENCH:只在这个项目派发时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):o.$t(`@WORKBENCH:先在左侧选中一个具体项目,才能设置它的提示词`)},null,8,ps),[[z,o.projectDraft]]),D(`p`,ms,e(o.hasProject?o.$t(`@WORKBENCH:项目提示词追加在全局提示词之后(不覆盖全局),派发到「{name}」时一起带上`,{name:i.projectName}):o.$t(`@WORKBENCH:选中的是「全部项目」,落点由主 Agent 判断 —— 想给某个项目单设提示词,先选中它`)),1)])])]),_:1},8,[`model-value`,`title`])}var vs=Q(ts,[[`render`,_s],[`__scopeId`,`data-v-766f470f`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchDefaultPromptDialog.vue`]]);X(),R();var ys=s({__name:`WorkbenchTaskCreateDialog`,props:{modelValue:{type:Boolean,required:!0},projects:{type:Array,required:!0},defaultProjectPath:{type:String,required:!0}},emits:[`update:modelValue`,`created`],setup(e,{expose:t,emit:n}){t();let r=e,i=n,a=Y(``),o=Y(``),s=Y(``),c=Y(!1),l=Y(``);function u(e){let t=$(e);if(!t)return``;let n=r.projects.find(e=>$(e.path)===t);return n?n.path:``}P(()=>r.modelValue,e=>{e&&(a.value=``,o.value=``,s.value=u(r.defaultProjectPath),l.value=``,c.value=!1)});let d=q(()=>r.projects),f=q(()=>!c.value&&(a.value.trim().length>0||o.value.trim().length>0)),p=q(()=>{let e=$(s.value);if(!e)return``;let t=d.value.find(t=>$(t.path)===e);return t?t.name:``});async function m(e){if(f.value){c.value=!0,l.value=``;try{let t={title:a.value.trim(),desc:o.value,promptId:null,simpleOverride:``};s.value&&(t.projectPath=s.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){l.value=n?.error||Z(`@WORKBENCH:保存失败`);return}i(`update:modelValue`,!1),i(`created`,{task:n.task,openEditor:e})}finally{c.value=!1}}}let h={props:r,emit:i,title:a,desc:o,projectPath:s,submitting:c,error:l,matchOptionPath:u,projectOptions:d,canSubmit:f,projectName:p,submit:m,get $t(){return Z},CommonDialog:Me};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});b(),X(),G();var bs={class:`nc`},xs={class:`nc__field`},Ss={class:`nc__label`,for:`nc-project`},Cs={value:``},ws=[`value`],Ts=[`title`],Es={class:`nc__field`},Ds={class:`nc__label`,for:`nc-title`},Os=[`placeholder`],ks={class:`nc__field`},As={class:`nc__label`,for:`nc-desc`},js=[`placeholder`],Ms={key:0,class:`nc__error`},Ns={class:`nc__foot`},Ps=[`disabled`],Fs=[`disabled`];function Is(t,n,i,o,s,c){return A(),a(o.CommonDialog,{"model-value":i.modelValue,title:o.$t(`@WORKBENCH:新建开发任务`),width:`min(600px, 94vw)`,"close-on-click-modal":!1,"onUpdate:modelValue":n[9]||=e=>o.emit(`update:modelValue`,e)},{footer:W(()=>[D(`div`,Ns,[D(`button`,{type:`button`,class:`nc__btn`,onClick:n[6]||=e=>o.emit(`update:modelValue`,!1)},e(o.$t(`@WORKBENCH:取消`)),1),n[10]||=D(`span`,{class:`nc__foot-spacer`},null,-1),D(`button`,{type:`button`,class:`nc__btn`,disabled:!o.canSubmit,onClick:n[7]||=e=>o.submit(!0)},e(o.$t(`@WORKBENCH:创建并打开编辑器`)),9,Ps),D(`button`,{type:`button`,class:`nc__btn nc__btn--primary`,disabled:!o.canSubmit,onClick:n[8]||=e=>o.submit(!1)},e(o.submitting?o.$t(`@WORKBENCH:创建中…`):o.$t(`@WORKBENCH:创建`)),9,Fs)])]),default:W(()=>[D(`div`,bs,[D(`div`,xs,[D(`label`,Ss,e(o.$t(`@WORKBENCH:项目`)),1),L(D(`select`,{id:`nc-project`,"onUpdate:modelValue":n[0]||=e=>o.projectPath=e,class:`nc__select`},[D(`option`,Cs,e(o.$t(`@WORKBENCH:跟随当前项目`)),1),(A(!0),v(I,null,S(o.projectOptions,t=>(A(),v(`option`,{key:t.key,value:t.path},e(t.name)+e(t.exists===!1?` · ${o.$t(`@WORKBENCH:目录不存在`)}`:``),9,ws))),128))],512),[[pe,o.projectPath]]),D(`p`,{class:`nc__hint`,title:o.projectPath},e(o.projectName?o.$t(`@WORKBENCH:任务会在「{name}」目录下执行`,{name:o.projectName}):o.$t(`@WORKBENCH:任务会跟随应用当前的工作目录`)),9,Ts)]),D(`div`,Es,[D(`label`,Ds,e(o.$t(`@WORKBENCH:标题`)),1),L(D(`input`,{id:`nc-title`,"onUpdate:modelValue":n[1]||=e=>o.title=e,class:`nc__input`,type:`text`,maxlength:`200`,placeholder:o.$t(`@WORKBENCH:一句话说清要做什么`),onKeydown:n[2]||=K(J(e=>o.submit(!1),[`prevent`]),[`enter`])},null,40,Os),[[z,o.title]])]),D(`div`,ks,[D(`label`,As,e(o.$t(`@WORKBENCH:描述`)),1),L(D(`textarea`,{id:`nc-desc`,"onUpdate:modelValue":n[3]||=e=>o.desc=e,class:`nc__input nc__input--area`,rows:`6`,placeholder:o.$t(`@WORKBENCH:把背景、验收标准、相关文件路径写进来,执行时用它当上下文`),onKeydown:[n[4]||=K(J(e=>o.submit(!1),[`ctrl`,`prevent`]),[`enter`]),n[5]||=K(J(e=>o.submit(!1),[`meta`,`prevent`]),[`enter`])]},null,40,js),[[z,o.desc]])]),o.error?(A(),v(`p`,Ms,e(o.error),1)):r(`v-if`,!0)])]),_:1},8,[`model-value`,`title`])}var Ls=Q(ys,[[`render`,Is],[`__scopeId`,`data-v-c60e660a`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchTaskCreateDialog.vue`]]);X(),R();var Rs=`wb.boardProject.v1`,zs=5e3,Bs=`wb.boardLayout.v1`,Vs=180,Hs=420,Us=260,Ws=900,Gs=.26,Ks=.46,qs=120,Js=560,Ys=.5,Xs=s({__name:`WorkbenchBoard`,emits:[`open-task`],setup(e,{expose:t,emit:n}){t();let r=n,{projects:i,boardTasks:a,currentProjectPath:o,loading:s,loadProjects:c}=Cr(),{active:l,activity:d,running:p,dispatching:m,togglingSchedule:h,defaultPrompt:g,projectPrompts:_,loadOrchestrator:v,setSchedulingActive:y,dispatch:b,saveDefaultPrompt:x,saveProjectPrompt:S}=wr(),w=Y((()=>{try{return localStorage.getItem(Rs)||``}catch{return``}})());P(w,e=>{try{localStorage.setItem(Rs,e)}catch{}});let T=q(()=>w.value&&i.value.find(e=>e.key===w.value)||null);P(i,e=>{w.value&&(e.some(e=>e.key===w.value)||(w.value=``))});let E=q(()=>{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($(n.projectPath))||``);return t}),D=q(()=>{if(!w.value)return a.value;let e=w.value;return a.value.filter(t=>$(t.projectPath)===e)}),ee=q(()=>{let e=new Date;e.setHours(0,0,0,0);let t=e.getTime();return{projects:i.value.length,tasks:a.value.length,running:p.value.length,todayDone:d.value.filter(e=>e.kind===`done`&&e.at&&new Date(e.at).getTime()>=t).length}});function te(e){r(`open-task`,{taskId:e.id,projectPath:e.projectPath})}let ne=null,re=!1;async function k(e=!0){if(!re){re=!0;try{await Promise.all([c(e),v(e)])}finally{re=!1}}}function ie(){document.hidden||k(!0)}u(async()=>{window.addEventListener(`resize`,N),await k(!1),ne=setInterval(()=>{document.hidden||k(!0)},zs),document.addEventListener(`visibilitychange`,ie)}),f(()=>{window.removeEventListener(`resize`,N),ne&&=(clearInterval(ne),null),document.removeEventListener(`visibilitychange`,ie)});let A=se({left:null,right:null,agentH:null,leftCollapsed:!1,rightCollapsed:!1});function ae(){try{let e=localStorage.getItem(Bs);if(!e)return;let t=JSON.parse(e);typeof t.left==`number`&&Number.isFinite(t.left)&&(A.left=t.left),typeof t.right==`number`&&Number.isFinite(t.right)&&(A.right=t.right),typeof t.agentH==`number`&&Number.isFinite(t.agentH)&&(A.agentH=t.agentH),A.leftCollapsed=t.leftCollapsed===!0,A.rightCollapsed=t.rightCollapsed===!0}catch{}}ae();function j(){try{localStorage.setItem(Bs,JSON.stringify(A))}catch{}}let M=Y(typeof window>`u`?1920:window.innerWidth),oe=Y(typeof window>`u`?1080:window.innerHeight);function N(){M.value=window.innerWidth,oe.value=window.innerHeight}let F=q(()=>M.value<=1024),ce=q(()=>M.value<=860);function I(e,t){let n=e===`left`?Vs:Us,r=Math.min(e===`left`?Hs:Ws,M.value*(e===`left`?Gs:Ks));return Math.round(Math.min(Math.max(t,n),Math.max(n,r)))}function L(e){let t=Math.min(Js,oe.value*Ys);return Math.round(Math.min(Math.max(e,qs),Math.max(qs,t)))}let le=q(()=>{let e={};return A.left!=null&&(e[`--wb-left-w`]=I(`left`,A.left)+`px`),A.right!=null&&!ce.value&&(e[`--wb-right-w`]=I(`right`,A.right)+`px`),e}),ue=q(()=>{let e={};return A.agentH!=null&&(e[`--wb-agents-h`]=L(A.agentH)+`px`),e}),R=Y(null),de=Y(null),z=Y(null);function pe(e){return R.value?.querySelector(e===`left`?`.board__left`:`.oc`)}function me(e){window.removeEventListener(`mousemove`,e),document.body.style.userSelect=``,document.body.style.cursor=``,z.value=null,j()}function V(e,t){if(e===`left`?F.value:ce.value)return;let n=pe(e);if(!n)return;t.preventDefault();let r=t.clientX,i=n.getBoundingClientRect().width;z.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);A[e]=I(e,i+n)};window.addEventListener(`mousemove`,a),window.addEventListener(`mouseup`,()=>me(a),{once:!0})}function H(e){A[e]=null,j()}function he(){return de.value?.querySelector(`.agents`)}function U(e){let t=he();if(!t)return;e.preventDefault();let n=e.clientY,r=t.getBoundingClientRect().height;z.value=`agents`,document.body.style.userSelect=`none`,document.body.style.cursor=`row-resize`;let i=e=>{A.agentH=L(r+(n-e.clientY))};window.addEventListener(`mousemove`,i),window.addEventListener(`mouseup`,()=>me(i),{once:!0})}function ge(){A.agentH=null,j()}let W=Y(!1),ve=q(()=>F.value?!W.value:A.leftCollapsed);function ye(){if(F.value){W.value=!W.value;return}A.leftCollapsed=!A.leftCollapsed,j()}function G(){F.value&&(W.value=!1)}let be=q(()=>A.rightCollapsed&&!ce.value);function xe(){A.rightCollapsed=!A.rightCollapsed,j()}function K(e){w.value=e?e.key:``,W.value=!1}let Ce=Y(!1);function we(){Ce.value=!0}async function Te(e){if(await k(!0),e.openEditor){r(`open-task`,{taskId:e.task.id,projectPath:e.task.projectPath||``});return}B.success(Z(`@WORKBENCH:已创建任务`))}async function J(e){if(e.runningJobs>0)return;let t=Ne(),n={claude:t.claudeAvailable,opencode:t.opencodeAvailable},r=Ke();n[r]||(r=r===`claude`?`opencode`:`claude`);let i=`/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){B.error(a?.error||Z(`@WORKBENCH:执行失败`));return}B.success(Z(`@WORKBENCH:已开始执行`)),await k(!0)}async function X(e){let t=(e.title||``).trim()||Z(`@WORKBENCH:未命名任务`);try{await _e.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){B.error(n.error||Z(`@WORKBENCH:删除失败`));return}await k(!0)}let Ee=Y(null),De=q(()=>T.value?.path||o.value);async function Oe(e){let t=await b({text:e.text,projectPath:e.projectPath,autoRun:e.autoRun,attachments:e.attachments,useDefaultPrompt:e.useDefaultPrompt,executor:e.executor});t&&(Ee.value?.clearAttachments(),B.success(t.ran?Z(`@WORKBENCH:已派发并开始执行`):Z(`@WORKBENCH:已派发(只建任务未执行)`)),await k(!0))}async function ke(e){await y(e)}let Q=Y(!1),Ae=Y(!1),je=q(()=>{let e=T.value?.key;return e&&_.value?.[e]?.prompt||``});async function Me(e){if(Ae.value)return;let t=e.globalPrompt.trim(),n=e.projectPrompt.trim(),r=T.value;Ae.value=!0;try{let e=!0;t!==(g.value||``).trim()&&(e=await x(t)),e&&r&&n!==je.value.trim()&&(e=await S(r.path,n)),e&&(Q.value=!1)}finally{Ae.value=!1}}let Pe={emit:r,projects:i,boardTasks:a,currentProjectPath:o,loading:s,loadProjects:c,active:l,activity:d,running:p,dispatching:m,togglingSchedule:h,defaultPrompt:g,projectPrompts:_,loadOrchestrator:v,setSchedulingActive:y,dispatch:b,saveDefaultPrompt:x,saveProjectPrompt:S,SELECTED_KEY:Rs,selectedKey:w,selectedProject:T,projectLabels:E,visibleTasks:D,headerStats:ee,onOpenTask:te,POLL_MS:zs,get pollTimer(){return ne},set pollTimer(e){ne=e},get inFlight(){return re},set inFlight(e){re=e},refresh:k,onVisibilityChange:ie,LAYOUT_KEY:Bs,LEFT_W_MIN:Vs,LEFT_W_MAX:Hs,RIGHT_W_MIN:Us,RIGHT_W_MAX:Ws,LEFT_W_SHARE:Gs,RIGHT_W_SHARE:Ks,AGENT_H_MIN:qs,AGENT_H_MAX:Js,AGENT_H_SHARE:Ys,layout:A,readLayout:ae,saveLayout:j,viewportW:M,viewportH:oe,onWindowResize:N,isNarrow:F,isStacked:ce,clampWidth:I,clampAgentH:L,boardStyle:le,leftStyle:ue,colsRef:R,leftRef:de,dragging:z,panelEl:pe,endDrag:me,onSplitterMouseDown:V,onSplitterDblClick:H,agentEl:he,onAgentSplitterMouseDown:U,onAgentSplitterDblClick:ge,leftDrawerOpen:W,leftHidden:ve,toggleLeft:ye,onLeftEsc:G,rightHidden:be,toggleRight:xe,onSelectProject:K,createOpen:Ce,onCreateClick:we,onTaskCreated:Te,runTask:J,deleteTask:X,consoleRef:Ee,defaultProjectPath:De,onDispatch:Oe,onToggleSchedule:ke,promptDialogOpen:Q,savingPrompt:Ae,selectedProjectPrompt:je,onSavePromptDraft:Me,get $t(){return Z},get Plus(){return C},get Refresh(){return O},get Fold(){return Se},get Expand(){return fe},WorkbenchProjectPanel:$i,WorkbenchAgentPanel:ma,WorkbenchKanban:to,OrchestratorConsole:$o,WorkbenchDefaultPromptDialog:vs,WorkbenchTaskCreateDialog:Ls};return Object.defineProperty(Pe,"__isScriptSetup",{enumerable:!1,value:!0}),Pe}});X(),b(),G();var Zs={class:`board__top`},Qs=[`title`,`aria-label`,`aria-expanded`],$s={class:`board__brand`},ec={class:`board__brand-text`},tc={class:`board__title`},nc={class:`board__subtitle`},rc={class:`board__stats`},ic={class:`board__stat`},ac={class:`board__stat-label`},oc={class:`board__stat-value`},sc={class:`board__stat`},cc={class:`board__stat-label`},lc={class:`board__stat-value`},uc={class:`board__stat`},dc={class:`board__stat-label`},fc={class:`board__stat`},pc={class:`board__stat-label`},mc={class:`board__stat-value`},hc={class:`board__actions`},gc=[`title`,`aria-label`],_c=[`title`],vc=[`title`],yc={class:`board__main`},bc={class:`board__main-head`},xc={class:`board__main-title`},Sc={class:`board__project-name`},Cc=[`title`],wc={key:1,class:`board__project-path`},Tc={key:0,class:`board__project-meta`},Ec=[`title`];function Dc(t,n,i,o,s,c){let l=d,u=p;return A(),v(`div`,{class:`board`,style:j(o.boardStyle)},[D(`header`,Zs,[r(` 左栏的开合。宽屏=收起/展开常驻那一栏;窄屏=抽屉 `),D(`button`,{type:`button`,class:U([`board__icon-btn board__fold-btn`,{"is-on":!o.leftHidden}]),title:o.leftHidden?o.$t(`@WORKBENCH:展开项目列表`):o.$t(`@WORKBENCH:收起项目列表`),"aria-label":o.leftHidden?o.$t(`@WORKBENCH:展开项目列表`):o.$t(`@WORKBENCH:收起项目列表`),"aria-expanded":!o.leftHidden,onClick:o.toggleLeft},[o.leftHidden?(A(),a(l,{key:1},{default:W(()=>[_(o.Expand)]),_:1})):(A(),a(l,{key:0},{default:W(()=>[_(o.Fold)]),_:1}))],10,Qs),D(`div`,$s,[D(`span`,{class:U([`board__live`,{"is-off":!o.active}]),"aria-hidden":`true`},null,2),D(`div`,ec,[D(`h1`,tc,e(o.$t(`@WORKBENCH:多项目编排台`)),1),D(`p`,nc,e(o.active?o.$t(`@WORKBENCH:主 Agent 调度中`):o.$t(`@WORKBENCH:主 Agent 已暂停`)),1)])]),D(`div`,rc,[D(`span`,ic,[D(`span`,ac,e(o.$t(`@WORKBENCH:项目`)),1),D(`strong`,oc,e(o.headerStats.projects),1)]),D(`span`,sc,[D(`span`,cc,e(o.$t(`@WORKBENCH:任务`)),1),D(`strong`,lc,e(o.headerStats.tasks),1)]),D(`span`,uc,[D(`span`,dc,e(o.$t(`@WORKBENCH:活跃执行`)),1),D(`strong`,{class:U([`board__stat-value`,{"is-live":o.headerStats.running>0}])},e(o.headerStats.running),3)]),D(`span`,fc,[D(`span`,pc,e(o.$t(`@WORKBENCH:今日完成`)),1),D(`strong`,mc,e(o.headerStats.todayDone),1)])]),D(`div`,hc,[D(`button`,{type:`button`,class:`board__icon-btn`,title:o.$t(`@WORKBENCH:刷新`),"aria-label":o.$t(`@WORKBENCH:刷新`),onClick:n[0]||=e=>o.refresh(!1)},[_(l,null,{default:W(()=>[_(o.Refresh)]),_:1})],8,gc),_(u,{type:`primary`,size:`small`,icon:o.Plus,onClick:o.onCreateClick},{default:W(()=>[g(e(o.$t(`@WORKBENCH:新建开发任务`)),1)]),_:1},8,[`icon`])])]),D(`div`,{ref:`colsRef`,class:U([`board__cols`,{"is-resizing":o.dragging!==null}])},[r(` 抽屉打开时的点击捕获层:点空白处收起。
|
|
42
42
|
只在窄屏 + 打开时才 display:block(见媒体查询),宽屏下是个不占位的空 div。
|
|
43
43
|
不加遮罩底色而是全透明 —— 只是为了接住点击,不是为了压暗看板;
|
|
44
44
|
真要压暗就得处理深色主题下半透明背景叠不实的老问题(见 NOTES §2)。 `),D(`div`,{class:U([`board__scrim`,{"is-on":o.leftDrawerOpen}]),"aria-hidden":`true`,onClick:n[1]||=e=>o.leftDrawerOpen=!1},null,2),D(`aside`,{ref:`leftRef`,class:U([`board__left`,{"is-collapsed":o.leftHidden}]),style:j(o.leftStyle),onKeydown:K(o.onLeftEsc,[`esc`])},[_(o.WorkbenchProjectPanel,{projects:o.projects,"selected-key":o.selectedKey,loading:o.loading,onSelect:o.onSelectProject},null,8,[`projects`,`selected-key`,`loading`]),r(` 项目列表 / 执行监控之间的横向分隔条:上下拖动改监控高度,双击恢复默认。
|
|
45
|
-
这条同时也画出两段之间的那条 1px 分隔线(原来挂在 .agents 的 border-top 上)。 `),D(`div`,{class:`board__splitter board__splitter--h`,role:`separator`,"aria-orientation":`horizontal`,title:o.$t(`@WORKBENCH:上下拖动调整执行监控高度,双击恢复默认`),onMousedown:o.onAgentSplitterMouseDown,onDblclick:o.onAgentSplitterDblClick},null,40,_c),_(o.WorkbenchAgentPanel,{running:o.running},null,8,[`running`])],38),r(` 左栏分隔条:左栏收起 / 窄屏抽屉模式下不占位(不渲染 / 媒体查询里 display:none) `),o.leftHidden?r(`v-if`,!0):(A(),v(`div`,{key:0,class:`board__splitter board__splitter--left`,role:`separator`,"aria-orientation":`vertical`,title:o.$t(`@WORKBENCH:拖动调整项目列表宽度,双击恢复默认`),onMousedown:n[2]||=e=>o.onSplitterMouseDown(`left`,e),onDblclick:n[3]||=e=>o.onSplitterDblClick(`left`)},null,40,vc)),D(`main`,yc,[D(`div`,bc,[D(`div`,xc,[D(`h2`,Sc,e(o.selectedProject?o.selectedProject.name:o.$t(`@WORKBENCH:全部项目`)),1),o.selectedProject?(A(),v(`span`,{key:0,class:`board__project-path`,title:o.selectedProject.path},e(o.selectedProject.path),9,Cc)):(A(),v(`span`,wc,e(o.$t(`@WORKBENCH:共 {n} 个项目的任务`,{n:o.projects.length})),1))]),o.selectedProject?(A(),v(`span`,Tc,e(o.$t(`@WORKBENCH:{done}/{total} 任务完成`,{done:o.selectedProject.stats.done,total:o.selectedProject.stats.total})),1)):r(`v-if`,!0)]),_(o.WorkbenchKanban,{tasks:o.visibleTasks,"project-labels":o.projectLabels,"show-project-label":!o.selectedProject,onOpenTask:o.onOpenTask,onRunTask:o.runTask,onDeleteTask:o.deleteTask,onCreateTask:o.onCreateClick},null,8,[`tasks`,`project-labels`,`show-project-label`])]),r(` 右栏分隔条:右栏收起 / 竖排(≤860)时不占位 `),!o.rightHidden&&!o.isStacked?(A(),v(`div`,{key:1,class:`board__splitter board__splitter--right`,role:`separator`,"aria-orientation":`vertical`,title:o.$t(`@WORKBENCH:拖动调整主 Agent 控制台宽度,双击恢复默认`),onMousedown:n[4]||=e=>o.onSplitterMouseDown(`right`,e),onDblclick:n[5]||=e=>o.onSplitterDblClick(`right`)},null,40,Ec)):r(`v-if`,!0),_(o.OrchestratorConsole,{ref:`consoleRef`,active:o.active,activity:o.activity,"running-count":o.running.length,"selected-project":o.selectedProject,dispatching:o.dispatching,"toggling-schedule":o.togglingSchedule,"today-done":o.headerStats.todayDone,collapsed:o.rightHidden,"default-prompt":o.defaultPrompt,"project-prompts":o.projectPrompts,onToggleCollapse:o.toggleRight,onToggleSchedule:o.onToggleSchedule,onDispatch:o.onDispatch,onOpenPromptSettings:n[6]||=e=>o.promptDialogOpen=!0},null,8,[`active`,`activity`,`running-count`,`selected-project`,`dispatching`,`toggling-schedule`,`today-done`,`collapsed`,`default-prompt`,`project-prompts`])],2),r(` 派发默认提示词:全局一条 + 选中项目一条,写完即生效于之后的派发 `),_(o.WorkbenchDefaultPromptDialog,{modelValue:o.promptDialogOpen,"onUpdate:modelValue":n[7]||=e=>o.promptDialogOpen=e,"default-prompt":o.defaultPrompt,"project-path":o.selectedProject?.path||``,"project-name":o.selectedProject?.name||``,"project-prompt":o.selectedProjectPrompt,saving:o.savingPrompt,onSave:o.onSavePromptDraft},null,8,[`modelValue`,`default-prompt`,`project-path`,`project-name`,`project-prompt`,`saving`]),r(` 新建任务:弹窗里问清字段,建完就关 `),_(o.WorkbenchTaskCreateDialog,{modelValue:o.createOpen,"onUpdate:modelValue":n[8]||=e=>o.createOpen=e,projects:o.projects,"default-project-path":o.defaultProjectPath,onCreated:o.onTaskCreated},null,8,[`modelValue`,`projects`,`default-project-path`])],4)}var Oc=Q(Xs,[[`render`,Dc],[`__scopeId`,`data-v-dd2dc7b4`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchBoard.vue`]]);X(),R();var kc=`wb.lastTaskByProject.v1`,Ac=`__no_project__`,jc=`wb.sidebarWidth.v1`,Mc=200,Nc=480,Pc=268,Fc=52,Ic=320,Lc=500,Rc=s({__name:`WorkbenchView`,setup(e,{expose:t}){t();let n=je(),r=Me(),i=Y((()=>{try{let e=parseInt(localStorage.getItem(jc)||``,10);return Number.isFinite(e)?Math.min(Nc,Math.max(Mc,e)):Pc}catch{return Pc}})());function a(e){e.preventDefault();let t=e.clientX,n=i.value;document.body.style.userSelect=`none`,document.body.style.cursor=`col-resize`;let r=e=>{i.value=Math.min(Nc,Math.max(Mc,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(jc,String(i.value))}catch{}},{once:!0})}function o(){try{let e=localStorage.getItem(kc),t=e?JSON.parse(e):{};return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function s(e){try{localStorage.setItem(kc,JSON.stringify(e))}catch{}}function c(e,t){let n=o();n[e||Ac]=t,s(n)}let d=Y(!1);function p(){d.value=!1}async function m(e){await E(),O.value=e.taskId,j(),k.value&&c($(v.value.path),e.taskId),d.value=!0}let{prompts:h,tasks:g,jobs:_,currentProject:v,syncRunningCount:y,connectSSE:b,disconnectSSE:x,loadPrompts:S,loadCurrentProject:C,loadJobs:w,clearJobsByTask:T,loadTasks:E}=Fn();function D(){let e=$(v.value.path),t=g.value.filter(t=>!t.projectPath||$(t.projectPath)===e),n=o(),r=e&&n[e]||!e&&n[Ac]||``,i=r?g.value.find(e=>e.id===r):null,a=t[0]||g.value[0]||null,s=i&&i.projectPath&&$(i.projectPath)!==e?null:i?i.id:a?a.id:null;O.value=s,j()}async function ee(){let e=O.value;if(await E(),e&&g.value.some(t=>t.id===e)){j();return}D()}async function te(){await E(),D()}let re=Y(!1),O=Y(null),k=q(()=>g.value.find(e=>e.id===O.value)||null),ie=q(()=>{let e=k.value?.projectPath||``;return!e||$(e)===$(v.value.path)?null:{name:e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e,path:e}}),A=Y({title:``,desc:``,promptId:null,simpleOverride:``});function j(){k.value?A.value={title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:A.value={title:``,desc:``,promptId:null,simpleOverride:``}}let M=Y(`idle`),oe=Y(0),N=null,F=q(()=>{if(!k.value)return!1;let e=k.value;return A.value.title!==e.title||A.value.desc!==e.desc||A.value.promptId!==e.promptId||A.value.simpleOverride!==(e.simpleOverride||``)});function ce(){N!==null&&(clearTimeout(N),N=null)}function I(e){return!(!e||(e.title||``).trim()||(e.desc||``).trim()||e.promptId||(e.simpleOverride||``).trim()||Array.isArray(e.attachments)&&e.attachments.length>0)}async function L(e){try{await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`})}catch{}let t=g.value.findIndex(t=>t.id===e.id);t!==-1&&g.value.splice(t,1)}async function R(){let e=g.value.filter(e=>e.id!==O.value&&I(e));for(let t of e)await L(t)}async function z(){if(!k.value)return!1;if(!F.value)return!0;if(M.value=`saving`,await Ye(!1))return oe.value=Date.now(),M.value=`saved`,setTimeout(()=>{M.value===`saved`&&Date.now()-oe.value>=4e3&&(M.value=`idle`)},4e3),!0;M.value=`error`;let e=Date.now();return setTimeout(()=>{M.value===`error`&&Date.now()-e>=4e3&&(M.value=`idle`)},4e3),!1}P(()=>k.value?{id:k.value.id,title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:null,(e,t)=>{e&&t&&e.id===t.id&&(N!==null&&clearTimeout(N),N=window.setTimeout(()=>{z()},1500))},{deep:!0}),P(O,async(e,t)=>{ce(),k.value&&F.value&&await z()}),P(v,async e=>{if(!e.path)return;let t=$(e.path),n=k.value;n&&n.projectPath&&$(n.projectPath)!==t&&await te()});function fe(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function pe(){k.value&&F.value&&!I(k.value)&&fe(k.value)}let V=se({visible:!1,editing:null,name:``,content:``,aiLoading:!1,projectPath:``}),H=se({visible:!1,text:``,loading:!1,saving:!1}),U=Y(!0),ge=q(()=>{let e=$(v.value.path);return h.value.filter(t=>!t.projectPath||$(t.projectPath)===e)});async function W(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}}let ye=Y(null),G=Y(null);async function be(e){if(e){if(!await W((e.title||``).trim()||Z(`@WORKBENCH:未命名任务`))){B.error(Z(`@WORKBENCH:复制失败`));return}ye.value=e.id,B.success(Z(`@WORKBENCH:已复制任务标题`)),window.setTimeout(()=>{ye.value===e.id&&(ye.value=null)},1500)}}async function xe(e){if(!e)return;let t=(e.desc||``).trim();if(!t){B.warning(Z(`@WORKBENCH:任务描述为空,无需复制`));return}if(!await W(t)){B.error(Z(`@WORKBENCH:复制失败`));return}G.value=e.id,B.success(Z(`@WORKBENCH:已复制任务描述`)),window.setTimeout(()=>{G.value===e.id&&(G.value=null)},1500)}let{simpleConversationMessages:K,simpleAllJobsFor:Se,simpleJobFor:Ce,simpleJobState:we}=Nn(_,k);function Te(e){if(!e)return!1;let t=Ce(e);return!!t&&(t.status===`running`||t.status===`pending`)}function J(){V.editing=null,V.name=``,V.content=``,V.aiLoading=!1,V.projectPath=(v.value.path||``).trim(),V.visible=!0}function X(e){V.editing=e,V.name=e.name,V.content=e.content,V.aiLoading=!1,V.projectPath=(e.projectPath||``).trim(),V.visible=!0}async function Oe(){if(!V.aiLoading){V.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?(V.name=e.name||V.name,V.content=e.result||``,B.success(Z(`@WORKBENCH:已生成,可继续编辑`))):B.error(e.error||Z(`@WORKBENCH:生成失败`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{V.aiLoading=!1}}}async function ke(){H.visible=!0,H.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?H.text=e.instruction||``:B.error(e.error||Z(`@WORKBENCH:读取指令失败`))}catch(e){B.error(Z(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{H.loading=!1}}async function Q(){if(!H.text.trim()){B.warning(Z(`@WORKBENCH:指令内容不能为空`));return}H.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:H.text})}).then(e=>e.json());e.success?(B.success(Z(`@WORKBENCH:已保存指令`)),H.visible=!1):B.error(e.error||Z(`@WORKBENCH:保存失败`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{H.saving=!1}}async function Ae(){if(!V.name.trim()||!V.content.trim()){B.warning(Z(`@WORKBENCH:名称和内容不能为空`));return}let e={id:V.editing?.id,name:V.name.trim(),content:V.content,projectPath:(V.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?(B.success(Z(`@WORKBENCH:已保存`)),V.visible=!1,S()):B.error(t.error||Z(`@WORKBENCH:保存失败`))}async function Pe(e){await _e.confirm(Z(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),S();for(let t of g.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 ee()}let Le=Y(!1),Re=Y(null),ze=Y(null);function Be(e){let t=e?.currentTarget||ze.value;if(!t)return;t.style.height=`auto`;let n=document.activeElement===t?Lc:Ic,r=Math.min(Math.max(t.scrollHeight,Fc),n);t.style.height=`${r}px`,t.style.overflowY=t.scrollHeight>n?`auto`:`hidden`}P(U,async e=>{e&&(await ne(),Be())}),P(()=>k.value?.id,async()=>{U.value&&(await ne(),Be())});async function Ve(){if(Le.value)return;Le.value=!0;let e={title:``,desc:``,promptId:null,simpleOverride:``};v.value.path&&(e.projectPath=v.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){B.error(t.error||Z(`@WORKBENCH:保存失败`));return}ce(),k.value&&I(k.value)?await L(k.value):k.value&&F.value&&await z(),await te(),t.task?.id&&(O.value=t.task.id,j(),B.success(Z(`@WORKBENCH:已新建任务`)),await ne(),Re.value?.focus())}finally{Le.value=!1}}async function He(e){await _e.confirm(Z(`@WORKBENCH:删除任务「{title}」?`,{title:e.title}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),O.value===e.id&&(O.value=null),te()}async function Ue(e){let t=(e.title||Z(`@WORKBENCH:未命名任务`)).trim(),n={title:Z(`@WORKBENCH:{title} (副本)`,{title:t}),desc:e.desc||``,promptId:e.promptId||null,simpleOverride:e.simpleOverride||``};v.value.path&&(n.projectPath=v.value.path);try{let e=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}).then(e=>e.json());if(!e.success){B.error(e.error||Z(`@WORKBENCH:复制失败`));return}await te(),e.task?.id&&(O.value=e.task.id,j()),B.success(Z(`@WORKBENCH:已复制任务`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}}async function Ge(e){if(O.value===e.id)return;ce();let t=k.value;t&&I(t)?await L(t):t&&F.value&&await z(),O.value=e.id,j(),c($(v.value.path),e.id)}async function qe(e){let{groupPath:t,orderedIds:n}=e;if(!Array.isArray(n)||n.length===0)return;let r=g.value.slice(),i=Je(g.value,t,n);if(i!==g.value){g.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||(g.value=r,B.error(e?.error||Z(`@WORKBENCH:排序保存失败`)))}catch(e){g.value=r,B.error(Z(`@WORKBENCH:排序保存失败`)+`: `+(e?.message||e))}}}function Je(e,t,n){let r=e=>$(e)||Ac,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}async function Ye(e){if(!k.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(k.value)}).then(e=>e.json());return t.success?(e&&B.success(Z(`@WORKBENCH:已保存`)),await ee(),!0):(B.error(t.error||Z(`@WORKBENCH:保存失败`)),!1)}u(async()=>{await Promise.all([S(),te(),C(),w()]),await R(),b(),window.addEventListener(`beforeunload`,pe)}),f(()=>{x(),window.removeEventListener(`beforeunload`,pe),k.value&&F.value&&!I(k.value)&&fe(k.value)});let{pasteHoverId:Xe,isUploading:Ze,isImageAttachment:Qe,humanSize:$e,onAttachmentPaste:et,onAttachmentDrop:tt,uploadAttachment:nt,removeAttachment:rt,pickAttachmentFile:it}=An(),{runTask:at,onContinueSendFromChat:ot,cancelJob:st,clearExecutionForSelectedTask:lt}=Pn(_,g,k,{syncRunningCount:y,clearJobsByTask:T,persistTask:Ye,uploadAttachment:nt,getExecutor:()=>ut.value}),ut=Y(Ke()),ft=q(()=>({claude:r.claudeAvailable,opencode:r.opencodeAvailable})),pt=q(()=>ft.value.claude||ft.value.opencode);P(ft,e=>{if(e[ut.value])return;let t=Object.keys(e).find(t=>e[t]);t&&(ut.value=t)},{immediate:!0});function mt(e){ft.value[e]&&(ut.value=e,Ie(e))}function ht(e){return We.find(t=>t.id===e)?.name||e}let gt=q(()=>Se(k.value).slice(-1)[0]),_t={configStore:n,toolsStore:r,LAST_TASK_BY_PROJECT_KEY:kc,NO_PROJECT_KEY:Ac,SIDEBAR_WIDTH_KEY:jc,SIDEBAR_MIN_W:Mc,SIDEBAR_MAX_W:Nc,SIDEBAR_DEFAULT_W:Pc,sidebarWidth:i,onSidebarSplitterMouseDown:a,readLastTaskMap:o,writeLastTaskMap:s,rememberLastTask:c,editorOpen:d,closeEditor:p,openTaskFromBoard:m,prompts:h,tasks:g,jobs:_,currentProject:v,syncRunningCount:y,connectSSE:b,disconnectSSE:x,loadPrompts:S,loadCurrentProject:C,loadJobs:w,clearJobsByTask:T,_loadDataTasks:E,applyRestoredSelection:D,refreshTasks:ee,loadTasks:te,logsDialogVisible:re,selectedTaskId:O,selectedTask:k,foreignRepo:ie,metaSnapshot:A,captureSnapshot:j,metaSaveState:M,metaSavedAt:oe,get metaSaveTimer(){return N},set metaSaveTimer(e){N=e},metaDirty:F,clearMetaSaveTimers:ce,isTaskBlank:I,discardBlankTask:L,pruneBlankTasks:R,flushMetaSave:z,beaconPersist:fe,onBeforeUnloadPersist:pe,promptDialog:V,instructionDialog:H,taskDescExpanded:U,availablePrompts:ge,copyToClipboard:W,copyTitleFlashId:ye,copyDescFlashId:G,copyTaskTitle:be,copyTaskDesc:xe,simpleConversationMessages:K,simpleAllJobsFor:Se,simpleJobFor:Ce,simpleJobState:we,isTaskRunning:Te,openCreatePrompt:J,openEditPrompt:X,aiGeneratePrompt:Oe,openEditInstruction:ke,saveInstruction:Q,savePrompt:Ae,deletePrompt:Pe,creatingTask:Le,titleInputRef:Re,taskDescTextareaRef:ze,DESC_TEXTAREA_MIN_PX:Fc,DESC_TEXTAREA_MAX_PX:Ic,DESC_TEXTAREA_MAX_PX_FOCUS:Lc,autoGrowTextarea:Be,createTaskDirect:Ve,deleteTask:He,copyTask:Ue,selectTask:Ge,reorderTasks:qe,applyLocalReorder:Je,persistTask:Ye,pasteHoverId:Xe,isUploading:Ze,isImageAttachment:Qe,humanSize:$e,onAttachmentPaste:et,onAttachmentDrop:tt,uploadAttachment:nt,removeAttachment:rt,pickAttachmentFile:it,runTask:at,onContinueSendFromChat:ot,cancelJob:st,clearExecutionForSelectedTask:lt,selectedTaskExecutor:ut,executorAvailability:ft,hasAnyExecutor:pt,pickExecutor:mt,executorLabel:ht,lastSimpleJob:gt,simpleAssistantLabel:q(()=>gt.value?.agent===`opencode`?`OpenCode`:`Claude`),simpleAssistantAvatar:q(()=>dt(gt.value?.agent)),get $t(){return Z},get ArrowDown(){return he},get ArrowLeft(){return l},get ArrowRight(){return ae},get Check(){return ue},get Document(){return de},get Delete(){return le},get CopyDocument(){return ve},get Warning(){return me},AttachmentZone:ct,get ChatInput(){return Ee},get ChatContainer(){return De},ExecutionLogManager:yn,get ALLOWED_EXT_HINT(){return xn},get MAX_ATTACHMENT_BYTES(){return Sn},get TASK_EXECUTOR_OPTIONS(){return We},TaskExecutorIcon:Fe,WorkbenchSidebar:Sr,WorkbenchBoard:Oc,CommonDialog:Ne};return Object.defineProperty(_t,"__isScriptSetup",{enumerable:!1,value:!0}),_t}});X(),b(),G();var zc={class:`workbench`},Bc={class:`wb-editor`},Vc={class:`wb-editor-bar`},Hc=[`title`],Uc=[`title`],Wc=[`title`],Gc={class:`wb-editor-bar__hint`},Kc={class:`workbench__editor-row`},qc=[`title`],Jc={class:`wb-split`},Yc={key:0,class:`wb-placeholder`},Xc={class:`wb-split__header`},Zc={class:`wb-split__title-wrap`},Qc=[`placeholder`],$c=[`title`,`aria-label`],el=[`title`],tl={key:0,class:`wb-meta-save__dot`},nl={key:1,class:`wb-meta-save__check`},rl={key:2,class:`wb-meta-save__bang`},il={key:3,class:`wb-meta-save__dot`},al={value:null},ol=[`value`],sl={class:`wb-executor-split__hint`},cl={class:`wb-executor-item`},ll={class:`wb-executor-item__name`},ul={key:1,class:`wb-executor-item__missing`},dl={key:2,class:`wb-no-claude-hint`,role:`status`},fl={class:`wb-no-claude-hint__text`},pl={class:`wb-no-claude-hint__link`,href:`https://docs.claude.com/en/docs/claude-code/setup`,target:`_blank`,rel:`noopener noreferrer`},ml=[`title`,`aria-label`],hl=[`title`,`aria-label`],gl=[`open`],_l={class:`wb-task-desc__summary`},vl={class:`wb-task-desc__label`},yl=[`title`,`aria-label`],bl={key:0,class:`wb-task-desc__tag`},xl={key:0},Sl={key:1,class:`wb-task-desc__tag-attachment`},Cl=[`placeholder`],wl={class:`wb-execution-body`},Tl={class:`wb-exec-detail`},El={class:`wb-form-item__label wb-simple__override-summary`},Dl=[`title`],Ol=[`placeholder`],kl={key:0,class:`wb-simple-chat-wrap`},Al={key:0,class:`wb-simple-chat__footer`},jl={style:{display:`flex`,gap:`8px`,"align-items":`center`}};function Ml(t,s,c,l,u,f){let m=d,h=n,b=Ce,x=w,C=i,T=re,E=k,ee=y,ne=o,O=p,ie=te;return A(),v(`div`,zc,[r(` L1:多项目编排台 —— **常驻底图**,不再与编辑器互斥 `),_(l.WorkbenchBoard,{onOpenTask:l.openTaskFromBoard}),r(` L2:单任务编辑器 —— 大弹窗浮在看板之上,关掉即回到原位,全程无跳转 `),_(l.CommonDialog,{modelValue:l.editorOpen,"onUpdate:modelValue":s[21]||=e=>l.editorOpen=e,title:l.$t(`@WORKBENCH:任务执行`),type:`flex`,"height-mode":`fixed`,"height-offset":`88px`,top:`2vh`,width:`min(1520px, 96vw)`},{default:W(()=>[D(`div`,Bc,[r(` 顶部细栏:关闭入口做成独立一条,而不是塞进任务头 ——
|
|
45
|
+
这条同时也画出两段之间的那条 1px 分隔线(原来挂在 .agents 的 border-top 上)。 `),D(`div`,{class:`board__splitter board__splitter--h`,role:`separator`,"aria-orientation":`horizontal`,title:o.$t(`@WORKBENCH:上下拖动调整执行监控高度,双击恢复默认`),onMousedown:o.onAgentSplitterMouseDown,onDblclick:o.onAgentSplitterDblClick},null,40,_c),_(o.WorkbenchAgentPanel,{running:o.running},null,8,[`running`])],38),r(` 左栏分隔条:左栏收起 / 窄屏抽屉模式下不占位(不渲染 / 媒体查询里 display:none) `),o.leftHidden?r(`v-if`,!0):(A(),v(`div`,{key:0,class:`board__splitter board__splitter--left`,role:`separator`,"aria-orientation":`vertical`,title:o.$t(`@WORKBENCH:拖动调整项目列表宽度,双击恢复默认`),onMousedown:n[2]||=e=>o.onSplitterMouseDown(`left`,e),onDblclick:n[3]||=e=>o.onSplitterDblClick(`left`)},null,40,vc)),D(`main`,yc,[D(`div`,bc,[D(`div`,xc,[D(`h2`,Sc,e(o.selectedProject?o.selectedProject.name:o.$t(`@WORKBENCH:全部项目`)),1),o.selectedProject?(A(),v(`span`,{key:0,class:`board__project-path`,title:o.selectedProject.path},e(o.selectedProject.path),9,Cc)):(A(),v(`span`,wc,e(o.$t(`@WORKBENCH:共 {n} 个项目的任务`,{n:o.projects.length})),1))]),o.selectedProject?(A(),v(`span`,Tc,e(o.$t(`@WORKBENCH:{done}/{total} 任务完成`,{done:o.selectedProject.stats.done,total:o.selectedProject.stats.total})),1)):r(`v-if`,!0)]),_(o.WorkbenchKanban,{tasks:o.visibleTasks,"project-labels":o.projectLabels,"show-project-label":!o.selectedProject,onOpenTask:o.onOpenTask,onRunTask:o.runTask,onDeleteTask:o.deleteTask,onCreateTask:o.onCreateClick},null,8,[`tasks`,`project-labels`,`show-project-label`])]),r(` 右栏分隔条:右栏收起 / 竖排(≤860)时不占位 `),!o.rightHidden&&!o.isStacked?(A(),v(`div`,{key:1,class:`board__splitter board__splitter--right`,role:`separator`,"aria-orientation":`vertical`,title:o.$t(`@WORKBENCH:拖动调整主 Agent 控制台宽度,双击恢复默认`),onMousedown:n[4]||=e=>o.onSplitterMouseDown(`right`,e),onDblclick:n[5]||=e=>o.onSplitterDblClick(`right`)},null,40,Ec)):r(`v-if`,!0),_(o.OrchestratorConsole,{ref:`consoleRef`,active:o.active,activity:o.activity,"running-count":o.running.length,"selected-project":o.selectedProject,dispatching:o.dispatching,"toggling-schedule":o.togglingSchedule,"today-done":o.headerStats.todayDone,collapsed:o.rightHidden,"default-prompt":o.defaultPrompt,"project-prompts":o.projectPrompts,onToggleCollapse:o.toggleRight,onToggleSchedule:o.onToggleSchedule,onDispatch:o.onDispatch,onOpenPromptSettings:n[6]||=e=>o.promptDialogOpen=!0},null,8,[`active`,`activity`,`running-count`,`selected-project`,`dispatching`,`toggling-schedule`,`today-done`,`collapsed`,`default-prompt`,`project-prompts`])],2),r(` 派发默认提示词:全局一条 + 选中项目一条,写完即生效于之后的派发 `),_(o.WorkbenchDefaultPromptDialog,{modelValue:o.promptDialogOpen,"onUpdate:modelValue":n[7]||=e=>o.promptDialogOpen=e,"default-prompt":o.defaultPrompt,"project-path":o.selectedProject?.path||``,"project-name":o.selectedProject?.name||``,"project-prompt":o.selectedProjectPrompt,saving:o.savingPrompt,onSave:o.onSavePromptDraft},null,8,[`modelValue`,`default-prompt`,`project-path`,`project-name`,`project-prompt`,`saving`]),r(` 新建任务:弹窗里问清字段,建完就关 `),_(o.WorkbenchTaskCreateDialog,{modelValue:o.createOpen,"onUpdate:modelValue":n[8]||=e=>o.createOpen=e,projects:o.projects,"default-project-path":o.defaultProjectPath,onCreated:o.onTaskCreated},null,8,[`modelValue`,`projects`,`default-project-path`])],4)}var Oc=Q(Xs,[[`render`,Dc],[`__scopeId`,`data-v-dd2dc7b4`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/components/WorkbenchBoard.vue`]]);X(),R();var kc=`wb.lastTaskByProject.v1`,Ac=`__no_project__`,jc=`wb.sidebarWidth.v1`,Mc=200,Nc=480,Pc=268,Fc=52,Ic=320,Lc=500,Rc=s({__name:`WorkbenchView`,setup(e,{expose:t}){t();let n=je(),r=Ne(),i=Y((()=>{try{let e=parseInt(localStorage.getItem(jc)||``,10);return Number.isFinite(e)?Math.min(Nc,Math.max(Mc,e)):Pc}catch{return Pc}})());function a(e){e.preventDefault();let t=e.clientX,n=i.value;document.body.style.userSelect=`none`,document.body.style.cursor=`col-resize`;let r=e=>{i.value=Math.min(Nc,Math.max(Mc,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(jc,String(i.value))}catch{}},{once:!0})}function o(){try{let e=localStorage.getItem(kc),t=e?JSON.parse(e):{};return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function s(e){try{localStorage.setItem(kc,JSON.stringify(e))}catch{}}function c(e,t){let n=o();n[e||Ac]=t,s(n)}let d=Y(!1);function p(){d.value=!1}async function m(e){await E(),O.value=e.taskId,j(),k.value&&c($(v.value.path),e.taskId),d.value=!0}let{prompts:h,tasks:g,jobs:_,currentProject:v,syncRunningCount:y,connectSSE:b,disconnectSSE:x,loadPrompts:S,loadCurrentProject:C,loadJobs:w,clearJobsByTask:T,loadTasks:E}=Fn();function D(){let e=$(v.value.path),t=g.value.filter(t=>!t.projectPath||$(t.projectPath)===e),n=o(),r=e&&n[e]||!e&&n[Ac]||``,i=r?g.value.find(e=>e.id===r):null,a=t[0]||g.value[0]||null,s=i&&i.projectPath&&$(i.projectPath)!==e?null:i?i.id:a?a.id:null;O.value=s,j()}async function ee(){let e=O.value;if(await E(),e&&g.value.some(t=>t.id===e)){j();return}D()}async function te(){await E(),D()}let re=Y(!1),O=Y(null),k=q(()=>g.value.find(e=>e.id===O.value)||null),ie=q(()=>{let e=k.value?.projectPath||``;return!e||$(e)===$(v.value.path)?null:{name:e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e,path:e}}),A=Y({title:``,desc:``,promptId:null,simpleOverride:``});function j(){k.value?A.value={title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:A.value={title:``,desc:``,promptId:null,simpleOverride:``}}let M=Y(`idle`),oe=Y(0),N=null,F=q(()=>{if(!k.value)return!1;let e=k.value;return A.value.title!==e.title||A.value.desc!==e.desc||A.value.promptId!==e.promptId||A.value.simpleOverride!==(e.simpleOverride||``)});function ce(){N!==null&&(clearTimeout(N),N=null)}function I(e){return!(!e||(e.title||``).trim()||(e.desc||``).trim()||e.promptId||(e.simpleOverride||``).trim()||Array.isArray(e.attachments)&&e.attachments.length>0)}async function L(e){try{await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`})}catch{}let t=g.value.findIndex(t=>t.id===e.id);t!==-1&&g.value.splice(t,1)}async function R(){let e=g.value.filter(e=>e.id!==O.value&&I(e));for(let t of e)await L(t)}async function z(){if(!k.value)return!1;if(!F.value)return!0;if(M.value=`saving`,await Ye(!1))return oe.value=Date.now(),M.value=`saved`,setTimeout(()=>{M.value===`saved`&&Date.now()-oe.value>=4e3&&(M.value=`idle`)},4e3),!0;M.value=`error`;let e=Date.now();return setTimeout(()=>{M.value===`error`&&Date.now()-e>=4e3&&(M.value=`idle`)},4e3),!1}P(()=>k.value?{id:k.value.id,title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:null,(e,t)=>{e&&t&&e.id===t.id&&(N!==null&&clearTimeout(N),N=window.setTimeout(()=>{z()},1500))},{deep:!0}),P(O,async(e,t)=>{ce(),k.value&&F.value&&await z()}),P(v,async e=>{if(!e.path)return;let t=$(e.path),n=k.value;n&&n.projectPath&&$(n.projectPath)!==t&&await te()});function fe(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function pe(){k.value&&F.value&&!I(k.value)&&fe(k.value)}let V=se({visible:!1,editing:null,name:``,content:``,aiLoading:!1,projectPath:``}),H=se({visible:!1,text:``,loading:!1,saving:!1}),U=Y(!0),ge=q(()=>{let e=$(v.value.path);return h.value.filter(t=>!t.projectPath||$(t.projectPath)===e)});async function W(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}}let ye=Y(null),G=Y(null);async function be(e){if(e){if(!await W((e.title||``).trim()||Z(`@WORKBENCH:未命名任务`))){B.error(Z(`@WORKBENCH:复制失败`));return}ye.value=e.id,B.success(Z(`@WORKBENCH:已复制任务标题`)),window.setTimeout(()=>{ye.value===e.id&&(ye.value=null)},1500)}}async function xe(e){if(!e)return;let t=(e.desc||``).trim();if(!t){B.warning(Z(`@WORKBENCH:任务描述为空,无需复制`));return}if(!await W(t)){B.error(Z(`@WORKBENCH:复制失败`));return}G.value=e.id,B.success(Z(`@WORKBENCH:已复制任务描述`)),window.setTimeout(()=>{G.value===e.id&&(G.value=null)},1500)}let{simpleConversationMessages:K,simpleAllJobsFor:Se,simpleJobFor:Ce,simpleJobState:we}=Nn(_,k);function Te(e){if(!e)return!1;let t=Ce(e);return!!t&&(t.status===`running`||t.status===`pending`)}function J(){V.editing=null,V.name=``,V.content=``,V.aiLoading=!1,V.projectPath=(v.value.path||``).trim(),V.visible=!0}function X(e){V.editing=e,V.name=e.name,V.content=e.content,V.aiLoading=!1,V.projectPath=(e.projectPath||``).trim(),V.visible=!0}async function Oe(){if(!V.aiLoading){V.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?(V.name=e.name||V.name,V.content=e.result||``,B.success(Z(`@WORKBENCH:已生成,可继续编辑`))):B.error(e.error||Z(`@WORKBENCH:生成失败`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{V.aiLoading=!1}}}async function ke(){H.visible=!0,H.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?H.text=e.instruction||``:B.error(e.error||Z(`@WORKBENCH:读取指令失败`))}catch(e){B.error(Z(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{H.loading=!1}}async function Q(){if(!H.text.trim()){B.warning(Z(`@WORKBENCH:指令内容不能为空`));return}H.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:H.text})}).then(e=>e.json());e.success?(B.success(Z(`@WORKBENCH:已保存指令`)),H.visible=!1):B.error(e.error||Z(`@WORKBENCH:保存失败`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{H.saving=!1}}async function Ae(){if(!V.name.trim()||!V.content.trim()){B.warning(Z(`@WORKBENCH:名称和内容不能为空`));return}let e={id:V.editing?.id,name:V.name.trim(),content:V.content,projectPath:(V.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?(B.success(Z(`@WORKBENCH:已保存`)),V.visible=!1,S()):B.error(t.error||Z(`@WORKBENCH:保存失败`))}async function Pe(e){await _e.confirm(Z(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),S();for(let t of g.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 ee()}let Le=Y(!1),Re=Y(null),ze=Y(null);function Be(e){let t=e?.currentTarget||ze.value;if(!t)return;t.style.height=`auto`;let n=document.activeElement===t?Lc:Ic,r=Math.min(Math.max(t.scrollHeight,Fc),n);t.style.height=`${r}px`,t.style.overflowY=t.scrollHeight>n?`auto`:`hidden`}P(U,async e=>{e&&(await ne(),Be())}),P(()=>k.value?.id,async()=>{U.value&&(await ne(),Be())});async function Ve(){if(Le.value)return;Le.value=!0;let e={title:``,desc:``,promptId:null,simpleOverride:``};v.value.path&&(e.projectPath=v.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){B.error(t.error||Z(`@WORKBENCH:保存失败`));return}ce(),k.value&&I(k.value)?await L(k.value):k.value&&F.value&&await z(),await te(),t.task?.id&&(O.value=t.task.id,j(),B.success(Z(`@WORKBENCH:已新建任务`)),await ne(),Re.value?.focus())}finally{Le.value=!1}}async function He(e){await _e.confirm(Z(`@WORKBENCH:删除任务「{title}」?`,{title:e.title}),Z(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),O.value===e.id&&(O.value=null),te()}async function Ue(e){let t=(e.title||Z(`@WORKBENCH:未命名任务`)).trim(),n={title:Z(`@WORKBENCH:{title} (副本)`,{title:t}),desc:e.desc||``,promptId:e.promptId||null,simpleOverride:e.simpleOverride||``};v.value.path&&(n.projectPath=v.value.path);try{let e=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}).then(e=>e.json());if(!e.success){B.error(e.error||Z(`@WORKBENCH:复制失败`));return}await te(),e.task?.id&&(O.value=e.task.id,j()),B.success(Z(`@WORKBENCH:已复制任务`))}catch(e){B.error(Z(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}}async function Ge(e){if(O.value===e.id)return;ce();let t=k.value;t&&I(t)?await L(t):t&&F.value&&await z(),O.value=e.id,j(),c($(v.value.path),e.id)}async function qe(e){let{groupPath:t,orderedIds:n}=e;if(!Array.isArray(n)||n.length===0)return;let r=g.value.slice(),i=Je(g.value,t,n);if(i!==g.value){g.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||(g.value=r,B.error(e?.error||Z(`@WORKBENCH:排序保存失败`)))}catch(e){g.value=r,B.error(Z(`@WORKBENCH:排序保存失败`)+`: `+(e?.message||e))}}}function Je(e,t,n){let r=e=>$(e)||Ac,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}async function Ye(e){if(!k.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(k.value)}).then(e=>e.json());return t.success?(e&&B.success(Z(`@WORKBENCH:已保存`)),await ee(),!0):(B.error(t.error||Z(`@WORKBENCH:保存失败`)),!1)}u(async()=>{await Promise.all([S(),te(),C(),w()]),await R(),b(),window.addEventListener(`beforeunload`,pe)}),f(()=>{x(),window.removeEventListener(`beforeunload`,pe),k.value&&F.value&&!I(k.value)&&fe(k.value)});let{pasteHoverId:Xe,isUploading:Ze,isImageAttachment:Qe,humanSize:$e,onAttachmentPaste:et,onAttachmentDrop:tt,uploadAttachment:nt,removeAttachment:rt,pickAttachmentFile:it}=An(),{runTask:at,onContinueSendFromChat:ot,cancelJob:st,clearExecutionForSelectedTask:lt}=Pn(_,g,k,{syncRunningCount:y,clearJobsByTask:T,persistTask:Ye,uploadAttachment:nt,getExecutor:()=>ut.value}),ut=Y(Ke()),ft=q(()=>({claude:r.claudeAvailable,opencode:r.opencodeAvailable})),pt=q(()=>ft.value.claude||ft.value.opencode);P(ft,e=>{if(e[ut.value])return;let t=Object.keys(e).find(t=>e[t]);t&&(ut.value=t)},{immediate:!0});function mt(e){ft.value[e]&&(ut.value=e,Ie(e))}function ht(e){return We.find(t=>t.id===e)?.name||e}let gt=q(()=>Se(k.value).slice(-1)[0]),_t={configStore:n,toolsStore:r,LAST_TASK_BY_PROJECT_KEY:kc,NO_PROJECT_KEY:Ac,SIDEBAR_WIDTH_KEY:jc,SIDEBAR_MIN_W:Mc,SIDEBAR_MAX_W:Nc,SIDEBAR_DEFAULT_W:Pc,sidebarWidth:i,onSidebarSplitterMouseDown:a,readLastTaskMap:o,writeLastTaskMap:s,rememberLastTask:c,editorOpen:d,closeEditor:p,openTaskFromBoard:m,prompts:h,tasks:g,jobs:_,currentProject:v,syncRunningCount:y,connectSSE:b,disconnectSSE:x,loadPrompts:S,loadCurrentProject:C,loadJobs:w,clearJobsByTask:T,_loadDataTasks:E,applyRestoredSelection:D,refreshTasks:ee,loadTasks:te,logsDialogVisible:re,selectedTaskId:O,selectedTask:k,foreignRepo:ie,metaSnapshot:A,captureSnapshot:j,metaSaveState:M,metaSavedAt:oe,get metaSaveTimer(){return N},set metaSaveTimer(e){N=e},metaDirty:F,clearMetaSaveTimers:ce,isTaskBlank:I,discardBlankTask:L,pruneBlankTasks:R,flushMetaSave:z,beaconPersist:fe,onBeforeUnloadPersist:pe,promptDialog:V,instructionDialog:H,taskDescExpanded:U,availablePrompts:ge,copyToClipboard:W,copyTitleFlashId:ye,copyDescFlashId:G,copyTaskTitle:be,copyTaskDesc:xe,simpleConversationMessages:K,simpleAllJobsFor:Se,simpleJobFor:Ce,simpleJobState:we,isTaskRunning:Te,openCreatePrompt:J,openEditPrompt:X,aiGeneratePrompt:Oe,openEditInstruction:ke,saveInstruction:Q,savePrompt:Ae,deletePrompt:Pe,creatingTask:Le,titleInputRef:Re,taskDescTextareaRef:ze,DESC_TEXTAREA_MIN_PX:Fc,DESC_TEXTAREA_MAX_PX:Ic,DESC_TEXTAREA_MAX_PX_FOCUS:Lc,autoGrowTextarea:Be,createTaskDirect:Ve,deleteTask:He,copyTask:Ue,selectTask:Ge,reorderTasks:qe,applyLocalReorder:Je,persistTask:Ye,pasteHoverId:Xe,isUploading:Ze,isImageAttachment:Qe,humanSize:$e,onAttachmentPaste:et,onAttachmentDrop:tt,uploadAttachment:nt,removeAttachment:rt,pickAttachmentFile:it,runTask:at,onContinueSendFromChat:ot,cancelJob:st,clearExecutionForSelectedTask:lt,selectedTaskExecutor:ut,executorAvailability:ft,hasAnyExecutor:pt,pickExecutor:mt,executorLabel:ht,lastSimpleJob:gt,simpleAssistantLabel:q(()=>gt.value?.agent===`opencode`?`OpenCode`:`Claude`),simpleAssistantAvatar:q(()=>dt(gt.value?.agent)),get $t(){return Z},get ArrowDown(){return he},get ArrowLeft(){return l},get ArrowRight(){return ae},get Check(){return ue},get Document(){return de},get Delete(){return le},get CopyDocument(){return ve},get Warning(){return me},AttachmentZone:ct,get ChatInput(){return Ee},get ChatContainer(){return De},ExecutionLogManager:yn,get ALLOWED_EXT_HINT(){return xn},get MAX_ATTACHMENT_BYTES(){return Sn},get TASK_EXECUTOR_OPTIONS(){return We},TaskExecutorIcon:Fe,WorkbenchSidebar:Sr,WorkbenchBoard:Oc,CommonDialog:Me};return Object.defineProperty(_t,"__isScriptSetup",{enumerable:!1,value:!0}),_t}});X(),b(),G();var zc={class:`workbench`},Bc={class:`wb-editor`},Vc={class:`wb-editor-bar`},Hc=[`title`],Uc=[`title`],Wc=[`title`],Gc={class:`wb-editor-bar__hint`},Kc={class:`workbench__editor-row`},qc=[`title`],Jc={class:`wb-split`},Yc={key:0,class:`wb-placeholder`},Xc={class:`wb-split__header`},Zc={class:`wb-split__title-wrap`},Qc=[`placeholder`],$c=[`title`,`aria-label`],el=[`title`],tl={key:0,class:`wb-meta-save__dot`},nl={key:1,class:`wb-meta-save__check`},rl={key:2,class:`wb-meta-save__bang`},il={key:3,class:`wb-meta-save__dot`},al={value:null},ol=[`value`],sl={class:`wb-executor-split__hint`},cl={class:`wb-executor-item`},ll={class:`wb-executor-item__name`},ul={key:1,class:`wb-executor-item__missing`},dl={key:2,class:`wb-no-claude-hint`,role:`status`},fl={class:`wb-no-claude-hint__text`},pl={class:`wb-no-claude-hint__link`,href:`https://docs.claude.com/en/docs/claude-code/setup`,target:`_blank`,rel:`noopener noreferrer`},ml=[`title`,`aria-label`],hl=[`title`,`aria-label`],gl=[`open`],_l={class:`wb-task-desc__summary`},vl={class:`wb-task-desc__label`},yl=[`title`,`aria-label`],bl={key:0,class:`wb-task-desc__tag`},xl={key:0},Sl={key:1,class:`wb-task-desc__tag-attachment`},Cl=[`placeholder`],wl={class:`wb-execution-body`},Tl={class:`wb-exec-detail`},El={class:`wb-form-item__label wb-simple__override-summary`},Dl=[`title`],Ol=[`placeholder`],kl={key:0,class:`wb-simple-chat-wrap`},Al={key:0,class:`wb-simple-chat__footer`},jl={style:{display:`flex`,gap:`8px`,"align-items":`center`}};function Ml(t,s,c,l,u,f){let m=d,h=n,b=Ce,x=w,C=i,T=re,E=k,ee=y,ne=o,O=p,ie=te;return A(),v(`div`,zc,[r(` L1:多项目编排台 —— **常驻底图**,不再与编辑器互斥 `),_(l.WorkbenchBoard,{onOpenTask:l.openTaskFromBoard}),r(` L2:单任务编辑器 —— 大弹窗浮在看板之上,关掉即回到原位,全程无跳转 `),_(l.CommonDialog,{modelValue:l.editorOpen,"onUpdate:modelValue":s[21]||=e=>l.editorOpen=e,title:l.$t(`@WORKBENCH:任务执行`),type:`flex`,"height-mode":`fixed`,"height-offset":`88px`,top:`2vh`,width:`min(1520px, 96vw)`},{default:W(()=>[D(`div`,Bc,[r(` 顶部细栏:关闭入口做成独立一条,而不是塞进任务头 ——
|
|
46
46
|
没选中任务时(右侧是空态占位)也需要它,塞进任务头就会出现"进了编辑器却关不掉"的死角。 `),D(`div`,Vc,[D(`button`,{type:`button`,class:`wb-back-btn`,title:l.$t(`@WORKBENCH:返回看板`),onClick:l.closeEditor},[_(m,{class:`wb-back-btn__icon`},{default:W(()=>[_(l.ArrowLeft)]),_:1}),D(`span`,null,e(l.$t(`@WORKBENCH:返回看板`)),1)],8,Hc),D(`span`,{class:`wb-editor-bar__project`,title:l.currentProject.path},e(l.currentProject.name),9,Uc),l.foreignRepo?(A(),v(`span`,{key:0,class:`wb-editor-bar__repo`,title:l.foreignRepo.path},e(l.$t(`@WORKBENCH:执行于 {name}`,{name:l.foreignRepo.name})),9,Wc)):r(`v-if`,!0),D(`span`,Gc,e(l.$t(`@WORKBENCH:任务执行`)),1)]),D(`div`,Kc,[_(l.WorkbenchSidebar,{style:j({width:l.sidebarWidth+`px`}),tasks:l.tasks,prompts:l.prompts,"selected-task-id":l.selectedTaskId,"current-project":l.currentProject,"creating-task":l.creatingTask,"is-task-running":l.isTaskRunning,onSelectTask:l.selectTask,onDeleteTask:l.deleteTask,onCopyTask:l.copyTask,onCreateTask:l.createTaskDirect,onOpenCreatePrompt:l.openCreatePrompt,onOpenEditPrompt:l.openEditPrompt,onDeletePrompt:l.deletePrompt,onReorderTasks:l.reorderTasks},null,8,[`style`,`tasks`,`prompts`,`selected-task-id`,`current-project`,`creating-task`]),D(`div`,{class:`wb-splitter`,role:`separator`,"aria-orientation":`vertical`,title:l.$t(`@WORKBENCH:拖动调整侧边栏宽度`),onMousedown:l.onSidebarSplitterMouseDown},null,40,qc),r(` 中:单任务编辑区 `),D(`section`,Jc,[l.selectedTask?(A(),v(I,{key:1},[D(`div`,Xc,[D(`div`,Zc,[L(D(`input`,{ref:`titleInputRef`,class:`wb-input wb-input--title`,"onUpdate:modelValue":s[0]||=e=>l.selectedTask.title=e,placeholder:l.$t(`@WORKBENCH:任务标题`)},null,8,Qc),[[z,l.selectedTask.title]]),D(`button`,{type:`button`,class:U([`wb-copy-btn`,{"is-flash":l.copyTitleFlashId===l.selectedTask.id}]),title:l.$t(`@WORKBENCH:复制任务标题`),"aria-label":l.$t(`@WORKBENCH:复制任务标题`),onClick:s[1]||=e=>l.copyTaskTitle(l.selectedTask)},[l.copyTitleFlashId===l.selectedTask.id?(A(),a(m,{key:1,class:`wb-copy-btn__icon wb-copy-btn__icon--check`},{default:W(()=>[...s[31]||=[g(`✓`,-1)]]),_:1})):(A(),a(m,{key:0,class:`wb-copy-btn__icon`},{default:W(()=>[_(l.CopyDocument)]),_:1}))],10,$c)]),l.metaSaveState!==`idle`||l.metaDirty?(A(),v(`span`,{key:0,class:U([`wb-meta-save`,{"is-saving":l.metaSaveState===`saving`,"is-saved":l.metaSaveState===`saved`,"is-error":l.metaSaveState===`error`,"is-dirty":l.metaDirty&&l.metaSaveState===`idle`}]),title:l.metaSaveState===`saving`?l.$t(`@WORKBENCH:保存中…`):l.metaSaveState===`error`?l.$t(`@WORKBENCH:保存失败`):l.metaSaveState===`saved`?l.$t(`@WORKBENCH:已保存`):``},[l.metaSaveState===`saving`?(A(),v(`span`,tl)):l.metaSaveState===`saved`?(A(),v(`span`,nl,`✓`)):l.metaSaveState===`error`?(A(),v(`span`,rl,`!`)):(A(),v(`span`,il)),g(` `+e(l.metaSaveState===`saving`?l.$t(`@WORKBENCH:保存中…`):l.metaSaveState===`saved`?l.$t(`@WORKBENCH:已保存`):l.metaSaveState===`error`?l.$t(`@WORKBENCH:保存失败`):l.$t(`@WORKBENCH:有未保存的更改`)),1)],10,el)):r(`v-if`,!0),L(D(`select`,{class:`wb-select`,"onUpdate:modelValue":s[2]||=e=>l.selectedTask.promptId=e},[D(`option`,al,e(l.$t(`@WORKBENCH:不绑定预置提示词`)),1),(A(!0),v(I,null,S(l.availablePrompts,t=>(A(),v(`option`,{key:t.id,value:t.id},e(t.name),9,ol))),128))],512),[[pe,l.selectedTask.promptId]]),r(` 执行:split button —— 主体按当前选中执行器直接跑,下拉临时切换执行器 `),l.hasAnyExecutor?(A(),a(x,{key:1,"split-button":``,type:`primary`,class:`wb-executor-split`,trigger:`click`,onClick:s[3]||=e=>l.runTask(l.selectedTask),onCommand:l.pickExecutor},{dropdown:W(()=>[_(b,null,{default:W(()=>[(A(!0),v(I,null,S(l.TASK_EXECUTOR_OPTIONS,t=>(A(),a(h,{key:t.id,command:t.id,disabled:!l.executorAvailability[t.id]},{default:W(()=>[D(`span`,cl,[_(l.TaskExecutorIcon,{executor:t.id,class:`wb-executor-item__icon`},null,8,[`executor`]),D(`span`,ll,e(t.name),1),l.selectedTaskExecutor===t.id?(A(),a(m,{key:0,class:`wb-executor-item__check`},{default:W(()=>[_(l.Check)]),_:1})):l.executorAvailability[t.id]?r(`v-if`,!0):(A(),v(`span`,ul,e(l.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:W(()=>[g(e(l.$t(`@WORKBENCH:执行任务`))+` `,1),D(`span`,sl,[_(l.TaskExecutorIcon,{executor:l.selectedTaskExecutor,class:`wb-executor-split__hint-icon`},null,8,[`executor`]),g(` `+e(l.executorLabel(l.selectedTaskExecutor)),1)])]),_:1})):(A(),v(`div`,dl,[_(m,{class:`wb-no-claude-hint__icon`},{default:W(()=>[_(l.Warning)]),_:1}),D(`span`,fl,e(l.$t(`@WORKBENCH:未检测到本地 claude / opencode,无法执行任务`)),1),D(`a`,pl,e(l.$t(`@WORKBENCH:查看安装指引`)),1)])),D(`button`,{type:`button`,class:`wb-logs-inline-btn wb-logs-inline-btn--danger`,title:l.$t(`@WORKBENCH:清空当前任务的所有执行内容`),"aria-label":l.$t(`@WORKBENCH:清空当前任务的所有执行内容`),onClick:s[4]||=(...e)=>l.clearExecutionForSelectedTask&&l.clearExecutionForSelectedTask(...e)},[_(m,{class:`wb-logs-inline-btn__icon`},{default:W(()=>[_(l.Delete)]),_:1}),D(`span`,null,e(l.$t(`@WORKBENCH:清空执行`)),1)],8,ml),D(`button`,{type:`button`,class:`wb-logs-inline-btn`,title:l.$t(`@WORKBENCH:执行日志`),"aria-label":l.$t(`@WORKBENCH:执行日志`),onClick:s[5]||=e=>l.logsDialogVisible=!0},[_(m,{class:`wb-logs-inline-btn__icon`},{default:W(()=>[_(l.Document)]),_:1}),D(`span`,null,e(l.$t(`@WORKBENCH:执行日志`)),1)],8,hl)]),r(` 任务描述区域:默认折叠,节省首屏空间;展开后可编辑/上传附件 `),D(`details`,{class:`wb-task-desc`,open:l.taskDescExpanded,onToggle:s[17]||=e=>l.taskDescExpanded=e.target.open},[D(`summary`,_l,[_(m,{class:`wb-task-desc__caret`},{default:W(()=>[(A(),a(ye(l.taskDescExpanded?l.ArrowDown:l.ArrowRight)))]),_:1}),D(`span`,vl,e(l.$t(`@WORKBENCH:任务描述(可选)`)),1),D(`button`,{type:`button`,class:U([`wb-copy-btn wb-copy-btn--inline`,{"is-flash":l.copyDescFlashId===l.selectedTask.id}]),title:l.selectedTask.desc&&l.selectedTask.desc.trim()?l.$t(`@WORKBENCH:复制任务描述`):l.$t(`@WORKBENCH:任务描述为空,无需复制`),"aria-label":l.$t(`@WORKBENCH:复制任务描述`),onClick:s[6]||=J(e=>l.copyTaskDesc(l.selectedTask),[`stop`,`prevent`])},[l.copyDescFlashId===l.selectedTask.id?(A(),a(m,{key:1,class:`wb-copy-btn__icon wb-copy-btn__icon--check`},{default:W(()=>[...s[32]||=[g(`✓`,-1)]]),_:1})):(A(),a(m,{key:0,class:`wb-copy-btn__icon`},{default:W(()=>[_(l.CopyDocument)]),_:1}))],10,yl),l.selectedTask.desc&&l.selectedTask.desc.length>0||l.selectedTask.attachments&&l.selectedTask.attachments.length>0?(A(),v(`span`,bl,[l.selectedTask.desc&&l.selectedTask.desc.length>0?(A(),v(`span`,xl,e(l.$t(`@WORKBENCH:已填写`)),1)):r(`v-if`,!0),l.selectedTask.attachments&&l.selectedTask.attachments.length>0?(A(),v(`span`,Sl,e(l.selectedTask.attachments.length),1)):r(`v-if`,!0)])):r(`v-if`,!0)]),L(D(`textarea`,{ref:`taskDescTextareaRef`,class:`wb-textarea wb-textarea--autogrow`,"onUpdate:modelValue":s[7]||=e=>l.selectedTask.desc=e,placeholder:l.$t(`@WORKBENCH:任务描述(可选)`),onInput:s[8]||=e=>l.autoGrowTextarea(e),onFocus:s[9]||=e=>l.autoGrowTextarea(e),onBlur:s[10]||=e=>l.autoGrowTextarea(e),onPaste:s[11]||=e=>l.onAttachmentPaste(e,{kind:`task`,task:l.selectedTask})},null,40,Cl),[[z,l.selectedTask.desc]]),_(l.AttachmentZone,{attachments:l.selectedTask.attachments||[],"is-image":l.isImageAttachment,"human-size":l.humanSize,"is-uploading":l.isUploading(`task-`+l.selectedTask.id),"is-paste-hover":l.pasteHoverId===`task-`+l.selectedTask.id,"max-count":9,"on-pick":()=>l.pickAttachmentFile({kind:`task`,task:l.selectedTask}),"on-remove":e=>l.removeAttachment({kind:`task`,task:l.selectedTask},e),onPaste:s[12]||=e=>l.onAttachmentPaste(e,{kind:`task`,task:l.selectedTask}),onDrop:s[13]||=J(e=>l.onAttachmentDrop(e,{kind:`task`,task:l.selectedTask}),[`prevent`]),onDragover:s[14]||=J(e=>l.pasteHoverId=`task-`+l.selectedTask.id,[`prevent`]),onDragenter:s[15]||=J(e=>l.pasteHoverId=`task-`+l.selectedTask.id,[`prevent`]),onDragleave:s[16]||=e=>l.pasteHoverId=l.pasteHoverId===`task-`+l.selectedTask.id?null:l.pasteHoverId},null,8,[`attachments`,`is-image`,`human-size`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],40,gl),r(` ── 执行主体:一条任务 = 一次会话,详情面板占满整行 ── `),D(`div`,wl,[r(` 详情面板(执行内容区) `),D(`div`,Tl,[r(` ⚠️ 这一层**不要**用裸 <template> 包起来(踩过,2026-09-22):
|
|
47
47
|
Vue 3 只把带 v-if / v-else / v-for / v-slot 的 <template> 编译成片段,
|
|
48
48
|
裸 <template> 会被当成真的 <template> 元素渲染 —— 浏览器把子节点全塞进
|