zen-gitsync 2.18.25 → 2.18.26

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 (48) hide show
  1. package/package.json +4 -2
  2. package/src/cli/ai/modelSetup.js +11 -0
  3. package/src/cli/ai/modelSetup.test.js +4 -2
  4. package/src/ui/public/assets/AgentView-BgsIfH1V.js +27 -0
  5. package/src/ui/public/assets/{AppVersionBadge-DbFO8rLi.js → AppVersionBadge-vKeEhoxI.js} +2 -2
  6. package/src/ui/public/assets/{BranchSelector-DA2SwWaV.js → BranchSelector-D4Igm7sR.js} +1 -1
  7. package/src/ui/public/assets/{ChatSilenceBadge-DSIaadKb.js → ChatSilenceBadge-D-lbhnwH.js} +8 -8
  8. package/src/ui/public/assets/{CommitForm-DkxH_Ts2.js → CommitForm-CXBA-E-6.js} +3 -3
  9. package/src/ui/public/assets/{CommonDialog-BLNGFUbf.js → CommonDialog-DrbQC1fm.js} +1 -1
  10. package/src/ui/public/assets/{EditorView-zYjlwSMs.js → EditorView-CXj7-8DC.js} +1 -1
  11. package/src/ui/public/assets/{FlowExecutionViewer-LdVYaAwm.js → FlowExecutionViewer-CjL1DfmI.js} +1 -1
  12. package/src/ui/public/assets/{FlowOrchestrationWorkspace-BB91PXml.js → FlowOrchestrationWorkspace-p7_NcaY-.js} +1 -1
  13. package/src/ui/public/assets/{LogList-CRZpd3FE.js → LogList-SDV2f7R6.js} +4 -4
  14. package/src/ui/public/assets/MindmapView-BWXQHyV7.js +35 -0
  15. package/src/ui/public/assets/{MonitorView-DsOy5K_F.js → MonitorView-G1MQ7M0F.js} +1 -1
  16. package/src/ui/public/assets/{ProjectManagerView-ZhrY5oiK.js → ProjectManagerView-Cg3GLLxQ.js} +1 -1
  17. package/src/ui/public/assets/{ProjectStartupButton-cLbx_jCw.js → ProjectStartupButton-DMlDI4Xn.js} +1 -1
  18. package/src/ui/public/assets/{RemoteManagerDialog-C7RKYhq3.js → RemoteManagerDialog-BZLYsW8E.js} +1 -1
  19. package/src/ui/public/assets/{RemoteRepoCard-pqs_CXmT.js → RemoteRepoCard-BqHQho7O.js} +1 -1
  20. package/src/ui/public/assets/{SourceMapView-WvoQSlij.js → SourceMapView-CHl1yfAe.js} +2 -2
  21. package/src/ui/public/assets/{SvgIcon-Bpjn8BFa.js → SvgIcon-EoI0db7X.js} +1 -1
  22. package/src/ui/public/assets/TaskExecutorPicker-cEgHnI-W.js +1 -0
  23. package/src/ui/public/assets/{UserInputNode-BNfpIezE.js → UserInputNode-CbwrGTgh.js} +1 -1
  24. package/src/ui/public/assets/{WorkbenchView-_s879kev.js → WorkbenchView-hSDyngLo.js} +155 -155
  25. package/src/ui/public/assets/{_plugin-vue_export-helper-BFvqRHs6.js → _plugin-vue_export-helper-Birg7-Pq.js} +3 -3
  26. package/src/ui/public/assets/{configStore-BiJopZl2.js → configStore-DPzIt2AS.js} +1 -1
  27. package/src/ui/public/assets/{dagre-yiQDclZv.js → dagre-BZyAVTDj.js} +3 -3
  28. package/src/ui/public/assets/{element-plus-BeZBQw4X.js → element-plus-CosPN4uA.js} +1 -1
  29. package/src/ui/public/assets/{flow-mindmap-CGjPqCv0.js → flow-mindmap-DY6jCfqE.js} +1 -1
  30. package/src/ui/public/assets/index-BJJSr6Sb.css +1 -0
  31. package/src/ui/public/assets/{index-B85tzLZT.js → index-CUUfiQYd.js} +79 -81
  32. package/src/ui/public/assets/{monaco-CMQow_j-.js → monaco-CJlef6w-.js} +1 -1
  33. package/src/ui/public/assets/{office-docx-nuGPI15f.js → office-docx-BOLbjEIt.js} +1 -1
  34. package/src/ui/public/assets/{office-excel-CK-HOYi8.js → office-excel-4xPekjHL.js} +1 -1
  35. package/src/ui/public/assets/{office-pptx-9onMeLux.js → office-pptx-BHSdxmkd.js} +1 -1
  36. package/src/ui/public/assets/{relativeTime-UxtHA303.js → relativeTime-257j87Fm.js} +1 -1
  37. package/src/ui/public/assets/{taskExecutionExport-CXKV0l1N.js → taskExecutionExport-CplN8eIn.js} +1 -1
  38. package/src/ui/public/assets/{toolsStore-DTNnZxXM.js → toolsStore-BjG-9k17.js} +1 -1
  39. package/src/ui/public/assets/{useWorkbenchProjects-5LLBir9K.js → useWorkbenchProjects-Cj3XIq94.js} +1 -1
  40. package/src/ui/public/assets/vendor-2SbNafIY.css +1 -0
  41. package/src/ui/public/assets/{vendor-KxSgeiUX.js → vendor-DSY591Nv.js} +457 -450
  42. package/src/ui/public/assets/{vue-flow-BMMiguH1.js → vue-flow-CJFvg_oJ.js} +1 -1
  43. package/src/ui/public/index.html +14 -14
  44. package/src/ui/public/assets/AgentView-GLzEji4Z.js +0 -27
  45. package/src/ui/public/assets/MindmapView-jQuKfAL3.js +0 -35
  46. package/src/ui/public/assets/TaskExecutorPicker-DPrm4ld1.js +0 -1
  47. package/src/ui/public/assets/index-Cewm9TZ-.css +0 -1
  48. package/src/ui/public/assets/vendor-CAhoE06w.css +0 -1
