zen-gitsync 2.18.18 → 2.18.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/package.json +2 -1
  2. package/src/ui/public/assets/AgentView-CRkUXGCW.js +12 -0
  3. package/src/ui/public/assets/{AppVersionBadge-BfgAvMQg.js → AppVersionBadge-Dqca8Uoi.js} +2 -2
  4. package/src/ui/public/assets/{BranchSelector-B55Ta_HD.js → BranchSelector-CN2iCCAs.js} +1 -1
  5. package/src/ui/public/assets/{ChatSilenceBadge-BDltHrA2.js → ChatSilenceBadge-ltPjxE4-.js} +1 -1
  6. package/src/ui/public/assets/{CommitForm-C1Jql1he.js → CommitForm-mOWC0Zio.js} +3 -3
  7. package/src/ui/public/assets/{CommonDialog-lhBO3OFL.js → CommonDialog-D2f72EzI.js} +1 -1
  8. package/src/ui/public/assets/EditorView-D7tyqaAl.js +46 -0
  9. package/src/ui/public/assets/EditorView-cW_Ax-z8.css +1 -0
  10. package/src/ui/public/assets/{FlowExecutionViewer-BPMqArlZ.js → FlowExecutionViewer-4dAyrq6w.js} +1 -1
  11. package/src/ui/public/assets/{FlowOrchestrationWorkspace-Cq-1Knnp.js → FlowOrchestrationWorkspace-BYcu7GZu.js} +1 -1
  12. package/src/ui/public/assets/{LogList-Bk7GAfle.js → LogList-n-gSd_A8.js} +1 -1
  13. package/src/ui/public/assets/{MindmapView-CBOfycTa.js → MindmapView-msWKbkjo.js} +1 -1
  14. package/src/ui/public/assets/{MonitorView-3g87o1gD.js → MonitorView-D0mJlgEJ.js} +1 -1
  15. package/src/ui/public/assets/{ProjectManagerView-DgMq7Jed.js → ProjectManagerView-CuKtgxJg.js} +1 -1
  16. package/src/ui/public/assets/{ProjectStartupButton-CkJEFz-S.js → ProjectStartupButton-Cx0JvDzM.js} +1 -1
  17. package/src/ui/public/assets/{RecentDirectoriesChat-CQ6vjPkE.js → RecentDirectoriesChat-5OEF3wdB.js} +1 -1
  18. package/src/ui/public/assets/{RemoteManagerDialog-D9arrFOG.js → RemoteManagerDialog-ItxNmLvY.js} +1 -1
  19. package/src/ui/public/assets/{RemoteRepoCard-ZQ_SMlQZ.js → RemoteRepoCard-y-GzPZ7M.js} +1 -1
  20. package/src/ui/public/assets/{SourceMapView-1q3TRufj.js → SourceMapView-DXJUPkaX.js} +1 -1
  21. package/src/ui/public/assets/{SvgIcon-CfjWD31j.js → SvgIcon-DkU8Uro2.js} +1 -1
  22. package/src/ui/public/assets/{UserInputNode-BdU3sSVR.js → UserInputNode-unSg-ucz.js} +1 -1
  23. package/src/ui/public/assets/{WorkbenchView-D8WdRklc.js → WorkbenchView-C2-X3Ik_.js} +93 -93
  24. package/src/ui/public/assets/WorkbenchView-CVqXb__l.css +1 -0
  25. package/src/ui/public/assets/{_plugin-vue_export-helper-D4DL0jyB.js → _plugin-vue_export-helper-Dz34f-q7.js} +2 -2
  26. package/src/ui/public/assets/{agentConversations-DJ8rPauy.js → agentConversations-DLAC_0wI.js} +1 -1
  27. package/src/ui/public/assets/{configStore-BmWis0h4.js → configStore-BjNspgAX.js} +1 -1
  28. package/src/ui/public/assets/{index-DRDito6l.js → index-BybDOX1D.js} +79 -79
  29. package/src/ui/public/assets/{relativeTime-BpGKkKiW.js → relativeTime-DN4_NV-7.js} +1 -1
  30. package/src/ui/public/assets/{toolsStore-CmVXtAw_.js → toolsStore-C5a4cV7b.js} +1 -1
  31. package/src/ui/public/assets/{useOrchestrator-DKr4ShyB.js → useOrchestrator-Cd6p-ldI.js} +1 -1
  32. package/src/ui/public/assets/{useWorkbenchProjects-D169QQnx.js → useWorkbenchProjects-OkQTFYcp.js} +1 -1
  33. package/src/ui/public/index.html +6 -6
  34. package/src/ui/server/routes/fs.js +59 -4
  35. package/src/ui/server/routes/workbench/index.js +41 -1
  36. package/src/ui/public/assets/AgentView-fJbuH0N-.js +0 -12
  37. package/src/ui/public/assets/EditorView-Dvi9Js01.css +0 -1
  38. package/src/ui/public/assets/EditorView-nJTaLq6D.js +0 -46
  39. package/src/ui/public/assets/WorkbenchView-D6orzzEp.css +0 -1
@@ -1 +1 @@
1
- import{n as e}from"./_plugin-vue_export-helper-D4DL0jyB.js";var t=6e4,n=60*t,r=24*n;function i(i,a=Date.now()){if(!i)return``;let o=new Date(i).getTime();if(Number.isNaN(o))return``;let s=Math.max(0,a-o);return s<t?e(`@WORKBENCH:刚刚`):s<n?e(`@WORKBENCH:N 分钟前`,{n:Math.floor(s/t)}):s<r?e(`@WORKBENCH:N 小时前`,{n:Math.floor(s/n)}):s<30*r?e(`@WORKBENCH:N 天前`,{n:Math.floor(s/r)}):new Date(o).toLocaleDateString()}function a(t){if(typeof t!=`number`||!Number.isFinite(t)||t<0)return``;let n=Math.floor(t/1e3),r=Math.floor(n/3600),i=Math.floor(n%3600/60),a=n%60;return r>0?e(`@WORKBENCH:N 小时 M 分`,{n:r,m:i}):i>0?e(`@WORKBENCH:N 分 M 秒`,{n:i,m:a}):e(`@WORKBENCH:N 秒`,{n:a})}function o(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function s(t,n=Date.now()){if(!t)return``;let r=new Date(t);if(Number.isNaN(r.getTime()))return``;let i=e=>String(e).padStart(2,`0`),a=`${i(r.getHours())}:${i(r.getMinutes())}:${i(r.getSeconds())}`,s=new Date(n);if(o(r,s))return a;if(o(r,new Date(s.getFullYear(),s.getMonth(),s.getDate()-1)))return e(`@WORKBENCH:昨天 {time}`,{time:a});let c=`${r.getMonth()+1}/${r.getDate()}`;return r.getFullYear()===s.getFullYear()?`${c} ${a}`:`${r.getFullYear()}/${c} ${a}`}export{a as n,i as r,s as t};
1
+ import{n as e}from"./_plugin-vue_export-helper-Dz34f-q7.js";var t=6e4,n=60*t,r=24*n;function i(i,a=Date.now()){if(!i)return``;let o=new Date(i).getTime();if(Number.isNaN(o))return``;let s=Math.max(0,a-o);return s<t?e(`@WORKBENCH:刚刚`):s<n?e(`@WORKBENCH:N 分钟前`,{n:Math.floor(s/t)}):s<r?e(`@WORKBENCH:N 小时前`,{n:Math.floor(s/n)}):s<30*r?e(`@WORKBENCH:N 天前`,{n:Math.floor(s/r)}):new Date(o).toLocaleDateString()}function a(t){if(typeof t!=`number`||!Number.isFinite(t)||t<0)return``;let n=Math.floor(t/1e3),r=Math.floor(n/3600),i=Math.floor(n%3600/60),a=n%60;return r>0?e(`@WORKBENCH:N 小时 M 分`,{n:r,m:i}):i>0?e(`@WORKBENCH:N 分 M 秒`,{n:i,m:a}):e(`@WORKBENCH:N 秒`,{n:a})}function o(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function s(t,n=Date.now()){if(!t)return``;let r=new Date(t);if(Number.isNaN(r.getTime()))return``;let i=e=>String(e).padStart(2,`0`),a=`${i(r.getHours())}:${i(r.getMinutes())}:${i(r.getSeconds())}`,s=new Date(n);if(o(r,s))return a;if(o(r,new Date(s.getFullYear(),s.getMonth(),s.getDate()-1)))return e(`@WORKBENCH:昨天 {time}`,{time:a});let c=`${r.getMonth()+1}/${r.getDate()}`;return r.getFullYear()===s.getFullYear()?`${c} ${a}`:`${r.getFullYear()}/${c} ${a}`}export{a as n,i as r,s as t};
@@ -1 +1 @@
1
- import{gr as e,lr as t}from"./element-plus-Bz6lYur-.js";import{S as n}from"./vendor-C2k0GBzj.js";import{n as r}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{c as i,s as a}from"./configStore-BmWis0h4.js";t();var o=6e5;function s(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.name!=`string`||!t.name?null:{name:t.name,detail:typeof t.detail==`string`&&t.detail?t.detail:null,provider:typeof t.provider==`string`&&t.provider?t.provider:null,source:t.source===`config`||t.source===`state`?t.source:null}}var c=n(`tools`,()=>{let t=e(!1),n=e(!1),c=e(!1),l=e(!1),u=e(!1),d=e(!1),f=e(!1),p=e(!1),m=e(!1),h=e(null),g=e(!1),_=e(``),v=e({}),y=e({}),b=e({}),x=e({}),S=e(!1),C=0,w=null;function T(e=!1){return!e&&Date.now()-C<3e5?Promise.resolve():w||(S.value=!0,w=(async()=>{try{let e=await(await fetch(`/api/latest-tool-versions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})})).json();e.success&&e.latest&&typeof e.latest==`object`&&(x.value=e.latest,C=Date.now())}catch{}finally{S.value=!1,w=null}})(),w)}let E=null;function D(){return E||(g.value=!0,E=(async()=>{try{let e=await(await fetch(`/api/check-tools`)).json();e.success&&(t.value=!!e.vscode,n.value=!!e.claude,c.value=!!e.codex,l.value=!!e.opencode,u.value=!!e.codebuddy,d.value=!!e.pi,f.value=!!e.kimi,p.value=!!e.zcode,m.value=!!e.dsh,_.value=typeof e.platform==`string`?e.platform:``,v.value=e.installers&&typeof e.installers==`object`?e.installers:{},b.value=e.desktopApps&&typeof e.desktopApps==`object`?e.desktopApps:{},y.value=e.versions&&typeof e.versions==`object`?e.versions:{},h.value=Date.now())}catch{}finally{g.value=!1,E=null}})(),E)}function O(e){switch(e){case`vscode`:return t.value;case`claude`:return n.value;case`codex`:return c.value;case`opencode`:return l.value;case`codebuddy`:return u.value;case`pi`:return d.value;case`kimi`:return f.value;case`zcode`:return p.value;case`dsh`:return m.value}}function k(e){return b.value[e]}let A=e({}),j=e(!1),M=0,N=null;function P(e){if(!j.value)return{status:`unknown`};if(!i(e))return{status:`unset`};let t=A.value[e];return t?{status:`set`,info:t}:{status:`unset`}}function F(e=!1){return!e&&j.value&&Date.now()-M<6e5?Promise.resolve():N||(N=(async()=>{try{let e=await(await fetch(`/api/workbench/executor-models`)).json();if(e?.success&&e.models&&typeof e.models==`object`){let t={};for(let n of a)t[n.id]=s(e.models[n.id]);A.value=t,j.value=!0,M=Date.now()}}catch{}finally{N=null}})(),N)}function I(e){let t=P(e);return t.status===`unknown`?``:t.status===`set`?t.info.name:r(`@42BB9:未在配置中指定`)}function L(e){let t=P(e);return t.status===`set`?[t.info.source===`state`?r(`@42BB9:CLI 内最近使用`):``,t.info.detail,t.info.provider].filter(Boolean).join(` · `):``}let R=null;function z(){R||=(D(),F(),setInterval(()=>{D(),F()},o))}function B(){R&&=(clearInterval(R),null)}return{vscodeAvailable:t,claudeAvailable:n,codexAvailable:c,opencodeAvailable:l,codebuddyAvailable:u,piAvailable:d,kimiAvailable:f,zcodeAvailable:p,dshAvailable:m,lastCheckedAt:h,isChecking:g,platform:_,installers:v,versions:y,latestVersions:x,isFetchingLatest:S,isToolAvailable:O,desktopApps:b,desktopAppOf:k,executorModels:A,executorModelsReady:j,executorModelState:P,executorModelText:I,executorModelDetail:L,fetchExecutorModels:F,checkTools:D,fetchLatestVersions:T,startPolling:z,stopPolling:B}});export{c as t};
1
+ import{gr as e,lr as t}from"./element-plus-Bz6lYur-.js";import{S as n}from"./vendor-C2k0GBzj.js";import{n as r}from"./_plugin-vue_export-helper-Dz34f-q7.js";import{c as i,s as a}from"./configStore-BjNspgAX.js";t();var o=6e5;function s(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.name!=`string`||!t.name?null:{name:t.name,detail:typeof t.detail==`string`&&t.detail?t.detail:null,provider:typeof t.provider==`string`&&t.provider?t.provider:null,source:t.source===`config`||t.source===`state`?t.source:null}}var c=n(`tools`,()=>{let t=e(!1),n=e(!1),c=e(!1),l=e(!1),u=e(!1),d=e(!1),f=e(!1),p=e(!1),m=e(!1),h=e(null),g=e(!1),_=e(``),v=e({}),y=e({}),b=e({}),x=e({}),S=e(!1),C=0,w=null;function T(e=!1){return!e&&Date.now()-C<3e5?Promise.resolve():w||(S.value=!0,w=(async()=>{try{let e=await(await fetch(`/api/latest-tool-versions`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})})).json();e.success&&e.latest&&typeof e.latest==`object`&&(x.value=e.latest,C=Date.now())}catch{}finally{S.value=!1,w=null}})(),w)}let E=null;function D(){return E||(g.value=!0,E=(async()=>{try{let e=await(await fetch(`/api/check-tools`)).json();e.success&&(t.value=!!e.vscode,n.value=!!e.claude,c.value=!!e.codex,l.value=!!e.opencode,u.value=!!e.codebuddy,d.value=!!e.pi,f.value=!!e.kimi,p.value=!!e.zcode,m.value=!!e.dsh,_.value=typeof e.platform==`string`?e.platform:``,v.value=e.installers&&typeof e.installers==`object`?e.installers:{},b.value=e.desktopApps&&typeof e.desktopApps==`object`?e.desktopApps:{},y.value=e.versions&&typeof e.versions==`object`?e.versions:{},h.value=Date.now())}catch{}finally{g.value=!1,E=null}})(),E)}function O(e){switch(e){case`vscode`:return t.value;case`claude`:return n.value;case`codex`:return c.value;case`opencode`:return l.value;case`codebuddy`:return u.value;case`pi`:return d.value;case`kimi`:return f.value;case`zcode`:return p.value;case`dsh`:return m.value}}function k(e){return b.value[e]}let A=e({}),j=e(!1),M=0,N=null;function P(e){if(!j.value)return{status:`unknown`};if(!i(e))return{status:`unset`};let t=A.value[e];return t?{status:`set`,info:t}:{status:`unset`}}function F(e=!1){return!e&&j.value&&Date.now()-M<6e5?Promise.resolve():N||(N=(async()=>{try{let e=await(await fetch(`/api/workbench/executor-models`)).json();if(e?.success&&e.models&&typeof e.models==`object`){let t={};for(let n of a)t[n.id]=s(e.models[n.id]);A.value=t,j.value=!0,M=Date.now()}}catch{}finally{N=null}})(),N)}function I(e){let t=P(e);return t.status===`unknown`?``:t.status===`set`?t.info.name:r(`@42BB9:未在配置中指定`)}function L(e){let t=P(e);return t.status===`set`?[t.info.source===`state`?r(`@42BB9:CLI 内最近使用`):``,t.info.detail,t.info.provider].filter(Boolean).join(` · `):``}let R=null;function z(){R||=(D(),F(),setInterval(()=>{D(),F()},o))}function B(){R&&=(clearInterval(R),null)}return{vscodeAvailable:t,claudeAvailable:n,codexAvailable:c,opencodeAvailable:l,codebuddyAvailable:u,piAvailable:d,kimiAvailable:f,zcodeAvailable:p,dshAvailable:m,lastCheckedAt:h,isChecking:g,platform:_,installers:v,versions:y,latestVersions:x,isFetchingLatest:S,isToolAvailable:O,desktopApps:b,desktopAppOf:k,executorModels:A,executorModelsReady:j,executorModelState:P,executorModelText:I,executorModelDetail:L,fetchExecutorModels:F,checkTools:D,fetchLatestVersions:T,startPolling:z,stopPolling:B}});export{c as t};
@@ -1 +1 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{gr as e,i as t,lr as n}from"./element-plus-Bz6lYur-.js";import{n as r}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as i}from"./configStore-BmWis0h4.js";import{h as a,m as o,y as s}from"./index-DRDito6l.js";n();var c=1e5;function l(){let n=e([]),l=e([]),u=e(c),d=e([]),f=e(null),p=e(!1),m=e(!1),h=e(``),g=e({}),_=e([]),v=e(!1),y=e(!1),b=e(a);async function x(e=!1){try{let i=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return i?.success?(Number.isInteger(i.maxInstructionChars)&&i.maxInstructionChars>0&&(u.value=i.maxInstructionChars),n.value=Array.isArray(i.instructions)?i.instructions:[],l.value=Array.isArray(i.activity)?i.activity:[],d.value=Array.isArray(i.running)?i.running:[],o().setRunning(d.value.length),f.value=i.updatedAt||null,h.value=typeof i.defaultPrompt==`string`?i.defaultPrompt:``,g.value=i.projectPrompts&&typeof i.projectPrompts==`object`?i.projectPrompts:{},b.value=s(i.reportIntervalMs),p.value=!0,!0):(e||t.error(i?.error||r(`@WORKBENCH:读取编排状态失败`)),!1)}catch(n){return e||t.error(r(`@WORKBENCH:网络错误: `)+(n?.message||n)),!1}}async function S(e=!1){if(v.value)return!1;v.value=!0;try{let n=await fetch(`/api/workbench/orchestrator/reports`,{cache:`no-store`}).then(e=>e.json());return n?.success?(_.value=Array.isArray(n.reports)?n.reports:[],!0):(e||t.error(n?.error||r(`@WORKBENCH:读取进度报告失败`)),!1)}catch(n){return e||t.error(r(`@WORKBENCH:网络错误: `)+(n?.message||n)),!1}finally{v.value=!1}}async function C(){if(y.value)return null;y.value=!0;try{let e=String(i().locale||``).startsWith(`en`)?`en`:`zh`,n=await fetch(`/api/workbench/orchestrator/report`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({locale:e})}).then(e=>e.json());return n?.success?n.report?(_.value=[n.report,..._.value].slice(0,20),n.report):(t.info(r(`@WORKBENCH:当前没有正在执行的任务,没有可汇报的进度`)),null):(t.error(n?.error||r(`@WORKBENCH:生成进度报告失败`)),null)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{y.value=!1}}async function w(e){try{let n=await fetch(`/api/workbench/orchestrator/report-interval`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({intervalMs:e})}).then(e=>e.json());return n?.success?(b.value=s(n.reportIntervalMs),!0):(t.error(n?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function T(e){try{let n=await fetch(`/api/workbench/orchestrator/default-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e})}).then(e=>e.json());return n?.success?(h.value=typeof n.defaultPrompt==`string`?n.defaultPrompt:``,t.success(r(`@WORKBENCH:已保存全局预设提示词`)),!0):(t.error(n?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function E(e,n){try{let i=await fetch(`/api/workbench/orchestrator/project-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectPath:e,prompt:n})}).then(e=>e.json());return i?.success?(g.value=i.projectPrompts&&typeof i.projectPrompts==`object`?i.projectPrompts:{},t.success(r(`@WORKBENCH:已保存项目预设提示词`)),!0):(t.error(i?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function D(e){if(m.value)return null;m.value=!0;try{let n=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 n?.success?(await x(!0),{task:n.task||null,ran:!!n.ran}):(t.error(n?.error||r(`@WORKBENCH:派发失败`)),null)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{m.value=!1}}return{instructions:n,activity:l,running:d,updatedAt:f,loaded:p,dispatching:m,maxInstructionChars:u,defaultPrompt:h,projectPrompts:g,reports:_,loadingReports:v,generatingReport:y,reportIntervalMs:b,loadOrchestrator:x,dispatch:D,saveDefaultPrompt:T,saveProjectPrompt:E,loadReports:S,generateReport:C,setReportInterval:w}}export{l as t};
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{gr as e,i as t,lr as n}from"./element-plus-Bz6lYur-.js";import{n as r}from"./_plugin-vue_export-helper-Dz34f-q7.js";import{t as i}from"./configStore-BjNspgAX.js";import{h as a,m as o,y as s}from"./index-BybDOX1D.js";n();var c=1e5;function l(){let n=e([]),l=e([]),u=e(c),d=e([]),f=e(null),p=e(!1),m=e(!1),h=e(``),g=e({}),_=e([]),v=e(!1),y=e(!1),b=e(a);async function x(e=!1){try{let i=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return i?.success?(Number.isInteger(i.maxInstructionChars)&&i.maxInstructionChars>0&&(u.value=i.maxInstructionChars),n.value=Array.isArray(i.instructions)?i.instructions:[],l.value=Array.isArray(i.activity)?i.activity:[],d.value=Array.isArray(i.running)?i.running:[],o().setRunning(d.value.length),f.value=i.updatedAt||null,h.value=typeof i.defaultPrompt==`string`?i.defaultPrompt:``,g.value=i.projectPrompts&&typeof i.projectPrompts==`object`?i.projectPrompts:{},b.value=s(i.reportIntervalMs),p.value=!0,!0):(e||t.error(i?.error||r(`@WORKBENCH:读取编排状态失败`)),!1)}catch(n){return e||t.error(r(`@WORKBENCH:网络错误: `)+(n?.message||n)),!1}}async function S(e=!1){if(v.value)return!1;v.value=!0;try{let n=await fetch(`/api/workbench/orchestrator/reports`,{cache:`no-store`}).then(e=>e.json());return n?.success?(_.value=Array.isArray(n.reports)?n.reports:[],!0):(e||t.error(n?.error||r(`@WORKBENCH:读取进度报告失败`)),!1)}catch(n){return e||t.error(r(`@WORKBENCH:网络错误: `)+(n?.message||n)),!1}finally{v.value=!1}}async function C(){if(y.value)return null;y.value=!0;try{let e=String(i().locale||``).startsWith(`en`)?`en`:`zh`,n=await fetch(`/api/workbench/orchestrator/report`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({locale:e})}).then(e=>e.json());return n?.success?n.report?(_.value=[n.report,..._.value].slice(0,20),n.report):(t.info(r(`@WORKBENCH:当前没有正在执行的任务,没有可汇报的进度`)),null):(t.error(n?.error||r(`@WORKBENCH:生成进度报告失败`)),null)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{y.value=!1}}async function w(e){try{let n=await fetch(`/api/workbench/orchestrator/report-interval`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({intervalMs:e})}).then(e=>e.json());return n?.success?(b.value=s(n.reportIntervalMs),!0):(t.error(n?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function T(e){try{let n=await fetch(`/api/workbench/orchestrator/default-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e})}).then(e=>e.json());return n?.success?(h.value=typeof n.defaultPrompt==`string`?n.defaultPrompt:``,t.success(r(`@WORKBENCH:已保存全局预设提示词`)),!0):(t.error(n?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function E(e,n){try{let i=await fetch(`/api/workbench/orchestrator/project-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectPath:e,prompt:n})}).then(e=>e.json());return i?.success?(g.value=i.projectPrompts&&typeof i.projectPrompts==`object`?i.projectPrompts:{},t.success(r(`@WORKBENCH:已保存项目预设提示词`)),!0):(t.error(i?.error||r(`@WORKBENCH:保存失败`)),!1)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function D(e){if(m.value)return null;m.value=!0;try{let n=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 n?.success?(await x(!0),{task:n.task||null,ran:!!n.ran}):(t.error(n?.error||r(`@WORKBENCH:派发失败`)),null)}catch(e){return t.error(r(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{m.value=!1}}return{instructions:n,activity:l,running:d,updatedAt:f,loaded:p,dispatching:m,maxInstructionChars:u,defaultPrompt:h,projectPrompts:g,reports:_,loadingReports:v,generatingReport:y,reportIntervalMs:b,loadOrchestrator:x,dispatch:D,saveDefaultPrompt:T,saveProjectPrompt:E,loadReports:S,generateReport:C,setReportInterval:w}}export{l as t};
@@ -1,4 +1,4 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Cn as t,In as n,J as r,Lt as i,Mn as a,Nt as o,Sn as s,Tn as c,Wr as l,Xr as u,Yn as d,_n as f,gn as p,gr as m,hn as h,i as g,ir as _,jr as v,lr as y,on as b,qn as x,st as S,wn as C,xn as w,xt as T}from"./element-plus-Bz6lYur-.js";import{n as E,t as ee}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as te}from"./SvgIcon-CfjWD31j.js";import{t as D}from"./toolsStore-CmVXtAw_.js";import{B as O,F as k,G as A,H as j,I as M,L as N,M as P,N as F,P as I,R as L,U as R,V as z,W as B,z as V}from"./index-DRDito6l.js";function H(){let e=D();function t(t){return e.lastCheckedAt!==null&&!e.isToolAvailable(t)}async function n(t,n,r){if(!n)return`no-dir`;if(!await L())return g.warning(E(`@67CE7:工具检测失败,请稍后重试`)),`failed`;if(!e.isToolAvailable(t))return`install`;let i=await R(t,n,r);return i.success?(g.success(i.message||E(`@67CE7:已用 {tool} 打开目录`,{tool:k[t]})),`opened`):(g.error(`${E(`@67CE7:打开失败: `)}${i.error??``}`),`failed`)}return{toolMissing:t,tryOpenWithTool:n}}n(),y();var U=a({__name:`ProjectOpenMenuList`,props:{path:{type:String,required:!0},name:{type:String,required:!0}},emits:[`done`],setup(e,{expose:t,emit:n}){t();let r=e,a=n,{toolMissing:s,tryOpenWithTool:c}=H(),l=D(),u=m(!1),d=m(null),f=w(()=>F.filter(e=>l.desktopAppOf(e)).map(e=>({id:e,name:k[e],icon:I.find(t=>t.id===e)?.icon??``})));async function p(e){let t=l.desktopAppOf(e);if(!t)return;if(a(`done`),!t.installed){window.open(t.downloadUrl,`_blank`,`noopener,noreferrer`);return}let n=await O(e);n.success?g.success(n.message||E(`@67CE7:已打开 {app}`,{app:t.name})):g.error(n.error||E(`@WORKBENCH:打开桌面端失败`))}async function h(){a(`done`);let e=await z(r.path);e.success?g.success(e.message||E(`@WORKBENCH:已在文件管理器中打开文件夹`)):g.error(e.error||E(`@WORKBENCH:打开文件夹失败`))}async function _(){a(`done`);let e=await j(r.path);e.success?g.success(e.message||E(`@67CE7:已在终端中打开目录`)):g.error(e.error||E(`@WORKBENCH:打开终端失败`))}async function v(){a(`done`);let e=await V(r.path);e.success?g.success(E(`@WORKBENCH:已在新标签页启动 g ui`)):g.error(e.error||E(`@WORKBENCH:启动 g ui 失败`))}async function y(){if(a(`done`),r.name)try{await navigator.clipboard.writeText(r.name),g.success(E(`@67CE7:已复制文件夹名称`))}catch{g.error(E(`@67CE7:复制失败`))}}async function b(){if(a(`done`),r.path)try{await navigator.clipboard.writeText(r.path),g.success(E(`@67CE7:已复制文件夹路径`))}catch{g.error(E(`@67CE7:复制失败`))}}async function x(e,t){if(await c(e,r.path,t)===`install`){d.value=e,u.value=!0;return}a(`done`)}let C={props:r,emit:a,toolMissing:s,tryOpenWithTool:c,toolsStore:l,installVisible:u,installTool:d,desktopTools:f,openOrDownloadDesktop:p,openInFileManager:h,openInTerminal:_,launchGui:v,copyFolderName:y,copyFolderPath:b,openWithTool:x,get CopyDocument(){return S},get FolderOpened(){return T},get Monitor(){return o},get Promotion(){return i},SvgIcon:te,ToolInstallDialog:A,get claudeCodeIcon(){return B},get $t(){return E},get DARK_TILE_ICON_IDS(){return P},get OPEN_WITH_TOOLS(){return I},get desktopAppHint(){return M},get desktopAppLabel(){return N}};return Object.defineProperty(C,"__isScriptSetup",{enumerable:!1,value:!0}),C}});n(),v(),b();var W=[`aria-label`],G=[`onKeydown`],K={class:`proj-menu__icon`},q={class:`proj-menu__label`},J=[`onKeydown`],Y={class:`proj-menu__icon`},X={class:`proj-menu__label`},Z=[`onKeydown`],Q={class:`proj-menu__icon`},ne={class:`proj-menu__label`},re=[`onKeydown`],ie={class:`proj-menu__icon`},ae={class:`proj-menu__label`},oe=[`onKeydown`],se={class:`proj-menu__icon`},ce={class:`proj-menu__label`},le={class:`proj-menu__title`,role:`presentation`},ue=[`onClick`,`onKeydown`],de={class:`proj-menu__icon`},fe={class:`proj-menu__label`},pe={key:0,class:`proj-menu__hint`},me={class:`proj-menu__icon`},he=[`src`],ge={class:`proj-menu__label`},_e={class:`proj-menu__hint`},ve={class:`proj-menu__icon`},ye=[`src`],be={class:`proj-menu__label`},xe={class:`proj-menu__icon`},Se={class:`proj-menu__label`},Ce={class:`proj-menu__icon`},we={class:`proj-menu__label`},Te={key:0,class:`proj-menu__hint`},Ee={key:1,class:`proj-menu__hint`},De={class:`proj-menu__icon`},$={class:`proj-menu__label`},Oe={class:`proj-menu__icon`},ke={class:`proj-menu__label`},Ae={class:`proj-menu__icon`},je={class:`proj-menu__label`},Me={class:`proj-menu__title`,role:`presentation`},Ne=[`onClick`,`onKeydown`],Pe={class:`proj-menu__icon`},Fe=[`src`],Ie={class:`proj-menu__label`},Le={class:`proj-menu__hint`};function Re(n,i,a,o,m,g){let v=r;return x(),c(f,null,[s(`ul`,{class:`proj-menu`,role:`menu`,"aria-label":o.$t(`@WORKBENCH:打开方式`)},[s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.openInFileManager,onKeydown:[h(p(o.openInFileManager,[`prevent`]),[`enter`]),h(p(o.openInFileManager,[`prevent`]),[`space`])]},[s(`span`,K,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.FolderOpened)]),_:1})]),s(`span`,q,u(o.$t(`@WORKBENCH:在文件管理器中打开`)),1)],40,G),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.openInTerminal,onKeydown:[h(p(o.openInTerminal,[`prevent`]),[`enter`]),h(p(o.openInTerminal,[`prevent`]),[`space`])]},[s(`span`,Y,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.Monitor)]),_:1})]),s(`span`,X,u(o.$t(`@WORKBENCH:在终端中打开`)),1)],40,J),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.launchGui,onKeydown:[h(p(o.launchGui,[`prevent`]),[`enter`]),h(p(o.launchGui,[`prevent`]),[`space`])]},[s(`span`,Q,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.Promotion)]),_:1})]),s(`span`,ne,u(o.$t(`@WORKBENCH:在新标签页启动 g ui`)),1)],40,Z),C(` 复制文件夹名称:放在"打开"这一组里,因为它操作的是项目目录本身,
1
+ import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Cn as t,In as n,J as r,Lt as i,Mn as a,Nt as o,Sn as s,Tn as c,Wr as l,Xr as u,Yn as d,_n as f,gn as p,gr as m,hn as h,i as g,ir as _,jr as v,lr as y,on as b,qn as x,st as S,wn as C,xn as w,xt as T}from"./element-plus-Bz6lYur-.js";import{n as E,t as ee}from"./_plugin-vue_export-helper-Dz34f-q7.js";import{t as te}from"./SvgIcon-DkU8Uro2.js";import{t as D}from"./toolsStore-C5a4cV7b.js";import{B as O,F as k,G as A,H as j,I as M,L as N,M as P,N as F,P as I,R as L,U as R,V as z,W as B,z as V}from"./index-BybDOX1D.js";function H(){let e=D();function t(t){return e.lastCheckedAt!==null&&!e.isToolAvailable(t)}async function n(t,n,r){if(!n)return`no-dir`;if(!await L())return g.warning(E(`@67CE7:工具检测失败,请稍后重试`)),`failed`;if(!e.isToolAvailable(t))return`install`;let i=await R(t,n,r);return i.success?(g.success(i.message||E(`@67CE7:已用 {tool} 打开目录`,{tool:k[t]})),`opened`):(g.error(`${E(`@67CE7:打开失败: `)}${i.error??``}`),`failed`)}return{toolMissing:t,tryOpenWithTool:n}}n(),y();var U=a({__name:`ProjectOpenMenuList`,props:{path:{type:String,required:!0},name:{type:String,required:!0}},emits:[`done`],setup(e,{expose:t,emit:n}){t();let r=e,a=n,{toolMissing:s,tryOpenWithTool:c}=H(),l=D(),u=m(!1),d=m(null),f=w(()=>F.filter(e=>l.desktopAppOf(e)).map(e=>({id:e,name:k[e],icon:I.find(t=>t.id===e)?.icon??``})));async function p(e){let t=l.desktopAppOf(e);if(!t)return;if(a(`done`),!t.installed){window.open(t.downloadUrl,`_blank`,`noopener,noreferrer`);return}let n=await O(e);n.success?g.success(n.message||E(`@67CE7:已打开 {app}`,{app:t.name})):g.error(n.error||E(`@WORKBENCH:打开桌面端失败`))}async function h(){a(`done`);let e=await z(r.path);e.success?g.success(e.message||E(`@WORKBENCH:已在文件管理器中打开文件夹`)):g.error(e.error||E(`@WORKBENCH:打开文件夹失败`))}async function _(){a(`done`);let e=await j(r.path);e.success?g.success(e.message||E(`@67CE7:已在终端中打开目录`)):g.error(e.error||E(`@WORKBENCH:打开终端失败`))}async function v(){a(`done`);let e=await V(r.path);e.success?g.success(E(`@WORKBENCH:已在新标签页启动 g ui`)):g.error(e.error||E(`@WORKBENCH:启动 g ui 失败`))}async function y(){if(a(`done`),r.name)try{await navigator.clipboard.writeText(r.name),g.success(E(`@67CE7:已复制文件夹名称`))}catch{g.error(E(`@67CE7:复制失败`))}}async function b(){if(a(`done`),r.path)try{await navigator.clipboard.writeText(r.path),g.success(E(`@67CE7:已复制文件夹路径`))}catch{g.error(E(`@67CE7:复制失败`))}}async function x(e,t){if(await c(e,r.path,t)===`install`){d.value=e,u.value=!0;return}a(`done`)}let C={props:r,emit:a,toolMissing:s,tryOpenWithTool:c,toolsStore:l,installVisible:u,installTool:d,desktopTools:f,openOrDownloadDesktop:p,openInFileManager:h,openInTerminal:_,launchGui:v,copyFolderName:y,copyFolderPath:b,openWithTool:x,get CopyDocument(){return S},get FolderOpened(){return T},get Monitor(){return o},get Promotion(){return i},SvgIcon:te,ToolInstallDialog:A,get claudeCodeIcon(){return B},get $t(){return E},get DARK_TILE_ICON_IDS(){return P},get OPEN_WITH_TOOLS(){return I},get desktopAppHint(){return M},get desktopAppLabel(){return N}};return Object.defineProperty(C,"__isScriptSetup",{enumerable:!1,value:!0}),C}});n(),v(),b();var W=[`aria-label`],G=[`onKeydown`],K={class:`proj-menu__icon`},q={class:`proj-menu__label`},J=[`onKeydown`],Y={class:`proj-menu__icon`},X={class:`proj-menu__label`},Z=[`onKeydown`],Q={class:`proj-menu__icon`},ne={class:`proj-menu__label`},re=[`onKeydown`],ie={class:`proj-menu__icon`},ae={class:`proj-menu__label`},oe=[`onKeydown`],se={class:`proj-menu__icon`},ce={class:`proj-menu__label`},le={class:`proj-menu__title`,role:`presentation`},ue=[`onClick`,`onKeydown`],de={class:`proj-menu__icon`},fe={class:`proj-menu__label`},pe={key:0,class:`proj-menu__hint`},me={class:`proj-menu__icon`},he=[`src`],ge={class:`proj-menu__label`},_e={class:`proj-menu__hint`},ve={class:`proj-menu__icon`},ye=[`src`],be={class:`proj-menu__label`},xe={class:`proj-menu__icon`},Se={class:`proj-menu__label`},Ce={class:`proj-menu__icon`},we={class:`proj-menu__label`},Te={key:0,class:`proj-menu__hint`},Ee={key:1,class:`proj-menu__hint`},De={class:`proj-menu__icon`},$={class:`proj-menu__label`},Oe={class:`proj-menu__icon`},ke={class:`proj-menu__label`},Ae={class:`proj-menu__icon`},je={class:`proj-menu__label`},Me={class:`proj-menu__title`,role:`presentation`},Ne=[`onClick`,`onKeydown`],Pe={class:`proj-menu__icon`},Fe=[`src`],Ie={class:`proj-menu__label`},Le={class:`proj-menu__hint`};function Re(n,i,a,o,m,g){let v=r;return x(),c(f,null,[s(`ul`,{class:`proj-menu`,role:`menu`,"aria-label":o.$t(`@WORKBENCH:打开方式`)},[s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.openInFileManager,onKeydown:[h(p(o.openInFileManager,[`prevent`]),[`enter`]),h(p(o.openInFileManager,[`prevent`]),[`space`])]},[s(`span`,K,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.FolderOpened)]),_:1})]),s(`span`,q,u(o.$t(`@WORKBENCH:在文件管理器中打开`)),1)],40,G),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.openInTerminal,onKeydown:[h(p(o.openInTerminal,[`prevent`]),[`enter`]),h(p(o.openInTerminal,[`prevent`]),[`space`])]},[s(`span`,Y,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.Monitor)]),_:1})]),s(`span`,X,u(o.$t(`@WORKBENCH:在终端中打开`)),1)],40,J),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.launchGui,onKeydown:[h(p(o.launchGui,[`prevent`]),[`enter`]),h(p(o.launchGui,[`prevent`]),[`space`])]},[s(`span`,Q,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.Promotion)]),_:1})]),s(`span`,ne,u(o.$t(`@WORKBENCH:在新标签页启动 g ui`)),1)],40,Z),C(` 复制文件夹名称:放在"打开"这一组里,因为它操作的是项目目录本身,
2
2
  而不是"用哪个工具打开"(下面那组有独立标题)。 `),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.copyFolderName,onKeydown:[h(p(o.copyFolderName,[`prevent`]),[`enter`]),h(p(o.copyFolderName,[`prevent`]),[`space`])]},[s(`span`,ie,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.CopyDocument)]),_:1})]),s(`span`,ae,u(o.$t(`@67CE7:复制文件夹名称`)),1)],40,re),C(` 复制文件夹路径:与名称成对(名称=最后一级目录名,路径=完整绝对路径,
3
3
  粘进终端 cd 用)。同属"操作目录本身"的一组,排在名称下面。 `),s(`li`,{class:`proj-menu__item`,role:`menuitem`,tabindex:`-1`,onClick:o.copyFolderPath,onKeydown:[h(p(o.copyFolderPath,[`prevent`]),[`enter`]),h(p(o.copyFolderPath,[`prevent`]),[`space`])]},[s(`span`,se,[e(v,{"aria-hidden":`true`},{default:_(()=>[e(o.CopyDocument)]),_:1})]),s(`span`,ce,u(o.$t(`@67CE7:复制文件夹路径`)),1)],40,oe),i[23]||=s(`li`,{class:`proj-menu__sep`,role:`separator`},null,-1),s(`li`,le,u(o.$t(`@WORKBENCH:用工具打开`)),1),(x(!0),c(f,null,d(o.OPEN_WITH_TOOLS,t=>(x(),c(`li`,{key:t.id,class:l([`proj-menu__item`,{"is-missing":o.toolMissing(t.id)}]),role:`menuitem`,tabindex:`-1`,onClick:e=>o.openWithTool(t.id),onKeydown:[h(p(e=>o.openWithTool(t.id),[`prevent`]),[`enter`]),h(p(e=>o.openWithTool(t.id),[`prevent`]),[`space`])]},[s(`span`,de,[e(o.SvgIcon,{"icon-class":t.icon,class:l({"icon-invert-dark":t.id===`codex`,"icon-outline-dark":o.DARK_TILE_ICON_IDS.has(t.id)})},null,8,[`icon-class`,`class`])]),s(`span`,fe,u(o.$t(t.labelKey)),1),o.toolMissing(t.id)?(x(),c(`span`,pe,u(o.$t(`@67CE7:未安装`)),1)):C(`v-if`,!0)],42,ue))),128)),C(` claude 有两种权限模式,不混进上面的工具列表(顶栏也是单独排布的) `),s(`li`,{class:l([`proj-menu__item`,{"is-missing":o.toolMissing(`claude`)}]),role:`menuitem`,tabindex:`-1`,onClick:i[0]||=e=>o.openWithTool(`claude`),onKeydown:[i[1]||=h(p(e=>o.openWithTool(`claude`),[`prevent`]),[`enter`]),i[2]||=h(p(e=>o.openWithTool(`claude`),[`prevent`]),[`space`])]},[s(`span`,me,[s(`img`,{src:o.claudeCodeIcon,alt:``,class:`proj-menu__img`},null,8,he)]),s(`span`,ge,u(o.$t(`@67CE7:用 Claude Code 打开`)),1),s(`span`,_e,u(o.toolMissing(`claude`)?o.$t(`@67CE7:未安装`):o.$t(`@67CE7:默认权限`)),1)],34),s(`li`,{class:l([`proj-menu__item proj-menu__item--danger`,{"is-missing":o.toolMissing(`claude`)}]),role:`menuitem`,tabindex:`-1`,onClick:i[3]||=e=>o.openWithTool(`claude`,`bypassPermissions`),onKeydown:[i[4]||=h(p(e=>o.openWithTool(`claude`,`bypassPermissions`),[`prevent`]),[`enter`]),i[5]||=h(p(e=>o.openWithTool(`claude`,`bypassPermissions`),[`prevent`]),[`space`])]},[s(`span`,ve,[s(`img`,{src:o.claudeCodeIcon,alt:``,class:`proj-menu__img`},null,8,ye)]),s(`span`,be,u(o.$t(`@67CE7:用 Claude Code 打开(完全批准)`)),1)],34),C(` opencode 的「完全批准」(\`--auto\`)与 claude 的 bypass 档并列收在末尾:
4
4
  它带警示色,混进上面的普通工具列表会把"一行一个工具"的节奏打乱,
@@ -10,19 +10,19 @@
10
10
  <meta name="theme-color" content="#141820" media="(prefers-color-scheme: dark)" />
11
11
  <title>Zen GitSync</title>
12
12
  <!-- 字体改为自托管(@font-face 见 src/main.css),不再依赖 Google Fonts 外链 -->
13
- <script type="module" crossorigin src="/assets/index-DRDito6l.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-BybDOX1D.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/dagre-CpKxpMNH.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/element-plus-Bz6lYur-.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-C2k0GBzj.js">
18
- <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-D4DL0jyB.js">
19
- <link rel="modulepreload" crossorigin href="/assets/SvgIcon-CfjWD31j.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-Dz34f-q7.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/SvgIcon-DkU8Uro2.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/socket-io-BFqQXqAp.js">
21
- <link rel="modulepreload" crossorigin href="/assets/configStore-BmWis0h4.js">
22
- <link rel="modulepreload" crossorigin href="/assets/toolsStore-CmVXtAw_.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/configStore-BjNspgAX.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/toolsStore-C5a4cV7b.js">
23
23
  <link rel="modulepreload" crossorigin href="/assets/monaco-CvMddat7.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/flow-mindmap-CpjwoduB.js">
25
- <link rel="modulepreload" crossorigin href="/assets/CommonDialog-lhBO3OFL.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/CommonDialog-D2f72EzI.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/vue-flow-Cnxq2qrs.js">
27
27
  <link rel="stylesheet" crossorigin href="/assets/element-plus-D-6gla1z.css">
28
28
  <link rel="stylesheet" crossorigin href="/assets/vendor-CSFGMcMB.css">
@@ -16,6 +16,7 @@ import express from 'express';
16
16
  import logger from '../utils/logger.js'
17
17
  import chalk from 'chalk';
18
18
  import fs from 'fs/promises';
19
+ import { createReadStream } from 'fs';
19
20
  import path from 'path';
20
21
  import open from 'open';
21
22
  import os from 'os';
@@ -1050,7 +1051,11 @@ export function registerFsRoutes({
1050
1051
  }
1051
1052
  }));
1052
1053
 
1053
- // ── 编辑器:读取原始文件(用于图片等二进制文件预览)────────────────────
1054
+ // ── 编辑器:读取原始文件(图片预览 / 音视频播放)────────────────────────
1055
+ // 图片走"整份读进内存"(最大 20 MB);音视频必须走流 + Range:
1056
+ // - <audio>/<video> 拖进度条时浏览器发 `Range: bytes=N-`,回不了 206 就没法 seek;
1057
+ // - 一首无损 / 一段视频动辄上百 MB,整份读进内存既慢又容易被 20 MB 上限拒掉
1058
+ // (以前点 mp3 会掉进"文件过大,暂不支持在线编辑"就是这条上限的连带)。
1054
1059
  app.get('/api/editor/raw', asyncRoute(async (req, res) => {
1055
1060
  try {
1056
1061
  const filePath = req.query.path;
@@ -1060,18 +1065,68 @@ export function registerFsRoutes({
1060
1065
  const resolved = safe.safePath;
1061
1066
  const stat = await fs.stat(resolved);
1062
1067
  if (!stat.isFile()) return res.status(400).end();
1063
- if (stat.size > 20 * 1024 * 1024) return res.status(413).end();
1064
1068
  const ext = path.extname(resolved).toLowerCase().slice(1);
1065
1069
  const mimeMap = {
1066
1070
  png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',
1067
1071
  gif: 'image/gif', webp: 'image/webp', ico: 'image/x-icon',
1068
1072
  svg: 'image/svg+xml', bmp: 'image/bmp', tiff: 'image/tiff',
1073
+ // 音视频:MIME 必须给对,否则浏览器把它当 octet-stream 直接不播
1074
+ mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', oga: 'audio/ogg',
1075
+ m4a: 'audio/mp4', aac: 'audio/aac', flac: 'audio/flac', opus: 'audio/opus',
1076
+ weba: 'audio/webm',
1077
+ mp4: 'video/mp4', m4v: 'video/mp4', webm: 'video/webm', ogv: 'video/ogg',
1078
+ mov: 'video/quicktime', mkv: 'video/x-matroska', avi: 'video/x-msvideo',
1069
1079
  };
1070
1080
  const mime = mimeMap[ext] || 'application/octet-stream';
1071
- const content = await fs.readFile(resolved);
1081
+ const isMedia = mime.startsWith('audio/') || mime.startsWith('video/');
1082
+
1083
+ if (!isMedia) {
1084
+ if (stat.size > 20 * 1024 * 1024) return res.status(413).end();
1085
+ const content = await fs.readFile(resolved);
1086
+ res.setHeader('Content-Type', mime);
1087
+ res.setHeader('Cache-Control', 'no-store');
1088
+ res.send(content);
1089
+ return;
1090
+ }
1091
+
1092
+ const size = stat.size;
1072
1093
  res.setHeader('Content-Type', mime);
1073
1094
  res.setHeader('Cache-Control', 'no-store');
1074
- res.send(content);
1095
+ res.setHeader('Accept-Ranges', 'bytes');
1096
+
1097
+ // 只接受单段 `bytes=a-b` / `bytes=a-` / `bytes=-n`;多段(逗号)按整份返回,
1098
+ // 浏览器对音视频只会发单段,没必要为多段写 multipart。
1099
+ const rangeHeader = String(req.headers.range || '').trim();
1100
+ const m = /^bytes=(\d*)-(\d*)$/.exec(rangeHeader);
1101
+ let start = 0;
1102
+ let end = size - 1;
1103
+ let partial = false;
1104
+ if (m && (m[1] !== '' || m[2] !== '')) {
1105
+ if (m[1] === '') {
1106
+ // 后缀区间:最后 n 字节
1107
+ const len = Math.min(Number(m[2]) || 0, size);
1108
+ start = size - len;
1109
+ } else {
1110
+ start = Number(m[1]);
1111
+ if (m[2] !== '') end = Math.min(Number(m[2]), size - 1);
1112
+ }
1113
+ if (!Number.isFinite(start) || !Number.isFinite(end) || start > end || start >= size) {
1114
+ res.status(416);
1115
+ res.setHeader('Content-Range', `bytes */${size}`);
1116
+ return res.end();
1117
+ }
1118
+ partial = true;
1119
+ }
1120
+
1121
+ const length = end - start + 1;
1122
+ res.status(partial ? 206 : 200);
1123
+ res.setHeader('Content-Length', String(length));
1124
+ if (partial) res.setHeader('Content-Range', `bytes ${start}-${end}/${size}`);
1125
+ // 空文件:没有可读区间,直接收尾(createReadStream(start>end) 会抛)
1126
+ if (length <= 0) return res.end();
1127
+ const stream = createReadStream(resolved, { start, end });
1128
+ stream.on('error', () => res.destroy());
1129
+ stream.pipe(res);
1075
1130
  } catch (error) {
1076
1131
  res.status(500).end();
1077
1132
  }
@@ -369,8 +369,48 @@ export function registerWorkbenchRoutes({
369
369
  }));
370
370
 
371
371
  // ════════════════════════════════════════════════════════════════════════
372
- // §12. 执行任务(每个任务都是一次会话)
372
+ // §11.5 移动任务到其他项目(看板「待处理」卡片的右键菜单)
373
+ //
374
+ // 为什么单独开一个端点,而不是让 POST /api/workbench/tasks 的更新分支
375
+ // 支持改 projectPath:那条分支是编辑器"整 task 体提交"走的路,它**刻意**
376
+ // 一律保留任务原有的 projectPath(见上面 296–297 行)—— 否则在 A 项目的
377
+ // 编辑器里打开 B 项目的任务、保存一次,任务就悄悄挪到 A 去了。
378
+ // 「移动到其他项目」是一次显式动作,值得一个显式端点。
379
+ //
380
+ // projectPath 同时是任务的**执行目录**(resolveTaskRepoPath),所以:
381
+ // · 有活跃 job 的任务拒绝移动 —— 这一轮还在旧目录里跑、下一轮才换地方,
382
+ // 一张卡会短暂地在两个项目下都看得见,先停再挪(与 DELETE 同口径);
383
+ // · 目标按 canonicalProjectPath 判重(大小写/斜杠不同也是同一个项目),
384
+ // 落库保留调用方给的原始写法(与 buildProjectEntries "首次出现的写法"一致)。
373
385
  // ════════════════════════════════════════════════════════════════════════
386
+ app.post('/api/workbench/tasks/:id/move', asyncRoute(async (req, res) => {
387
+ const taskId = req.params.id;
388
+ const targetPath = typeof req.body?.projectPath === 'string' ? req.body.projectPath.trim() : '';
389
+ if (!targetPath) throw new HttpError(400, '缺少目标项目路径');
390
+ const data = await readJson(TASKS_FILE, { tasks: [] });
391
+ const task = (data.tasks || []).find(t => t && t.id === taskId);
392
+ if (!task) throw new HttpError(404, '任务不存在');
393
+
394
+ // 先刷磁盘再取快照:别的实例刚起的 job 也要看得到(与 /tasks/:id/run 同一口径)
395
+ await refreshJobsFromDisk();
396
+ const liveJob = snapshotJobs().find(j => j.taskId === taskId && (j.status === 'running' || j.status === 'pending'));
397
+ if (liveJob) throw new HttpError(400, '该任务正在执行,请先停止再移动');
398
+
399
+ // 幂等:目标就是当前归属时直接回成功("挪到它已经在的项目"不是错误)
400
+ if (canonicalProjectPath(task.projectPath) === canonicalProjectPath(targetPath)) {
401
+ return res.json({ success: true, task });
402
+ }
403
+
404
+ const now = nowIso();
405
+ task.projectPath = targetPath;
406
+ task.updatedAt = now;
407
+ await writeJson(TASKS_FILE, data);
408
+ publish('task:update', task);
409
+ res.json({ success: true, task });
410
+ }));
411
+
412
+ // ════════════════════════════════════════════════════════════════════════
413
+ // §12. 执行任务(每个任务都是一次会话)
374
414
  app.post('/api/workbench/tasks/:id/run', asyncRoute(async (req, res) => {
375
415
  const data = await readJson(TASKS_FILE, { tasks: [] });
376
416
  const task = (data.tasks || []).find(t => t.id === req.params.id);
@@ -1,12 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Dt as r,Et as i,Gn as a,Gt as o,Ht as s,In as c,J as l,Kr as u,M as d,Mn as f,Pn as p,Qn as m,Rt as h,Sn as g,Tn as _,Un as v,Vt as y,W as b,Wr as x,Xr as S,Yn as C,_n as w,a as T,ar as E,ct as D,dn as O,en as ee,et as k,fn as A,gr as j,i as M,ir as N,j as P,jr as F,kn as I,ln as L,lr as R,mr as z,nr as B,on as V,pn as H,pt as te,qn as U,r as ne,wn as W,xn as G,xt as re}from"./element-plus-Bz6lYur-.js";import{c as K,t as ie}from"./vendor-C2k0GBzj.js";import{n as q,t as J}from"./_plugin-vue_export-helper-D4DL0jyB.js";import{t as Y}from"./configStore-BmWis0h4.js";import{t as ae}from"./CommonDialog-lhBO3OFL.js";import{j as oe,lt as se,st as ce,tt as le,ut as ue}from"./index-DRDito6l.js";import{a as de,c as fe,i as pe,l as me,m as he,n as ge,o as _e,r as ve,s as ye,t as be,u as xe}from"./agentConversations-DJ8rPauy.js";import{c as Se,d as Ce,n as we,t as Te,u as Ee}from"./ChatSilenceBadge-BDltHrA2.js";import{t as De}from"./useOrchestrator-DKr4ShyB.js";async function X(e,t){let n=await fetch(e,{headers:{"Content-Type":`application/json`},...t}),r={};try{r=await n.json()}catch{}if(!n.ok||r.success===!1)throw Error(r.error||`请求失败 (${n.status})`);return r}async function Oe(){let e=await X(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function ke(e){return(await X(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function Ae(e,t){return(await X(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function je(e){await X(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function Me(e){await X(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Ne(e){await X(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Pe(e){if(typeof EventSource>`u`)return()=>{};let t=new EventSource(`/api/schedules/events`);return t.onmessage=t=>{try{e(JSON.parse(t.data))}catch{}},()=>t.close()}var Z=e=>/^\d+$/.test(e)?Number(e):null;function Fe(e){let t=String(e||``).trim(),n=t.split(/\s+/);if(n.length!==5)return{kind:`custom`,raw:t};let[r,i,a,o,s]=n,c=Z(r),l=Z(i);if(t===`* * * * *`)return{kind:`every-minute`,raw:t};let u=r.match(/^\*\/(\d+)$/);if(u&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`every-n-minutes`,n:Number(u[1]),raw:t};if(c!==null&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`hourly`,minute:c,raw:t};if(c!==null&&l!==null&&a===`*`&&o===`*`&&s===`*`)return{kind:`daily`,hour:l,minute:c,raw:t};let d=Z(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=Z(a);return c!==null&&l!==null&&f!==null&&o===`*`&&s===`*`?{kind:`monthly`,day:f,hour:l,minute:c,raw:t}:{kind:`custom`,raw:t}}var Q=e=>String(e).padStart(2,`0`),Ie=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function Le(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${Q(n.getHours())}:${Q(n.getMinutes())}`,i=Math.round((Ie(n)-Ie(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${Q(n.getDate())}`,time:r}:i===0?{kind:`today`,time:r}:i===1?{kind:`tomorrow`,time:r}:i<7?{kind:`weekday`,weekday:n.getDay(),time:r}:{kind:`date`,date:`${n.getMonth()+1}-${Q(n.getDate())}`,time:r}}function Re(e){switch(e){case`ok`:return`ok`;case`error`:case`timed-out`:return`error`;case`skipped-busy`:case`missed`:case`cancelled`:return`skipped`;default:return`pending`}}function ze(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return``;if(t<1e3)return`<1s`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m${Q(n%60)}s`:`${Math.floor(r/60)}h${Q(r%60)}m`}function Be(e){let t=Math.min(59,Math.max(0,Math.floor(e.minute))),n=Math.min(23,Math.max(0,Math.floor(e.hour))),r=(Math.floor(e.weekday)%7+7)%7;switch(e.freq){case`minutes`:return`*/${Math.min(59,Math.max(1,Math.floor(e.everyMinutes??30)))} * * * *`;case`hourly`:return`${t} * * * *`;case`daily`:return`${t} ${n} * * *`;case`weekly`:return`${t} ${n} * * ${r}`;case`custom`:return String(e.custom||``).trim()}}var Ve=`https://cdn.simpleicons.org`;function He(e){return`https://github.com/${e}.png?size=64`}function Ue(e,t){return`${Ve}/${e}${t?`/E8EAED`:``}`}var $=[[/chromedevtools|chrome-dev-tools/,`avatar:ChromeDevTools`],[/googlechrome|\bchrome\b/,`googlechrome`],[/\bfirefox\b/,`firefox`],[/puppeteer/,`puppeteer`],[/playwright/,`avatar:microsoft`],[/selenium/,`selenium`],[/cypress/,`cypress`],[/appium/,`appium`],[/browserstack/,`avatar:browserstack`],[/saucelabs/,`saucelabs`],[/storybook/,`storybook`],[/\bgithub\b|githubcopilot|githubactions/,`github`],[/\bgitlab\b/,`gitlab`],[/\bbitbucket\b/,`bitbucket`],[/context7/,`avatar:upstash`],[/modelcontextprotocol/,`avatar:modelcontextprotocol`],[/claude|anthropic/,`claude`],[/\bopenai\b|chatgpt/,`avatar:openai`],[/gemini|google\s*ai\b/,`googlegemini`],[/hugging\s*face/,`huggingface`],[/\bollama\b/,`ollama`],[/\bdify\b/,`dify`],[/\bn8n\b/,`n8n`],[/langchain/,`langchain`],[/perplexity/,`avatar:perplexityai`],[/\bexa\b/,`avatar:exa-labs`],[/firecrawl/,`avatar:firecrawl`],[/\be2b\b/,`avatar:e2b-dev`],[/browserbase/,`avatar:browserbase`],[/apify/,`avatar:apify`],[/postgres|postgresql/,`postgresql`],[/\bmysql\b|mariadb/,`mysql`],[/\bsqlite\b/,`sqlite`],[/mongodb|\bmongo\b/,`mongodb`],[/\bredis\b/,`redis`],[/elasticsearch|\belastic\b/,`elasticsearch`],[/clickhouse/,`clickhouse`],[/snowflake/,`snowflake`],[/databricks/,`databricks`],[/duckdb/,`duckdb`],[/influxdb/,`influxdb`],[/neo4j/,`neo4j`],[/cassandra/,`apachecassandra`],[/rabbitmq/,`rabbitmq`],[/kafka/,`apachekafka`],[/\bqdrant\b/,`qdrant`],[/weaviate/,`weaviate`],[/pinecone/,`avatar:pinecone`],[/planetscale/,`avatar:planetscale`],[/neondatabase|\bneon\b/,`avatar:neondatabase`],[/supabase/,`supabase`],[/firebase/,`firebase`],[/\bdbt\b/,`avatar:dbt-labs`],[/airflow/,`apacheairflow`],[/dagster/,`avatar:dagster-io`],[/prefect/,`prefect`],[/\bspark\b/,`apachespark`],[/hadoop/,`apachehadoop`],[/airbyte/,`airbyte`],[/bigquery/,`googlebigquery`],[/\baws\b|amazon\s*web\s*services|amazons3|amazondynamodb/,`avatar:aws`],[/azure/,`microsoftazure`],[/google\s*cloud|\bgcp\b/,`googlecloud`],[/cloudflare/,`cloudflare`],[/vercel/,`vercel`],[/netlify/,`netlify`],[/heroku/,`heroku`],[/digitalocean/,`digitalocean`],[/\bdocker\b/,`docker`],[/kubernetes|\bk8s\b|kubectl/,`kubernetes`],[/kubeflow/,`kubeflow`],[/terraform/,`terraform`],[/jenkins/,`jenkins`],[/circleci/,`circleci`],[/\bhelm\b/,`avatar:helm`],[/argocd|argo\s*cd/,`avatar:argoproj`],[/\bnginx\b/,`nginx`],[/\bapache\b/,`apache`],[/caddy/,`caddy`],[/traefik/,`traefikproxy`],[/haproxy/,`haproxy`],[/tailscale/,`tailscale`],[/\bngrok\b/,`ngrok`],[/\bconsul\b|hashicorp/,`hashicorp`],[/vault/,`hashicorp`],[/packer/,`packer`],[/virtualbox/,`virtualbox`],[/vmware/,`vmware`],[/grafana/,`grafana`],[/prometheus/,`prometheus`],[/datadog/,`datadog`],[/\bsentry\b/,`sentry`],[/splunk/,`splunk`],[/new\s*relic/,`newrelic`],[/pagerduty/,`pagerduty`],[/opsgenie/,`opsgenie`],[/home\s*assistant/,`homeassistant`],[/obsidian/,`obsidian`],[/notion/,`notion`],[/figma/,`figma`],[/\blinear\b/,`linear`],[/atlassian/,`atlassian`],[/\bjira\b/,`jira`],[/confluence/,`confluence`],[/airtable/,`airtable`],[/clickup/,`clickup`],[/asana/,`asana`],[/trello/,`trello`],[/basecamp/,`basecamp`],[/todoist/,`todoist`],[/zapier/,`zapier`],[/hubspot/,`hubspot`],[/zendesk/,`zendesk`],[/intercom/,`intercom`],[/mailchimp/,`mailchimp`],[/salesforce/,`avatar:salesforce`],[/slack/,`avatar:slack`],[/discord/,`discord`],[/telegram/,`telegram`],[/whatsapp/,`whatsapp`],[/gmail/,`gmail`],[/google\s*drive/,`googledrive`],[/google\s*sheets/,`googlesheets`],[/google\s*docs/,`googledocs`],[/google\s*maps/,`googlemaps`],[/google\s*calendar/,`googlecalendar`],[/youtube/,`youtube`],[/spotify/,`spotify`],[/twilio/,`avatar:twilio`],[/sendgrid/,`avatar:sendgrid`],[/mailgun/,`mailgun`],[/stripe/,`stripe`],[/paypal/,`paypal`],[/shopify/,`shopify`],[/posthog/,`avatar:posthog`],[/segment\b/,`avatar:segmentio`],[/amplitude/,`avatar:amplitude`],[/mixpanel/,`avatar:mixpanel`],[/contentful/,`contentful`],[/sanity/,`sanity`],[/wordpress|\bwp\b/,`wordpress`],[/ghost\b/,`ghost`],[/webflow/,`webflow`],[/framer/,`framer`],[/bitwarden/,`bitwarden`],[/proton\s*vpn/,`protonvpn`],[/1password/,`1password`],[/auth0/,`auth0`],[/okta/,`okta`],[/keycloak/,`keycloak`],[/clerk/,`avatar:clerk`],[/brave\b/,`brave`],[/duckduckgo/,`duckduckgo`],[/openapi|swagger/,`openapiinitiative`],[/graphql/,`graphql`],[/apollo/,`apollographql`],[/postman/,`postman`],[/insomnia/,`insomnia`],[/hoppscotch/,`hoppscotch`],[/\bcurl\b/,`curl`],[/react/,`react`],[/vue/,`vuedotjs`],[/angular/,`angular`],[/svelte/,`svelte`],[/next\.?js/,`nextdotjs`],[/nuxt/,`nuxtdotjs`],[/\bastro\b/,`astro`],[/tailwind/,`tailwindcss`],[/electron/,`electron`],[/flutter/,`flutter`],[/\bswift\b/,`swift`],[/typescript/,`typescript`],[/javascript/,`javascript`],[/python/,`python`],[/node\.?js/,`nodedotjs`],[/\bdeno\b/,`deno`],[/\bbun\b/,`bun`],[/\brust\b/,`rust`],[/\bgolang\b|\bgo\b/,`go`],[/pytorch|\btorch\b/,`pytorch`],[/tensorflow/,`tensorflow`],[/scikit|sklearn/,`scikitlearn`],[/mlflow/,`mlflow`],[/\bray\b/,`ray`],[/jupyter/,`jupyter`],[/\bvite\b/,`vite`],[/vitest/,`vitest`],[/eslint/,`eslint`],[/prettier/,`prettier`],[/\bjest\b/,`jest`],[/\bnpm\b/,`npm`],[/pnpm/,`pnpm`],[/\byarn\b/,`yarn`],[/homebrew/,`homebrew`],[/docusaurus/,`docusaurus`],[/readthedocs/,`readthedocs`],[/gitbook/,`gitbook`],[/markdown/,`markdown`],[/\blinux\b/,`linux`],[/ubuntu/,`ubuntu`],[/debian/,`debian`],[/apple|macos/,`apple`],[/windows/,`windows`],[/microsoft/,`microsoft`],[/\bteams\b/,`microsoftteams`],[/onedrive/,`onedrive`],[/power\s*bi/,`powerbi`],[/bing\b/,`bing`],[/google/,`google`],[/baidu/,`baidu`],[/bilibili/,`bilibili`],[/wechat|weixin/,`wechat`],[/alibaba|aliyun/,`alibabacloud`]],We={url:``,letter:``,hue:0};function Ge(e){let t=String(e||``).trim();if(!t)return``;let n=t.match(/github\.com\/([^/\s]+)/i),r=n?n[1]:t.split(`/`)[0];return/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/.test(r)?r:``}function Ke(e){let t=0;for(let n=0;n<e.length;n++)t=(t*31+e.charCodeAt(n))%36e4;return t%360}function qe(e,t=!1){let n=String(e?.name||``).trim();if(!n)return We;let r=[...n][0]?.toUpperCase()||``,i=Ke(n.toLowerCase()),a=`${n} ${e?.package||``} ${e?.repository||``}`.toLowerCase();for(let[e,n]of $)if(e.test(a))return{url:n.startsWith(`avatar:`)?He(n.slice(7)):Ue(n,t),letter:r,hue:i};let o=Ge(e?.repository||``);return o?{url:He(o),letter:r,hue:i}:{url:``,letter:r,hue:i}}c(),R();var Je=4e3,Ye=f({__name:`MarketplacePanel`,props:{type:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,r=Y(),a=j([]),c=j([]),l=j(!1),u=j(``),d=j(``),f=j([]),p=j(`project`),m=j(new Set),g=j(new Set),_=j(new Set),b=G(()=>r.currentDirectory||``),{theme:x}=le(),S=G(()=>x.value===`dark`),C=j(new Set),w=new Map;function T(e){let t=w.get(e);t&&clearTimeout(t),w.delete(e)}function E(e){let t=H(e);qe(e,S.value).url&&(T(t),w.set(t,setTimeout(()=>{w.delete(t),C.value.add(t)},Je)))}v(()=>{for(let e of w.values())clearTimeout(e);w.clear()});function O(e){let t=qe(e,S.value);return C.value.has(H(e))?{...t,url:``}:t}function A(e){T(H(e))}function N(e){T(H(e)),C.value.add(H(e))}let P=G(()=>a.value.reduce((e,t)=>e+(t.status===`ok`?t.items.length:0),0)),F=null;async function I(){if(!l.value){l.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:b.value});d.value&&e.set(`q`,d.value),f.value.length&&e.set(`sources`,f.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();if(t?.success){a.value=t.groups||[],c.value=t.installed||[];for(let e of a.value)for(let t of e.items)E(t)}else M.error(t?.error||q(`@MKT:加载失败`))}catch{M.error(q(`@MKT:加载失败`))}finally{l.value=!1}}}B(u,e=>{F&&clearTimeout(F),F=setTimeout(()=>{d.value=e.trim(),I()},400)}),B(f,()=>I()),B(()=>n.type,()=>{f.value=[],d.value=``,u.value=``,I()}),B(b,()=>I()),I();let L=G(()=>{let e=b.value?b.value.split(/[\\/]/).filter(Boolean).pop():``;return p.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function R(e){return e.stars?`${V(e.stars)} ★`:e.downloads?`${V(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${V(e.uses)} ${q(`@MKT:次使用`)}`:``}function V(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function H(e){return`${e.id}`}function U(e){return m.value.has(H(e))}let W=G(()=>{let e={project:[],global:[]};for(let t of c.value)(e[t.target]||=[]).push(t);return e}),K=z({visible:!1,item:null,env:{},args:``});function ie(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function J(e){K.item=e,K.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),K.args=(e.args||[]).join(` `),K.visible=!0}function oe(){let e=K.item;if(K.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(K.env).filter(([,e])=>e.trim()!==``)),n=K.args.trim()?K.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;ce(e,{env:t,...n?{args:n}:{}})}async function se(e){if(!e.installed||await ue(e)){if(ie(e)){J(e);return}await ce(e,{})}}async function ce(e,t){let r=H(e);m.value.add(r);try{let r=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:p.value,cwd:b.value,item:{...e,...t}})}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){M.error(i?.error||q(`@MKT:安装失败`));return}i.item?.warning&&M.warning(i.item.warning),i.item?.envKeys?.length?M.warning(`${q(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):M.success(q(`@MKT:安装成功`)),await I()}catch{M.error(q(`@MKT:安装失败`))}finally{m.value.delete(r)}}async function ue(e){try{return await ne.confirm(`${e.name} ${q(`@MKT:已安装,要重新安装吗?`)}`,q(`@MKT:重新安装`),{confirmButtonText:q(`@MKT:重装`),cancelButtonText:q(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function de(e){let t=`${e.target}:${e.id}`;_.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:n.type,target:e.target,cwd:b.value,id:e.id})}),r=await t.json().catch(()=>null);(!t.ok||!r?.success)&&M.error(r?.error||q(`@MKT:打开失败`))}catch{M.error(q(`@MKT:打开失败`))}finally{_.value.delete(t)}}async function fe(e){try{await ne.confirm(`${q(`@MKT:确定卸载`)} ${e.name}?`,q(`@MKT:卸载`),{confirmButtonText:q(`@MKT:卸载`),cancelButtonText:q(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;g.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:b.value}),r=await fetch(`/api/agent/marketplace/item/${n.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await r.json().catch(()=>null);if(!r.ok||!i?.success){M.error(i?.error||q(`@MKT:卸载失败`));return}M.success(q(`@MKT:已卸载`)),await I()}catch{M.error(q(`@MKT:卸载失败`))}finally{g.value.delete(t)}}let pe={props:n,configStore:r,groups:a,installed:c,loading:l,searchInput:u,query:d,selectedSources:f,installTarget:p,installing:m,removing:g,revealing:_,cwd:b,currentTheme:x,isDark:S,ICON_FALLBACK_MS:Je,iconErrors:C,iconTimers:w,settleIconTimer:T,scheduleIconFallback:E,iconOf:O,onIconLoad:A,onIconError:N,totalCount:P,get searchTimer(){return F},set searchTimer(e){F=e},loadCatalog:I,targetLabel:L,metricText:R,formatCount:V,cardKey:H,isBusy:U,installedByTarget:W,configDialog:K,needsConfig:ie,openConfigDialog:J,confirmConfig:oe,onInstall:se,doInstall:ce,confirmReinstall:ue,onReveal:de,onRemove:fe,get $t(){return q},get Search(){return y},get Refresh(){return h},get Delete(){return D},get Link(){return i},get Check(){return k},get Select(){return s},get Star(){return o},get Download(){return te},get Warning(){return ee},get FolderOpened(){return re},CommonDialog:ae};return Object.defineProperty(pe,"__isScriptSetup",{enumerable:!1,value:!0}),pe}});c(),F(),V();var Xe={class:`marketplace-panel`},Ze={class:`mp-hero`},Qe={class:`mp-hero-text`},$e={class:`mp-hero-title`},et={class:`mp-hero-sub`},tt={class:`mp-hero-count`},nt={class:`mp-toolbar`},rt={class:`mp-search`},it=[`placeholder`],at={class:`mp-toolbar-sub`},ot={class:`mp-target-hint`},st={class:`mp-source-filter`},ct=[`onClick`],lt={class:`mp-body`},ut={class:`mp-group-header`},dt={class:`mp-group-title`},ft={key:0,class:`mp-group-count`},pt={key:1,class:`mp-group-error`},mt=[`href`,`title`],ht={key:0,class:`mp-grid`},gt=[`src`,`alt`,`onLoad`,`onError`],_t={key:1},vt={class:`mp-card-main`},yt={class:`mp-card-head`},bt=[`title`],xt={key:1,class:`mp-card-metric`},St=[`title`],Ct={class:`mp-card-meta`},wt=[`title`],Tt=[`title`],Et={key:2,class:`mp-tag remote`},Dt={class:`mp-card-foot`},Ot=[`href`],kt={key:1,class:`mp-installed-chip`},At=[`disabled`,`onClick`],jt={key:3,class:`mp-not-installable`},Mt={key:1,class:`mp-empty`},Nt={key:0,class:`mp-group installed`},Pt={class:`mp-group-header`},Ft={class:`mp-group-title`},It={class:`mp-group-count`},Lt={key:0,class:`mp-installed-block`},Rt={class:`mp-installed-target`},zt={class:`mp-installed-list`},Bt=[`title`],Vt=[`title`],Ht={key:1,class:`mp-meta-pkg`},Ut={key:2,class:`mp-tag warn`},Wt=[`disabled`,`title`,`onClick`],Gt=[`disabled`,`onClick`],Kt={key:1,class:`mp-empty all`},qt={key:0,class:`mkt-form`},Jt={class:`mkt-form-name`},Yt=[`onUpdate:modelValue`,`placeholder`],Xt={key:0,class:`mkt-field`},Zt={class:`mkt-hint`};function Qt(t,r,i,a,o,s){let c=l,f=P,p=d,m=b,h=T;return U(),_(`div`,Xe,[W(` ── 页头 ───────────────────────────────── `),g(`header`,Ze,[g(`div`,Qe,[g(`h2`,$e,S(i.type===`skill`?a.$t(`@MKT:Skill 广场`):a.$t(`@MKT:MCP 广场`)),1),g(`p`,et,S(i.type===`skill`?a.$t(`@MKT:Skill 广场副标题`):a.$t(`@MKT:MCP 广场副标题`)),1)]),g(`span`,tt,S(i.type===`skill`?a.$t(`@MKT:共 {n} 个技能`,{n:a.totalCount}):a.$t(`@MKT:共 {n} 个服务`,{n:a.totalCount})),1)]),W(` ── 工具栏 ───────────────────────────────── `),g(`div`,nt,[g(`div`,rt,[e(c,{class:`mp-search-icon`},{default:N(()=>[e(a.Search)]),_:1}),E(g(`input`,{"onUpdate:modelValue":r[0]||=e=>a.searchInput=e,class:`mp-search-input`,type:`text`,placeholder:i.type===`skill`?a.$t(`@MKT:搜索 Skill...`):a.$t(`@MKT:搜索 MCP 服务...`)},null,8,it),[[H,a.searchInput]])]),e(p,{modelValue:a.installTarget,"onUpdate:modelValue":r[1]||=e=>a.installTarget=e,size:`small`,class:`mp-target`},{default:N(()=>[e(f,{value:`project`},{default:N(()=>[I(S(a.$t(`@MKT:当前项目`)),1)]),_:1}),e(f,{value:`global`},{default:N(()=>[I(S(a.$t(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),e(m,{content:a.$t(`@MKT:刷新`),placement:`top`,"show-after":300},{default:N(()=>[g(`button`,{class:x([`mp-refresh`,{spinning:a.loading}]),onClick:a.loadCatalog},[e(c,null,{default:N(()=>[e(a.Refresh)]),_:1})],2)]),_:1},8,[`content`])]),g(`div`,at,[g(`span`,ot,[I(S(a.$t(`@MKT:安装到`))+` `,1),g(`b`,null,S(a.targetLabel),1)]),g(`div`,st,[(U(!0),_(w,null,C(a.groups,e=>(U(),_(`button`,{key:e.id,class:x([`mp-chip`,{active:a.selectedSources.includes(e.id)}]),onClick:()=>{let t=a.selectedSources.indexOf(e.id);t>=0?a.selectedSources.splice(t,1):a.selectedSources.push(e.id)}},S(e.label),11,ct))),128)),a.selectedSources.length?(U(),_(`button`,{key:0,class:`mp-chip clear`,onClick:r[2]||=e=>a.selectedSources=[]},S(a.$t(`@MKT:全部来源`)),1)):W(`v-if`,!0)])]),W(` ── 内容 ─────────────────────────────────── `),E((U(),_(`div`,lt,[(U(!0),_(w,null,C(a.groups,t=>(U(),_(`section`,{key:t.id,class:`mp-group`},[g(`header`,ut,[g(`h3`,dt,S(t.label),1),t.status===`ok`?(U(),_(`span`,ft,S(t.items.length),1)):(U(),_(`span`,pt,[e(c,null,{default:N(()=>[e(a.Warning)]),_:1}),I(` `+S(t.error||a.$t(`@MKT:来源不可用`)),1)])),t.homepage?(U(),_(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[e(c,null,{default:N(()=>[e(a.Link)]),_:1})],8,mt)):W(`v-if`,!0)]),t.status===`ok`&&t.items.length?(U(),_(`div`,ht,[(U(!0),_(w,null,C(t.items,t=>(U(),_(`article`,{key:a.cardKey(t),class:`mp-card`},[W(` 图标:品牌 logo(simple-icons / GitHub 组织头像)→ 首字母砖兜底 `),g(`div`,{class:x([`mp-card-icon`,{tile:!a.iconOf(t).url}]),style:u({"--tile-hue":String(a.iconOf(t).hue)})},[a.iconOf(t).url?(U(),_(`img`,{key:0,src:a.iconOf(t).url,alt:t.name,draggable:`false`,onLoad:e=>a.onIconLoad(t),onError:e=>a.onIconError(t)},null,40,gt)):(U(),_(`span`,_t,S(a.iconOf(t).letter),1))],6),g(`div`,vt,[g(`div`,yt,[g(`span`,{class:`mp-card-name`,title:t.name},S(t.name),9,bt),t.verified?(U(),n(c,{key:0,class:`mp-verified`,title:a.$t(`@MKT:已验证`)},{default:N(()=>[e(a.Select)]),_:1},8,[`title`])):W(`v-if`,!0),a.metricText(t)?(U(),_(`span`,xt,[e(c,null,{default:N(()=>[t.stars?(U(),n(a.Star,{key:0})):(U(),n(a.Download,{key:1}))]),_:2},1024),I(` `+S(a.metricText(t)),1)])):W(`v-if`,!0)]),g(`p`,{class:`mp-card-desc`,title:t.description},S(t.description||a.$t(`@MKT:暂无描述`)),9,St),g(`div`,Ct,[t.package?(U(),_(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},S(t.package),9,wt)):t.repository?(U(),_(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[I(S(t.repository),1),t.subpath?(U(),_(w,{key:0},[I(` · `+S(t.subpath),1)],64)):W(`v-if`,!0)],8,Tt)):W(`v-if`,!0),t.transport===`remote`?(U(),_(`span`,Et,S(a.$t(`@MKT:远程服务`)),1)):W(`v-if`,!0),(U(!0),_(w,null,C((t.tags||[]).slice(0,2),e=>(U(),_(`span`,{key:e,class:`mp-tag`},S(e),1))),128))]),g(`div`,Dt,[t.upstream?(U(),_(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},S(a.$t(`@MKT:查看来源`)),9,Ot)):W(`v-if`,!0),r[6]||=g(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(U(),_(`span`,kt,[e(c,null,{default:N(()=>[e(a.Check)]),_:1}),I(S(a.$t(`@MKT:已安装`)),1)])):t.installable===!1?(U(),_(`span`,jt,S(a.$t(`@MKT:暂不支持一键安装`)),1)):(U(),_(`button`,{key:2,class:`mp-install-btn`,disabled:a.isBusy(t),onClick:e=>a.onInstall(t)},S(a.isBusy(t)?a.$t(`@MKT:安装中...`):a.$t(`@MKT:安装`)),9,At))])])]))),128))])):t.status===`ok`?(U(),_(`div`,Mt,S(a.$t(`@MKT:该来源暂无结果`)),1)):W(`v-if`,!0)]))),128)),W(` ── 已安装 ─────────────────────────────── `),a.installed.length?(U(),_(`section`,Nt,[g(`header`,Pt,[g(`h3`,Ft,S(a.$t(`@MKT:已安装`)),1),g(`span`,It,S(a.installed.length),1)]),(U(),_(w,null,C([`project`,`global`],t=>g(`div`,{key:t},[a.installedByTarget[t]?.length?(U(),_(`div`,Lt,[g(`div`,Rt,S(t===`project`?a.$t(`@MKT:当前项目`):a.$t(`@MKT:g ai 智能体`)),1),g(`div`,zt,[(U(!0),_(w,null,C(a.installedByTarget[t],n=>(U(),_(`div`,{key:t+n.id,class:`mp-installed-row`},[g(`span`,{class:`mp-installed-name`,title:n.name},S(n.name),9,Bt),W(` 实际落盘的标识:SKILL.md 里的 name 常与仓库名不同(如仓库 taste-skill
2
- 里的 skill 自称 brandkit),不显示这个用户就对不上广场卡片上的名字 `),n.id&&n.id!==n.name?(U(),_(`code`,{key:0,class:`mp-installed-id`,title:n.dir||n.file||n.id},S(n.id),9,Vt)):W(`v-if`,!0),n.package?(U(),_(`code`,Ht,S(n.package),1)):W(`v-if`,!0),n.requiredEnv?.length?(U(),_(`span`,Ut,S(a.$t(`@MKT:待配置`))+`: `+S(n.requiredEnv.join(`, `)),1)):W(`v-if`,!0),r[7]||=g(`span`,{class:`mp-foot-spacer`},null,-1),g(`button`,{class:`mp-reveal-btn`,disabled:a.revealing.has(t+n.id),title:n.dir||n.file||``,onClick:e=>a.onReveal(n)},[e(c,null,{default:N(()=>[e(a.FolderOpened)]),_:1}),I(` `+S(a.$t(`@MKT:打开文件夹`)),1)],8,Wt),g(`button`,{class:`mp-remove-btn`,disabled:a.removing.has(t+n.id),onClick:e=>a.onRemove(n)},[e(c,null,{default:N(()=>[e(a.Delete)]),_:1}),I(` `+S(a.removing.has(t+n.id)?a.$t(`@MKT:卸载中...`):a.$t(`@MKT:卸载`)),1)],8,Gt)]))),128))])])):W(`v-if`,!0)])),64))])):W(`v-if`,!0),!a.loading&&!a.groups.length?(U(),_(`div`,Kt,S(a.$t(`@MKT:加载失败`)),1)):W(`v-if`,!0)])),[[h,a.loading]]),W(` ── MCP 安装前配置 ───────────────────────── `),e(a.CommonDialog,{modelValue:a.configDialog.visible,"onUpdate:modelValue":r[5]||=e=>a.configDialog.visible=e,title:a.$t(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:N(()=>[g(`button`,{class:`mkt-cancel`,onClick:r[4]||=e=>a.configDialog.visible=!1},S(a.$t(`@MKT:取消`)),1),g(`button`,{class:`mkt-confirm`,onClick:a.confirmConfig},S(a.$t(`@MKT:安装`)),1)]),default:N(()=>[a.configDialog.item?(U(),_(`div`,qt,[g(`p`,Jt,S(a.configDialog.item.name),1),(U(!0),_(w,null,C(Object.keys(a.configDialog.env),e=>(U(),_(`div`,{key:e,class:`mkt-field`},[g(`label`,null,S(e),1),E(g(`input`,{"onUpdate:modelValue":t=>a.configDialog.env[e]=t,type:`text`,autocomplete:`off`,placeholder:a.$t(`@MKT:环境变量值`),spellcheck:`false`},null,8,Yt),[[H,a.configDialog.env[e]]])]))),128)),a.configDialog.item.args?.length?(U(),_(`div`,Xt,[g(`label`,null,S(a.$t(`@MKT:启动参数`)),1),E(g(`input`,{"onUpdate:modelValue":r[3]||=e=>a.configDialog.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[H,a.configDialog.args]]),g(`p`,Zt,S(a.$t(`@MKT:参数提示`)),1)])):W(`v-if`,!0)])):W(`v-if`,!0)]),_:1},8,[`modelValue`,`title`])])}var $t=J(Ye,[[`render`,Qt],[`__scopeId`,`data-v-e9f9e851`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MarketplacePanel.vue`]]);c(),R();var en=f({__name:`SchedulePanel`,emits:[`open-session`],setup(e,{expose:t,emit:n}){t();let r=n,i=Y(),o=j([]),s=j(!0),c=j(``),l=j({}),u=null,d=null;async function f(){try{o.value=await Oe(),c.value=``}catch(e){c.value=e?.message||String(e)}finally{s.value=!1}}function p(){d===null&&(d=window.setTimeout(()=>{d=null,f()},150))}a(async()=>{await f(),u=Pe(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&p()})}),v(()=>{u?.(),d!==null&&window.clearTimeout(d)});let m=G(()=>{let e=o.value.filter(e=>e.enabled).length,t=o.value.length-e;return o.value.length?q(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),h=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function g(e){let t=Fe(e.schedule);switch(t.kind){case`every-minute`:return q(`@SCHED:每分钟`);case`every-n-minutes`:return q(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return q(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return q(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return q(`@SCHED:每周 {weekday} {time}`,{weekday:q(h[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return q(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function _(e){if(!e.enabled)return q(`@SCHED:已停用`);if(e.running)return q(`@SCHED:运行中...`);let t=Le(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return q(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return q(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return q(`@SCHED:下次 {weekday} {time}`,{weekday:q(h[t.weekday]),time:t.time});case`date`:return q(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function y(e){let t=e.lastRun;if(!t)return q(`@SCHED:还没执行过`);switch(t.status){case`ok`:return q(`@SCHED:成功`);case`error`:return q(`@SCHED:失败`);case`timed-out`:return q(`@SCHED:超时中止`);case`skipped-busy`:return q(`@SCHED:已跳过(会话忙)`);case`missed`:return q(`@SCHED:已错过(未运行)`);case`cancelled`:return q(`@SCHED:已停止`);default:return t.status}}function b(e){let t=e.lastRun;if(!t)return q(`@SCHED:还没执行过`);let n=ze(t.durationMs),r=q(`@SCHED:上次 {status}`,{status:y(e)});return n?`${r} · ${n}`:r}function x(e){return e.lastRun?`is-${Re(e.lastRun.status)}`:`is-muted`}async function S(e,t){if(!l.value[e.id]){l.value={...l.value,[e.id]:!0};try{await t(),await f()}catch(e){M.error(e?.message||String(e))}finally{let t={...l.value};delete t[e.id],l.value=t}}}function C(e){return S(e,()=>Ae(e.id,{enabled:!e.enabled}))}function w(e){return S(e,()=>Me(e.id))}function T(e){return S(e,()=>Ne(e.id))}let E=j(!1),D=j(null);function O(e){D.value=e,E.value=!0}async function ee(){let e=D.value;if(e)try{await je(e.id),E.value=!1,await f()}catch(e){M.error(e?.message||String(e))}}let k=j(!1),A=j(``),N=j(``),P=j(!1),F=j({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),I=G(()=>[{value:`minutes`,label:q(`@SCHED:每 N 分钟`)},{value:`hourly`,label:q(`@SCHED:每小时`)},{value:`daily`,label:q(`@SCHED:每天`)},{value:`weekly`,label:q(`@SCHED:每周`)},{value:`custom`,label:q(`@SCHED:自定义 cron`)}]),L=G(()=>Be({freq:F.value.freq,everyMinutes:F.value.everyMinutes,minute:F.value.minute,hour:F.value.hour,weekday:F.value.weekday,custom:F.value.custom}));function R(){F.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:i.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},N.value=``}function z(){A.value=``,R(),k.value=!0}function B(e){A.value=e.id;let t=Fe(e.schedule),n={name:e.name,freq:`custom`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:e.schedule,cwd:e.cwd,prompt:e.prompt,onMissed:e.onMissed===`skip`?`skip`:`run`,enabled:e.enabled};switch(t.kind){case`every-n-minutes`:n.freq=`minutes`,n.everyMinutes=t.n;break;case`hourly`:n.freq=`hourly`,n.minute=t.minute;break;case`daily`:n.freq=`daily`,n.minute=t.minute,n.hour=t.hour;break;case`weekly`:n.freq=`weekly`,n.minute=t.minute,n.hour=t.hour,n.weekday=t.weekday;break;default:n.freq=`custom`}F.value=n,N.value=``,k.value=!0}async function V(){let e=F.value;if(!e.name.trim()){N.value=q(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){N.value=q(`@SCHED:提示词不能为空`);return}let t=L.value;if(!t){N.value=q(`@SCHED:cron 表达式不能为空`);return}let n={name:e.name.trim(),schedule:t,cwd:e.cwd.trim(),prompt:e.prompt.trim(),enabled:e.enabled,onMissed:e.onMissed};P.value=!0;try{A.value?await Ae(A.value,n):await ke(n),k.value=!1,await f()}catch(e){N.value=e?.message||String(e)}finally{P.value=!1}}let H={emit:r,configStore:i,tasks:o,loading:s,errorMsg:c,pending:l,get disposeEvents(){return u},set disposeEvents(e){u=e},get refreshTimer(){return d},set refreshTimer(e){d=e},refresh:f,scheduleRefresh:p,summaryText:m,WEEKDAY_KEYS:h,descText:g,nextText:_,lastStatusText:y,lastText:b,lastClass:x,withPending:S,toggle:C,runNow:w,stop:T,confirmVisible:E,confirmTarget:D,askRemove:O,confirmRemove:ee,formVisible:k,editingId:A,formError:N,saving:P,form:F,freqOptions:I,cronPreview:L,resetForm:R,openCreate:z,openEdit:B,submitForm:V,get $t(){return q},CommonDialog:ae};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}});F(),c(),V();var tn={class:`schedule-panel`},nn={class:`schedule-toolbar`},rn={class:`schedule-summary`},an={key:0,class:`schedule-error`},on={key:1,class:`schedule-loading`},sn={key:2,class:`schedule-empty`},cn={class:`schedule-empty-title`},ln={class:`schedule-empty-desc`},un={key:3,class:`schedule-list`},dn={class:`schedule-card-body`},fn={class:`schedule-card-head`},pn={class:`schedule-name`},mn={key:0,class:`schedule-running`},hn=[`aria-checked`,`aria-label`,`onClick`],gn={class:`schedule-card-sub`},_n={class:`schedule-desc`},vn=[`onClick`],yn={class:`schedule-card-side`},bn={class:`schedule-actions`},xn=[`disabled`,`onClick`],Sn=[`disabled`,`onClick`],Cn=[`onClick`],wn=[`onClick`],Tn={class:`sch-form`},En={class:`sch-field`},Dn={class:`sch-field-label`},On=[`placeholder`],kn={class:`sch-field`},An={class:`sch-field-label`},jn={class:`sch-freq-row`},Mn=[`value`],Nn={class:`sch-inline-label`},Pn=[`value`],Fn={class:`sch-inline-label`},In=[`value`],Ln=[`value`],Rn=[`value`],zn={class:`sch-inline-label`},Bn=[`value`],Vn={class:`sch-inline-label`},Hn=[`placeholder`],Un={class:`sch-hint`},Wn={class:`sch-field`},Gn={class:`sch-field-label`},Kn=[`placeholder`],qn={class:`sch-field`},Jn={class:`sch-field-label`},Yn=[`placeholder`],Xn={class:`sch-field`},Zn={class:`sch-field-label`},Qn={class:`sch-radio-row`},$n={class:`sch-radio`},er={class:`sch-radio`},tr={class:`sch-radio`},nr={key:0,class:`sch-form-error`},rr={class:`sch-form-footer`},ir=[`disabled`],ar={class:`sch-confirm-text`},or={class:`sch-form-footer`};function sr(t,n,r,i,a,o){return U(),_(`div`,tn,[g(`div`,nn,[g(`span`,rn,S(i.summaryText),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:i.openCreate},S(i.$t(`@SCHED:新建任务`)),1)]),i.errorMsg?(U(),_(`div`,an,S(i.$t(`@SCHED:操作失败:{error}`,{error:i.errorMsg})),1)):W(`v-if`,!0),i.loading?(U(),_(`div`,on,S(i.$t(`@SCHED:加载中...`)),1)):i.tasks.length?(U(),_(`div`,un,[(U(!0),_(w,null,C(i.tasks,e=>(U(),_(`article`,{key:e.id,class:x([`schedule-card`,{"is-disabled":!e.enabled,"is-running":!!e.running}])},[g(`div`,dn,[g(`div`,fn,[g(`span`,pn,S(e.name),1),e.running?(U(),_(`span`,mn,S(i.$t(`@SCHED:运行中`)),1)):W(`v-if`,!0),g(`button`,{type:`button`,class:x([`sch-switch`,{on:e.enabled}]),role:`switch`,"aria-checked":e.enabled,"aria-label":e.enabled?i.$t(`@SCHED:停用`):i.$t(`@SCHED:启用`),onClick:t=>i.toggle(e)},[...n[17]||=[g(`span`,{class:`sch-switch-knob`},null,-1)]],10,hn)]),g(`div`,gn,[g(`span`,_n,S(i.descText(e)),1),n[18]||=g(`span`,{class:`schedule-sep`},`·`,-1),g(`span`,{class:x([`schedule-last`,i.lastClass(e)])},S(i.lastText(e)),3),e.sessionId?(U(),_(`button`,{key:0,type:`button`,class:`sch-link`,onClick:t=>i.emit(`open-session`,e.sessionId)},S(i.$t(`@SCHED:查看会话`)),9,vn)):W(`v-if`,!0)])]),g(`div`,yn,[g(`div`,{class:x([`schedule-next`,{"is-muted":!e.enabled}])},S(i.nextText(e)),3),g(`div`,bn,[e.running?(U(),_(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.stop(e)},S(i.$t(`@SCHED:停止`)),9,xn)):(U(),_(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!i.pending[e.id],onClick:t=>i.runNow(e)},S(i.$t(`@SCHED:运行`)),9,Sn)),g(`button`,{type:`button`,class:`sch-btn`,onClick:t=>i.openEdit(e)},S(i.$t(`@SCHED:编辑`)),9,Cn),g(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:t=>i.askRemove(e)},S(i.$t(`@SCHED:删除`)),9,wn)])])],2))),128))])):(U(),_(`div`,sn,[g(`p`,cn,S(i.$t(`@SCHED:还没有定时任务`)),1),g(`p`,ln,S(i.$t(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),W(` 新建 / 编辑 `),e(i.CommonDialog,{modelValue:i.formVisible,"onUpdate:modelValue":n[14]||=e=>i.formVisible=e,title:i.editingId?i.$t(`@SCHED:编辑任务`):i.$t(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:N(()=>[g(`div`,Tn,[g(`label`,En,[g(`span`,Dn,S(i.$t(`@SCHED:任务名`)),1),E(g(`input`,{"onUpdate:modelValue":n[0]||=e=>i.form.name=e,class:`sch-input`,type:`text`,placeholder:i.$t(`@SCHED:如:每日拉代码`)},null,8,On),[[H,i.form.name]])]),g(`div`,kn,[g(`span`,An,S(i.$t(`@SCHED:执行计划`)),1),g(`div`,jn,[E(g(`select`,{"onUpdate:modelValue":n[1]||=e=>i.form.freq=e,class:`sch-input sch-select`},[(U(!0),_(w,null,C(i.freqOptions,e=>(U(),_(`option`,{key:e.value,value:e.value},S(e.label),9,Mn))),128))],512),[[A,i.form.freq]]),i.form.freq===`minutes`?(U(),_(w,{key:0},[g(`span`,Nn,S(i.$t(`@SCHED:每`)),1),E(g(`select`,{"onUpdate:modelValue":n[2]||=e=>i.form.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C([5,10,15,20,30,60],e=>g(`option`,{key:e,value:e},S(e),9,Pn)),64))],512),[[A,i.form.everyMinutes,void 0,{number:!0}]]),g(`span`,Fn,S(i.$t(`@SCHED:分钟`)),1)],64)):i.form.freq===`daily`||i.form.freq===`weekly`?(U(),_(w,{key:1},[i.form.freq===`weekly`?E((U(),_(`select`,{key:0,"onUpdate:modelValue":n[3]||=e=>i.form.weekday=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(i.WEEKDAY_KEYS,(e,t)=>g(`option`,{key:t,value:t},S(i.$t(e)),9,In)),64))],512)),[[A,i.form.weekday,void 0,{number:!0}]]):W(`v-if`,!0),E(g(`select`,{"onUpdate:modelValue":n[4]||=e=>i.form.hour=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(24,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Ln)),64))],512),[[A,i.form.hour,void 0,{number:!0}]]),n[19]||=g(`span`,{class:`sch-inline-label`},`:`,-1),E(g(`select`,{"onUpdate:modelValue":n[5]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(60,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Rn)),64))],512),[[A,i.form.minute,void 0,{number:!0}]])],64)):i.form.freq===`hourly`?(U(),_(w,{key:2},[g(`span`,zn,S(i.$t(`@SCHED:第`)),1),E(g(`select`,{"onUpdate:modelValue":n[6]||=e=>i.form.minute=e,class:`sch-input sch-select sch-select-sm`},[(U(),_(w,null,C(60,e=>g(`option`,{key:e-1,value:e-1},S(String(e-1).padStart(2,`0`)),9,Bn)),64))],512),[[A,i.form.minute,void 0,{number:!0}]]),g(`span`,Vn,S(i.$t(`@SCHED:分钟`)),1)],64)):E((U(),_(`input`,{key:3,"onUpdate:modelValue":n[7]||=e=>i.form.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:如:0 9 * * 1-5`)},null,8,Hn)),[[H,i.form.custom]])]),g(`span`,Un,S(i.$t(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:i.cronPreview||`—`})),1)]),g(`label`,Wn,[g(`span`,Gn,S(i.$t(`@SCHED:项目目录`)),1),E(g(`input`,{"onUpdate:modelValue":n[8]||=e=>i.form.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:i.$t(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,Kn),[[H,i.form.cwd]])]),g(`label`,qn,[g(`span`,Jn,S(i.$t(`@SCHED:提示词`)),1),E(g(`textarea`,{"onUpdate:modelValue":n[9]||=e=>i.form.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:i.$t(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,Yn),[[H,i.form.prompt]])]),g(`div`,Xn,[g(`span`,Zn,S(i.$t(`@SCHED:错过补偿`)),1),g(`div`,Qn,[g(`label`,$n,[E(g(`input`,{"onUpdate:modelValue":n[10]||=e=>i.form.onMissed=e,type:`radio`,value:`run`},null,512),[[O,i.form.onMissed]]),g(`span`,null,S(i.$t(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),g(`label`,er,[E(g(`input`,{"onUpdate:modelValue":n[11]||=e=>i.form.onMissed=e,type:`radio`,value:`skip`},null,512),[[O,i.form.onMissed]]),g(`span`,null,S(i.$t(`@SCHED:跳过`)),1)]),g(`label`,tr,[E(g(`input`,{"onUpdate:modelValue":n[12]||=e=>i.form.enabled=e,type:`checkbox`},null,512),[[L,i.form.enabled]]),g(`span`,null,S(i.$t(`@SCHED:创建后启用`)),1)])])]),i.formError?(U(),_(`p`,nr,S(i.formError),1)):W(`v-if`,!0)]),g(`div`,rr,[g(`button`,{type:`button`,class:`sch-btn`,onClick:n[13]||=e=>i.formVisible=!1},S(i.$t(`@SCHED:取消`)),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:i.saving,onClick:i.submitForm},S(i.saving?i.$t(`@SCHED:保存中...`):i.$t(`@SCHED:保存`)),9,ir)])]),_:1},8,[`modelValue`,`title`]),W(` 删除确认 `),e(i.CommonDialog,{modelValue:i.confirmVisible,"onUpdate:modelValue":n[16]||=e=>i.confirmVisible=e,title:i.$t(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:N(()=>[g(`p`,ar,S(i.$t(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:i.confirmTarget?.name||``})),1),g(`div`,or,[g(`button`,{type:`button`,class:`sch-btn`,onClick:n[15]||=e=>i.confirmVisible=!1},S(i.$t(`@SCHED:取消`)),1),g(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:i.confirmRemove},S(i.$t(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])])}var cr=J(en,[[`render`,sr],[`__scopeId`,`data-v-63dc658b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/SchedulePanel.vue`]]);c(),R();var lr=4e3,ur=f({__name:`AgentPromptSettings`,setup(e,{expose:t}){t();let n=Y(),{defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c}=De(),l=j(``),u=j(!1),d=j(!1),f=G(()=>n.agentDefaultPrompt||``),p=G(()=>l.value.trim()!==f.value.trim());async function m(){if(!u.value&&p.value){u.value=!0;try{await n.saveAiSettings({agentDefaultPrompt:l.value})&&(l.value=f.value,d.value=!0,M.success(q(`@AGENT:已保存 g ai 默认提示词`)))}finally{u.value=!1}}}let h=G(()=>n.currentDirectory||``),g=G(()=>ue(h.value)||h.value),_=G(()=>{let e=se(h.value);return e&&i.value?.[e]?.prompt||``}),v=j(``),y=j(``),b=j(!1),x=j(!1),S=j(!1),C=G(()=>v.value.trim()!==(r.value||``).trim()||!!h.value&&y.value.trim()!==_.value.trim());function w(){v.value=r.value||``,y.value=_.value}a(async()=>{l.value=f.value,w();let e=await o(!0);S.value=!e,e&&w()});async function T(){if(!b.value&&C.value){b.value=!0;try{let e=!0,t=v.value.trim();t!==(r.value||``).trim()&&(e=await s(t));let n=y.value.trim();e&&h.value&&n!==_.value.trim()&&(e=await c(h.value,n)),e&&(w(),x.value=!0)}finally{b.value=!1}}}let E={configStore:n,defaultPrompt:r,projectPrompts:i,loadOrchestrator:o,saveDefaultPrompt:s,saveProjectPrompt:c,MAX_CHARS:lr,gaiDraft:l,savingGai:u,gaiSaved:d,gaiStored:f,gaiDirty:p,saveGai:m,projectPath:h,projectName:g,projectPrompt:_,globalDraft:v,projectDraft:y,savingDispatch:b,dispatchSaved:x,dispatchLoadFailed:S,dispatchDirty:C,syncDispatchDraft:w,saveDispatch:T,get $t(){return q}};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}});F(),c(),V();var dr={class:`aps`},fr={class:`aps__scroll`},pr={class:`aps__head`},mr={class:`aps__title`},hr={class:`aps__intro`},gr={class:`aps__card aps__card--gai`},_r={class:`aps__card-head`},vr={class:`aps__card-title`},yr={class:`aps__count`},br={class:`aps__hint`},xr=[`placeholder`],Sr={class:`aps__foot`},Cr={key:0,class:`aps__saved`},wr=[`disabled`],Tr={class:`aps__card aps__card--dispatch`},Er={class:`aps__card-head`},Dr={class:`aps__card-title`},Or={class:`aps__hint`},kr={class:`aps__field`},Ar={class:`aps__card-head`},jr={class:`aps__label`,for:`aps-global`},Mr={class:`aps__count`},Nr=[`placeholder`],Pr={class:`aps__field`},Fr={class:`aps__card-head`},Ir={class:`aps__label`,for:`aps-project`},Lr={key:0,class:`aps__count`},Rr=[`disabled`,`placeholder`],zr={class:`aps__hint`},Br={class:`aps__foot`},Vr={key:0,class:`aps__saved`},Hr={key:1,class:`aps__saved`},Ur=[`disabled`];function Wr(e,t,n,r,i,a){return U(),_(`div`,dr,[g(`div`,fr,[g(`header`,pr,[g(`h3`,mr,S(r.$t(`@AGENT:提示词设置`)),1),g(`p`,hr,S(r.$t(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),W(` ── ① g ai 智能体的默认提示词 ── `),g(`section`,gr,[g(`div`,_r,[g(`h4`,vr,S(r.$t(`@AGENT:g ai 智能体的默认提示词`)),1),g(`span`,yr,S(r.gaiDraft.length)+` / `+S(r.MAX_CHARS),1)]),g(`p`,br,S(r.$t(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),E(g(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":t[0]||=e=>r.gaiDraft=e,class:`aps__area`,rows:`6`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,xr),[[H,r.gaiDraft]]),g(`div`,Sr,[r.gaiSaved&&!r.gaiDirty?(U(),_(`span`,Cr,S(r.$t(`@AGENT:已保存`)),1)):W(`v-if`,!0),t[3]||=g(`span`,{class:`aps__spacer`},null,-1),g(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingGai||!r.gaiDirty,onClick:r.saveGai},S(r.savingGai?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,wr)])]),W(` ── ② 派发任务的提示词 ── `),g(`section`,Tr,[g(`div`,Er,[g(`h4`,Dr,S(r.$t(`@AGENT:派发任务的提示词`)),1)]),g(`p`,Or,S(r.$t(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),g(`div`,kr,[g(`div`,Ar,[g(`label`,jr,S(r.$t(`@AGENT:全局提示词`)),1),g(`span`,Mr,S(r.globalDraft.length)+` / `+S(r.MAX_CHARS),1)]),E(g(`textarea`,{id:`aps-global`,"onUpdate:modelValue":t[1]||=e=>r.globalDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,placeholder:r.$t(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,Nr),[[H,r.globalDraft]])]),g(`div`,Pr,[g(`div`,Fr,[g(`label`,Ir,S(r.projectPath?r.$t(`@AGENT:「{name}」的项目提示词`,{name:r.projectName}):r.$t(`@AGENT:项目提示词`)),1),r.projectPath?(U(),_(`span`,Lr,S(r.projectDraft.length)+` / `+S(r.MAX_CHARS),1)):W(`v-if`,!0)]),E(g(`textarea`,{id:`aps-project`,"onUpdate:modelValue":t[2]||=e=>r.projectDraft=e,class:`aps__area`,rows:`5`,maxlength:r.MAX_CHARS,disabled:!r.projectPath,placeholder:r.projectPath?r.$t(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):r.$t(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,Rr),[[H,r.projectDraft]]),g(`p`,zr,S(r.projectPath?r.$t(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:r.projectName}):r.$t(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),g(`div`,Br,[r.dispatchSaved&&!r.dispatchDirty?(U(),_(`span`,Vr,S(r.$t(`@AGENT:已保存`)),1)):r.dispatchLoadFailed?(U(),_(`span`,Hr,S(r.$t(`@AGENT:读取设置失败,请稍后重试`)),1)):W(`v-if`,!0),t[4]||=g(`span`,{class:`aps__spacer`},null,-1),g(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:r.savingDispatch||!r.dispatchDirty,onClick:r.saveDispatch},S(r.savingDispatch?r.$t(`@AGENT:保存中…`):r.$t(`@AGENT:保存`)),9,Ur)])])])])}var Gr=J(ur,[[`render`,Wr],[`__scopeId`,`data-v-f9ada51b`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentPromptSettings.vue`]]);c(),R();var Kr=1100,qr=40,Jr=f({__name:`AgentView`,setup(e,{expose:n}){n();let i=Y(),o=ce(),s=j(null),{width:c,narrow:u}=Ce(s),d=j(`chat`),m=j(`chat`),h=G(()=>m.value===`mcp`?`mcp`:`skill`),g=(...e)=>f({render:()=>p(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},e.map(e=>p(`path`,{d:e})))}),_=G(()=>[{id:`chat`,label:q(`@AGENT:对话`),icon:g(`M12 11v.01`,`M8 11v.01`,`M16 11v.01`,`M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-5l-5 3v-3h-2a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3l12 0`)},{id:`schedule`,label:q(`@AGENT:定时任务`),icon:g(`M5 13a7 7 0 1 0 14 0a7 7 0 0 0-14 0`,`M14.5 10.5l-2.5 2.5`,`M17 8l1-1`,`M14 3h-4`)},{id:`skill`,label:q(`@AGENT:Skill 广场`),icon:g(`M6.331 8h11.339a2 2 0 0 1 1.977 2.304l-1.255 8.152a3 3 0 0 1-2.966 2.544h-6.852a3 3 0 0 1-2.965-2.544l-1.255-8.152a2 2 0 0 1 1.977-2.304`,`M9 11v-5a3 3 0 0 1 6 0v5`)},{id:`mcp`,label:q(`@AGENT:MCP 广场`),icon:g(`M7 12l5 5l-1.5 1.5a3.536 3.536 0 1 1-5-5l1.5-1.5`,`M17 12l-5-5l1.5-1.5a3.536 3.536 0 1 1 5 5l-1.5 1.5`,`M3 21l2.5-2.5`,`M18.5 5.5l2.5-2.5`,`M10 11l-2 2`,`M13 14l-2 2`)},{id:`settings`,label:q(`@AGENT:设置`),icon:g(`M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37c1 .608 2.296.07 2.572-1.065`,`M9 12a3 3 0 1 0 6 0a3 3 0 0 0-6 0`)}]),{sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:O,renameSession:ee,newSession:k,sendMessage:A,retryTurn:M,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:L,pendingEngine:R,isEngineLocked:z,pickEngine:V,stop:H,inputContextUsage:te,queuedMessages:U,queuePaused:ne,removeQueuedMessage:W,flushQueued:re,silentMs:J}=xe(),ae=G(()=>z.value?L.value:R.value);function se(e){z.value||V(e)}let le=G(()=>{let e=i.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),ue=G(()=>{let e=i.models.find(e=>e.isDefault);return e&&(e.name||e.model)||``}),De=G(()=>fe(y.value,I)),X=de(),Oe=G(()=>De.value.find(e=>e.id===x.value)?.title||q(`@AGENT:对话`)),ke={"--welcome-avatar":`url("${be}")`},Ae=G(()=>oe(i.agentPresetPrompts));async function je(e){await A(e.text,e.files),await t(),Q()}async function Me(e){await A(e.prompt),await t(),Q()}let Ne=_e(),Z=j(null),Fe=ye();function Q(e=!0){Z.value?.scrollToBottom(e)}B(()=>S.value.length,()=>{t(()=>Q(!1))});function Ie(e){D(e),d.value=`chat`}function Le(e){e&&(m.value=`chat`,Ie(e))}function Re(){k(),d.value=`chat`}let ze=j(280),Be=j(!1),{convListCollapsed:Ve,setConvListCollapsed:He}=Ee();function Ue(e){if(Ve.value)return;Be.value=!0;let t=e.clientX,n=ze.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));ze.value=i},i=()=>{Be.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}B(u,e=>{e||(d.value=`chat`)}),B(()=>[i.currentDirectory,w.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await E(),x.value&&!w.value&&!y.value.some(e=>e.sessionId===x.value)&&k()},{immediate:!0});let $=null;a(()=>{$=Pe(e=>{e.type===`task_finished`&&E().catch(()=>{})})}),v(()=>{$?.(),$=null});let We={configStore:i,gitStore:o,rootRef:s,width:c,narrow:u,TABS_SILENCE_MIN_WIDTH:Kr,chatPage:d,activeTab:m,marketplaceType:h,tablerIcon:g,tabs:_,sessions:y,sessionsLoading:b,currentSessionId:x,messages:S,displayMessages:C,isStreaming:w,sessionLoading:T,loadSessions:E,loadSession:D,deleteSession:O,renameSession:ee,newSession:k,sendMessage:A,retryTurn:M,questionPanel:N,answeringQuestion:P,answerQuestion:F,isSessionGenerating:I,currentEngine:L,pendingEngine:R,isEngineLocked:z,pickEngine:V,stop:H,inputContextUsage:te,queuedMessages:U,queuePaused:ne,removeQueuedMessage:W,flushQueued:re,silentMs:J,displayEngine:ae,handleEngineSelect:se,chatTheme:le,inputModelName:ue,conversationItems:De,conversationLabels:X,currentSessionTitle:Oe,welcomeAvatarStyle:ke,presetQuestions:Ae,onSend:je,onSelectPreset:Me,questionLabels:Ne,chatContainerRef:Z,queueLabels:Fe,scrollToBottom:Q,selectSession:Ie,handleScheduleOpenSession:Le,handleNewSession:Re,sidebarWidth:ze,isResizing:Be,convListCollapsed:Ve,setConvListCollapsed:He,CONV_RAIL_WIDTH:qr,startResize:Ue,get disposeScheduleEvents(){return $},set disposeScheduleEvents(e){$=e},get $t(){return q},get ElIcon(){return l},get Loading(){return r},get ChatContainer(){return K},get ConversationList(){return ie},get AGENT_UPLOAD_ACCEPT(){return me},get AGENT_ASSISTANT_NAME(){return ge},get AGENT_ASSISTANT_AVATAR(){return be},get MESSAGE_RAIL_CONFIG(){return pe},get MESSAGE_META_CONFIG(){return ve},get agentEngineName(){return he},MarketplacePanel:$t,SchedulePanel:cr,AgentPromptSettings:Gr,AgentEngineSelector:Se,CopySessionButton:we,ChatSilenceBadge:Te};return Object.defineProperty(We,"__isScriptSetup",{enumerable:!1,value:!0}),We}});c(),F();var Yr={ref:`rootRef`,class:`agent-view`},Xr={class:`agent-chat-area`},Zr={class:`agent-tabs`,role:`tablist`},Qr=[`aria-selected`,`onClick`],$r={class:`agent-tab-body`},ei={key:0,class:`agent-chat-pane`},ti={key:0,class:`agent-list-page`},ni={key:0,class:`agent-page-bar`},ri=[`title`,`aria-label`],ii={class:`agent-page-title`},ai={key:0,class:`chat-loading`};function oi(t,r,i,a,o,s){return U(),_(`div`,Yr,[W(` ═══ 宽屏:左侧会话列表(只在「对话」Tab 显示)═══
3
- 窄屏时这一整块不渲染,会话列表改成 body 里的一个整页(见 .agent-list-page) `),a.activeTab===`chat`&&!a.narrow?(U(),_(w,{key:0},[g(`aside`,{class:x([`agent-sidebar`,{"is-convs-collapsed":a.convListCollapsed}]),style:u({width:(a.convListCollapsed?a.CONV_RAIL_WIDTH:a.sidebarWidth)+`px`})},[W(` 会话列表:UI 与交互都在组件库的 ConversationList 里(含收起 / 展开) `),e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:``,collapsed:a.convListCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],6),W(` 拖拽分隔条(收起时藏起来:40px 的收纳条没有可拖的余地) `),a.convListCollapsed?W(`v-if`,!0):(U(),_(`div`,{key:0,class:x([`sidebar-resizer`,{active:a.isResizing}]),onMousedown:a.startResize},null,34))],64)):W(`v-if`,!0),W(` ═══ 右侧:Tab 栏 + 内容区 ═══ `),g(`main`,Xr,[g(`nav`,Zr,[(U(!0),_(w,null,C(a.tabs,t=>(U(),_(`button`,{key:t.id,type:`button`,class:x([`agent-tab`,{active:a.activeTab===t.id}]),role:`tab`,"aria-selected":a.activeTab===t.id,onClick:e=>a.activeTab=t.id},[e(a.ElIcon,null,{default:N(()=>[(U(),n(m(t.icon)))]),_:2},1024),g(`span`,null,S(t.label),1)],10,Qr))),128)),W(` ═══ 引擎选择器 ═══
4
- 与工作台执行器下拉同一套交互(点击展开、未安装标出来、点了直接开安装弹窗)。
5
- 下拉本体收口在 AgentEngineSelector,文件空间 g ai 面板复用同一份实现。
6
- 会话一旦落盘就置灰:引擎在会话建立时锁定(三家续聊标识互不通用),要换请新建。 `),a.activeTab===`chat`?(U(),n(a.AgentEngineSelector,{key:0,class:`agent-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.handleEngineSelect},null,8,[`engine`,`locked`])):W(`v-if`,!0),W(` 复制整条会话(默认精简范围,小箭头可选全量)——与工作台的「复制执行内容」同一套口径 `),a.activeTab===`chat`?(U(),n(a.CopySessionButton,{key:1,class:`agent-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):W(`v-if`,!0),W(` 本轮静默:挂在 Tab 行最右端(与引擎 / 复制同一条右对齐线)。
7
- 等回答时不算静默 —— 那一轮挂着是在等用户点选项(见 ChatSilenceBadge 文件头)。 `),a.activeTab===`chat`&&a.width>=a.TABS_SILENCE_MIN_WIDTH?(U(),n(a.ChatSilenceBadge,{key:2,class:`agent-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):W(`v-if`,!0)]),g(`div`,$r,[W(` ── 对话 ── `),a.activeTab===`chat`?(U(),_(`div`,ei,[W(` 窄屏 · 会话列表页:列表独占整页 `),a.narrow&&a.chatPage===`list`?(U(),_(`div`,ti,[e(a.ConversationList,{class:`agent-conversations`,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,onSelect:a.selectSession,onNew:a.handleNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(U(),_(w,{key:1},[W(` 对话页(窄屏时顶上多一条返回条;宽屏左侧就摆着列表,不需要) `),a.narrow?(U(),_(`div`,ni,[g(`button`,{type:`button`,class:`agent-page-back`,title:a.$t(`@AGENT:返回会话列表`),"aria-label":a.$t(`@AGENT:返回会话列表`),onClick:r[0]||=e=>a.chatPage=`list`},[...r[1]||=[g(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[g(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),g(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,ri),g(`span`,ii,S(a.currentSessionTitle),1)])):W(`v-if`,!0),W(`
8
- 对话宿主:单独开一层裁剪边界。
9
- 欢迎页在矮/窄窗口里会比可用高度还高,而它是垂直居中的 —— 溢出的部分
10
- 会**向上**跑出 .acu-chat,盖到刚加的返回条上(把返回条的点击也一起吃掉,
11
- e2e 实测就是这个症状)。宿主的 overflow:hidden 把它裁在自己这一格里。
12
- `),g(`div`,{class:`agent-chat-host`,style:a.welcomeAvatarStyle},[W(` 加载中 `),a.sessionLoading?(U(),_(`div`,ai,[e(a.ElIcon,{class:`is-loading`,size:32},{default:N(()=>[e(a.Loading)]),_:1}),g(`span`,null,S(a.$t(`@AGENT:加载会话中...`)),1)])):(U(),_(w,{key:1},[W(` ChatContainer `),e(a.ChatContainer,{ref:`chatContainerRef`,messages:a.displayMessages,"preset-questions":a.presetQuestions,"welcome-title":a.$t(`@AGENT:智能体助手`),"welcome-description":a.$t(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,"git-branch":a.gitStore.currentBranch||void 0,model:a.inputModelName||void 0,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),question:a.questionPanel,"question-submitting":a.answeringQuestion,"question-labels":a.questionLabels,"plan-config":{labels:{title:a.$t(`@AGENT:计划`),raw:a.$t(`@AGENT:原始参数`)}},"message-rail-config":a.MESSAGE_RAIL_CONFIG,"message-meta-config":a.MESSAGE_META_CONFIG,onSend:a.onSend,onSelect:a.onSelectPreset,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued,onAnswer:a.answerQuestion,onRetry:a.retryTurn},null,8,`messages.preset-questions.welcome-title.welcome-description.assistant-name.assistant-avatar.theme.generating.queued.queue-paused.queue-labels.upload-config.context-usage.git-branch.model.placeholder.question.question-submitting.question-labels.plan-config.message-rail-config.message-meta-config.onStop.onUnqueue.onFlushQueued.onAnswer.onRetry`.split(`.`))],2112))])],64))])):a.activeTab===`schedule`?(U(),_(w,{key:1},[W(` ── 定时任务 ── `),e(a.SchedulePanel,{onOpenSession:a.handleScheduleOpenSession})],2112)):a.activeTab===`skill`||a.activeTab===`mcp`?(U(),_(w,{key:2},[W(` ── Skill 广场 / MCP 广场 ── `),e(a.MarketplacePanel,{type:a.marketplaceType},null,8,[`type`])],2112)):(U(),_(w,{key:3},[W(` ── 设置(提示词设置)── `),e(a.AgentPromptSettings)],2112))])])],512)}var si=J(Jr,[[`render`,oi],[`__scopeId`,`data-v-bd681ddd`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/AgentView.vue`]]);export{si as default};
@@ -1 +0,0 @@
1
- .mindmap-preview[data-v-3969a8bf]{background:var(--bg-container,#fff);flex-direction:column;width:100%;height:100%;display:flex}.mindmap-preview-header[data-v-3969a8bf]{background:var(--bg-panel,var(--md-bg-subtle));font-size:var(--font-size-sm);align-items:center;gap:12px;padding:8px 14px;display:flex}.mindmap-preview-title[data-v-3969a8bf]{color:var(--text-primary,var(--md-text-strong));letter-spacing:.5px;font-weight:600}.mindmap-preview-hint[data-v-3969a8bf]{color:var(--text-secondary,var(--md-text-muted));font-size:var(--font-size-xs)}.mindmap-preview-canvas[data-v-3969a8bf]{flex:1;width:100%;min-height:0}.mindmap-preview-canvas[data-v-3969a8bf] .zm-mindmap,.mindmap-preview-canvas[data-v-3969a8bf]>*{width:100%;height:100%}.editor-agent-panel[data-v-7cc12c51]{background:var(--bg-panel);border-left:1px solid var(--border-color);flex-direction:column;flex-grow:1;flex-basis:0;min-width:200px;min-height:0;display:flex;overflow:hidden}.editor-agent-panel.is-fullscreen[data-v-7cc12c51]{z-index:20;background:var(--bg-container);border-left:none;flex:none;position:absolute;inset:0}.agent-panel-header[data-v-7cc12c51]{border-bottom:1px solid var(--border-color);flex-shrink:0;align-items:center;gap:8px;height:34px;padding:0 6px 0 12px;display:flex}.agent-panel-title[data-v-7cc12c51]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:700;overflow:hidden}.agent-panel-spacer[data-v-7cc12c51]{flex:1}.agent-panel-engine[data-v-7cc12c51]{flex:none}.agent-panel-silence[data-v-7cc12c51]{flex:none;margin-right:4px}.agent-panel-icon-btn[data-v-7cc12c51]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-panel-icon-btn[data-v-7cc12c51]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-panel-body[data-v-7cc12c51]{flex:1;grid-template:"stage"minmax(0,1fr)"composer"/minmax(0,1fr);min-height:0;display:grid}.agent-panel-body.is-wide[data-v-7cc12c51]{transition:grid-template-columns var(--transition-base) var(--ease-custom);grid-template-columns:240px minmax(0,1fr);grid-template-areas:"list chat""list composer"}.agent-panel-body.is-wide.is-convs-collapsed[data-v-7cc12c51]{grid-template-columns:40px minmax(0,1fr)}.agent-panel-body.is-wide.is-convs-collapsed .agent-panel-convs[data-v-7cc12c51]{padding:8px 4px}.agent-panel-convs[data-v-7cc12c51]{grid-area:stage;min-height:0;padding:8px 10px;overflow-y:auto}.agent-panel-chat[data-v-7cc12c51]{grid-area:stage;min-height:0;display:flex}.agent-panel-body.is-wide .agent-panel-convs[data-v-7cc12c51]{grid-area:list}.agent-panel-body.is-wide .agent-panel-chat[data-v-7cc12c51]{grid-area:chat}.agent-panel-composer[data-v-7cc12c51]{padding:var(--acu-space-3) var(--acu-space-4) var(--acu-space-4);background:linear-gradient(to top, var(--acu-bg) 70%, transparent);grid-area:composer}.agent-panel-composer[data-v-7cc12c51] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-panel-chat[data-v-7cc12c51]>.acu-chat{flex:1;min-width:0}.agent-panel-chat[data-v-7cc12c51] .acu-avatar--left{background:0 0}.agent-panel-chat[data-v-7cc12c51] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-panel-chat[data-v-7cc12c51] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-panel-chat[data-v-7cc12c51] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-panel-composer[data-v-7cc12c51] .acu-input-wrap>.agent-context-slot{gap:var(--acu-space-2,8px);padding:var(--acu-space-2,8px) var(--acu-space-2,8px) 0;flex-wrap:wrap;display:flex}.agent-panel-composer[data-v-7cc12c51] .acu-input-attachments>.agent-context-slot{display:inline-flex}.agent-context-att[data-v-7cc12c51]{align-items:center;gap:var(--acu-space-2,8px);max-width:180px;padding:var(--acu-space-2,8px) var(--acu-space-3,12px);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm,8px);background:var(--acu-bg,var(--bg-container));color:var(--acu-text-secondary,var(--text-secondary));font-size:var(--acu-font-size-xs,12px);display:inline-flex;position:relative}.agent-context-att-icon[data-v-7cc12c51]{opacity:.75;flex-shrink:0}.agent-context-att-name[data-v-7cc12c51]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.agent-context-att-remove[data-v-7cc12c51]{border-radius:var(--acu-radius-full,999px);background:var(--acu-text,var(--text-primary));width:18px;height:18px;color:var(--acu-bg,var(--bg-container));cursor:pointer;box-shadow:var(--acu-shadow-sm,0 1px 2px #0003);transition:transform var(--acu-duration-fast,.15s) var(--acu-easing,ease);border:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:-6px;right:-6px}.agent-context-att-remove[data-v-7cc12c51]:hover{transform:scale(1.12)}.agent-context-att-remove[data-v-7cc12c51]:active{transform:scale(1.02)}.editor-view[data-v-fc2ebf13]{background:var(--bg-container);width:100%;height:100%;box-shadow:var(--shadow-sm);border-radius:0;display:flex;overflow:hidden}.editor-sidebar[data-v-fc2ebf13]{background:var(--bg-panel);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.sidebar-header[data-v-fc2ebf13]{flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 10px 6px;display:flex}.sidebar-title[data-v-fc2ebf13]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-weight:700}.sidebar-action-btn[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;display:flex}.sidebar-action-btn[data-v-fc2ebf13]:hover{color:var(--text-primary);background:var(--bg-hover)}.sidebar-search[data-v-fc2ebf13]{flex-shrink:0;align-items:center;padding:6px 10px;display:flex;position:relative}.sidebar-search-icon[data-v-fc2ebf13]{color:var(--text-meta);pointer-events:none;position:absolute;left:18px}.sidebar-search-input[data-v-fc2ebf13]{min-width:0;height:26px;font-size:var(--font-size-sm);color:var(--text-primary);background:var(--bg-input,#ffffff0a);border:1px solid var(--border-color);border-radius:var(--radius-base);transition:border-color var(--transition-fast), background var(--transition-fast);outline:none;flex:1;padding:0 24px 0 26px}.sidebar-search-input[data-v-fc2ebf13]::placeholder{color:var(--text-meta)}.sidebar-search-input[data-v-fc2ebf13]:hover{border-color:var(--text-tertiary)}.sidebar-search-input[data-v-fc2ebf13]:focus{border-color:var(--color-primary);background:var(--bg-panel)}.sidebar-search-clear[data-v-fc2ebf13]{cursor:pointer;width:18px;height:18px;color:var(--text-meta);transition:background var(--transition-fast), color var(--transition-fast);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;display:flex;position:absolute;right:14px}.sidebar-search-clear[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-name-hit[data-v-fc2ebf13]{color:var(--color-warning-light);border-radius:var(--radius-xs);background:#f59e0b26;padding:0 1px}.search-section-head[data-v-fc2ebf13]{letter-spacing:.04em;color:var(--text-meta);-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:7px 12px 3px;font-size:11px;font-weight:600;display:flex}.search-section-count[data-v-fc2ebf13]{text-align:center;min-width:14px;color:var(--text-meta);background:var(--bg-hover);border-radius:var(--radius-xs);padding:0 4px;font-size:10px;line-height:14px}.search-section-note[data-v-fc2ebf13]{color:var(--text-meta);margin-left:auto;font-size:10px;font-weight:400}.content-results[data-v-fc2ebf13]{margin-top:6px;padding-bottom:6px}.content-results>.search-section-head[data-v-fc2ebf13],.content-results-status[data-v-fc2ebf13]{border-top:1px solid var(--border-color)}.content-results-status[data-v-fc2ebf13]{color:var(--text-meta);align-items:center;gap:6px;padding:8px 12px;font-size:12px;display:flex}.content-search-spin[data-v-fc2ebf13]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:11px;height:11px;animation:.8s linear infinite spin-fc2ebf13}.content-hit-file[data-v-fc2ebf13]{cursor:pointer;height:24px;color:var(--text-primary);transition:background var(--transition-fast);align-items:center;gap:5px;padding:0 8px 0 12px;display:flex}.content-hit-file[data-v-fc2ebf13]:hover,.content-hit-line[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.content-hit-name[data-v-fc2ebf13]{font-size:var(--font-size-mid);white-space:nowrap}.content-hit-dir[data-v-fc2ebf13]{min-width:0;color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:11px;overflow:hidden}.content-hit-total[data-v-fc2ebf13]{text-align:center;min-width:16px;color:var(--text-meta);background:var(--bg-hover);border-radius:var(--radius-xs);flex-shrink:0;font-size:10px;line-height:14px}.content-hit-line[data-v-fc2ebf13]{cursor:pointer;align-items:baseline;gap:6px;padding:1px 10px 1px 24px;display:flex}.content-hit-ln[data-v-fc2ebf13]{text-align:right;width:30px;color:var(--text-meta);flex-shrink:0;font-family:JetBrains Mono,Consolas,monospace;font-size:10.5px}.content-hit-text[data-v-fc2ebf13]{min-width:0;color:var(--text-secondary);white-space:pre;text-overflow:ellipsis;flex:1;font-family:JetBrains Mono,Consolas,monospace;font-size:11px;overflow:hidden}.content-hit-mark[data-v-fc2ebf13]{color:var(--color-warning-light);border-radius:var(--radius-xs);background:#f59e0b26;padding:0 1px}.sidebar-tree[data-v-fc2ebf13]{flex:1;padding:4px 0;overflow:hidden auto}.tree-node[data-v-fc2ebf13]{cursor:pointer;border-radius:var(--radius-base);-webkit-user-select:none;user-select:none;height:24px;color:var(--text-primary);font-size:var(--font-size-mid);transition:background var(--transition-fast);white-space:nowrap;align-items:center;gap:4px;padding-right:8px;display:flex;overflow:hidden}.tree-node[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.tree-node--active[data-v-fc2ebf13]{background:var(--tint-primary-12);color:var(--color-primary)}.tree-node--selected[data-v-fc2ebf13]{outline-offset:-1px;background:#63b3ed26;outline:1px solid #63b3ed59}.tree-arrow[data-v-fc2ebf13]{color:var(--text-meta);transition:transform var(--transition-fast);flex-shrink:0;align-items:center;width:12px;display:flex}.tree-arrow.expanded[data-v-fc2ebf13]{transform:rotate(90deg)}.tree-arrow-spacer[data-v-fc2ebf13]{flex-shrink:0;width:12px}.tree-icon[data-v-fc2ebf13]{font-size:var(--font-size-base);flex-shrink:0;align-items:center;line-height:1;display:flex}.tree-icon.mit-icon[data-v-fc2ebf13]{fill:currentColor;vertical-align:middle;width:14px;height:14px;display:inline-block}.tree-icon--dir[data-v-fc2ebf13]{color:#e8b84b}.tree-name[data-v-fc2ebf13]{text-overflow:ellipsis;min-width:0;font-size:var(--font-size-mid);flex:1;overflow:hidden}.tree-loading[data-v-fc2ebf13]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite spin-fc2ebf13;display:inline-block}.tree-empty[data-v-fc2ebf13]{font-size:var(--font-size-sm);color:var(--text-meta);text-align:center;padding:24px 12px}.sidebar-loading[data-v-fc2ebf13]{flex:1;justify-content:center;align-items:center;display:flex}.spin-icon[data-v-fc2ebf13]{border:2px solid var(--color-primary);border-top-color:#0000;border-radius:50%;width:20px;height:20px;animation:.8s linear infinite spin-fc2ebf13;display:inline-block}@keyframes spin-fc2ebf13{to{transform:rotate(360deg)}}.editor-resizer[data-v-fc2ebf13]{cursor:col-resize;width:6px;transition:background var(--transition-fast);z-index:2;background:0 0;flex-shrink:0;position:relative}.editor-resizer[data-v-fc2ebf13]:after{content:"";background:var(--color-gray-300);border-radius:var(--radius-xs);width:2px;height:32px;transition:background var(--transition-fast), height var(--transition-fast);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.editor-resizer[data-v-fc2ebf13]:hover{background:var(--tint-primary-06)}.editor-resizer[data-v-fc2ebf13]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.editor-main[data-v-fc2ebf13]{flex-direction:column;flex:1;display:flex;overflow:hidden}.editor-tabs[data-v-fc2ebf13]{background:var(--bg-panel);scrollbar-width:none;flex-shrink:0;display:flex;overflow:auto hidden}.editor-tabs[data-v-fc2ebf13]::-webkit-scrollbar{display:none}.editor-tab[data-v-fc2ebf13]{cursor:pointer;height:34px;font-size:var(--font-size-mid);color:var(--text-secondary);transition:background var(--transition-fast), color var(--transition-fast);-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:center;gap:6px;min-width:80px;max-width:200px;padding:0 12px;display:flex}.editor-tab[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.editor-tab.active[data-v-fc2ebf13]{background:var(--bg-container);color:var(--text-primary);border-bottom:2px solid var(--color-primary)}.tab-name[data-v-fc2ebf13]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tab-dirty-dot[data-v-fc2ebf13]{background:var(--color-warning);border-radius:50%;flex-shrink:0;width:6px;height:6px}.tab-close[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);opacity:0;transition:opacity var(--transition-fast), background var(--transition-fast);background:0 0;border:none;flex-shrink:0;align-items:center;padding:2px;display:flex}.editor-tab:hover .tab-close[data-v-fc2ebf13],.editor-tab.active .tab-close[data-v-fc2ebf13]{opacity:1}.tab-close[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--color-danger-dark)}.editor-empty[data-v-fc2ebf13]{flex:1}.monaco-container[data-v-fc2ebf13]{flex:1;min-width:0;overflow:hidden}.monaco-container.hidden[data-v-fc2ebf13]{display:none}.image-tab-placeholder[data-v-fc2ebf13]{justify-content:center;align-items:center;gap:var(--spacing-sm);color:var(--text-secondary);background:var(--bg-container);text-align:center;padding:var(--spacing-lg);flex-direction:column;flex:1;display:flex}.image-tab-placeholder-title[data-v-fc2ebf13]{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--text-primary);word-break:break-all;margin:0}.image-tab-placeholder-hint[data-v-fc2ebf13]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0}.editor-body[data-v-fc2ebf13]{flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.editor-body.is-agent-fullscreen .preview-resizer[data-v-fc2ebf13]{display:none}.preview-resizer[data-v-fc2ebf13]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;width:7px;position:relative}.preview-resizer[data-v-fc2ebf13]:after{content:"";background:var(--border-color);width:1px;transition:background var(--transition-fast), width var(--transition-fast);position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}.preview-resizer:hover[data-v-fc2ebf13]{background:var(--tint-primary-06)}.preview-resizer:hover[data-v-fc2ebf13]:after{background:var(--color-primary);width:2px}.preview-panel[data-v-fc2ebf13]{background:var(--bg-panel);flex-direction:column;flex:1 1 0;min-width:200px;display:flex;overflow:hidden}.preview-header[data-v-fc2ebf13]{background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 10px;display:flex}.preview-title[data-v-fc2ebf13]{font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-weight:700}.preview-ext-badge[data-v-fc2ebf13]{font-size:var(--font-size-xs);border-radius:var(--radius-base);background:var(--tint-primary-16);color:var(--color-primary);letter-spacing:.04em;padding:1px 5px;font-weight:600}.preview-header-spacer[data-v-fc2ebf13]{flex:1}.preview-close-btn[data-v-fc2ebf13]{cursor:pointer;color:var(--text-meta);border-radius:var(--radius-base);transition:color var(--transition-fast), background var(--transition-fast);background:0 0;border:none;align-items:center;padding:3px;display:flex}.preview-close-btn[data-v-fc2ebf13]:hover{color:var(--color-danger-dark);background:var(--bg-hover)}.preview-body[data-v-fc2ebf13]{flex-direction:column;flex:1;display:flex;overflow:hidden}.preview-copybar[data-v-fc2ebf13]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:6px 10px;display:flex}.preview-copy-btn[data-v-fc2ebf13]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);color:var(--text-secondary);font-size:var(--font-size-xs);cursor:pointer;white-space:nowrap;transition:background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);align-items:center;gap:5px;padding:3px 10px;font-weight:600;display:inline-flex}.preview-copy-btn[data-v-fc2ebf13]:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}.preview-copy-btn[data-v-fc2ebf13]:disabled{opacity:.6;cursor:default}.preview-copy-btn.done[data-v-fc2ebf13]{border-color:var(--color-primary);color:var(--color-primary);background:var(--tint-primary-12)}.preview-copy-btn--primary[data-v-fc2ebf13]{background:var(--color-primary);color:#fff;border-color:#0000}.preview-copy-btn--primary[data-v-fc2ebf13]:hover:not(:disabled){background:var(--color-primary-dark,var(--color-primary));color:#fff}.preview-copy-btn--primary.done[data-v-fc2ebf13]{background:var(--color-primary);color:#fff;border-color:#0000}.preview-copy-btn-icon[data-v-fc2ebf13]{opacity:.75;font-family:monospace;font-size:11px}.preview-copy-embed[data-v-fc2ebf13]{color:var(--text-meta);font-size:var(--font-size-xs);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:5px;margin-left:auto;display:inline-flex}.preview-copy-embed input[data-v-fc2ebf13]{accent-color:var(--color-primary);margin:0}.preview-iframe[data-v-fc2ebf13]{background:0 0;border:none;flex:1;width:100%;height:100%}.preview-markdown[data-v-fc2ebf13]{flex:1;width:100%;height:100%;overflow:auto}.preview-mindmap[data-v-fc2ebf13]{background:var(--bg-container,#fff);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow:hidden}.mindmap-toggle-btn.disabled[data-v-fc2ebf13]{opacity:.45;cursor:not-allowed}.mindmap-toggle-btn.active[data-v-fc2ebf13]{color:#fff;background:linear-gradient(#6366f1 0%,#4f46e5 100%);border-color:#4f46e5}.preview-image-wrap[data-v-fc2ebf13]{background:var(--bg-container);flex:1;justify-content:center;align-items:center;padding:16px;display:flex;overflow:auto}.preview-image-wrap img[data-v-fc2ebf13]{object-fit:contain;border-radius:var(--radius-base);max-width:100%;max-height:100%;box-shadow:0 2px 12px #0003}.editor-tabs-spacer[data-v-fc2ebf13]{flex:1}.preview-toggle-btn[data-v-fc2ebf13]{cursor:pointer;height:34px;color:var(--text-secondary);font-size:var(--font-size-sm);white-space:nowrap;transition:background var(--transition-fast), color var(--transition-fast);background:0 0;border:none;flex-shrink:0;align-items:center;gap:5px;padding:0 10px;display:flex}.preview-toggle-btn[data-v-fc2ebf13]:hover{background:var(--bg-hover);color:var(--text-primary)}.preview-toggle-btn.active[data-v-fc2ebf13]{color:var(--color-primary);background:var(--tint-primary-08)}.sidebar-actions[data-v-fc2ebf13]{align-items:center;gap:2px;display:flex}.tree-inline-input-row[data-v-fc2ebf13]{cursor:default;background:var(--bg-hover)}.tree-inline-input[data-v-fc2ebf13]{min-width:0;height:20px;font-size:var(--font-size-mid);background:var(--bg-container);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--text-primary);outline:none;flex:1;padding:0 5px;font-family:inherit}.ctx-menu[data-v-fc2ebf13]{z-index:var(--z-menu-float);background:var(--bg-container);border:1px solid var(--border-color);border-radius:var(--radius-md);-webkit-user-select:none;user-select:none;min-width:160px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000059}.ctx-menu-icon[data-v-fc2ebf13]{flex-shrink:0;width:13px;height:13px}.ctx-menu-item[data-v-fc2ebf13]{border-radius:var(--radius-base);cursor:pointer;width:100%;font-size:var(--font-size-mid);color:var(--text-primary);text-align:left;transition:background var(--transition-fast);background:0 0;border:none;align-items:center;gap:8px;padding:6px 10px;display:flex}.ctx-menu-item[data-v-fc2ebf13]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-fc2ebf13]{color:var(--color-danger-dark)}.ctx-menu-item--danger[data-v-fc2ebf13]:hover{background:#ef44441a}.ctx-menu-sep[data-v-fc2ebf13]{background:var(--border-color);height:1px;margin:4px 2px}