@@ -1,35 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Gn as r,In as i,J as a,Kr as o,L as ee,Mn as s,On as c,Sn as l,Tn as u,Un as te,W as d,Wr as f,Xr as p,Yn as m,_n as h,a as g,ar as _,ct as v,gn as y,gr as b,i as x,ir as S,jr as C,kn as w,lr as T,mn as E,mt as ne,nr as D,on as O,qn as k,r as A,wn as j,xn as M,yn as re,z as ie}from"./element-plus-BeZBQw4X.js";import{C as ae,l as oe,m as se,o as ce,t as le}from"./vendor-KxSgeiUX.js";import{n as N,t as ue}from"./_plugin-vue_export-helper-BFvqRHs6.js";import{o as de,t as fe}from"./configStore-BiJopZl2.js";import{n as pe,r as me}from"./flow-mindmap-CGjPqCv0.js";import{Q as he,_ as ge,c as _e,d as ve,f as ye,ft as be,g as P,h as xe,m as Se,o as Ce,p as we,s as Te,t as Ee,v as F,xt as De}from"./index-B85tzLZT.js";import{a as I,c as L,i as Oe,n as ke,o as Ae,r as R,s as je,t as Me}from"./ChatSilenceBadge-DSIaadKb.js";i(),T();var Ne=s({__name:`EditorAgentPanel`,props:{activeFilePath:{type:[String,null],required:!1},activeFileName:{type:String,required:!1},contextNote:{type:String,required:!1},active:{type:Boolean,required:!1},fullscreen:{type:Boolean,required:!1}},emits:[`close`,`toggle-fullscreen`,`assistant-done`],setup(e,{expose:n,emit:i}){n();let a=e,o=i,{theme:ee}=be(),s=M(()=>ee.value===`dark`?`dark`:`light`),{sessions:c,sessionsLoading:l,currentSessionId:u,messages:d,displayMessages:f,isStreaming:p,questionPanel:m,answeringQuestion:h,isSessionGenerating:g,currentEngine:_,pendingEngine:v,isEngineLocked:y,pickEngine:x,loadSessions:S,loadSession:C,deleteSession:w,renameSession:T,newSession:E,sendMessage:ne,retryTurn:O,answerQuestion:k,stop:A,inputContextUsage:j,queuedMessages:re,queuePaused:ie,removeQueuedMessage:ae,flushQueued:se,silentMs:ue}=je(),de=fe(),pe=De(),me=M(()=>{let e=de.models.find(e=>e.isDefault);return e&&(e.name||e.model)||``}),he=M(()=>y.value?_.value:v.value);function _e(e){y.value||x(e)}let Ce=M(()=>F(c.value,g)),Te=xe(),Ee=P(),Ne=ge(),z=M(()=>Ce.value.find(e=>e.id===u.value)?.title||``),B=b(null),V=b(null),H=b(null),Pe=b(null),U=b(null),{width:W,narrow:G}=I(U),K=b(`chat`),{convListCollapsed:Fe,setConvListCollapsed:Ie}=Oe(),q=M(()=>!G.value&&Fe.value),J=b(null),Y=b(!1),X=null,Z=M(()=>!!a.activeFileName&&!Y.value);function Le(e){return Array.from(e.children).find(e=>e.classList?.contains(`acu-input-attachments`))??null}function Q(){let e=V.value?.$el;if(!e)return;let n=e.querySelector(`.agent-context-slot`);if(!Z.value){if(!n)return;J.value=null,t(()=>n.remove());return}let r=J.value&&e.contains(J.value)?J.value:n;r||(r=document.createElement(`div`),r.className=`agent-context-slot`);let i=Le(e),a=i??e;r.parentElement!==a&&a.insertBefore(r,i?i.firstChild:e.firstChild),J.value=r}function $(e=!0){B.value?.scrollToBottom(e)}async function Re(e){let n=Y.value?void 0:a.activeFilePath||void 0;await ne(e.text,e.files,{openFilePath:n,docNote:a.contextNote||void 0}),await t(),$()}function ze(e){C(e),K.value=`chat`}function Be(){E(),K.value=`chat`}D(()=>d.value.length,()=>{t(()=>$(!1))}),D(p,(e,t)=>{!e&&t&&o(`assistant-done`,{text:Ve()})});function Ve(){let e=d.value;for(let t=e.length-1;t>=0;t--)if(e[t]?.role===`assistant`)return String(e[t].content||``);return``}function He(){let e=Pe.value;!e||typeof MutationObserver>`u`||(X?.disconnect(),X=new MutationObserver(()=>Q()),X.observe(e,{childList:!0,subtree:!0}))}D(()=>a.active,e=>{e&&(K.value=`chat`,S().catch(()=>{}),t(()=>{Q(),$(!1)}))}),D(G,e=>{e||(K.value=`chat`)}),D(()=>a.activeFilePath,()=>{Y.value=!1}),D(Z,e=>{e&&t(Q)}),r(()=>{S().catch(()=>{}),t(()=>{Q(),He()})}),te(()=>{X?.disconnect(),X=null,J.value=null});let Ue={props:a,emit:o,theme:ee,chatTheme:s,sessions:c,sessionsLoading:l,currentSessionId:u,messages:d,displayMessages:f,isStreaming:p,questionPanel:m,answeringQuestion:h,isSessionGenerating:g,currentEngine:_,pendingEngine:v,isEngineLocked:y,pickEngine:x,loadSessions:S,loadSession:C,deleteSession:w,renameSession:T,newSession:E,sendMessage:ne,retryTurn:O,answerQuestion:k,stop:A,inputContextUsage:j,queuedMessages:re,queuePaused:ie,removeQueuedMessage:ae,flushQueued:se,silentMs:ue,configStore:de,gitStore:pe,inputModelName:me,displayEngine:he,onEngineSelect:_e,conversationItems:Ce,conversationLabels:Te,questionLabels:Ee,queueLabels:Ne,currentSessionTitle:z,chatRef:B,inputRef:V,chatHostRef:H,composerRef:Pe,rootRef:U,width:W,narrow:G,page:K,convListCollapsed:Fe,setConvListCollapsed:Ie,convsCollapsed:q,contextSlot:J,contextDismissed:Y,get slotObserver(){return X},set slotObserver(e){X=e},showContextCard:Z,findAttachmentsHost:Le,syncContextSlot:Q,scrollToBottom:$,onSend:Re,onSelectSession:ze,onNewSession:Be,lastAssistantText:Ve,watchChatDom:He,get $t(){return N},get ChatContainer(){return ce},get ChatInput(){return oe},get ConversationList(){return le},get AGENT_UPLOAD_ACCEPT(){return Ae},get agentEngineName(){return L},get AGENT_ASSISTANT_NAME(){return ye},get AGENT_ASSISTANT_AVATAR(){return ve},get MESSAGE_RAIL_CONFIG(){return Se},get MESSAGE_META_CONFIG(){return we},AgentEngineSelector:R,CopySessionButton:ke,ChatSilenceBadge:Me};return Object.defineProperty(Ue,"__isScriptSetup",{enumerable:!1,value:!0}),Ue}});i(),C(),O();var z={class:`agent-panel-header`},B=[`title`,`aria-label`],V={class:`agent-panel-title`},H={key:1,class:`agent-panel-title`},Pe=[`title`,`aria-label`],U=[`title`,`aria-label`],W={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},G={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},K=[`title`],Fe={class:`agent-panel-convs`},Ie={ref:`chatHostRef`,class:`agent-panel-chat`},q=[`data-theme`],J=[`title`],Y={class:`agent-context-att-name`},X=[`title`,`aria-label`];function Z(t,r,i,a,o,ee){return k(),u(h,null,[j(`
2
- 文件空间右侧的 g ai 对话面板。
3
- - 够宽(≥680px,判据同「智能体」视图):左边一列会话历史 + 右边对话,历史**直接摆在那儿**,
4
- 不用先点按钮翻过去;不够宽就折成两页,头部按钮来回翻
5
- - 输入框常驻底部:ChatContainer 传 show-input=false,输入框拆出来自己摆在面板最下方。
6
- 于是两种形态、两个页面都有输入框 —— 列表页也能直接开聊,翻页时草稿与附件都不丢
7
- - 复用的都是组件库的独立导出:ConversationList(列表)+ ChatContainer(气泡区)+ ChatInput(输入框)
8
- - "当前打开的文档"通过请求级注入告知模型(sendMessage 的 openFilePath 选项);
9
- 它修饰的是**这一条消息的上下文**,所以做成附件卡片、搬进输入框内部(见 contextSlot)
10
- - 自己持有一个 useAgentChat 实例:runs/refs 与「对话」Tab 隔离,互不打断
11
- `),j(`
12
- 全屏对话:盖住整个编辑区(左栏文件树不动)。父级负责把分隔条藏掉。
13
- absolute 而不是改 flex-basis —— Monaco 留在原地、状态不重建。
14
- `),l(`div`,{ref:`rootRef`,class:f([`editor-agent-panel`,{"is-fullscreen":i.fullscreen}])},[l(`div`,z,[j(` 窄屏的列表页:整条 header 让给「返回对话 + 标题」 `),a.narrow&&a.page===`list`?(k(),u(h,{key:0},[l(`button`,{class:`agent-panel-icon-btn agent-panel-back-btn`,title:a.$t(`@EDITOR:返回对话`),"aria-label":a.$t(`@EDITOR:返回对话`),onClick:r[0]||=e=>a.page=`chat`},[...r[5]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),l(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,B),l(`span`,V,p(a.$t(`@EDITOR:会话列表`)),1)],64)):(k(),u(`span`,H,p(a.$t(`@EDITOR:g ai 对话`)),1)),r[10]||=l(`div`,{class:`agent-panel-spacer`},null,-1),j(` 本轮静默:与「智能体」页、主 Agent 控制台同一枚(等回答时不算静默) `),!a.narrow||a.page===`chat`?(k(),n(a.ChatSilenceBadge,{key:2,class:`agent-panel-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):j(`v-if`,!0),j(` 引擎切换:与「智能体」视图同一套(同一个 AgentEngineSelector)。
15
- 宽屏左边摆着历史,对话区一直在,所以常驻;窄屏只在对话页出现 ——
16
- 列表页没有正在跑的对话,摆这儿只会挤占标题。 `),!a.narrow||a.page===`chat`?(k(),n(a.AgentEngineSelector,{key:3,class:`agent-panel-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.onEngineSelect},null,8,[`engine`,`locked`])):j(`v-if`,!0),j(` 复制整条会话:只有对话页才有"当前这条会话"可复制(列表页连引擎选择器都不摆) `),!a.narrow||a.page===`chat`?(k(),n(a.CopySessionButton,{key:4,class:`agent-panel-copy`,messages:a.messages,title:a.currentSessionTitle,engine:a.agentEngineName(a.displayEngine)},null,8,[`messages`,`title`,`engine`])):j(`v-if`,!0),j(` 会话列表按钮:只有"列表是独立一页"时才需要它(宽屏列表就在旁边) `),a.narrow&&a.page===`chat`?(k(),u(`button`,{key:5,class:`agent-panel-icon-btn agent-panel-list-btn`,title:a.$t(`@EDITOR:会话列表`),"aria-label":a.$t(`@EDITOR:会话列表`),onClick:r[1]||=e=>a.page=`list`},[...r[6]||=[c(`<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" data-v-7cc12c51><line x1="8" y1="6" x2="21" y2="6" data-v-7cc12c51></line><line x1="8" y1="12" x2="21" y2="12" data-v-7cc12c51></line><line x1="8" y1="18" x2="21" y2="18" data-v-7cc12c51></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-7cc12c51></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-7cc12c51></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-7cc12c51></line></svg>`,1)]],8,Pe)):j(`v-if`,!0),l(`button`,{class:`agent-panel-icon-btn agent-panel-fullscreen-btn`,title:i.fullscreen?a.$t(`@EDITOR:退出全屏对话`):a.$t(`@EDITOR:全屏对话`),"aria-label":i.fullscreen?a.$t(`@EDITOR:退出全屏对话`):a.$t(`@EDITOR:全屏对话`),onClick:r[2]||=e=>a.emit(`toggle-fullscreen`)},[j(` 展开:四角朝外;收起:四角朝内(Tabler maximize / minimize) `),i.fullscreen?(k(),u(`svg`,G,[...r[8]||=[l(`path`,{d:`M5 9h3a1 1 0 0 0 1-1V5`},null,-1),l(`path`,{d:`M15 5v3a1 1 0 0 0 1 1h3`},null,-1),l(`path`,{d:`M19 15h-3a1 1 0 0 0-1 1v3`},null,-1),l(`path`,{d:`M9 19v-3a1 1 0 0 0-1-1H5`},null,-1)]])):(k(),u(`svg`,W,[...r[7]||=[l(`path`,{d:`M4 8V5a1 1 0 0 1 1-1h3`},null,-1),l(`path`,{d:`M16 4h3a1 1 0 0 1 1 1v3`},null,-1),l(`path`,{d:`M20 16v3a1 1 0 0 1-1 1h-3`},null,-1),l(`path`,{d:`M8 20H5a1 1 0 0 1-1-1v-3`},null,-1)]]))],8,U),l(`button`,{class:`agent-panel-icon-btn`,title:a.$t(`@EDITOR:关闭对话`),onClick:r[3]||=e=>a.emit(`close`)},[...r[9]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[l(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),l(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,K)]),l(`div`,{class:f([`agent-panel-body`,{"is-wide":!a.narrow,"is-convs-collapsed":a.convsCollapsed}])},[j(` 会话历史:宽屏是常驻左列(可收起),窄屏是独享整页 `),_(l(`div`,Fe,[e(a.ConversationList,{"show-search":!0,items:a.conversationItems,"active-id":a.currentSessionId,loading:a.sessionsLoading,labels:a.conversationLabels,collapsible:!a.narrow,collapsed:a.convsCollapsed,"onUpdate:collapsed":a.setConvListCollapsed,onSelect:a.onSelectSession,onNew:a.onNewSession,onRename:a.renameSession,onDelete:a.deleteSession},null,8,[`items`,`active-id`,`loading`,`labels`,`collapsible`,`collapsed`,`onUpdate:collapsed`,`onRename`,`onDelete`])],512),[[E,!a.narrow||a.page===`list`]]),j(` 气泡区:输入框已经不在这里了(show-input=false),见下面常驻的那一条 `),_(l(`div`,Ie,[e(a.ChatContainer,{ref:`chatRef`,"show-input":!1,messages:a.displayMessages,"assistant-name":a.AGENT_ASSISTANT_NAME,"assistant-avatar":a.AGENT_ASSISTANT_AVATAR,theme:a.chatTheme,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,onAnswer:a.answerQuestion,onRetry:a.retryTurn},null,8,[`messages`,`assistant-name`,`assistant-avatar`,`theme`,`question`,`question-submitting`,`question-labels`,`plan-config`,`message-rail-config`,`message-meta-config`,`onAnswer`,`onRetry`])],512),[[E,!a.narrow||a.page===`chat`]]),j(`
17
- 输入框常驻:两种形态、两个页面都在最下方(与演示页同一套做法)。
18
- 它被拆到 ChatContainer 外面,所以 acu-root 与 data-theme 得自己套上:
19
- 库把盒模型重置限定在 .acu-root 子树里,而 ChatInput 根节点是 div(不是 button),
20
- 少了它就会退回 content-box、横着溢出面板。
21
-
22
- v-if="width > 0":**等量到本面板的宽度再挂载输入框**。库的 ChatInput 只在
23
- onMounted 里量一次 scrollHeight,量到的宽度不对就再也纠不回来 —— 实测首帧挂载时
24
- 容器还没宽度,占位文案被折成十几行,textarea 直接顶到 200px 上限并一直卡在那里。
25
- 宽度是 useNarrowPane 在 onMounted 里同步量到的,所以这里晚的只是一次重渲染。
26
- `),a.width>0?(k(),u(`div`,{key:0,ref:`composerRef`,class:`agent-panel-composer acu-root`,"data-theme":a.chatTheme},[e(a.ChatInput,{ref:`inputRef`,generating:a.isStreaming,"allow-queue":!0,queued:a.queuedMessages,"queue-paused":a.queuePaused,"queue-labels":a.queueLabels,placeholder:a.isStreaming?a.$t(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):a.$t(`@AGENT:输入消息,Enter 发送`),"upload-config":{accept:a.AGENT_UPLOAD_ACCEPT},"context-usage":a.inputContextUsage,"git-branch":a.gitStore.currentBranch||void 0,model:a.inputModelName||void 0,onSend:a.onSend,onStop:a.stop,onUnqueue:a.removeQueuedMessage,onFlushQueued:a.flushQueued},null,8,[`generating`,`queued`,`queue-paused`,`queue-labels`,`placeholder`,`upload-config`,`context-usage`,`git-branch`,`model`,`onStop`,`onUnqueue`,`onFlushQueued`]),j(`
27
- 当前文档:**和添加的附件同处一行、同一副样子**。
28
- 组件库的 ChatContainer / ChatInput 没有任何插槽(dist 里 \`slots\` 出现 0 次),
29
- 没法声明式地往输入框里放东西,所以:
30
- · 往 \`.acu-input-wrap\` 插一个锚点,再把卡片 Teleport 进去(节点仍是 Vue 渲染的);
31
- · **有附件行(.acu-input-attachments)时锚点住进它内部** —— 卡片因此成为那一行的
32
- flex item,与附件并排、共用同一套 gap/wrap。只插在输入框最前面是不行的:
33
- Vue 更新输入框时会用自己的锚点 \`insertBefore\`,把外来节点挤到后面去。
34
- `),a.contextSlot?(k(),n(re,{key:0,to:a.contextSlot},[a.showContextCard?(k(),u(`div`,{key:0,class:`agent-context-att`,title:i.activeFilePath||``},[r[12]||=l(`svg`,{class:`agent-context-att-icon`,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[l(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z`}),l(`polyline`,{points:`14 3 14 8 19 8`})],-1),l(`span`,Y,p(i.activeFileName),1),l(`button`,{type:`button`,class:`agent-context-att-remove`,title:a.$t(`@EDITOR:不引用当前文档`),"aria-label":a.$t(`@EDITOR:不引用当前文档`),onClick:r[4]||=e=>a.contextDismissed=!0},[...r[11]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`,"aria-hidden":`true`},[l(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),l(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,X)],8,J)):j(`v-if`,!0)],8,[`to`])):j(`v-if`,!0)],8,q)):j(`v-if`,!0)],2)],2)],2112)}var Le=ue(Ne,[[`render`,Z],[`__scopeId`,`data-v-7cc12c51`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/EditorAgentPanel.vue`]]);i(),T();var Q=1500,$=300,Re=320,ze=s({__name:`MindmapView`,setup(e,{expose:n}){n();let i=Te(),a=fe(),{currentLocale:o}=ae(de()),ee=M(()=>{let e=a.theme;return e===`dark`?!0:e===`light`?!1:window.matchMedia?.(`(prefers-color-scheme: dark)`).matches??!1}),s=b(null),c=b(!1);function l(){c.value=!0}async function u(e){c.value=!1;let t=(e||[]).filter(Boolean);if(t.length!==0)try{let e=await i.addDirs(t);e>0?x.success(N(`@MINDMAP:已添加目录`,{n:e})):x.info(N(`@MINDMAP:重复目录已忽略`))}catch(e){x.error(e?.message||N(`@MINDMAP:读取目录失败`))}}let d=b({});function f(e){d.value={...d.value,[e]:!d.value[e]},i.activeDir=e}function p(e){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/);return t[t.length-1]||e}function m(e){return!!i.activeDir&&i.activeDir.toLowerCase()===e.toLowerCase()}function h(){let{dir:e,ambiguous:t}=i.resolveTargetDir();return e||(x.warning(N(t?`@MINDMAP:请选择目标目录`:`@MINDMAP:请先添加目录`)),null)}async function g(e){let t=e||h();if(!t||(e&&(i.activeDir=e),!await w()))return;let n=``;try{n=(await A.prompt(N(`@MINDMAP:输入文件名提示`),N(`@MINDMAP:新建思维导图`),{confirmButtonText:N(`@MINDMAP:新建`),cancelButtonText:N(`@MINDMAP:取消`),inputPlaceholder:N(`@MINDMAP:文件名占位`),inputValidator:e=>!e||!e.trim()?N(`@MINDMAP:名称不能为空`):!/[\\/:*?"<>|]/.test(e)||N(`@MINDMAP:名称含非法字符`)})).value.trim()}catch{return}try{await i.createFile(n,!0,t),x.success(N(`@MINDMAP:已新建并打开`))}catch(e){x.error(e?.message||N(`@MINDMAP:新建失败`))}}async function _(e=!1){if(i.current)try{let t=s.value?.exportData();if(!t){e||x.warning(N(`@MINDMAP:无法获取数据`));return}await i.saveCurrent(t),e||x.success(N(`@MINDMAP:已保存`))}catch(e){x.error(e?.message||N(`@MINDMAP:保存失败`))}}let y=null;function S(){i.current&&i.dirty&&(y&&clearTimeout(y),y=setTimeout(()=>{y=null,i.current&&i.dirty&&_(!0)},Q))}function C(){y&&=(clearTimeout(y),null)}async function w(){if(!i.dirty||!i.current)return!0;try{await A.confirm(N(`@MINDMAP:未保存提示`,{title:i.current.title}),N(`@MINDMAP:未保存的改动`),{confirmButtonText:N(`@MINDMAP:保存`),cancelButtonText:N(`@MINDMAP:丢弃`),distinguishCancelAndClose:!0,type:`warning`}),C();let e=s.value?.exportData();return e&&(await i.saveCurrent(e),x.success(N(`@MINDMAP:已保存`))),!0}catch(e){return e===`cancel`&&(C(),!0)}}async function T(e){if(!(i.current&&i.current.path===e)&&await w())try{await i.openFile(e,!0)}catch(e){x.error(e?.message||N(`@MINDMAP:打开失败`))}}async function E(e){let t=!!i.current&&Ce(i.current.path,e),n=N(`@MINDMAP:确认移除目录提示`,{dir:e});t&&(n=`${n} ${N(`@MINDMAP:当前文件将保持打开`)}`);try{await A.confirm(n,N(`@MINDMAP:移除目录`),{confirmButtonText:N(`@MINDMAP:移除目录`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}i.removeDir(e),x.success(N(`@MINDMAP:已移除目录`))}let O=b(null);function k(e,t){e.preventDefault(),O.value={x:e.clientX,y:e.clientY,dir:t}}function j(){O.value=null}async function re(){let e=O.value?.dir;if(j(),!e)return;let t=await he(e);t.success?x.success(t.message||N(`@MINDMAP:已在文件管理器中打开`)):x.error(t.error||N(`@MINDMAP:打开目录失败`))}function ie(){let e=O.value?.dir;j(),e&&g(e)}function oe(){let e=O.value?.dir;j(),e&&E(e)}async function ce(e){try{await A.confirm(N(`@MINDMAP:确认删除提示`,{title:e.title}),N(`@MINDMAP:删除`),{confirmButtonText:N(`@MINDMAP:删除`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}try{await i.deleteFile(e.path),x.success(N(`@MINDMAP:已删除`))}catch(e){x.error(e?.message||N(`@MINDMAP:删除失败`))}}async function le(e){let t=``;try{t=(await A.prompt(N(`@MINDMAP:输入新名称提示`),N(`@MINDMAP:重命名`),{confirmButtonText:N(`@MINDMAP:确定`),cancelButtonText:N(`@MINDMAP:取消`),inputValue:e.title,inputValidator:e=>!e||!e.trim()?N(`@MINDMAP:名称不能为空`):!/[\\/:*?"<>|]/.test(e)||N(`@MINDMAP:名称含非法字符`)})).value.trim()}catch{return}try{await i.renameFile(e.path,t),x.success(N(`@MINDMAP:已重命名`))}catch(e){x.error(e?.message||N(`@MINDMAP:重命名失败`))}}function ue(e){i.markDirty(),S()}function ge(e){}async function ve(e){let t=e||h();if(!t)return;let n=``,r=``;try{n=(await A.prompt(N(`@MINDMAP:粘贴Markdown提示`),N(`@MINDMAP:从Markdown导入`),{confirmButtonText:N(`@MINDMAP:导入`),cancelButtonText:N(`@MINDMAP:取消`),inputType:`textarea`,inputPlaceholder:N(`@MINDMAP:Markdown占位`),inputValidator:e=>!e||!e.trim()?N(`@MINDMAP:内容不能为空`):!0})).value}catch{return}try{r=(await A.prompt(N(`@MINDMAP:输入文件名提示`),N(`@MINDMAP:文件名`),{confirmButtonText:N(`@MINDMAP:新建`),cancelButtonText:N(`@MINDMAP:取消`),inputValidator:e=>!e||!e.trim()?N(`@MINDMAP:名称不能为空`):!/[\\/:*?"<>|]/.test(e)||N(`@MINDMAP:名称含非法字符`)})).value.trim()}catch{return}try{await i.createFile(r,!0,t);let e=pe(n,r),a=JSON.stringify(e,null,2);await i.saveCurrent(a),x.success(N(`@MINDMAP:已导入`))}catch(e){x.error(e?.message||N(`@MINDMAP:导入失败`))}}async function ye(){if(s.value)try{let e=s.value.getMarkdown();await navigator.clipboard.writeText(e),x.success(N(`@MINDMAP:已复制Markdown`))}catch(e){x.error(e?.message||N(`@MINDMAP:复制失败`))}}function be(e){if(e.key===`Escape`&&I.value){I.value=!1;return}(e.ctrlKey||e.metaKey)&&e.key===`s`&&(e.preventDefault(),i.current&&i.dirty&&(C(),_()))}let P=b(0);D(()=>i.current?.path,()=>{P.value++,G.value=null});let xe=b(!1);function Se(){xe.value=!xe.value}let we=M(()=>{let e=i.current?.content;if(!e)return null;try{return JSON.parse(e)}catch{return null}}),F=b(!1),De=b(!1),I=b(!1),L=b(0),Oe=M(()=>L.value<=0?{}:I.value?{flex:`0 0 ${L.value}px`}:{flex:`0 0 ${L.value}px`,maxWidth:`calc(100% - 320px)`});function ke(){F.value=!F.value,De.value=!0}function Ae(){F.value=!1}let R=0;function je(){R&&cancelAnimationFrame(R),R=requestAnimationFrame(()=>{R=0,s.value?.resetView()})}D([F,I],()=>t(je)),D(F,e=>{e||(I.value=!1)});let Me=M(()=>{let e=(i.current?.path||``).split(/[\\/]/);return e[e.length-1]||``}),Ne=M(()=>Ee(i.current?.path,o.value,{withConvention:!0})),z=!1,B=0,V=0,H=0;function Pe(e){let t=e.currentTarget,n=t.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=t.getBoundingClientRect();z=!0,B=e.clientX,V=r.right-i.right,H=Math.max($,r.width-Re),document.addEventListener(`mousemove`,U),document.addEventListener(`mouseup`,W),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,e.preventDefault()}function U(e){if(!z)return;let t=B-e.clientX;L.value=Math.round(Math.max($,Math.min(H,V+t)))}function W(){let e=z;z=!1,document.removeEventListener(`mousemove`,U),document.removeEventListener(`mouseup`,W),document.body.style.cursor=``,document.body.style.userSelect=``,e&&je()}let G=b(null);function K(e){let t=/```[ \t]*(?:mindmap|mm)[ \t]*\r?\n([\s\S]*?)```/gi,n=null,r;for(;(r=t.exec(String(e||``)))!==null;)n=r[1];let i=(n||``).trim();if(!i)return null;let a=i.match(/^#{1,6}[ \t]+\S.*$/gm)||[];return a.length===0?null:{md:i,title:(a[0]||``).replace(/^#{1,6}[ \t]+/,``).trim(),nodes:a.length}}function Fe({text:e}){let t=K(e);t&&(G.value=t)}function Ie(){G.value=null}function q(e,t){return JSON.stringify(pe(e.md,t),null,2)}async function J(){let e=G.value;if(e&&i.current){try{await A.confirm(N(`@MINDMAP:覆盖当前导图确认`,{title:i.current.title}),N(`@MINDMAP:应用导图草稿`),{confirmButtonText:N(`@MINDMAP:覆盖`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}try{C(),await i.saveCurrent(q(e,e.title)),i.current&&(i.current.title=e.title),P.value++,G.value=null,x.success(N(`@MINDMAP:已应用到当前导图`))}catch(e){x.error(e?.message||N(`@MINDMAP:应用草稿失败`))}}}async function Y(){let e=G.value;if(!e)return;let t=h();if(!t)return;let n=``;try{n=(await A.prompt(N(`@MINDMAP:输入文件名提示`),N(`@MINDMAP:新建思维导图`),{confirmButtonText:N(`@MINDMAP:新建`),cancelButtonText:N(`@MINDMAP:取消`),inputValue:e.title,inputValidator:e=>!e||!e.trim()?N(`@MINDMAP:名称不能为空`):!/[\\/:*?"<>|]/.test(e)||N(`@MINDMAP:名称含非法字符`)})).value.trim()}catch{return}try{await i.createFile(n,!0,t),await i.saveCurrent(q(e,n)),P.value++,G.value=null,x.success(N(`@MINDMAP:已新建导图`))}catch(e){x.error(e?.message||N(`@MINDMAP:应用草稿失败`))}}r(async()=>{window.addEventListener(`keydown`,be),document.addEventListener(`click`,j),await i.init()}),te(()=>{window.removeEventListener(`keydown`,be),document.removeEventListener(`click`,j),C(),W()});function X(e){if(!e)return`-`;let t=new Date(e),n=Date.now()-e;return n<6e4?N(`@MINDMAP:刚刚`):n<36e5?`${Math.floor(n/6e4)}${N(`@MINDMAP:分钟前`)}`:n<864e5?`${Math.floor(n/36e5)}${N(`@MINDMAP:小时前`)}`:`${t.getMonth()+1}/${t.getDate()} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}function Z(e){return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`0 B`}let ze={store:i,configStore:a,currentLocale:o,isDark:ee,mmRef:s,filePickerVisible:c,openDirPicker:l,onPickerConfirm:u,collapsedGroups:d,toggleGroup:f,baseName:p,isActiveDir:m,pickTargetDir:h,handleNewFile:g,handleSave:_,AUTOSAVE_DELAY:Q,get autosaveTimer(){return y},set autosaveTimer(e){y=e},scheduleAutosave:S,cancelAutosave:C,confirmDiscardIfDirty:w,handleOpenFile:T,handleRemoveDir:E,ctxMenu:O,openDirContextMenu:k,closeCtxMenu:j,ctxOpenDir:re,ctxNewFile:ie,ctxRemoveDir:oe,handleDelete:ce,handleRename:le,onMindMapChange:ue,onMindMapSelect:ge,handleImportMarkdown:ve,handleExportMarkdown:ye,onKeydown:be,mmKey:P,previewMode:xe,onCanvasTogglePreview:Se,mmData:we,showAi:F,aiOpened:De,aiFullscreen:I,aiWidth:L,aiStyle:Oe,toggleAi:ke,closeAi:Ae,get recenterRaf(){return R},set recenterRaf(e){R=e},recenterMindmap:je,currentFileName:Me,aiContextNote:Ne,AI_MIN_WIDTH:$,CANVAS_MIN_WIDTH:Re,get isAiResizing(){return z},set isAiResizing(e){z=e},get aiResizeStartX(){return B},set aiResizeStartX(e){B=e},get aiResizeStartW(){return V},set aiResizeStartW(e){V=e},get aiResizeMaxW(){return H},set aiResizeMaxW(e){H=e},startAiResize:Pe,onAiResize:U,stopAiResize:W,draft:G,extractMindmapDraft:K,onAssistantDone:Fe,dismissDraft:Ie,draftToContent:q,applyDraftToCurrent:J,applyDraftAsNew:Y,formatTime:X,formatSize:Z,get $t(){return N},get Delete(){return v},get Edit(){return ne},get FilePicker(){return se},get MindMap(){return me},EmptyState:_e,EditorAgentPanel:Le};return Object.defineProperty(ze,"__isScriptSetup",{enumerable:!1,value:!0}),ze}});i(),C(),O();var Be={class:`mindmap-view`},Ve={class:`mm-toolbar`},He={class:`mm-toolbar-left`},Ue={class:`mm-dir-tooltip`},We={key:1,class:`mm-dir-empty`},Ge={class:`mm-toolbar-right`},Ke={key:0,class:`mm-status`},qe=[`title`],Je={key:0,class:`mm-status-dirty`},Ye={class:`mm-body`},Xe={class:`mm-sidebar`},Ze={class:`mm-sidebar-header`},Qe={class:`mm-sidebar-title`},$e={class:`mm-sidebar-list`},et={key:0,class:`mm-sidebar-error`},tt=[`title`,`onClick`,`onContextmenu`],nt={class:`mm-group-info`},rt={class:`mm-group-name`},it={class:`mm-group-title`},at={class:`mm-group-count`},ot={class:`mm-group-path`},st={class:`mm-group-body`},ct=[`title`],lt=[`onClick`],ut={class:`mm-file-info`},dt=[`title`],ft={class:`mm-file-meta`},pt={class:`mm-editor`},mt={class:`mm-stage`},ht={key:0,class:`mm-draft`},gt={class:`mm-draft-tag`},_t=[`title`],vt={class:`mm-draft-meta`},yt=[`disabled`],bt=[`title`,`aria-label`],xt={class:`mm-canvas`};function St(t,r,i,s,c,te){let v=ie,b=ee,x=d,C=a,T=g;return k(),u(`div`,Be,[j(` 顶部工具栏 `),l(`div`,Ve,[l(`div`,He,[e(v,{size:`small`,onClick:s.openDirPicker},{icon:S(()=>[...r[8]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M12 19h-7a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2h4l3 3h7a2 2 0 0 1 2 2v3.5`}),l(`path`,{d:`M16 19h6`}),l(`path`,{d:`M19 16v6`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:添加目录`)),1)]),_:1}),s.store.dirs.length>0?(k(),n(x,{key:0,placement:`bottom-start`,"show-after":200},{content:S(()=>[l(`div`,Ue,[(k(!0),u(h,null,m(s.store.dirs,e=>(k(),u(`div`,{key:e},p(e),1))),128))])]),default:S(()=>[e(b,{size:`small`,type:`info`,class:`mm-dir-tag`},{default:S(()=>[w(p(s.$t(`@MINDMAP:个目录`,{n:s.store.dirs.length})),1)]),_:1})]),_:1})):(k(),u(`span`,We,p(s.$t(`@MINDMAP:请先添加目录`)),1))]),l(`div`,Ge,[e(v,{size:`small`,disabled:s.store.dirs.length===0,onClick:r[0]||=e=>s.handleNewFile()},{icon:S(()=>[...r[9]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M12 5l0 14`}),l(`path`,{d:`M5 12l14 0`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:新建`)),1)]),_:1},8,[`disabled`]),e(v,{size:`small`,disabled:s.store.dirs.length===0,onClick:r[1]||=e=>s.handleImportMarkdown()},{icon:S(()=>[...r[10]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),l(`path`,{d:`M5 13v-8a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2h-5.5m-9.5-2h7m-3-3l3 3l-3 3`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:从MD导入`)),1)]),_:1},8,[`disabled`]),e(v,{size:`small`,disabled:!s.store.current,onClick:s.handleExportMarkdown},{icon:S(()=>[...r[11]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),l(`path`,{d:`M17 21h-10a2 2 0 0 1-2-2v-14a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2`}),l(`path`,{d:`M10 18l5-5a1.414 1.414 0 0 0-2-2l-5 5v2h2`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:复制MD`)),1)]),_:1},8,[`disabled`]),e(v,{size:`small`,class:f([`mm-ai-btn`,{"is-on":s.showAi}]),title:s.showAi?s.$t(`@MINDMAP:关闭 g ai 对话`):s.$t(`@MINDMAP:打开 g ai 对话`),onClick:s.toggleAi},{icon:S(()=>[...r[12]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`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-3h12`}),l(`path`,{d:`M9.5 9h.01`}),l(`path`,{d:`M14.5 9h.01`}),l(`path`,{d:`M9.5 13a3.5 3.5 0 0 0 5 0`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:g ai 对话`)),1)]),_:1},8,[`class`,`title`]),e(v,{size:`small`,type:`primary`,disabled:!s.store.current||!s.store.dirty,loading:s.store.loading,onClick:r[2]||=()=>{s.cancelAutosave(),s.handleSave()}},{icon:S(()=>[...r[13]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M6 4h10l4 4v10a2 2 0 0 1-2 2h-12a2 2 0 0 1-2-2v-12a2 2 0 0 1 2-2`}),l(`path`,{d:`M10 14a2 2 0 1 0 4 0a2 2 0 1 0-4 0`}),l(`path`,{d:`M14 4l0 4l-6 0l0-4`})],-1)]]),default:S(()=>[w(` `+p(s.$t(`@MINDMAP:保存`)),1)]),_:1},8,[`disabled`,`loading`]),s.store.current?(k(),u(`span`,Ke,[l(`span`,{class:`mm-status-title`,title:s.store.current.title},p(s.store.current.title),9,qe),s.store.dirty?(k(),u(`span`,Je,`●`)):j(`v-if`,!0)])):j(`v-if`,!0)])]),l(`div`,Ye,[j(` 左侧:按目录分组的文件列表 `),l(`div`,Xe,[l(`div`,Ze,[l(`span`,Qe,p(s.$t(`@MINDMAP:文件列表`)),1),e(v,{size:`small`,text:``,loading:s.store.refreshing,onClick:r[3]||=e=>s.store.refresh(),disabled:s.store.dirs.length===0},{icon:S(()=>[...r[14]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M20 11a8.1 8.1 0 0 0-15.5-2m-.5-4v4h4`}),l(`path`,{d:`M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4`})],-1)]]),_:1},8,[`loading`,`disabled`])]),_((k(),u(`div`,$e,[s.store.error?(k(),u(`div`,et,p(s.store.error),1)):j(`v-if`,!0),s.store.dirs.length===0?(k(),n(s.EmptyState,{key:1,class:`mm-sidebar-empty`,size:`inline`,title:s.$t(`@MINDMAP:请先添加目录`)},null,8,[`title`])):(k(!0),u(h,{key:2},m(s.store.groups,t=>(k(),u(`div`,{key:t.dir,class:`mm-group`},[l(`div`,{class:f([`mm-group-header`,{active:s.isActiveDir(t.dir)}]),title:t.dir,onClick:e=>s.toggleGroup(t.dir),onContextmenu:e=>s.openDirContextMenu(e,t.dir)},[e(C,{class:f([`mm-group-caret`,{collapsed:s.collapsedGroups[t.dir]}])},{default:S(()=>[j(` chevron-down.svg(Tabler icons,MIT):收起态由 CSS 旋转 -90° `),r[15]||=l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M6 9l6 6l6-6`})],-1)]),_:1},8,[`class`]),l(`div`,nt,[l(`div`,rt,[l(`span`,it,p(s.baseName(t.dir)),1),l(`span`,at,p(t.files.length),1)]),l(`div`,ot,p(t.dir),1)])],42,tt),_(l(`div`,st,[t.error?(k(),u(`div`,{key:0,class:`mm-group-error`,title:t.error},[l(`span`,null,p(s.$t(`@MINDMAP:目录不存在或已删除`)),1),e(v,{size:`small`,text:``,type:`danger`,onClick:e=>s.handleRemoveDir(t.dir)},{default:S(()=>[w(p(s.$t(`@MINDMAP:移除目录`)),1)]),_:1},8,[`onClick`])],8,ct)):t.files.length===0?(k(),n(s.EmptyState,{key:1,class:`mm-sidebar-empty`,size:`inline`,title:s.$t(`@MINDMAP:该目录暂无思维导图`)},null,8,[`title`])):(k(!0),u(h,{key:2},m(t.files,t=>(k(),u(`div`,{key:t.path,class:f([`mm-file-item`,{active:s.store.current?.path===t.path}]),onClick:e=>s.handleOpenFile(t.path)},[l(`div`,ut,[l(`div`,{class:`mm-file-title`,title:t.title},p(t.title),9,dt),l(`div`,ft,p(s.formatTime(t.mtime))+` · `+p(s.formatSize(t.size)),1)]),l(`div`,{class:`mm-file-actions`,onClick:r[4]||=y(()=>{},[`stop`])},[e(v,{size:`small`,text:``,icon:s.Edit,onClick:e=>s.handleRename(t),title:s.$t(`@MINDMAP:重命名`)},null,8,[`icon`,`onClick`,`title`]),e(v,{size:`small`,text:``,type:`danger`,icon:s.Delete,onClick:e=>s.handleDelete(t),title:s.$t(`@MINDMAP:删除`)},null,8,[`icon`,`onClick`,`title`])])],10,lt))),128))],512),[[E,!s.collapsedGroups[t.dir]]])]))),128))])),[[T,s.store.refreshing]])]),j(` 右侧:画布 + g ai 面板(与文件空间同一套:分隔条贴在面板左边缘,向左拖变宽) `),l(`div`,pt,[l(`div`,mt,[j(" AI 导图草稿条:模型在回答里给了 ```mindmap 大纲才有。\n 平铺一条通栏,不用「圆角 + 单边框」的卡片 —— 它是画布上的一条横幅,不是浮块。 "),s.draft?(k(),u(`div`,ht,[l(`span`,gt,p(s.$t(`@MINDMAP:AI 导图草稿`)),1),l(`span`,{class:`mm-draft-title`,title:s.draft.title},p(s.draft.title),9,_t),l(`span`,vt,p(s.$t(`@MINDMAP:个节点`,{n:s.draft.nodes})),1),r[17]||=l(`span`,{class:`mm-draft-spacer`},null,-1),s.store.current?(k(),u(`button`,{key:0,class:`mm-draft-btn mm-draft-btn--primary`,onClick:s.applyDraftToCurrent},p(s.$t(`@MINDMAP:应用到当前导图`)),1)):j(`v-if`,!0),l(`button`,{class:`mm-draft-btn`,disabled:s.store.dirs.length===0,onClick:s.applyDraftAsNew},p(s.$t(`@MINDMAP:另存为新导图`)),9,yt),l(`button`,{class:`mm-draft-close`,title:s.$t(`@MINDMAP:关闭草稿`),"aria-label":s.$t(`@MINDMAP:关闭草稿`),onClick:s.dismissDraft},[...r[16]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[l(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),l(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,bt)])):j(`v-if`,!0),l(`div`,xt,[s.store.current?(k(),n(s.MindMap,{key:s.mmKey,ref:`mmRef`,data:s.mmData,"preview-mode":s.previewMode,onChange:s.onMindMapChange,onSelect:s.onMindMapSelect,onCanvasTogglePreview:s.onCanvasTogglePreview},null,8,[`data`,`preview-mode`])):(k(),n(s.EmptyState,{key:0,class:`mm-editor-empty`,title:s.$t(`@MINDMAP:思维导图编辑器`),hint:s.store.dirs.length>0?s.$t(`@MINDMAP:从左侧选择或新建`):s.$t(`@MINDMAP:先选择目录提示`)},{icon:S(()=>[...r[18]||=[l(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`circle`,{cx:`12`,cy:`12`,r:`2`}),l(`circle`,{cx:`5`,cy:`5`,r:`2`}),l(`circle`,{cx:`19`,cy:`5`,r:`2`}),l(`circle`,{cx:`5`,cy:`19`,r:`2`}),l(`circle`,{cx:`19`,cy:`19`,r:`2`}),l(`line`,{x1:`10.5`,y1:`10.5`,x2:`6.5`,y2:`6.5`}),l(`line`,{x1:`13.5`,y1:`10.5`,x2:`17.5`,y2:`6.5`}),l(`line`,{x1:`10.5`,y1:`13.5`,x2:`6.5`,y2:`17.5`}),l(`line`,{x1:`13.5`,y1:`13.5`,x2:`17.5`,y2:`17.5`})],-1)]]),_:1},8,[`title`,`hint`]))])]),j(` 分隔条:全屏时这一列整个让给面板 `),s.showAi&&!s.aiFullscreen?(k(),u(`div`,{key:0,class:`mm-resizer`,onMousedown:s.startAiResize},null,32)):j(`v-if`,!0),j(` g ai 对话:v-if 懒挂载 + v-show 保状态(切走再切回来,进行中的流还在) `),s.aiOpened?_((k(),n(s.EditorAgentPanel,{key:1,class:`mm-ai-panel`,active:s.showAi,"active-file-path":s.store.current?.path||``,"active-file-name":s.currentFileName,"context-note":s.aiContextNote,fullscreen:s.aiFullscreen&&s.showAi,style:o(s.aiStyle),onClose:s.closeAi,onToggleFullscreen:r[5]||=e=>s.aiFullscreen=!s.aiFullscreen,onAssistantDone:s.onAssistantDone},null,8,[`active`,`active-file-path`,`active-file-name`,`context-note`,`fullscreen`,`style`])),[[E,s.showAi]]):j(`v-if`,!0)])]),j(` 目录选择(local-file-picker,支持多选目录) `),j(` 传入当前目标目录作为 defaultPath:用户添加目录时不用每次都从根目录找,
35
- 已选过的话直接定位到上次的位置;无效时 picker 自动回落到用户目录 `),e(s.FilePicker,{visible:s.filePickerVisible,mode:`directory`,multiple:!0,theme:s.isDark?`dark`:`light`,locale:s.currentLocale,"default-path":s.store.activeDir||s.store.dirs[0]||``,onClose:r[6]||=e=>s.filePickerVisible=!1,onConfirm:s.onPickerConfirm},null,8,[`visible`,`theme`,`locale`,`default-path`]),j(` 目录右键菜单:打开目录 / 在此新建 / 移除目录 `),(k(),n(re,{to:`body`},[s.ctxMenu?(k(),u(`div`,{key:0,class:`ctx-menu`,style:o({left:s.ctxMenu.x+`px`,top:s.ctxMenu.y+`px`}),onClick:r[7]||=y(()=>{},[`stop`])},[l(`button`,{class:`ctx-menu-item`,onClick:s.ctxOpenDir},[j(` folder icon `),r[19]||=l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`path`,{d:`M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`}),l(`path`,{d:`M3 7v10a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2`})],-1),w(` `+p(s.$t(`@MINDMAP:打开目录`)),1)]),l(`button`,{class:`ctx-menu-item`,onClick:s.ctxNewFile},[j(` new-file icon `),r[20]||=l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`path`,{d:`M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z`}),l(`polyline`,{points:`14 2 14 8 20 8`}),l(`line`,{x1:`12`,y1:`13`,x2:`12`,y2:`19`}),l(`line`,{x1:`9`,y1:`16`,x2:`15`,y2:`16`})],-1),w(` `+p(s.$t(`@MINDMAP:在此新建`)),1)]),r[22]||=l(`div`,{class:`ctx-menu-sep`},null,-1),l(`button`,{class:`ctx-menu-item ctx-menu-item--danger`,onClick:s.ctxRemoveDir},[j(` trash icon `),r[21]||=l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`polyline`,{points:`3 6 5 6 21 6`}),l(`path`,{d:`M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6`}),l(`path`,{d:`M10 11v6`}),l(`path`,{d:`M14 11v6`}),l(`path`,{d:`M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2`})],-1),w(` `+p(s.$t(`@MINDMAP:移除目录`)),1)])],4)):j(`v-if`,!0)]))])}var Ct=ue(ze,[[`render`,St],[`__scopeId`,`data-v-b157fbd3`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/MindmapView.vue`]]);export{Ct as default};
@@ -1 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,C as t,Cn as n,Gn as r,In as i,J as a,Mn as o,S as s,Sn as c,Tn as l,Xr as u,Y as d,Yn as f,_n as p,et as m,gr as h,i as g,ir as _,jr as v,lr as y,qn as b,w as x,wn as S,xn as C}from"./element-plus-BeZBQw4X.js";import{n as w,t as T}from"./_plugin-vue_export-helper-BFvqRHs6.js";import{d as E,m as D,t as O}from"./configStore-BiJopZl2.js";import{t as k}from"./toolsStore-DTNnZxXM.js";import{A,E as j,L as M,T as N}from"./index-B85tzLZT.js";import{s as P}from"./taskExecutionExport-CXKV0l1N.js";y();var F=1e5;function I(){let e=h([]),t=h([]),n=h(F),r=h([]),i=h(null),a=h(!1),o=h(!1),s=h(``),c=h({}),l=h([]),u=h(!1),d=h(!1),f=h(j);async function p(o=!1){try{let l=await fetch(`/api/workbench/orchestrator`,{cache:`no-store`}).then(e=>e.json());return l?.success?(Number.isInteger(l.maxInstructionChars)&&l.maxInstructionChars>0&&(n.value=l.maxInstructionChars),e.value=Array.isArray(l.instructions)?l.instructions:[],t.value=Array.isArray(l.activity)?l.activity:[],r.value=Array.isArray(l.running)?l.running:[],N().setRunning(r.value.length),i.value=l.updatedAt||null,s.value=typeof l.defaultPrompt==`string`?l.defaultPrompt:``,c.value=l.projectPrompts&&typeof l.projectPrompts==`object`?l.projectPrompts:{},f.value=A(l.reportIntervalMs),a.value=!0,!0):(o||g.error(l?.error||w(`@WORKBENCH:读取编排状态失败`)),!1)}catch(e){return o||g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function m(e=!1){if(u.value)return!1;u.value=!0;try{let t=await fetch(`/api/workbench/orchestrator/reports`,{cache:`no-store`}).then(e=>e.json());return t?.success?(l.value=Array.isArray(t.reports)?t.reports:[],!0):(e||g.error(t?.error||w(`@WORKBENCH:读取进度报告失败`)),!1)}catch(t){return e||g.error(w(`@WORKBENCH:网络错误: `)+(t?.message||t)),!1}finally{u.value=!1}}async function _(){if(d.value)return null;d.value=!0;try{let e=String(O().locale||``).startsWith(`en`)?`en`:`zh`,t=await fetch(`/api/workbench/orchestrator/report`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({locale:e})}).then(e=>e.json());return t?.success?t.report?(l.value=[t.report,...l.value].slice(0,20),t.report):(g.info(w(`@WORKBENCH:当前没有正在执行的任务,没有可汇报的进度`)),null):(g.error(t?.error||w(`@WORKBENCH:生成进度报告失败`)),null)}catch(e){return g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{d.value=!1}}async function v(e){try{let t=await fetch(`/api/workbench/orchestrator/report-interval`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({intervalMs:e})}).then(e=>e.json());return t?.success?(f.value=A(t.reportIntervalMs),!0):(g.error(t?.error||w(`@WORKBENCH:保存失败`)),!1)}catch(e){return g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function y(e){try{let t=await fetch(`/api/workbench/orchestrator/default-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e})}).then(e=>e.json());return t?.success?(s.value=typeof t.defaultPrompt==`string`?t.defaultPrompt:``,g.success(w(`@WORKBENCH:已保存全局预设提示词`)),!0):(g.error(t?.error||w(`@WORKBENCH:保存失败`)),!1)}catch(e){return g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function b(e,t){try{let n=await fetch(`/api/workbench/orchestrator/project-prompt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({projectPath:e,prompt:t})}).then(e=>e.json());return n?.success?(c.value=n.projectPrompts&&typeof n.projectPrompts==`object`?n.projectPrompts:{},g.success(w(`@WORKBENCH:已保存项目预设提示词`)),!0):(g.error(n?.error||w(`@WORKBENCH:保存失败`)),!1)}catch(e){return g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),!1}}async function x(e){if(o.value)return null;o.value=!0;try{let t=await fetch(`/api/workbench/orchestrator/dispatch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({text:e.text,projectPath:e.projectPath||``,autoRun:e.autoRun!==!1,useDefaultPrompt:e.useDefaultPrompt!==!1,executor:e.executor,imageText:e.imageText,attachments:(e.attachments||[]).map(e=>({id:e.id,ext:e.ext,originalName:e.originalName}))})}).then(e=>e.json());return t?.success?(await p(!0),{task:t.task||null,ran:!!t.ran}):(g.error(t?.error||w(`@WORKBENCH:派发失败`)),null)}catch(e){return g.error(w(`@WORKBENCH:网络错误: `)+(e?.message||e)),null}finally{o.value=!1}}return{instructions:e,activity:t,running:r,updatedAt:i,loaded:a,dispatching:o,maxInstructionChars:n,defaultPrompt:s,projectPrompts:c,reports:l,loadingReports:u,generatingReport:d,reportIntervalMs:f,loadOrchestrator:p,dispatch:x,saveDefaultPrompt:y,saveProjectPrompt:b,loadReports:m,generateReport:_,setReportInterval:v}}i();var L=o({__name:`TaskExecutorPicker`,props:{title:{type:String,required:!1},readonly:{type:Boolean,required:!1},value:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,{active:i,availability:a,choose:o,executorModelText:s,executorModelTitle:c}=P(),l=C(()=>n.readonly&&n.value?n.value:i.value),u=k();r(()=>{u.fetchExecutorModels()});function f(){return[n.title,c(l.value)].filter(Boolean).join(` · `)}let p={props:n,active:i,availability:a,choose:o,executorModelText:s,executorModelTitle:c,displayed:l,toolsStore:u,btnTitle:f,get ArrowDown(){return d},get Check(){return m},get $t(){return w},TaskExecutorIcon:M,get TASK_EXECUTOR_OPTIONS(){return E},get taskExecutorName(){return D}};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}});i(),v();var R={key:0,class:`tep tep--static`},z=[`title`,`aria-label`],B={class:`tep__btn-name`},V={class:`tep__btn-tag`},H=[`title`,`aria-label`],U={class:`tep__btn-name`},W={class:`tep__item`},G={class:`tep__item-name`},K=[`title`],q={key:2,class:`tep__item-missing`};function J(r,i,o,d,m,h){let g=a,v=t,y=x,C=s;return b(),l(p,null,[S(` 只读态:不是禁用下拉,而是**根本不是下拉** —— 禁用态的下拉点开是空的,更像坏了 `),o.readonly?(b(),l(`span`,R,[c(`span`,{class:`tep__btn`,title:d.btnTitle(),"aria-label":d.$t(`@WORKBENCH:任务执行器`)},[e(d.TaskExecutorIcon,{executor:d.displayed,class:`tep__btn-icon`},null,8,[`executor`]),c(`span`,B,u(d.taskExecutorName(d.displayed)),1),c(`span`,V,u(d.$t(`@AGENT:按优先级`)),1)],8,z)])):(b(),n(C,{key:1,trigger:`click`,class:`tep`,onCommand:d.choose},{dropdown:_(()=>[e(y,null,{default:_(()=>[(b(!0),l(p,null,f(d.TASK_EXECUTOR_OPTIONS,t=>(b(),n(v,{key:t.id,command:t.id,disabled:!d.availability[t.id]},{default:_(()=>[c(`span`,W,[e(d.TaskExecutorIcon,{executor:t.id,class:`tep__item-icon`},null,8,[`executor`]),c(`span`,G,u(t.name),1),d.executorModelText(t.id)?(b(),l(`span`,{key:0,class:`tep__item-model`,title:d.executorModelTitle(t.id)},u(d.executorModelText(t.id)),9,K)):S(`v-if`,!0),d.displayed===t.id?(b(),n(g,{key:1,class:`tep__item-check`},{default:_(()=>[e(d.Check)]),_:1})):d.availability[t.id]?S(`v-if`,!0):(b(),l(`span`,q,u(d.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`,`disabled`]))),128))]),_:1})]),default:_(()=>[c(`button`,{type:`button`,class:`tep__btn`,title:d.btnTitle(),"aria-label":d.$t(`@WORKBENCH:任务执行器`)},[e(d.TaskExecutorIcon,{executor:d.displayed,class:`tep__btn-icon`},null,8,[`executor`]),c(`span`,U,u(d.taskExecutorName(d.displayed)),1),e(g,{class:`tep__btn-caret`},{default:_(()=>[e(d.ArrowDown)]),_:1})],8,H)]),_:1},8,[`onCommand`]))],2112)}var Y=T(L,[[`render`,J],[`__scopeId`,`data-v-7674ee77`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/TaskExecutorPicker.vue`]]);export{I as n,Y as t};