zen-gitsync 2.18.20 → 2.18.22

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 (88) hide show
  1. package/package.json +4 -1
  2. package/src/cli/ai/agent.js +9 -2
  3. package/src/cli/ai/extensions.js +1 -1
  4. package/src/cli/ai/runtime.test.js +57 -1
  5. package/src/cli/ai/termui.js +11 -2
  6. package/src/cli/ai/tools.js +266 -5
  7. package/src/cli/ai/tools.test.js +81 -0
  8. package/src/cli/ai/transport.js +1 -1
  9. package/src/cli/ai/turn.js +59 -3
  10. package/src/config.js +60 -4
  11. package/src/mcp/install.js +548 -529
  12. package/src/ui/public/assets/AgentView-DdiyBMDD.js +26 -0
  13. package/src/ui/public/assets/{AgentView-BE7GD8rc.css → AgentView-_DUYxFmp.css} +1 -1
  14. package/src/ui/public/assets/{AppVersionBadge-86tbKU20.js → AppVersionBadge-CSEM45L4.js} +2 -2
  15. package/src/ui/public/assets/{BranchSelector-CsrkmTCA.js → BranchSelector-cSx2ZxYM.js} +1 -1
  16. package/src/ui/public/assets/ChatSilenceBadge-Dtv23ZmV.js +16 -0
  17. package/src/ui/public/assets/{CommitForm-DBK0GXEh.js → CommitForm-CrAsbDkq.js} +2 -2
  18. package/src/ui/public/assets/{CommonDialog-BkuDIWro.js → CommonDialog-BtO3uKdw.js} +1 -1
  19. package/src/ui/public/assets/{EditorView-CnWsMdHg.css → EditorView-B-t-nuf0.css} +1 -1
  20. package/src/ui/public/assets/EditorView-BesiWTV2.js +10 -0
  21. package/src/ui/public/assets/{FlowExecutionViewer-ClUkAmA2.js → FlowExecutionViewer-CfU9DLFG.js} +1 -1
  22. package/src/ui/public/assets/{FlowOrchestrationWorkspace-B3sOK3fz.js → FlowOrchestrationWorkspace-D3CSRMvG.js} +1 -1
  23. package/src/ui/public/assets/{LogList-6aO0-2xh.js → LogList-CT-SRIS3.js} +4 -4
  24. package/src/ui/public/assets/MindmapView-BCGq2zdh.js +35 -0
  25. package/src/ui/public/assets/MindmapView-CoUbyadF.css +1 -0
  26. package/src/ui/public/assets/{MonitorView-fcNrgVaU.js → MonitorView-BuBJJVhR.js} +1 -1
  27. package/src/ui/public/assets/{ProjectManagerView-CZfrML6A.js → ProjectManagerView-DlSfRn9N.js} +2 -2
  28. package/src/ui/public/assets/{ProjectStartupButton-D5MREz6F.js → ProjectStartupButton-DKZttDb3.js} +1 -1
  29. package/src/ui/public/assets/RemoteManagerDialog-CVrhhUPg.js +4 -0
  30. package/src/ui/public/assets/{RemoteRepoCard-CTnmfv2y.js → RemoteRepoCard-CmdYDF24.js} +1 -1
  31. package/src/ui/public/assets/{SourceMapView-B4q5qiE8.js → SourceMapView-DClgTmda.js} +1 -1
  32. package/src/ui/public/assets/{SvgIcon-WpEiC1rI.js → SvgIcon-D5fhBiJr.js} +1 -1
  33. package/src/ui/public/assets/TaskExecutorPicker-CzvWdS_K.js +1 -0
  34. package/src/ui/public/assets/TaskExecutorPicker-Dn8SgrTZ.css +1 -0
  35. package/src/ui/public/assets/{UserInputNode-Deoc3UvQ.js → UserInputNode-CNuW_Dtu.js} +1 -1
  36. package/src/ui/public/assets/WorkbenchView-D61DxNnn.css +1 -0
  37. package/src/ui/public/assets/WorkbenchView-WKNPn-oz.js +341 -0
  38. package/src/ui/public/assets/_plugin-vue_export-helper-E2AaPXn7.js +19 -0
  39. package/src/ui/public/assets/configStore-JIX2MOKo.js +1 -0
  40. package/src/ui/public/assets/{dagre-CpKxpMNH.js → dagre-yiQDclZv.js} +3 -3
  41. package/src/ui/public/assets/{element-plus-Bz6lYur-.js → element-plus-BeZBQw4X.js} +1 -1
  42. package/src/ui/public/assets/{flow-mindmap-cTg78Krq.js → flow-mindmap-CGjPqCv0.js} +1 -1
  43. package/src/ui/public/assets/{index-cDiVh_ZL.js → index-Cjv2Z6nF.js} +134 -125
  44. package/src/ui/public/assets/index-IjYv2goK.css +1 -0
  45. package/src/ui/public/assets/{monaco-CvMddat7.js → monaco-CMQow_j-.js} +1 -1
  46. package/src/ui/public/assets/{office-docx-VOB-i4K2.js → office-docx-nuGPI15f.js} +1 -1
  47. package/src/ui/public/assets/{office-excel-CJ2JvfA8.js → office-excel-CK-HOYi8.js} +1 -1
  48. package/src/ui/public/assets/{office-pptx-Z88k9qnx.js → office-pptx-9onMeLux.js} +1 -1
  49. package/src/ui/public/assets/{relativeTime-CoXAs57j.js → relativeTime-DHhE9Ihn.js} +1 -1
  50. package/src/ui/public/assets/taskExecutionExport-DlBMELzX.js +15 -0
  51. package/src/ui/public/assets/toolsStore-h5iqPyST.js +1 -0
  52. package/src/ui/public/assets/{useWorkbenchProjects-BS59r5Rj.js → useWorkbenchProjects-DW3vBHpK.js} +1 -1
  53. package/src/ui/public/assets/{vendor-CSFGMcMB.css → vendor-CAhoE06w.css} +1 -1
  54. package/src/ui/public/assets/{vendor-C2k0GBzj.js → vendor-KxSgeiUX.js} +303 -303
  55. package/src/ui/public/assets/{vue-flow-Cnxq2qrs.js → vue-flow-BMMiguH1.js} +1 -1
  56. package/src/ui/public/index.html +14 -14
  57. package/src/ui/server/routes/config.js +13 -0
  58. package/src/ui/server/routes/fileOpen.js +1851 -1736
  59. package/src/ui/server/routes/fileOpen.test.js +39 -1
  60. package/src/ui/server/routes/workbench/agentChat.js +48 -8
  61. package/src/ui/server/routes/workbench/agentChatShared.test.js +584 -496
  62. package/src/ui/server/routes/workbench/agentEngines.js +7 -4
  63. package/src/ui/server/routes/workbench/executorModels.js +25 -4
  64. package/src/ui/server/routes/workbench/executorModels.test.js +557 -530
  65. package/src/ui/server/routes/workbench/jobActivity.js +2 -2
  66. package/src/ui/server/routes/workbench/taskRunner.codearts.test.js +252 -0
  67. package/src/ui/server/routes/workbench/taskRunner.codebuddy.test.js +317 -317
  68. package/src/ui/server/routes/workbench/taskRunner.js +216 -7
  69. package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +130 -130
  70. package/src/ui/server/routes/workbench/taskRunner.pi.test.js +298 -298
  71. package/src/ui/public/assets/AgentView-Du9akUeZ.js +0 -12
  72. package/src/ui/public/assets/ChatSilenceBadge-BBoFeSqe.js +0 -21
  73. package/src/ui/public/assets/EditorAgentPanel-BMUphuG0.css +0 -1
  74. package/src/ui/public/assets/EditorAgentPanel-KiHbQPJP.js +0 -34
  75. package/src/ui/public/assets/EditorView-B18B4yNJ.js +0 -13
  76. package/src/ui/public/assets/MindmapView-BDI3D_1h.css +0 -1
  77. package/src/ui/public/assets/MindmapView-aJ9TTijE.js +0 -4
  78. package/src/ui/public/assets/RecentDirectoriesChat-DBGoUlkn.css +0 -1
  79. package/src/ui/public/assets/RecentDirectoriesChat-wfkSF6NU.js +0 -3
  80. package/src/ui/public/assets/RemoteManagerDialog-BBwNlK9J.js +0 -4
  81. package/src/ui/public/assets/WorkbenchView-CVqXb__l.css +0 -1
  82. package/src/ui/public/assets/WorkbenchView-CijzpDWN.js +0 -360
  83. package/src/ui/public/assets/_plugin-vue_export-helper-BhdsvhKo.js +0 -19
  84. package/src/ui/public/assets/agentConversations-DaAtF1v4.js +0 -10
  85. package/src/ui/public/assets/configStore-Drlw8KtR.js +0 -1
  86. package/src/ui/public/assets/index-DSQ6mp_N.css +0 -1
  87. package/src/ui/public/assets/toolsStore-CnX34C96.js +0 -1
  88. package/src/ui/public/assets/useOrchestrator-BXmxJsRl.js +0 -1
@@ -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-BhdsvhKo.js";import{t as ae}from"./configStore-Drlw8KtR.js";import{t as oe}from"./CommonDialog-BkuDIWro.js";import{ft as Y,j as se,pt as ce,tt as le,ut as ue}from"./index-cDiVh_ZL.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-DaAtF1v4.js";import{c as Se,d as Ce,n as we,t as Te,u as Ee}from"./ChatSilenceBadge-BBoFeSqe.js";import{t as De}from"./useOrchestrator-BXmxJsRl.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=ae(),a=j([]),c=j([]),l=j([]),u=j(!1),d=j(``),f=j(``),p=j([]),m=j(`project`),g=j(new Set),_=j(new Set),b=j(new Set),x=G(()=>r.currentDirectory||``),{theme:S}=le(),C=G(()=>S.value===`dark`),w=j(new Set),T=new Map;function E(e){let t=T.get(e);t&&clearTimeout(t),T.delete(e)}function O(e){let t=K(e);qe(e,C.value).url&&(E(t),T.set(t,setTimeout(()=>{T.delete(t),w.value.add(t)},Je)))}v(()=>{for(let e of T.values())clearTimeout(e);T.clear()});function A(e){let t=qe(e,C.value);return w.value.has(K(e))?{...t,url:``}:t}function N(e){E(K(e))}function P(e){E(K(e)),w.value.add(K(e))}let F=G(()=>a.value.reduce((e,t)=>e+(t.status===`ok`?t.items.length:0),0)),I=null;async function L(){try{let e=await(await fetch(`/api/agent/marketplace/sources?type=${n.type}`)).json();e?.success&&(c.value=e.sources||[])}catch{}}let R=!1;async function V(){if(u.value){R=!0;return}u.value=!0;try{let e=new URLSearchParams({type:n.type,cwd:x.value});f.value&&e.set(`q`,f.value),p.value.length&&e.set(`sources`,p.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();if(t?.success){a.value=t.groups||[],l.value=t.installed||[];for(let e of a.value)for(let t of e.items)O(t)}else M.error(t?.error||q(`@MKT:加载失败`))}catch{M.error(q(`@MKT:加载失败`))}finally{u.value=!1,R&&(R=!1,V())}}B(d,e=>{I&&clearTimeout(I),I=setTimeout(()=>{f.value=e.trim(),V()},400)}),B(p,()=>V(),{deep:!0}),B(()=>n.type,()=>{p.value=[],f.value=``,d.value=``,L(),V()}),B(x,()=>V()),L(),V();let H=G(()=>{let e=x.value?x.value.split(/[\\/]/).filter(Boolean).pop():``;return m.value===`project`?e||q(`@MKT:当前项目`):q(`@MKT:g ai 智能体`)});function U(e){return e.stars?`${W(e.stars)} ★`:e.downloads?`${W(e.downloads)} ${q(`@MKT:周下载`)}`:e.uses?`${W(e.uses)} ${q(`@MKT:次使用`)}`:``}function W(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function K(e){return`${e.id}`}function ie(e){return g.value.has(K(e))}let J=G(()=>{let e={project:[],global:[]};for(let t of l.value)(e[t.target]||=[]).push(t);return e}),Y=z({visible:!1,item:null,env:{},args:``});function se(e){return n.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function ce(e){Y.item=e,Y.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),Y.args=(e.args||[]).join(` `),Y.visible=!0}function ue(){let e=Y.item;if(Y.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(Y.env).filter(([,e])=>e.trim()!==``)),n=Y.args.trim()?Y.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;fe(e,{env:t,...n?{args:n}:{}})}async function de(e){if(!e.installed||await pe(e)){if(se(e)){ce(e);return}await fe(e,{})}}async function fe(e,t){let r=K(e);g.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:m.value,cwd:x.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 V()}catch{M.error(q(`@MKT:安装失败`))}finally{g.value.delete(r)}}async function pe(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 me(e){let t=`${e.target}:${e.id}`;b.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:x.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{b.value.delete(t)}}async function he(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}`;_.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:x.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 V()}catch{M.error(q(`@MKT:卸载失败`))}finally{_.value.delete(t)}}let ge={props:n,configStore:r,groups:a,sources:c,installed:l,loading:u,searchInput:d,query:f,selectedSources:p,installTarget:m,installing:g,removing:_,revealing:b,cwd:x,currentTheme:S,isDark:C,ICON_FALLBACK_MS:Je,iconErrors:w,iconTimers:T,settleIconTimer:E,scheduleIconFallback:O,iconOf:A,onIconLoad:N,onIconError:P,totalCount:F,get searchTimer(){return I},set searchTimer(e){I=e},loadSources:L,get reloadQueued(){return R},set reloadQueued(e){R=e},loadCatalog:V,targetLabel:H,metricText:U,formatCount:W,cardKey:K,isBusy:ie,installedByTarget:J,configDialog:Y,needsConfig:se,openConfigDialog:ce,confirmConfig:ue,onInstall:de,doInstall:fe,confirmReinstall:pe,onReveal:me,onRemove:he,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:oe};return Object.defineProperty(ge,"__isScriptSetup",{enumerable:!1,value:!0}),ge}});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.sources,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=ae(),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:oe};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=ae(),{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(()=>ce(h.value)||h.value),_=G(()=>{let e=Y(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=ae(),o=ue(),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(),oe=G(()=>z.value?L.value:R.value);function Y(e){z.value||V(e)}let ce=G(()=>{let e=i.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),le=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(()=>se(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:oe,handleEngineSelect:Y,chatTheme:ce,inputModelName:le,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,21 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,C as n,Cn as r,Gn as i,In as a,J as o,Mn as s,S as c,Sn as l,Tn as u,Un as d,Wr as f,Xr as p,Y as m,Yn as h,_n as g,et as ee,gr as _,i as v,ir as y,jr as b,kn as x,lr as S,qn as C,w,wn as T,xn as E}from"./element-plus-Bz6lYur-.js";import{n as D,t as O}from"./_plugin-vue_export-helper-BhdsvhKo.js";import{t as k}from"./SvgIcon-WpEiC1rI.js";import{c as A,l as j,s as te,t as ne}from"./configStore-Drlw8KtR.js";import{t as re}from"./toolsStore-CnX34C96.js";import{E as ie,G as ae}from"./index-cDiVh_ZL.js";import{f as oe,h as M,m as se,n as ce,p as le}from"./agentConversations-DaAtF1v4.js";import{n as ue}from"./relativeTime-CoXAs57j.js";a(),S();function N(e,n=680){let r=_(0),a=null;function o(){let t=e.value;return t?(r.value=t.clientWidth,typeof ResizeObserver>`u`||(a=new ResizeObserver(e=>{let t=e[0]?.contentRect?.width;typeof t==`number`&&(r.value=t)}),a.observe(t),!0)):!1}return i(()=>{o()||t(()=>o())}),d(()=>{a?.disconnect(),a=null}),{width:r,narrow:E(()=>r.value>0&&r.value<n)}}S();var P=`agent.convListCollapsed.v1`;function F(){try{return localStorage.getItem(P)===`1`}catch{return!1}}var I=_(F());function L(){function e(e){I.value=e;try{localStorage.setItem(P,e?`1`:`0`)}catch{}}return{convListCollapsed:I,setConvListCollapsed:e}}a();function R(){let e=ne(),t=re(),n=E({get:()=>e.resolvedTaskExecutor,set:t=>{A(t)&&e.setLastTaskExecutor(t)}}),r=E(()=>({claude:t.claudeAvailable,opencode:t.opencodeAvailable,codex:t.codexAvailable,codebuddy:t.codebuddyAvailable,pi:t.piAvailable})),i=E(()=>te.some(e=>r.value[e.id])),a=E(()=>r.value[n.value]?n.value:Object.keys(r.value).find(e=>r.value[e])??n.value);function o(e){r.value[e]&&(n.value=e)}function s(e){return t.executorModelText(e)}function c(e){return[s(e),t.executorModelDetail(e)].filter(Boolean).join(` · `)}return{selected:n,active:a,availability:r,hasAnyExecutor:i,choose:o,executorModelText:s,executorModelTitle:c}}a(),S();var z=s({__name:`AgentEngineSelector`,props:{engine:{type:String,required:!0},locked:{type:Boolean,required:!1}},emits:[`select`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,{availability:s}=R(),l=E(()=>se(i.engine)),u=E(()=>({gai:!0,...s.value})),d=_(!1),f=_(null);function p(e){if(!i.locked){if(!u.value[e]){if(!M(e))return;f.value=e,d.value=!0;return}a(`select`,e)}}let h={props:i,emit:a,executorAvailability:s,engineName:l,engineAvailability:u,installDialogVisible:d,installTool:f,onCommand:p,get $t(){return D},get ElIcon(){return o},get ElDropdown(){return c},get ElDropdownMenu(){return w},get ElDropdownItem(){return n},get ArrowDown(){return m},get Check(){return ee},get AGENT_ENGINE_OPTIONS(){return oe},get BUILTIN_ENGINE_ICON(){return le},get isExternalAgentEngine(){return M},SvgIcon:k,TaskExecutorIcon:ie,ToolInstallDialog:ae};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}});a(),b();var B={class:`agent-engine`},V=[`disabled`,`title`,`aria-label`],H={class:`agent-engine__name`},U={class:`agent-engine__item`},de={class:`agent-engine__item-name`},fe={key:3,class:`agent-engine__item-missing`};function pe(t,n,i,a,o,s){return C(),u(g,null,[T(` 单根包一层:父级传下来的 class(Tab 行的 margin-left:auto、面板的 flex:none)
2
- 才能可靠落到这里 —— 多根组件会丢掉 fallthrough class。 `),l(`div`,B,[e(a.ElDropdown,{trigger:`click`,onCommand:a.onCommand},{dropdown:y(()=>[e(a.ElDropdownMenu,null,{default:y(()=>[(C(!0),u(g,null,h(a.AGENT_ENGINE_OPTIONS,t=>(C(),r(a.ElDropdownItem,{key:t.id,command:t.id},{default:y(()=>[l(`span`,U,[a.isExternalAgentEngine(t.id)?(C(),r(a.TaskExecutorIcon,{key:0,executor:t.id,class:`agent-engine__item-icon`},null,8,[`executor`])):(C(),r(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__item-icon`},null,8,[`icon-class`])),l(`span`,de,p(t.name),1),i.engine===t.id?(C(),r(a.ElIcon,{key:2,class:`agent-engine__item-check`},{default:y(()=>[e(a.Check)]),_:1})):a.engineAvailability[t.id]?T(`v-if`,!0):(C(),u(`span`,fe,p(a.$t(`@42BB9:未安装`)),1))])]),_:2},1032,[`command`]))),128))]),_:1})]),default:y(()=>[l(`button`,{type:`button`,class:f([`agent-engine__btn`,{"is-locked":i.locked}]),disabled:i.locked,title:i.locked?a.$t(`@AGENT:本会话的引擎已锁定;要换引擎请新建会话`):a.$t(`@AGENT:新建会话使用的引擎`),"aria-label":a.$t(`@AGENT:智能体引擎`)},[a.isExternalAgentEngine(i.engine)?(C(),r(a.TaskExecutorIcon,{key:0,executor:i.engine,class:`agent-engine__icon`},null,8,[`executor`])):(C(),r(a.SvgIcon,{key:1,"icon-class":a.BUILTIN_ENGINE_ICON,class:`agent-engine__icon`},null,8,[`icon-class`])),l(`span`,H,p(a.engineName),1),e(a.ElIcon,{class:`agent-engine__caret`},{default:y(()=>[e(a.ArrowDown)]),_:1})],10,V)]),_:1}),e(a.ToolInstallDialog,{modelValue:a.installDialogVisible,"onUpdate:modelValue":n[0]||=e=>a.installDialogVisible=e,tool:a.installTool},null,8,[`modelValue`,`tool`])])],2112)}var me=O(z,[[`render`,pe],[`__scopeId`,`data-v-c67a4d14`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/AgentEngineSelector.vue`]]),he=8192;function ge(e,t){return e.length>t?`…(前文已截断)\n${e.slice(-t)}`:e}function _e(e,t){let n=e||`done`;return n!==`pending`&&n!==`running`||t===`running`||t===`pending`?n:t===`cancelled`||t===`error`?`error`:`done`}function W(e){let t=e?.toolCalls;if(!Array.isArray(t)||t.length===0)return[];let n=e?.status||`done`,r=[];for(let e=0;e<t.length;e++){let i=t[e];if(!i||typeof i!=`object`)continue;let a=_e(i.status,n),o=typeof i.result==`string`?i.result:``;r.push({id:typeof i.id==`string`&&i.id?i.id:`tool-${e}`,name:typeof i.name==`string`?i.name:``,argsPreview:typeof i.argsPreview==`string`?i.argsPreview:``,arguments:typeof i.arguments==`string`?i.arguments:``,result:o?ge(o,he):``,status:a,error:typeof i.error==`string`&&i.error?i.error:void 0})}return r}var ve=`
3
-
4
- ---
5
-
6
- `,ye=`[运行环境 ·`,be=`## 跨会话记忆库`,xe=/\n\n---\n本任务包含 \d+ 个附件(请按文件路径读取[\s\S]*$/,Se=/\n\n续接 #\d+\s*$/;function G(e){let t=e.indexOf(ve);return t===-1?0:t+7}function K(e){let t=typeof e==`string`?e:``;return t?(t.startsWith(ye)&&(t=t.slice(G(t))),t.startsWith(be)&&(t=t.slice(G(t))),t=t.replace(xe,``).replace(Se,``),t.trim()):``}function q(e){switch(e){case`todo`:return D(`@WORKBENCH:待执行`);case`running`:return D(`@WORKBENCH:执行中`);case`done`:return D(`@WORKBENCH:已完成`);case`error`:return D(`@WORKBENCH:出错`);case`cancelled`:return D(`@WORKBENCH:已取消`);case`pending`:return D(`@WORKBENCH:排队中`);default:return e}}function Ce(e){switch(e){case`running`:return`var(--color-primary)`;case`done`:return`#22c55e`;case`error`:return`#ef4444`;case`cancelled`:return`#9ca3af`;case`pending`:return`#f59e0b`;default:return`var(--text-tertiary)`}}function J(e){let t=e?new Date(e):new Date;if(Number.isNaN(t.getTime()))return``;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function we(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n}function Te(e){let t=(e.match(/`+/g)||[]).reduce((e,t)=>Math.max(e,t.length),0),n="`".repeat(Math.max(3,t+1));return`${n}\n${e}\n${n}`}function Y(e,t){return`### ${e}\n\n${t.trim()}`}function Ee(e){let t=[];return e.forEach((e,n)=>{let r=e.name||D(`@WORKBENCH:工具`),i=we(e.argsPreview||``);t.push(`${n+1}. **${r}**${i?` — \`${i}\``:``}`);let a=(e.status===`error`?e.error:e.result)||e.result||e.error||``;a.trim()&&t.push(``,Te(a.trim()))}),t.join(`
7
- `)}function De(e,t={},n={}){let r=Array.isArray(e)?e.filter(Boolean):[],i=n.scope===`brief`,a=[];if(r.forEach((e,t)=>{let n=[],r=K(e.prompt);if(r&&n.push(Y(D(`@WORKBENCH:用户提示词`),r)),!i){let t=(e.thinking||``).trim();t&&n.push(Y(D(`@WORKBENCH:Claude 思考`),t));let r=Ee(W(e));r&&n.push(Y(D(`@WORKBENCH:工具调用`),r))}let o=(e.output||``).trim();o&&n.push(Y(D(`@WORKBENCH:模型返回`),o));let s=(e.error||e.agentError||``).trim();if(s&&n.push(Y(D(`@WORKBENCH:出错`),s)),n.length===0)return;let c=[j(e.agent),q(e.status),J(e.startedAt)].filter(Boolean);a.push(`## ${D(`@WORKBENCH:第 {n} 轮`,{n:t+1})}\n\n*${c.join(` · `)}*\n\n${n.join(`
8
-
9
- `)}`)}),a.length===0)return``;let o=[`# ${(t.title||``).trim()||D(`@WORKBENCH:未命名任务`)}`],s=(t.projectName||``).trim();return s&&o.push(``,`- ${D(`@WORKBENCH:项目:{name}`,{name:s})}`),o.push(`- ${D(`@WORKBENCH:导出时间:{time}`,{time:J((t.now||new Date).toISOString())})}`),`${o.join(`
10
- `)}\n\n---\n\n${a.join(`
11
-
12
- ---
13
-
14
- `)}\n`}function Oe(e,t=120){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n}function ke(e){let t=(e.match(/`+/g)||[]).reduce((e,t)=>Math.max(e,t.length),0),n="`".repeat(Math.max(3,t+1));return`${n}\n${e}\n${n}`}function X(e,t){return`### ${e}\n\n${t.trim()}`}function Ae(e,t){return e===`user`?D(`@AGENT:我`):t}function je(e){if(!Array.isArray(e)||!e.length)return``;let t=[];return e.forEach((e,n)=>{let r=e.name||D(`@AGENT:工具`),i=Oe(e.argsPreview||``);t.push(`${n+1}. **${r}**${i?` — \`${i}\``:``}`);let a=(e.status===`error`?e.error:e.result)||e.result||e.error||``;a.trim()&&t.push(``,ke(a.trim()))}),t.join(`
15
- `)}function Me(e,t,n){if(e.role===`system`)return``;let r=[];if(t){let t=(e.reasoning||``).trim();t&&r.push(X(D(`@AGENT:思考`),t));let n=je(e.toolCalls);n&&r.push(X(D(`@AGENT:工具调用`),n))}let i=(e.content||``).trim();i&&r.push(i);let a=(e.attachments||[]).map(e=>e.name).filter(Boolean);a.length&&r.push(`${D(`@AGENT:附件`)}:${a.join(`、`)}`);let o=(e.error||``).trim();if(o&&r.push(`> ⚠️ ${o}`),r.length===0){if(e.role!==`assistant`)return``;r.push(`*${D(`@AGENT:本轮未输出正文`)}*`)}return`## ${Ae(e.role,n)}\n\n${r.join(`
16
-
17
- `)}`}function Ne(e,t={},n={}){let r=Array.isArray(e)?e.filter(Boolean):[],i=n.scope===`full`,a=(t.assistantName||``).trim()||`g ai`,o=[];for(let e of r){let t=Me(e,i,a);t&&o.push(t)}if(o.length===0)return``;let s=[`${D(`@AGENT:导出时间`)}:${J((t.now||new Date).toISOString())}`],c=(t.engine||``).trim();return c&&s.push(`${D(`@AGENT:引擎`)}:${c}`),s.push(D(`@AGENT:共 {n} 条消息`,{n:o.length})),`${`# ${(t.title||``).trim()||D(`@AGENT:无标题`)}\n\n- ${s.join(` · `)}`}\n\n---\n\n${o.join(`
18
-
19
- ---
20
-
21
- `)}\n`}a(),S();var Pe=s({__name:`CopySessionButton`,props:{messages:{type:Array,required:!0},title:{type:String,required:!1},engine:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,r=_(!1),i=null;d(()=>{i&&clearTimeout(i)});async function a(e){try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function o(e){let t=Ne(n.messages||[],{title:n.title,engine:n.engine,assistantName:ce},{scope:e});if(!t){v.warning(D(`@AGENT:暂无会话内容可复制`));return}if(!await a(t)){v.error(D(`@AGENT:复制失败`));return}r.value=!0,v.success(D(`@AGENT:已复制会话`)),i&&clearTimeout(i),i=setTimeout(()=>{r.value=!1,i=null},1500)}function s(e){o(e===`full`?`full`:`brief`)}let c={props:n,flash:r,get timer(){return i},set timer(e){i=e},copyToClipboard:a,doCopy:o,onCommand:s,get $t(){return D}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}});a(),b();var Fe={class:`csb`},Ie=[`title`,`aria-label`],Z={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},Le={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},Re=[`title`,`aria-label`];function ze(t,r,i,a,o,s){let d=n,m=w,h=c;return C(),u(`div`,Fe,[l(`button`,{type:`button`,class:f([`csb__btn`,{"is-flash":a.flash}]),title:a.$t(`@AGENT:复制本会话的对话内容(默认精简:仅对话正文)`),"aria-label":a.$t(`@AGENT:复制会话`),onClick:r[0]||=e=>a.doCopy(`brief`)},[T(` check / copy(Tabler icons,MIT) `),a.flash?(C(),u(`svg`,Z,[...r[1]||=[l(`path`,{d:`M5 12l5 5l10-10`},null,-1)]])):(C(),u(`svg`,Le,[...r[2]||=[l(`path`,{d:`M7 9.667a2.667 2.667 0 0 1 2.667-2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1-2.667 2.667h-8.666a2.667 2.667 0 0 1-2.667-2.667l0-8.666`},null,-1),l(`path`,{d:`M4.012 16.737a2.005 2.005 0 0 1-1.012-1.737v-10c0-1.1.9-2 2-2h10c.75 0 1.158.385 1.5 1`},null,-1)]]))],10,Ie),e(h,{trigger:`click`,placement:`bottom-end`,onCommand:a.onCommand},{dropdown:y(()=>[e(m,null,{default:y(()=>[e(d,{command:`brief`},{default:y(()=>[x(p(a.$t(`@AGENT:精简:对话正文`)),1)]),_:1}),e(d,{command:`full`},{default:y(()=>[x(p(a.$t(`@AGENT:全量:对话正文 + 思考 + 工具调用`)),1)]),_:1})]),_:1})]),default:y(()=>[l(`button`,{type:`button`,class:`csb__btn csb__caret`,title:a.$t(`@AGENT:选择复制范围`),"aria-label":a.$t(`@AGENT:选择复制范围`)},[T(` chevron-down.svg(Tabler icons,MIT) `),r[3]||=l(`svg`,{viewBox:`0 0 24 24`,width:`11`,height:`11`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[l(`path`,{d:`M6 9l6 6l6-6`})],-1)],8,Re)]),_:1})])}var Be=O(Pe,[[`render`,ze],[`__scopeId`,`data-v-76f63575`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/CopySessionButton.vue`]]);a();var Q=1e4,$=6e4,Ve=s({__name:`ChatSilenceBadge`,props:{silentMs:{type:[Number,null],required:!1,default:null},streaming:{type:Boolean,required:!1,default:!1}},setup(e,{expose:t}){t();let n=e,r={NOTABLE_MS:Q,WARN_MS:$,props:n,visible:E(()=>n.streaming&&n.silentMs!==null&&n.silentMs>=Q),warn:E(()=>(n.silentMs??0)>=$),get $t(){return D},get formatDurationMs(){return ue}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}});a(),b();var He=[`title`];function Ue(e,t,n,r,i,a){return r.visible?(C(),u(`span`,{key:0,class:f([`chat-silence`,{"is-warn":r.warn}]),title:r.$t(`@AGENT:已经有一段时间没有收到模型的输出与工具调用了`)},[t[0]||=l(`span`,{class:`chat-silence__dot`,"aria-hidden":`true`},null,-1),x(` `+p(r.$t(`@AGENT:静默 {elapsed}`,{elapsed:r.formatDurationMs(n.silentMs)})),1)],10,He)):T(`v-if`,!0)}var We=O(Ve,[[`render`,Ue],[`__scopeId`,`data-v-d87eac07`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/ChatSilenceBadge.vue`]]);export{q as a,me as c,N as d,Ce as i,R as l,Be as n,K as o,De as r,W as s,We as t,L as u};
@@ -1 +0,0 @@
1
- .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)}
@@ -1,34 +0,0 @@
1
- import{An as e,Bn as t,Cn as n,Gn as r,In as i,Mn as a,On as o,Sn as s,Tn as c,Un as ee,Wr as l,Xr as u,_n as d,ar as f,gr as p,jr as te,lr as m,mn as h,nr as g,on as _,qn as v,wn as y,xn as b,yn as x}from"./element-plus-Bz6lYur-.js";import{c as ne,l as re,t as ie}from"./vendor-C2k0GBzj.js";import{n as ae,t as S}from"./_plugin-vue_export-helper-BhdsvhKo.js";import{t as oe}from"./configStore-Drlw8KtR.js";import{tt as se,ut as ce}from"./index-cDiVh_ZL.js";import{a as le,c as ue,i as de,l as fe,m as pe,n as me,o as he,r as ge,s as _e,t as ve,u as ye}from"./agentConversations-DaAtF1v4.js";import{c as be,d as xe,n as Se,t as Ce,u as we}from"./ChatSilenceBadge-BBoFeSqe.js";i(),m();var C=a({__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:s}=se(),c=b(()=>s.value===`dark`?`dark`:`light`),{sessions:l,sessionsLoading:u,currentSessionId:d,messages:f,displayMessages:te,isStreaming:m,questionPanel:h,answeringQuestion:_,isSessionGenerating:v,currentEngine:y,pendingEngine:x,isEngineLocked:S,pickEngine:C,loadSessions:w,loadSession:T,deleteSession:E,renameSession:D,newSession:O,sendMessage:k,retryTurn:A,answerQuestion:j,stop:M,inputContextUsage:N,queuedMessages:P,queuePaused:F,removeQueuedMessage:I,flushQueued:L,silentMs:R}=ye(),z=oe(),Te=ce(),Ee=b(()=>{let e=z.models.find(e=>e.isDefault);return e&&(e.name||e.model)||``}),De=b(()=>S.value?y.value:x.value);function Oe(e){S.value||C(e)}let B=b(()=>ue(l.value,v)),ke=le(),Ae=he(),je=_e(),Me=b(()=>B.value.find(e=>e.id===d.value)?.title||``),V=p(null),H=p(null),Ne=p(null),U=p(null),W=p(null),{width:Pe,narrow:G}=xe(W),K=p(`chat`),{convListCollapsed:Fe,setConvListCollapsed:Ie}=we(),Le=b(()=>!G.value&&Fe.value),q=p(null),J=p(!1),Y=null,X=b(()=>!!a.activeFileName&&!J.value);function Re(e){return Array.from(e.children).find(e=>e.classList?.contains(`acu-input-attachments`))??null}function Z(){let e=H.value?.$el;if(!e)return;let n=e.querySelector(`.agent-context-slot`);if(!X.value){if(!n)return;q.value=null,t(()=>n.remove());return}let r=q.value&&e.contains(q.value)?q.value:n;r||(r=document.createElement(`div`),r.className=`agent-context-slot`);let i=Re(e),a=i??e;r.parentElement!==a&&a.insertBefore(r,i?i.firstChild:e.firstChild),q.value=r}function Q(e=!0){V.value?.scrollToBottom(e)}async function ze(e){let n=J.value?void 0:a.activeFilePath||void 0;await k(e.text,e.files,{openFilePath:n,docNote:a.contextNote||void 0}),await t(),Q()}function Be(e){T(e),K.value=`chat`}function Ve(){O(),K.value=`chat`}g(()=>f.value.length,()=>{t(()=>Q(!1))}),g(m,(e,t)=>{!e&&t&&o(`assistant-done`,{text:He()})});function He(){let e=f.value;for(let t=e.length-1;t>=0;t--)if(e[t]?.role===`assistant`)return String(e[t].content||``);return``}function Ue(){let e=U.value;!e||typeof MutationObserver>`u`||(Y?.disconnect(),Y=new MutationObserver(()=>Z()),Y.observe(e,{childList:!0,subtree:!0}))}g(()=>a.active,e=>{e&&(K.value=`chat`,w().catch(()=>{}),t(()=>{Z(),Q(!1)}))}),g(G,e=>{e||(K.value=`chat`)}),g(()=>a.activeFilePath,()=>{J.value=!1}),g(X,e=>{e&&t(Z)}),r(()=>{w().catch(()=>{}),t(()=>{Z(),Ue()})}),ee(()=>{Y?.disconnect(),Y=null,q.value=null});let $={props:a,emit:o,theme:s,chatTheme:c,sessions:l,sessionsLoading:u,currentSessionId:d,messages:f,displayMessages:te,isStreaming:m,questionPanel:h,answeringQuestion:_,isSessionGenerating:v,currentEngine:y,pendingEngine:x,isEngineLocked:S,pickEngine:C,loadSessions:w,loadSession:T,deleteSession:E,renameSession:D,newSession:O,sendMessage:k,retryTurn:A,answerQuestion:j,stop:M,inputContextUsage:N,queuedMessages:P,queuePaused:F,removeQueuedMessage:I,flushQueued:L,silentMs:R,configStore:z,gitStore:Te,inputModelName:Ee,displayEngine:De,onEngineSelect:Oe,conversationItems:B,conversationLabels:ke,questionLabels:Ae,queueLabels:je,currentSessionTitle:Me,chatRef:V,inputRef:H,chatHostRef:Ne,composerRef:U,rootRef:W,width:Pe,narrow:G,page:K,convListCollapsed:Fe,setConvListCollapsed:Ie,convsCollapsed:Le,contextSlot:q,contextDismissed:J,get slotObserver(){return Y},set slotObserver(e){Y=e},showContextCard:X,findAttachmentsHost:Re,syncContextSlot:Z,scrollToBottom:Q,onSend:ze,onSelectSession:Be,onNewSession:Ve,lastAssistantText:He,watchChatDom:Ue,get $t(){return ae},get ChatContainer(){return ne},get ChatInput(){return re},get ConversationList(){return ie},get AGENT_UPLOAD_ACCEPT(){return fe},get agentEngineName(){return pe},get AGENT_ASSISTANT_NAME(){return me},get AGENT_ASSISTANT_AVATAR(){return ve},get MESSAGE_RAIL_CONFIG(){return de},get MESSAGE_META_CONFIG(){return ge},AgentEngineSelector:be,CopySessionButton:Se,ChatSilenceBadge:Ce};return Object.defineProperty($,"__isScriptSetup",{enumerable:!1,value:!0}),$}});i(),te(),_();var w={class:`agent-panel-header`},T=[`title`,`aria-label`],E={class:`agent-panel-title`},D={key:1,class:`agent-panel-title`},O=[`title`,`aria-label`],k=[`title`,`aria-label`],A={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},j={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},M=[`title`],N={class:`agent-panel-convs`},P={ref:`chatHostRef`,class:`agent-panel-chat`},F=[`data-theme`],I=[`title`],L={class:`agent-context-att-name`},R=[`title`,`aria-label`];function z(t,r,i,a,ee,p){return v(),c(d,null,[y(`
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
- `),y(`
12
- 全屏对话:盖住整个编辑区(左栏文件树不动)。父级负责把分隔条藏掉。
13
- absolute 而不是改 flex-basis —— Monaco 留在原地、状态不重建。
14
- `),s(`div`,{ref:`rootRef`,class:l([`editor-agent-panel`,{"is-fullscreen":i.fullscreen}])},[s(`div`,w,[y(` 窄屏的列表页:整条 header 让给「返回对话 + 标题」 `),a.narrow&&a.page===`list`?(v(),c(d,{key:0},[s(`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]||=[s(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[s(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),s(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,T),s(`span`,E,u(a.$t(`@EDITOR:会话列表`)),1)],64)):(v(),c(`span`,D,u(a.$t(`@EDITOR:g ai 对话`)),1)),r[10]||=s(`div`,{class:`agent-panel-spacer`},null,-1),y(` 本轮静默:与「智能体」页、主 Agent 控制台同一枚(等回答时不算静默) `),!a.narrow||a.page===`chat`?(v(),n(a.ChatSilenceBadge,{key:2,class:`agent-panel-silence`,"silent-ms":a.silentMs,streaming:a.isStreaming&&!a.questionPanel},null,8,[`silent-ms`,`streaming`])):y(`v-if`,!0),y(` 引擎切换:与「智能体」视图同一套(同一个 AgentEngineSelector)。
15
- 宽屏左边摆着历史,对话区一直在,所以常驻;窄屏只在对话页出现 ——
16
- 列表页没有正在跑的对话,摆这儿只会挤占标题。 `),!a.narrow||a.page===`chat`?(v(),n(a.AgentEngineSelector,{key:3,class:`agent-panel-engine`,engine:a.displayEngine,locked:a.isEngineLocked,onSelect:a.onEngineSelect},null,8,[`engine`,`locked`])):y(`v-if`,!0),y(` 复制整条会话:只有对话页才有"当前这条会话"可复制(列表页连引擎选择器都不摆) `),!a.narrow||a.page===`chat`?(v(),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`])):y(`v-if`,!0),y(` 会话列表按钮:只有"列表是独立一页"时才需要它(宽屏列表就在旁边) `),a.narrow&&a.page===`chat`?(v(),c(`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]||=[o(`<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,O)):y(`v-if`,!0),s(`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`)},[y(` 展开:四角朝外;收起:四角朝内(Tabler maximize / minimize) `),i.fullscreen?(v(),c(`svg`,j,[...r[8]||=[s(`path`,{d:`M5 9h3a1 1 0 0 0 1-1V5`},null,-1),s(`path`,{d:`M15 5v3a1 1 0 0 0 1 1h3`},null,-1),s(`path`,{d:`M19 15h-3a1 1 0 0 0-1 1v3`},null,-1),s(`path`,{d:`M9 19v-3a1 1 0 0 0-1-1H5`},null,-1)]])):(v(),c(`svg`,A,[...r[7]||=[s(`path`,{d:`M4 8V5a1 1 0 0 1 1-1h3`},null,-1),s(`path`,{d:`M16 4h3a1 1 0 0 1 1 1v3`},null,-1),s(`path`,{d:`M20 16v3a1 1 0 0 1-1 1h-3`},null,-1),s(`path`,{d:`M8 20H5a1 1 0 0 1-1-1v-3`},null,-1)]]))],8,k),s(`button`,{class:`agent-panel-icon-btn`,title:a.$t(`@EDITOR:关闭对话`),onClick:r[3]||=e=>a.emit(`close`)},[...r[9]||=[s(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[s(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),s(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,M)]),s(`div`,{class:l([`agent-panel-body`,{"is-wide":!a.narrow,"is-convs-collapsed":a.convsCollapsed}])},[y(` 会话历史:宽屏是常驻左列(可收起),窄屏是独享整页 `),f(s(`div`,N,[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),[[h,!a.narrow||a.page===`list`]]),y(` 气泡区:输入框已经不在这里了(show-input=false),见下面常驻的那一条 `),f(s(`div`,P,[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),[[h,!a.narrow||a.page===`chat`]]),y(`
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?(v(),c(`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`]),y(`
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?(v(),n(x,{key:0,to:a.contextSlot},[a.showContextCard?(v(),c(`div`,{key:0,class:`agent-context-att`,title:i.activeFilePath||``},[r[12]||=s(`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`},[s(`path`,{d:`M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z`}),s(`polyline`,{points:`14 3 14 8 19 8`})],-1),s(`span`,L,u(i.activeFileName),1),s(`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]||=[s(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`,"aria-hidden":`true`},[s(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),s(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,R)],8,I)):y(`v-if`,!0)],8,[`to`])):y(`v-if`,!0)],8,F)):y(`v-if`,!0)],2)],2)],2112)}var Te=S(C,[[`render`,z],[`__scopeId`,`data-v-7cc12c51`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/EditorAgentPanel.vue`]]);export{Te as t};
@@ -1,13 +0,0 @@
1
- import"./rolldown-runtime-C0FnF6B9.js";import{An as e,Bn as t,Cn as n,Gn as r,In as i,Kr as a,Mn as o,On as s,Sn as c,Tn as l,Un as u,W as ee,Wr as d,Xr as f,Yn as p,_n as m,_r as te,ar as h,gn as g,gr as _,hn as v,i as y,ir as b,jr as x,kn as S,ln as ne,lr as re,mn as ie,nr as C,on as ae,pn as w,qn as T,r as oe,wn as E,xn as D,yn as se}from"./element-plus-Bz6lYur-.js";import{n as O,t as ce}from"./_plugin-vue_export-helper-BhdsvhKo.js";import{t as le}from"./SvgIcon-WpEiC1rI.js";import{t as ue}from"./configStore-Drlw8KtR.js";import{a as de,c as fe,i as pe,n as me,o as he,r as ge,s as _e}from"./monaco-CvMddat7.js";import{r as ve,t as ye}from"./flow-mindmap-cTg78Krq.js";import{$ as be,Q as xe,X as Se,Z as Ce,a as we,at as k,et as Te,f as Ee,it as A,nt as De,ot as Oe,rt as ke,st as Ae,tt as je}from"./index-cDiVh_ZL.js";import{t as Me}from"./EditorAgentPanel-KiHbQPJP.js";function Ne(e){return{ts:`typescript`,tsx:`typescript`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,htm:`html`,css:`css`,scss:`scss`,less:`less`,json:`json`,jsonc:`json`,md:`markdown`,markdown:`markdown`,yaml:`yaml`,yml:`yaml`,toml:`ini`,xml:`xml`,svg:`xml`,sh:`shell`,bash:`shell`,zsh:`shell`,fish:`shell`,ps1:`powershell`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,rb:`ruby`,php:`php`,c:`c`,cpp:`cpp`,h:`cpp`,cs:`csharp`,sql:`sql`,graphql:`graphql`,gql:`graphql`,txt:`plaintext`,log:`plaintext`,ini:`ini`,env:`ini`,gitignore:`ini`,dockerfile:`dockerfile`}[e.toLowerCase()]??`plaintext`}i(),re();var Pe=o({__name:`MediaPreview`,props:{filePath:{type:String,required:!0},fileName:{type:String,required:!1}},setup(e,{expose:t}){t();let n=e,r=D(()=>A(n.filePath)??`audio`),i=D(()=>k(n.filePath)),a=D(()=>n.fileName||n.filePath.split(/[\\/]/).pop()||``),o=_(!0),s=_(!1),c=_(0),l=_(0),u=_(0),ee=_(0);async function d(){try{let e=await(await fetch(`/api/editor/file?path=${encodeURIComponent(n.filePath)}&meta=1`)).json();e?.success&&typeof e.size==`number`&&(l.value=e.size)}catch{}}C(()=>n.filePath,()=>{o.value=!0,s.value=!1,c.value=0,l.value=0,u.value=0,ee.value=0,d()},{immediate:!0});function f(e){let t=e.target;Number.isFinite(t.duration)&&t.duration>0&&(c.value=t.duration),t instanceof HTMLVideoElement&&(u.value=t.videoWidth,ee.value=t.videoHeight),o.value=!1}function p(){o.value=!1}function m(){o.value=!1,s.value=!0}function te(e){if(!Number.isFinite(e)||e<=0)return`--:--`;let t=Math.floor(e),n=t%60,r=Math.floor(t/60)%60,i=Math.floor(t/3600),a=String(r).padStart(2,`0`);return i>0?`${i}:${a}:${String(n).padStart(2,`0`)}`:`${r}:${String(n).padStart(2,`0`)}`}function h(e){return!e||e<0?``:e>=1073741824?`${(e/1024/1024/1024).toFixed(2)} GB`:e>=1048576?`${(e/1024/1024).toFixed(1)} MB`:e>=1024?`${Math.round(e/1024)} KB`:`${e} B`}let g={props:n,kind:r,src:i,displayName:a,loading:o,error:s,duration:c,size:l,videoW:u,videoH:ee,fetchSize:d,onLoadedMetadata:f,onCanPlay:p,onError:m,formatDuration:te,formatSize:h,metaLine:D(()=>{let e=[r.value===`video`?O(`@EDITOR:视频`):O(`@EDITOR:音频`)];c.value>0&&e.push(te(c.value)),u.value>0&&ee.value>0&&e.push(`${u.value} × ${ee.value}`);let t=h(l.value);return t&&e.push(t),e.join(` · `)}),get $t(){return O}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}});i(),x();var Fe=[`data-media-kind`,`data-media-path`],Ie={class:`media-preview-stage`},Le={key:0,class:`media-preview-error`},Re={class:`media-preview-error-title`},ze={class:`media-preview-error-path`},Be=[`src`],Ve={class:`media-preview-audio`},He=[`title`],Ue=[`src`],We={key:2,class:`media-preview-loading`},Ge={class:`media-preview-footer`},j={class:`media-preview-meta`},M=[`title`];function N(e,t,n,r,i,a){return T(),l(`div`,{class:`media-preview`,"data-media-kind":r.kind,"data-media-path":r.props.filePath},[c(`div`,Ie,[r.error?(T(),l(`div`,Le,[t[0]||=c(`svg`,{viewBox:`0 0 24 24`,width:`40`,height:`40`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.4`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`circle`,{cx:`12`,cy:`12`,r:`9`}),c(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`13`}),c(`line`,{x1:`12`,y1:`16.5`,x2:`12`,y2:`16.6`})],-1),c(`p`,Re,f(r.$t(`@EDITOR:无法播放该文件,可能是编码或格式不受支持`)),1),c(`p`,ze,f(r.props.filePath),1)])):(T(),l(m,{key:1},[E(` 视频:占满可用区域,等比缩放(黑边由舞台底色补) `),r.kind===`video`?(T(),l(`video`,{key:r.props.filePath,class:`media-preview-video`,src:r.src,controls:``,playsinline:``,preload:`metadata`,onLoadedmetadata:r.onLoadedMetadata,onCanplay:r.onCanPlay,onError:r.onError},null,40,Be)):(T(),l(m,{key:1},[E(` 音频:中间一块信息 + 原生控制条。不套"圆角 + 单边框"的卡片 `),c(`div`,Ve,[t[1]||=s(`<div class="media-preview-glyph" aria-hidden="true" data-v-35007775><svg viewBox="0 0 24 24" width="46" height="46" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" data-v-35007775><path d="M3 17a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" data-v-35007775></path><path d="M9 17v-13h10v13" data-v-35007775></path><path d="M9 8h10" data-v-35007775></path></svg></div>`,1),c(`p`,{class:`media-preview-title`,title:r.props.filePath},f(r.displayName),9,He),(T(),l(`audio`,{key:r.props.filePath,class:`media-preview-audio-el`,src:r.src,controls:``,preload:`metadata`,onLoadedmetadata:r.onLoadedMetadata,onCanplay:r.onCanPlay,onError:r.onError},null,40,Ue))])],2112)),r.loading?(T(),l(`div`,We,[t[2]||=c(`span`,{class:`media-preview-spinner`},null,-1),c(`span`,null,f(r.$t(`@EDITOR:正在载入媒体文件…`)),1)])):E(`v-if`,!0)],64))]),c(`div`,Ge,[c(`span`,j,f(r.metaLine),1),r.kind===`video`?(T(),l(`span`,{key:0,class:`media-preview-name`,title:r.props.filePath},f(r.displayName),9,M)):E(`v-if`,!0)])],8,Fe)}var Ke=ce(Pe,[[`render`,N],[`__scopeId`,`data-v-35007775`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MediaPreview.vue`]]);i();var qe=o({__name:`MindmapPreview`,props:{content:{type:String,required:!0}},setup(e,{expose:t}){t();let n=e,r={props:n,data:D(()=>ye(n.content||``,`未命名文档`)),get MindMap(){return ve}};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}});i();var Je={class:`mindmap-preview`},P={class:`mindmap-preview-canvas`};function Ye(t,n,r,i,a,o){return T(),l(`div`,Je,[n[0]||=c(`div`,{class:`mindmap-preview-header`},[c(`span`,{class:`mindmap-preview-title`},`整篇导图`),c(`span`,{class:`mindmap-preview-hint`},`基于整篇 Markdown 自动生成 · 阅读模式`)],-1),c(`div`,P,[e(i.MindMap,{data:i.data,"preview-mode":``},null,8,[`data`])])])}var Xe=ce(qe,[[`render`,Ye],[`__scopeId`,`data-v-3969a8bf`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/components/MindmapPreview.vue`]]),F=1080,I=6e5,Ze=.86;function Qe(e){if(!e||e.startsWith(`data:`))return!1;if(e.startsWith(`blob:`)||e.startsWith(`/`))return!0;try{return new URL(e,location.href).origin===location.origin}catch{return!1}}async function $e(e){try{let t=await fetch(e);if(!t.ok)return null;let n=await t.blob();return await new Promise(e=>{let t=new FileReader;t.onload=()=>e(t.result||``),t.onerror=()=>e(``),t.readAsDataURL(n)})}catch{return null}}function et(e){return new Promise(t=>{let n=!1,r=e=>{n||(n=!0,t(e))};if(typeof Image>`u`){r(e);return}let i=new Image,a=setTimeout(()=>r(e),4e3);i.onload=()=>{if(clearTimeout(a),!(i.naturalWidth>F||e.length>I)){r(e);return}try{let t=Math.min(1,F/i.naturalWidth),n=Math.max(1,Math.round(i.naturalWidth*t)),a=Math.max(1,Math.round(i.naturalHeight*t)),o=document.createElement(`canvas`);o.width=n,o.height=a;let s=o.getContext(`2d`);if(!s){r(e);return}s.fillStyle=`#ffffff`,s.fillRect(0,0,n,a),s.drawImage(i,0,0,n,a),r(o.toDataURL(`image/jpeg`,Ze))}catch{r(e)}},i.onerror=()=>{clearTimeout(a),r(e)},i.src=e})}async function L(e){let t=await $e(e);return t?et(t):null}async function R(e){let t=Array.from(e.querySelectorAll(`img`)).filter(e=>Qe(e.getAttribute(`src`)||``)),n=0;return await Promise.all(t.map(async e=>{let t=await L(e.getAttribute(`src`)||``);t?e.setAttribute(`src`,t):n+=1})),n}function tt(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}var nt={h1:`font-size:26px;font-weight:700;line-height:1.35;margin:28px 0 16px;color:#111;`,h2:`font-size:22px;font-weight:700;line-height:1.4;margin:26px 0 14px;color:#111;`,h3:`font-size:19px;font-weight:700;line-height:1.45;margin:22px 0 12px;color:#222;`,h4:`font-size:17px;font-weight:600;line-height:1.5;margin:20px 0 10px;color:#333;`,h5:`font-size:16px;font-weight:600;line-height:1.5;margin:18px 0 8px;color:#333;`,h6:`font-size:15px;font-weight:600;line-height:1.5;margin:18px 0 8px;color:#555;`,p:`font-size:16px;line-height:1.8;margin:16px 0;color:#333;`,li:`font-size:16px;line-height:1.8;margin:0 0 6px;color:#333;`,ul:`margin:16px 0;padding-left:24px;`,ol:`margin:16px 0;padding-left:24px;`,blockquote:`margin:16px 0;padding:8px 16px;border-left:4px solid #e2e2e2;background:#f7f7f7;color:#666;font-size:15px;line-height:1.8;`,hr:`border:none;border-top:1px solid #e5e5e5;margin:26px 0;`,a:`color:#576b95;text-decoration:none;`,strong:`font-weight:700;color:#111;`,em:`font-style:italic;color:#555;`,code:`font-family:Menlo,Consolas,Monaco,monospace;font-size:0.92em;background:#f2f3f5;color:#c7254e;padding:1px 5px;border-radius:3px;`,pre:`font-family:Menlo,Consolas,Monaco,monospace;font-size:13px;line-height:1.6;background:#f6f8fa;color:#24292f;padding:12px 14px;border-radius:6px;overflow-x:auto;margin:16px 0;`,table:`border-collapse:collapse;width:100%;margin:16px 0;font-size:14px;`,th:`border:1px solid #e0e0e0;padding:8px 10px;background:#f6f8fa;font-weight:600;text-align:left;color:#333;`,td:`border:1px solid #e0e0e0;padding:8px 10px;color:#333;`,img:`max-width:100%;height:auto;display:block;margin:16px auto;border-radius:6px;`};function rt(e){e.querySelectorAll(`*`).forEach(e=>{let t=nt[e.tagName.toLowerCase()];t&&e.setAttribute(`style`,t)}),e.querySelectorAll(`pre code`).forEach(e=>e.setAttribute(`style`,`background:none;padding:0;color:inherit;font-size:inherit;`))}async function it(e,t){let n=e.cloneNode(!0),r=t?await R(n):0;return{html:n.innerHTML,leftover:r}}async function at(e,t){let n=e.cloneNode(!0),r=t.inline?await R(n):0;rt(n);let i=(t.title||``).trim();return{html:`<section style="font-size:16px;line-height:1.8;color:#333;word-break:break-word;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;">${i?`<h1 style="font-size:26px;font-weight:700;line-height:1.35;margin:0 0 22px;color:#111;">${tt(i)}</h1>`:``}${n.innerHTML}</section>`,leftover:r}}i(),re();var ot=2,st=6e4,ct=3e4,lt=300,ut=320,z=o({__name:`EditorView`,props:{pendingFilePath:{type:[String,null],required:!1}},setup(e,{expose:n}){n(),self.MonacoEnvironment={getWorker(e,t){return t===`json`?new _e:t===`css`||t===`scss`||t===`less`?new he:t===`html`||t===`handlebars`||t===`razor`?new de:t===`typescript`||t===`javascript`?new pe:new fe}};let i=e,a=ue(),o=Ee(),s=_([]),c=_(!1),l=_(``),d=_(``),f=null;function p(){l.value=``,d.value=``,f&&=(clearTimeout(f),null)}C(l,e=>{f&&clearTimeout(f),f=setTimeout(()=>{d.value=e,f=null},180)});let m=_([]),h=_(0),g=_(``),v=_(!1),b=_(!1),x=null,S=0;function ne(){x?.abort(),x=null,S+=1,m.value=[],h.value=0,g.value=``,v.value=!1,b.value=!1}async function re(e){let t=e.trim(),n=a.currentDirectory;if(!n||t.length<ot){ne();return}if(t===g.value&&v.value)return;x?.abort();let r=++S,i=new AbortController;x=i,v.value=!0,g.value=t;try{let e=await(await fetch(`/api/search_content`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n,query:t}),signal:i.signal})).json().catch(()=>null);if(r!==S)return;if(!e?.success){m.value=[],h.value=0,b.value=!1;return}m.value=Array.isArray(e.files)?e.files:[],h.value=typeof e.totalMatches==`number`?e.totalMatches:0,b.value=!!e.truncated}catch(e){if(e?.name===`AbortError`||r!==S)return;m.value=[],h.value=0,b.value=!1}finally{r===S&&(v.value=!1)}}C(d,e=>{re(e)}),u(()=>{f&&clearTimeout(f),x?.abort(),w(),yt()});let ie=null;function ae(){w(),a.ui.fileTreeAutoRefresh&&(ie=setInterval(()=>{document.hidden||a.currentDirectory&&(l.value.trim()||k())},st))}function w(){ie&&=(clearInterval(ie),null)}C(()=>a.currentDirectory,async()=>{if(I=!1,ne(),ae(),await E(),j.value.some(e=>e.isDirty)){I=!0;return}j.value=[],M.value=null,nt(),await $e()}),C(()=>a.ui.fileTreeAutoRefresh,()=>{ae()});async function T(e,t=0){let n=await(await fetch(`/api/browse_directory?path=${encodeURIComponent(e)}`)).json();return n.success?n.items.map(e=>({...e,depth:t,expanded:!1,loading:!1,children:(e.type,void 0)})):[]}async function E(){let e=a.currentDirectory;if(e){c.value=!0;try{s.value=await T(e,0)}finally{c.value=!1}}}function se(e,t=new Set){for(let n of e)n.type===`directory`&&n.expanded&&(t.add(n.path),n.children&&se(n.children,t));return t}function ce(e,t=0){return(e||[]).map(e=>{let n={name:e.name,path:e.path,type:e.type,depth:t,expanded:!1,loading:!1};return n.type===`directory`&&Array.isArray(e.children)&&(n.children=ce(e.children,t+1),n.expanded=!0),n})}async function ve(e){let t=a.currentDirectory;if(!t)return null;try{let n=await(await fetch(`/api/browse_directory_tree`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t,expand:e})})).json().catch(()=>null);return!n?.success||!Array.isArray(n.items)?null:ce(n.items,0)}catch{return null}}function ye(e,t){let n=new Map(e.map(e=>[e.path,e])),r=e.length!==t.length;if(!r){for(let n=0;n<t.length;n++)if(e[n].path!==t[n].path){r=!0;break}}for(let e=0;e<t.length;e++){let i=t[e],a=n.get(i.path);a&&(t[e]=a,a.name!==i.name&&(a.name=i.name,r=!0),a.type===`directory`&&a.expanded&&Array.isArray(i.children)&&(Array.isArray(a.children)?ye(a.children,i.children)&&(a.children=i.children,r=!0):(a.children=i.children,r=!0)))}return r}async function k(e={}){if(!a.currentDirectory)return;let t=await ve([...se(s.value)]);if(!t){e.notifyOnError&&y.error(O(`@EDITOR:刷新失败`));return}if(s.value.length===0){s.value=t;return}ye(s.value,t)&&(s.value=t)}async function A(e){if(e.type===`directory`){if(e.expanded)e.expanded=!1;else{if(!e.children){e.loading=!0;try{e.children=await T(e.path,e.depth+1)}finally{e.loading=!1}}e.expanded=!0}}}function Pe(e){let t=[];for(let n of e)t.push(n),n.type===`directory`&&n.expanded&&n.children&&t.push(...Pe(n.children));return t}let Fe=D(()=>d.value.trim().toLowerCase());function Ie(e,t){if(!t)return e;let n=[];for(let r of e){let e=r.name.toLowerCase().includes(t);if(r.type===`directory`){let i=r.children?Ie(r.children,t):[];if(!e&&i.length===0)continue;n.push({...r,expanded:!0,children:r.children===void 0?void 0:i})}else e&&n.push(r)}return n}function Le(e,t){for(let n of e){if(n.path===t)return n;if(n.children){let e=Le(n.children,t);if(e)return e}}return null}let Re=D(()=>Ie(s.value,Fe.value)),ze=D(()=>Fe.value.length>0&&Re.value.length===0),Be=D(()=>ze.value&&m.value.length===0&&!v.value);function Ve(e){let t=d.value.trim();if(!t)return[{text:e,hit:!1}];let n=e.toLowerCase(),r=t.toLowerCase(),i=[],a=0,o=n.indexOf(r,a);for(;o!==-1;)o>a&&i.push({text:e.slice(a,o),hit:!1}),i.push({text:e.slice(o,o+r.length),hit:!0}),a=o+r.length,o=n.indexOf(r,a);return a<e.length&&i.push({text:e.slice(a),hit:!1}),i}async function He(e,n){if(await qe({name:e.name,path:e.path,type:`file`,depth:0}),!n||n<1)return;await t();let r=L.value;r&&r.getModel()&&P()?.path===e.path&&(r.revealLineInCenter(n,ge.ScrollType.Smooth),r.setPosition({lineNumber:n,column:1}),r.focus())}let Ue=_(null);function We(){let e=Ue.value;e&&(e.focus(),e.select())}function Ge(){l.value?(p(),Ue.value?.focus()):(Ue.value?.blur(),L.value?.focus())}let j=_([]),M=_(null),N=_(null);async function qe(e){if(N.value=e,e.type!==`file`){A(Le(s.value,e.path)??e);return}let n=j.value.find(t=>t.path===e.path);if(console.log(`[debug-open-in-editor] EditorView openFile existing tab check:`,{path:e.path,found:!!n,tabsCount:j.value.length}),n){M.value=e.path,t(()=>z());return}let r=e.name.split(`.`).pop()||``;if(ke.has(r.toLowerCase())){let t={path:e.path,name:e.name,content:``,originalContent:``,isDirty:!1,language:`media`,diskMtimeMs:null};j.value.push(t),M.value=e.path;return}if(rn.has(r.toLowerCase())){let t={path:e.path,name:e.name,content:``,originalContent:``,isDirty:!1,language:`plaintext`,diskMtimeMs:null};j.value.push(t),M.value=e.path,J.value=!0;return}if(De(e.name)){let t={path:e.path,name:e.name,content:``,originalContent:``,isDirty:!1,language:`office`,diskMtimeMs:null};j.value.push(t),M.value=e.path,Y.value=!1,J.value=!0;return}try{let t=await fetch(`/api/editor/file?path=${encodeURIComponent(e.path)}`),n=await t.json();if(console.log(`[debug-open-in-editor] EditorView fetch /api/editor/file response:`,{path:e.path,status:t.status,data:n}),!n.success){y.error(`${O(`@EDITOR:打开文件失败: `)}${n.error}`);return}let i=Ne(r),a=R.get(e.path);a&&!a.isDisposed()&&a.setValue(n.content);let o={path:e.path,name:e.name,content:n.content,originalContent:n.content,isDirty:!1,language:i,diskMtimeMs:typeof n.mtimeMs==`number`?n.mtimeMs:null};console.log(`[debug-open-in-editor] EditorView pushing tab:`,{path:o.path,name:o.name,contentLen:o.content.length,lang:o.language}),j.value.push(o),M.value=e.path,console.log(`[debug-open-in-editor] EditorView tabs after push:`,j.value.length,`activeTabPath=`,M.value)}catch(e){console.log(`[debug-open-in-editor] EditorView fetch threw:`,e),y.error(`${O(`@EDITOR:打开文件失败: `)}${e.message}`)}}C(()=>i.pendingFilePath,async e=>{if(console.log(`[debug-open-in-editor] EditorView watcher fired, filePath=`,e),!e)return;await t();let n=e.split(/[\\/]/).pop()||e;console.log(`[debug-open-in-editor] EditorView calling openFile, name=`,n,`path=`,e),await qe({name:n,path:e,type:`file`,depth:0}),console.log(`[debug-open-in-editor] EditorView openFile returned`)},{immediate:!0});function Je(e,t){t.stopPropagation();let n=j.value.findIndex(t=>t.path===e);n!==-1&&(!j.value[n].isDirty||confirm(O(`@EDITOR:文件未保存,确认关闭?`)))&&(j.value.splice(n,1),M.value===e&&(M.value=j.value[Math.min(n,j.value.length-1)]?.path??null))}let P=()=>j.value.find(e=>e.path===M.value)??null,Ye=D(()=>({expandedDirs:[...se(s.value)],tabs:j.value.map(e=>e.path),activeTab:M.value})),F=!1,I=!1;function Ze(){I&&!F&&a.isUiLoaded&&a.saveEditorWorkspace(Ye.value)}C(Ye,()=>Ze());async function Qe(e){if(j.value.some(t=>t.path===e))return;let t=e.split(/[\\/]/).pop()||e,n=(t.split(`.`).pop()||``).toLowerCase();if(ke.has(n)){j.value.push({path:e,name:t,content:``,originalContent:``,isDirty:!1,language:`media`,diskMtimeMs:null});return}if(rn.has(n)){j.value.push({path:e,name:t,content:``,originalContent:``,isDirty:!1,language:`plaintext`,diskMtimeMs:null});return}if(De(t)){j.value.push({path:e,name:t,content:``,originalContent:``,isDirty:!1,language:`office`,diskMtimeMs:null});return}try{let r=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}`)).json();if(!r.success)return;let i=R.get(e);i&&!i.isDisposed()&&L.value?.getModel()!==i&&(i.dispose(),R.delete(e)),j.value.push({path:e,name:t,content:r.content,originalContent:r.content,isDirty:!1,language:Ne(n),diskMtimeMs:typeof r.mtimeMs==`number`?r.mtimeMs:null})}catch{}}async function $e(){try{for(let e=0;e<100&&!a.isUiLoaded;e++)await new Promise(e=>setTimeout(e,50));if(!a.isUiLoaded)return;U.value=a.ui.editorSidebarWidth;let e=a.getEditorWorkspace();if(!e)return;F=!0;try{if(e.expandedDirs.length>0){let t=await ve(e.expandedDirs);t&&(s.value=t)}for(let t of e.tabs)await Qe(t);if(!i.pendingFilePath&&e.activeTab&&j.value.some(t=>t.path===e.activeTab)){M.value=e.activeTab;let t=P(),n=(t?.name.split(`.`).pop()||``).toLowerCase();t&&(rn.has(n)||De(t.name))&&(J.value=!0)}}finally{F=!1}}finally{I=!0,Ze()}}let et=_(null),L=te(null),R=new Map;function tt(e){let t=R.get(e.path);return(!t||t.isDisposed())&&(t=ge.createModel(e.content,e.language,me.file(e.path)),R.set(e.path,t)),t}function nt(){L.value?.setModel(null);for(let e of R.values())e.isDisposed()||e.dispose();R.clear()}function rt(){if(!et.value)return;let e=document.documentElement.getAttribute(`data-theme`)===`dark`;L.value=ge.create(et.value,{theme:e?`vs-dark`:`vs`,fontSize:13,lineHeight:20,fontFamily:`'JetBrains Mono', 'Fira Code', 'Cascadia Code', Consolas, monospace`,minimap:{enabled:!0},scrollBeyondLastLine:!1,renderWhitespace:`selection`,automaticLayout:!0,tabSize:2,wordWrap:`off`,smoothScrolling:!0,cursorBlinking:`smooth`,padding:{top:8,bottom:8},editContext:!1}),L.value.onDidChangeModelContent(()=>{let e=P();if(!e)return;let t=L.value.getValue();e.content=t,e.isDirty=t!==e.originalContent}),L.value.onDidBlurEditorText(()=>{a.ui.editorAutoSave&&P()?.isDirty&&xt(!1),requestAnimationFrame(()=>{if(!H.value||H.value.offsetParent===null)return;let e=document.activeElement;e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable||e.classList?.contains(`native-edit-context`)||e.classList?.contains(`monaco-editor`))||z()})})}C(M,e=>{if(!L.value||!e)return;let n=j.value.find(t=>t.path===e);if(!n)return;let r=tt(n);L.value.setModel(r),t(()=>z()),gt(e)});function z(){if(!L.value)return;L.value.focus();let e=document.querySelector(`.monaco-editor .native-edit-context`);e&&document.activeElement!==e&&requestAnimationFrame(()=>e.focus?.())}let dt=0,ft=new Map;async function pt(e){try{let t=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}&meta=1`)).json();return!t?.success||typeof t.mtimeMs!=`number`?null:{mtimeMs:t.mtimeMs}}catch{return null}}async function mt(e){try{let t=await(await fetch(`/api/editor/file?path=${encodeURIComponent(e)}`)).json();return t?.success?{content:t.content,mtimeMs:typeof t.mtimeMs==`number`?t.mtimeMs:null}:null}catch{return null}}function ht(e,t,n){e.content=t,e.originalContent=t,e.isDirty=!1,e.diskMtimeMs=n;let r=R.get(e.path);if(!r||r.isDisposed())return;let i=L.value;if(!i||i.getModel()!==r){r.setValue(t);return}let a=i.saveViewState();r.pushEditOperations([],[{range:r.getFullModelRange(),text:t}],()=>null),i.restoreViewState(a)}async function gt(e){if(!e)return;let t=j.value.find(t=>t.path===e);if(!t||t.diskMtimeMs===null)return;let n=++dt,r=await pt(e);if(n!==dt||j.value.find(t=>t.path===e)!==t||!r||r.mtimeMs===t.diskMtimeMs)return;if(t.isDirty){if(ft.get(e)===r.mtimeMs)return;ft.set(e,r.mtimeMs);try{await oe.confirm(O(`@EDITOR:这个文件在磁盘上已被改动,你这边也有未保存的编辑。重新加载会丢弃你的改动。`),O(`@EDITOR:文件已被外部改动`),{confirmButtonText:O(`@EDITOR:重新加载`),cancelButtonText:O(`@EDITOR:保留我的`),type:`warning`})}catch{return}if(t.isDirty)return}let i=await mt(e);i&&j.value.find(t=>t.path===e)===t&&ht(t,i.content,i.mtimeMs)}function _t(){document.hidden||gt(M.value)}let B=null;function vt(){yt(),B=setInterval(()=>{document.hidden||gt(M.value)},ct)}function yt(){B&&=(clearInterval(B),null)}C(()=>j.value.filter(e=>e.isDirty).length,e=>{o.setDirtyCount(e)},{immediate:!0}),u(()=>o.setDirtyCount(0)),je(()=>{let e=document.documentElement.getAttribute(`data-theme`)===`dark`;ge.setTheme(e?`vs-dark`:`vs`)});let V=null;function bt(){if(V||!H.value)return;let e=[H.value],t=H.value.parentElement;for(;t;){if(t.classList.contains(`view-pane`)||t.classList.contains(`editor-pane`)){e.push(t);break}t=t.parentElement}V=new MutationObserver(()=>{H.value&&H.value.offsetParent!==null&&M.value&&L.value&&(gt(M.value),requestAnimationFrame(()=>{let e=document.activeElement;e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.isContentEditable||e.classList?.contains(`native-edit-context`)||e.classList?.contains(`monaco-editor`))||z()}))});let n=V;e.forEach(e=>n.observe(e,{attributes:!0,attributeFilter:[`style`,`class`,`hidden`]}))}r(async()=>{rt(),await E(),await $e(),bt(),ae(),window.addEventListener(`focus`,_t),document.addEventListener(`visibilitychange`,_t),vt(),M.value&&t(()=>z())}),u(()=>{V?.disconnect(),V=null,window.removeEventListener(`focus`,_t),document.removeEventListener(`visibilitychange`,_t),L.value?.dispose(),R.forEach(e=>e.dispose()),R.clear()});async function xt(e=!1){let t=P();if(t&&!(sn.value||cn.value||ln.value))try{let n=await(await fetch(`/api/editor/file`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:t.path,content:t.content})})).json();if(!n.success){y.error(`${O(`@EDITOR:保存失败: `)}${n.error}`);return}t.originalContent=t.content,t.isDirty=!1,typeof n.mtimeMs==`number`&&(t.diskMtimeMs=n.mtimeMs),e||y.success(O(`@EDITOR:已保存`))}catch(e){y.error(`${O(`@EDITOR:保存失败: `)}${e.message}`)}}function St(e){let t=e.ctrlKey||e.metaKey;if(t&&e.key.toLowerCase()===`f`){e.preventDefault(),We();return}t&&e.key===`s`&&(e.preventDefault(),xt())}r(()=>window.addEventListener(`keydown`,St)),u(()=>window.removeEventListener(`keydown`,St));let H=_(null),U=_(a.ui.editorSidebarWidth),Ct=!1,wt=0,Tt=0;function Et(e){Ct=!0,wt=e.clientX,Tt=U.value,document.addEventListener(`mousemove`,Dt),document.addEventListener(`mouseup`,Ot),e.preventDefault()}function Dt(e){if(!Ct)return;let t=e.clientX-wt;U.value=Math.max(140,Math.min(400,Tt+t))}function Ot(){Ct=!1,document.removeEventListener(`mousemove`,Dt),document.removeEventListener(`mouseup`,Ot),U.value!==a.ui.editorSidebarWidth&&a.setEditorSidebarWidth(U.value)}function kt(e){return e.type===`directory`?Ae(e.name):Oe(e.name)}let W=_(null),G=_(null),At=_(null),jt=_(null);function Mt(){let e=N.value;return e?e.type===`directory`?{parentPath:e.path,afterNode:e,depth:e.depth+1}:{parentPath:e.path.includes(`/`)||e.path.includes(`\\`)?e.path.replace(/[\\/][^\\/]+$/,``):a.currentDirectory??``,afterNode:e,depth:e.depth}:{parentPath:a.currentDirectory??``,afterNode:null,depth:0}}async function Nt(){let e=Mt();N.value?.type===`directory`&&!N.value.expanded&&await A(N.value),W.value={...e,kind:`file`,value:``},await t(),At.value?.focus()}async function Pt(){let e=Mt();N.value?.type===`directory`&&!N.value.expanded&&await A(N.value),W.value={...e,kind:`directory`,value:``},await t(),At.value?.focus()}function Ft(){W.value=null}async function It(){let e=W.value;if(!e||!e.value.trim()){W.value=null;return}let t=e.value.trim(),n=e.parentPath.replace(/[/\\]$/,``)+`/`+t;if(e.kind===`file`){let e=await(await fetch(`/api/editor/file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})})).json();if(!e.success){y.error(e.error);return}y.success(O(`@EDITOR:创建成功`))}else{let e=await(await fetch(`/api/editor/directory`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})})).json();if(!e.success){y.error(e.error);return}y.success(O(`@EDITOR:创建成功`))}W.value=null,await k()}function Lt(e){e.key===`Enter`&&(e.preventDefault(),It()),e.key===`Escape`&&(e.preventDefault(),Ft())}let K=_(null),Rt=_(null);function zt(e,t){e.preventDefault(),K.value={x:e.clientX,y:e.clientY,node:t}}function q(){K.value=null}async function Bt(){let e=K.value?.node;q(),e&&(N.value=e),e?.type===`directory`&&!e.expanded&&await A(e);let n=Mt();W.value={...n,kind:`file`,value:``},await t(),At.value?.focus()}async function Vt(){let e=K.value?.node;q(),e&&(N.value=e),e?.type===`directory`&&!e.expanded&&await A(e);let n=Mt();W.value={...n,kind:`directory`,value:``},await t(),At.value?.focus()}async function Ht(){let e=K.value?.node;q(),e&&(G.value={node:e,value:e.name},await t(),jt.value?.focus(),jt.value?.select())}async function Ut(){let e=G.value;if(!e||!e.value.trim()||e.value.trim()===e.node.name){G.value=null;return}let t=e.value.trim(),n=e.node.path.replace(/[\\/][^\\/]+$/,``).replace(/[/\\]$/,``)+`/`+t,r=await(await fetch(`/api/editor/rename`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({oldPath:e.node.path,newPath:n})})).json();if(!r.success){y.error(r.error);return}let i=j.value.find(t=>t.path===e.node.path);i&&(i.path=n,i.name=t,M.value===e.node.path&&(M.value=n)),G.value=null,await k()}function Wt(e){e.key===`Enter`&&(e.preventDefault(),Ut()),e.key===`Escape`&&(e.preventDefault(),G.value=null)}async function Gt(){let e=K.value?.node;if(q(),!e)return;let t=e.type===`directory`?O(`@EDITOR:文件夹`):O(`@EDITOR:文件`);if(!confirm(`${O(`@EDITOR:确认删除`)} ${t} "${e.name}"?`))return;let n=await(await fetch(`/api/editor/entry?path=${encodeURIComponent(e.path)}`,{method:`DELETE`})).json();if(!n.success){y.error(n.error);return}let r=j.value.findIndex(t=>t.path===e.path);r!==-1&&(j.value.splice(r,1),M.value===e.path&&(M.value=j.value[Math.max(0,r-1)]?.path??null)),y.success(O(`@EDITOR:已删除`)),await k()}async function Kt(){let e=K.value?.node;if(q(),e)try{let t=await(await fetch(`/api/editor/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||y.error(t.error)}catch(e){y.error(e?.message||String(e))}}function qt(e){let t=a.currentDirectory;if(!t)return e;let n=e=>e.replace(/\\/g,`/`).replace(/\/+$/,``),r=n(t),i=n(e);return i===r?`.`:i.startsWith(r+`/`)?i.slice(r.length+1):i}async function Jt(e){try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function Yt(){let e=K.value?.node;q(),e&&(await Jt(e.path)?y.success(O(`@EDITOR:已复制到剪贴板`)):y.error(O(`@EDITOR:复制失败`)))}async function Xt(){let e=K.value?.node;q(),e&&(await Jt(qt(e.path))?y.success(O(`@EDITOR:已复制到剪贴板`)):y.error(O(`@EDITOR:复制失败`)))}async function Zt(){let e=K.value?.node;if(q(),e)try{let t=await(await fetch(`/api/editor/open-in-vscode`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||y.error(t.error||O(`@EDITOR:VSCode 未安装`))}catch(e){y.error(e?.message||String(e))}}let Qt=new Set([`html`,`htm`]),$t=D(()=>{let e=K.value?.node;if(!e||e.type!==`file`)return!1;let t=e.name.slice(e.name.lastIndexOf(`.`)+1).toLowerCase();return Qt.has(t)});async function en(){let e=K.value?.node;if(q(),e)try{let t=await(await fetch(`/api/editor/open-in-browser`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e.path})})).json();t.success||y.error(t.error||O(`@EDITOR:浏览器打开失败`))}catch(e){y.error(e?.message||String(e))}}r(()=>{document.addEventListener(`click`,q),document.addEventListener(`keydown`,tn)}),u(()=>{document.removeEventListener(`click`,q),document.removeEventListener(`keydown`,tn)});function tn(e){e.key===`Escape`&&Z.value&&(Z.value=!1)}let nn=new Set([`md`,`html`,`htm`,`svg`]),rn=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`ico`,`bmp`]),J=_(!1),Y=_(!1),X=_(!1),an=_(!1),Z=_(!1),on=_(0),Q=D(()=>j.value.find(e=>e.path===M.value)??null),sn=D(()=>Q.value?.language===`plaintext`&&Q.value?.content===``),cn=D(()=>Q.value?.language===`office`),ln=D(()=>Q.value?.language===`media`),$=D(()=>(Q.value?.name??``).split(`.`).pop()?.toLowerCase()??``),un=D(()=>nn.has($.value)||rn.has($.value)||De($.value)),dn=D(()=>((Q.value?.content??``).match(/^#{1,6}\s+/gm)||[]).length),fn=D(()=>$.value===`md`&&dn.value>0);C(M,()=>{J.value&&!un.value&&(J.value=!1),Y.value&&!fn.value&&(Y.value=!1)});function pn(){un.value&&(J.value||(Y.value=!1,X.value=!1),J.value=!J.value)}function mn(){fn.value&&(Y.value||(J.value=!1,X.value=!1),Y.value=!Y.value)}function hn(){X.value||(J.value=!1,Y.value=!1),X.value=!X.value,an.value=!0}function gn(){X.value=!1}C(X,e=>{e||(Z.value=!1)});function _n(){Z.value=!Z.value}let vn=D(()=>on.value<=0||j.value.length===0?{flexBasis:`0px`}:Z.value?{flex:`0 0 ${on.value}px`}:{flex:`0 0 ${on.value}px`,maxWidth:`calc(100% - 320px)`}),yn=_(null),bn=_(!1),xn=_(``),Sn=_(!0),Cn=null,wn=D(()=>!Y.value&&J.value&&$.value===`md`&&!!Q.value);function Tn(){return Q.value?.content??``}function En(){return Tn().match(/^\s*#\s+(.+?)\s*(?:\r?\n|$)/)?.[1]?.trim()??``}function Dn(e,t,n){if(!e){y.error(O(`@EDITOR:复制失败`));return}xn.value=n,Cn&&clearTimeout(Cn),Cn=setTimeout(()=>{xn.value=``},1800),t>0?y.warning(O(`@EDITOR:{n} 张图片未能转成 Base64,已保留原地址`,{n:t})):y.success(O(`@EDITOR:已复制`))}async function On(){Dn(await Jt(Tn()),0,`md`)}async function kn(){let e=yn.value?.getRenderedElement();if(e){bn.value=!0;try{let{html:t,leftover:n}=await it(e,Sn.value);Dn(await Jt(t),n,`html`)}finally{bn.value=!1}}}function An(e){let t=document.createElement(`div`);t.style.cssText=`position:fixed;top:-9999px;left:-9999px;opacity:0;`,t.innerHTML=e,document.body.appendChild(t);try{let e=window.getSelection(),n=document.createRange();n.selectNodeContents(t),e?.removeAllRanges(),e?.addRange(n);let r=document.execCommand(`copy`);return e?.removeAllRanges(),r}catch{return!1}finally{document.body.removeChild(t)}}async function jn(){let e=yn.value?.getRenderedElement();if(e){bn.value=!0;try{let{html:t,leftover:n}=await at(e,{inline:Sn.value,title:En()}),r=Tn(),i=!1;try{navigator.clipboard?.write&&typeof ClipboardItem<`u`&&(await navigator.clipboard.write([new ClipboardItem({"text/html":new Blob([t],{type:`text/html`}),"text/plain":new Blob([r],{type:`text/plain`})})]),i=!0)}catch{i=!1}i||=An(t),Dn(i,n,`rich`)}finally{bn.value=!1}}}let Mn=D(()=>{let e=Q.value;if(!e)return``;let t=$.value,n=document.documentElement.getAttribute(`data-theme`)===`light`?`#ffffff`:`#0d1117`;return t===`html`||t===`htm`?Ce(e.content):t===`svg`?`<!DOCTYPE html><html><head><meta charset="utf-8"><style>html,body{margin:0;padding:0;background:${n};display:flex;align-items:center;justify-content:center;min-height:100vh;}svg{max-width:100%;max-height:90vh;}</style></head><body>${e.content}</body></html>`:``}),Nn=!1,Pn=0,Fn=0,In=0;function Ln(e){let t=e.currentTarget,n=t.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=t.getBoundingClientRect();Nn=!0,Pn=e.clientX,Fn=r.right-i.right,In=Math.max(lt,r.width-ut),document.addEventListener(`mousemove`,Rn),document.addEventListener(`mouseup`,zn),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,e.preventDefault()}function Rn(e){if(!Nn)return;let t=Pn-e.clientX;on.value=Math.round(Math.max(lt,Math.min(In,Fn+t)))}function zn(){Nn=!1,document.removeEventListener(`mousemove`,Rn),document.removeEventListener(`mouseup`,zn),document.body.style.cursor=``,document.body.style.userSelect=``}let Bn={props:i,configStore:a,editorTabsStore:o,treeNodes:s,treeLoading:c,searchQuery:l,debouncedSearchQuery:d,get searchDebounceTimer(){return f},set searchDebounceTimer(e){f=e},clearSearch:p,CONTENT_SEARCH_MIN_LEN:ot,contentHits:m,contentTotalMatches:h,contentQuery:g,contentSearching:v,contentTruncated:b,get contentAbort(){return x},set contentAbort(e){x=e},get contentSeq(){return S},set contentSeq(e){S=e},resetContentSearch:ne,runContentSearch:re,TREE_POLL_MS:st,get treePollTimer(){return ie},set treePollTimer(e){ie=e},startTreePolling:ae,stopTreePolling:w,loadDir:T,initTree:E,collectExpandedPaths:se,toTreeNodes:ce,fetchTreeSnapshot:ve,reconcileTree:ye,refreshTree:k,toggleDir:A,flattenTree:Pe,searchQueryLower:Fe,filterTree:Ie,findNodeByPath:Le,visibleTree:Re,noSearchResults:ze,noAnySearchResults:Be,highlightText:Ve,openContentHit:He,searchInputRef:Ue,focusSearchInput:We,onSearchEscape:Ge,tabs:j,activeTabPath:M,selectedNode:N,openFile:qe,closeTab:Je,activeTab:P,workspaceSnapshot:Ye,get workspaceRestoring(){return F},set workspaceRestoring(e){F=e},get workspaceHydrated(){return I},set workspaceHydrated(e){I=e},persistWorkspace:Ze,restoreTab:Qe,restoreWorkspace:$e,editorContainerRef:et,editorInstance:L,modelCache:R,getOrCreateModel:tt,disposeAllModels:nt,mountEditor:rt,focusEditor:z,get diskSyncSeq(){return dt},set diskSyncSeq(e){dt=e},diskConflictPromptedAt:ft,fetchFileMeta:pt,fetchFileContent:mt,applyDiskContent:ht,syncActiveTabWithDisk:gt,handleWindowFocus:_t,DISK_SYNC_POLL_MS:ct,get diskSyncTimer(){return B},set diskSyncTimer(e){B=e},startDiskSyncPolling:vt,stopDiskSyncPolling:yt,get viewVisibilityObserver(){return V},set viewVisibilityObserver(e){V=e},setupViewVisibilityObserver:bt,saveCurrentFile:xt,handleKeydown:St,containerRef:H,sidebarWidth:U,get isResizing(){return Ct},set isResizing(e){Ct=e},get resizeStartX(){return wt},set resizeStartX(e){wt=e},get resizeStartW(){return Tt},set resizeStartW(e){Tt=e},startSidebarResize:Et,onSidebarResize:Dt,stopSidebarResize:Ot,getNodeSpriteId:kt,inlineInput:W,renameInput:G,inlineInputRef:At,renameInputRef:jt,getTargetDir:Mt,startNewFile:Nt,startNewFolder:Pt,cancelInlineInput:Ft,confirmInlineInput:It,handleInlineKeydown:Lt,ctxMenu:K,ctxMenuRef:Rt,openContextMenu:zt,closeContextMenu:q,ctxNewFile:Bt,ctxNewFolder:Vt,ctxRename:Ht,confirmRename:Ut,handleRenameKeydown:Wt,ctxDelete:Gt,ctxRevealInExplorer:Kt,toWorkspaceRelative:qt,copyToClipboard:Jt,ctxCopyAbsolutePath:Yt,ctxCopyRelativePath:Xt,ctxOpenInVscode:Zt,BROWSER_OPEN_EXTS:Qt,ctxMenuCanOpenInBrowser:$t,ctxOpenInBrowser:en,onEditorKeydown:tn,PREVIEW_TEXT_EXTS:nn,IMAGE_EXTS:rn,showPreview:J,showMindmap:Y,showAgentChat:X,agentOpened:an,agentFullscreen:Z,previewWidth:on,activeTabRef:Q,activeTabIsImage:sn,activeTabIsOffice:cn,activeTabIsMedia:ln,activeExt:$,isPreviewable:un,mindmapTitleCount:dn,isMindmapable:fn,togglePreview:pn,toggleMindmap:mn,toggleAgentChat:hn,closeAgentChat:gn,toggleAgentFullscreen:_n,rightPaneStyle:vn,mdPreviewRef:yn,mdCopyBusy:bn,mdCopiedType:xn,mdCopyInlineImages:Sn,get mdCopiedTimer(){return Cn},set mdCopiedTimer(e){Cn=e},mdCopyAvailable:wn,mdSourceText:Tn,mdDocTitle:En,mdCopyFeedback:Dn,copyMarkdownSource:On,copyRenderedHtml:kn,copyRichTextBySelection:An,copyRichTextToClipboard:jn,previewSrcdoc:Mn,PREVIEW_MIN_WIDTH:lt,EDITOR_MIN_WIDTH:ut,get isPreviewResizing(){return Nn},set isPreviewResizing(e){Nn=e},get previewResizeStartX(){return Pn},set previewResizeStartX(e){Pn=e},get previewResizeStartW(){return Fn},set previewResizeStartW(e){Fn=e},get previewResizeMaxW(){return In},set previewResizeMaxW(e){In=e},startPreviewResize:Ln,onPreviewResize:Rn,stopPreviewResize:zn,get $t(){return O},get ElTooltip(){return ee},get getFileIconClass(){return Oe},ImagePreview:Te,MediaPreview:Ke,OfficePreview:xe,MarkdownPreview:be,MindmapPreview:Xe,EditorAgentPanel:Me,EmptyState:we,SvgIcon:le,get PREVIEW_IFRAME_SANDBOX(){return Se}};return Object.defineProperty(Bn,"__isScriptSetup",{enumerable:!1,value:!0}),Bn}});i(),x(),ae();var dt={class:`editor-view`,ref:`containerRef`},ft={class:`sidebar-header`},pt={class:`sidebar-title`},mt={class:`sidebar-actions`},ht={class:`sidebar-search`},gt=[`placeholder`,`title`],_t=[`title`,`aria-label`],B={key:0,class:`sidebar-tree`},vt={key:0,class:`search-section-head`},yt={key:1,class:`tree-arrow-spacer`},V={class:`tree-icon mit-icon`,"aria-hidden":`true`},bt=[`xlink:href`],xt=[`onClick`,`onContextmenu`],St={key:1,class:`tree-arrow-spacer`},H={key:2,class:`tree-icon mit-icon`,"aria-hidden":`true`},U=[`xlink:href`],Ct={key:3,class:`tree-icon mit-icon`,"aria-hidden":`true`},wt=[`xlink:href`],Tt=[`title`],Et={key:0,class:`tree-name-hit`},Dt={key:4,class:`tree-loading`},Ot={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--color-warning-dark)`}},kt={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--text-meta)`}},W=[`placeholder`],G={key:1,class:`tree-node tree-inline-input-row`,style:{paddingLeft:`12px`}},At={key:0,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--color-warning-dark)`}},jt={key:1,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`,color:`var(--text-meta)`}},Mt=[`placeholder`],Nt=[`data-query`],Pt={key:0,class:`content-results-status`},Ft={class:`search-section-head`},It={class:`search-section-count`},Lt={key:0,class:`search-section-note`},K=[`title`,`onClick`],Rt={class:`tree-icon mit-icon`,"aria-hidden":`true`},zt=[`xlink:href`],q={class:`content-hit-name`},Bt={class:`content-hit-dir`},Vt={class:`content-hit-total`},Ht=[`title`,`onClick`],Ut={class:`content-hit-ln`},Wt={class:`content-hit-text`},Gt={key:0,class:`content-hit-mark`},Kt={key:3,class:`tree-empty`},qt={key:1,class:`sidebar-loading`},Jt={class:`editor-main`},Yt={class:`editor-tabs`},Xt=[`onClick`,`title`],Zt={class:`tab-name`},Qt={key:0,class:`tab-dirty-dot`},$t=[`onClick`],en=[`title`],tn=[`disabled`,`title`],nn=[`title`],rn={key:1,class:`image-tab-placeholder`},J={viewBox:`0 0 24 24`,width:`56`,height:`56`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{opacity:`.35`}},Y={class:`image-tab-placeholder-title`},X={class:`image-tab-placeholder-hint`},an={class:`preview-header`},Z={class:`preview-title`},on={class:`preview-ext-badge`},Q=[`title`],sn={class:`preview-body`},cn={key:0,class:`preview-copybar`},ln=[`disabled`,`title`],$=[`disabled`,`title`],un=[`disabled`,`title`],dn=[`title`],fn=[`sandbox`,`srcdoc`];function pn(t,r,i,o,u,ee){return T(),l(m,null,[c(`div`,dt,[E(` 左侧文件树 `),c(`div`,{class:`editor-sidebar`,style:a({width:o.sidebarWidth+`px`})},[c(`div`,ft,[c(`span`,pt,f(o.$t(`@EDITOR:资源管理器`)),1),c(`div`,mt,[e(o.ElTooltip,{content:o.$t(`@EDITOR:新建文件`),placement:`bottom`,"show-after":300},{default:b(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:o.startNewFile},[E(` file-plus.svg(Tabler icons,MIT) `),r[11]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),c(`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`}),c(`path`,{d:`M12 11l0 6`}),c(`path`,{d:`M9 14l6 0`})],-1)])]),_:1},8,[`content`]),e(o.ElTooltip,{content:o.$t(`@EDITOR:新建文件夹`),placement:`bottom`,"show-after":300},{default:b(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:o.startNewFolder},[E(` folder-plus.svg(Tabler icons,MIT) `),r[12]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`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`}),c(`path`,{d:`M16 19h6`}),c(`path`,{d:`M19 16v6`})],-1)])]),_:1},8,[`content`]),e(o.ElTooltip,{content:o.$t(`@EDITOR:刷新`),placement:`bottom`,"show-after":300},{default:b(()=>[c(`button`,{class:`sidebar-action-btn`,onClick:r[0]||=e=>o.refreshTree({notifyOnError:!0})},[E(` refresh.svg(Tabler icons,MIT) `),r[13]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M20 11a8.1 8.1 0 0 0-15.5-2m-.5-4v4h4`}),c(`path`,{d:`M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4`})],-1)])]),_:1},8,[`content`])])]),c(`div`,ht,[r[15]||=c(`svg`,{class:`sidebar-search-icon`,viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`circle`,{cx:`11`,cy:`11`,r:`7`}),c(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})],-1),h(c(`input`,{ref:`searchInputRef`,"onUpdate:modelValue":r[1]||=e=>o.searchQuery=e,type:`text`,class:`sidebar-search-input`,placeholder:o.$t(`@EDITOR:搜索文件名或内容...`),title:o.$t(`@EDITOR:搜索文件名或内容...`),spellcheck:`false`,autocomplete:`off`,onKeydown:v(o.onSearchEscape,[`escape`])},null,40,gt),[[w,o.searchQuery]]),o.searchQuery?(T(),l(`button`,{key:0,class:`sidebar-search-clear`,title:o.$t(`@EDITOR:清除搜索`),"aria-label":o.$t(`@EDITOR:清除搜索`),onClick:o.clearSearch},[...r[14]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,_t)):E(`v-if`,!0)]),o.treeLoading?(T(),l(`div`,qt,[...r[25]||=[c(`span`,{class:`spin-icon`},null,-1)]])):(T(),l(`div`,B,[E(` 搜索态下给上方森林一个分组标题:下面还有「内容匹配」,不标一下分不清两块 `),o.searchQueryLower&&o.visibleTree.length>0?(T(),l(`div`,vt,f(o.$t(`@EDITOR:名称匹配`)),1)):E(`v-if`,!0),(T(!0),l(m,null,p(o.flattenTree(o.visibleTree),e=>(T(),l(m,{key:e.path},[E(` 重命名时用输入框替换节点 `),o.renameInput&&o.renameInput.node.path===e.path?(T(),l(`div`,{key:0,class:`tree-node tree-inline-input-row`,style:a({paddingLeft:12+e.depth*14+`px`})},[e.type===`directory`?(T(),l(`span`,{key:0,class:d([`tree-arrow`,{expanded:e.expanded}])},[...r[16]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(T(),l(`span`,yt)),(T(),l(`svg`,V,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,bt)])),h(c(`input`,{ref_for:!0,ref:`renameInputRef`,"onUpdate:modelValue":r[2]||=e=>o.renameInput.value=e,onKeydown:o.handleRenameKeydown,onBlur:o.confirmRename,onClick:r[3]||=g(()=>{},[`stop`])},null,544),[[w,o.renameInput.value]])],4)):(T(),l(m,{key:1},[E(` 普通节点 `),c(`div`,{class:d([`tree-node`,{"tree-node--dir":e.type===`directory`,"tree-node--file":e.type===`file`,"tree-node--active":o.activeTabPath===e.path,"tree-node--selected":o.selectedNode?.path===e.path&&o.activeTabPath!==e.path}]),style:a({paddingLeft:12+e.depth*14+`px`}),onClick:t=>o.openFile(e),onContextmenu:t=>o.openContextMenu(t,e)},[E(` 展开箭头 `),e.type===`directory`?(T(),l(`span`,{key:0,class:d([`tree-arrow`,{expanded:e.expanded}])},[...r[17]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(T(),l(`span`,St)),E(` 图标 `),e.type===`directory`?(T(),l(`svg`,H,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,U)])):(T(),l(`svg`,Ct,[c(`use`,{"xlink:href":`#${o.getNodeSpriteId(e)}`},null,8,wt)])),E(` 名称(命中关键字高亮) `),c(`span`,{class:`tree-name`,title:e.path},[(T(!0),l(m,null,p(o.highlightText(e.name),(e,t)=>(T(),l(m,{key:t},[e.hit?(T(),l(`span`,Et,f(e.text),1)):(T(),l(m,{key:1},[S(f(e.text),1)],64))],64))),128))],8,Tt),e.loading?(T(),l(`span`,Dt)):E(`v-if`,!0)],46,xt)],2112)),E(` 内联新建输入框:紧跟在 afterNode 之后 `),o.inlineInput&&o.inlineInput.afterNode?.path===e.path?(T(),l(`div`,{key:2,class:`tree-node tree-inline-input-row`,style:a({paddingLeft:12+o.inlineInput.depth*14+`px`})},[r[20]||=c(`span`,{class:`tree-arrow-spacer`},null,-1),o.inlineInput.kind===`directory`?(T(),l(`svg`,Ot,[...r[18]||=[c(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`},null,-1)]])):(T(),l(`svg`,kt,[...r[19]||=[c(`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`},null,-1),c(`polyline`,{points:`14 2 14 8 20 8`},null,-1)]])),h(c(`input`,{ref_for:!0,ref:`inlineInputRef`,class:`tree-inline-input`,"onUpdate:modelValue":r[4]||=e=>o.inlineInput.value=e,placeholder:o.inlineInput.kind===`file`?o.$t(`@EDITOR:输入文件名`):o.$t(`@EDITOR:输入文件夹名`),onKeydown:o.handleInlineKeydown,onBlur:o.cancelInlineInput,onClick:r[5]||=g(()=>{},[`stop`])},null,40,W),[[w,o.inlineInput.value]])],4)):E(`v-if`,!0)],64))),128)),E(` 根级输入框(无选中节点时出现在列表末尾) `),o.inlineInput&&o.inlineInput.afterNode===null?(T(),l(`div`,G,[r[23]||=c(`span`,{class:`tree-arrow-spacer`},null,-1),o.inlineInput.kind===`directory`?(T(),l(`svg`,At,[...r[21]||=[c(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`},null,-1)]])):(T(),l(`svg`,jt,[...r[22]||=[c(`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`},null,-1),c(`polyline`,{points:`14 2 14 8 20 8`},null,-1)]])),h(c(`input`,{ref:`inlineInputRef`,class:`tree-inline-input`,"onUpdate:modelValue":r[6]||=e=>o.inlineInput.value=e,placeholder:o.inlineInput.kind===`file`?o.$t(`@EDITOR:输入文件名`):o.$t(`@EDITOR:输入文件夹名`),onKeydown:o.handleInlineKeydown,onBlur:o.cancelInlineInput,onClick:r[7]||=g(()=>{},[`stop`])},null,40,Mt),[[w,o.inlineInput.value]])])):E(`v-if`,!0),E(` 内容匹配:搜索框的第二块结果。名称在树里已经能懒加载,内容命中只能平铺 `),o.searchQueryLower?(T(),l(`div`,{key:2,class:`content-results`,"data-query":o.contentQuery},[o.contentSearching?(T(),l(`div`,Pt,[r[24]||=c(`span`,{class:`content-search-spin`},null,-1),c(`span`,null,f(o.$t(`@EDITOR:正在搜索文件内容...`)),1)])):o.contentHits.length>0?(T(),l(m,{key:1},[c(`div`,Ft,[c(`span`,null,f(o.$t(`@EDITOR:内容匹配`)),1),c(`span`,It,f(o.contentTotalMatches),1),o.contentTruncated?(T(),l(`span`,Lt,f(o.$t(`@EDITOR:结果过多,已截断`)),1)):E(`v-if`,!0)]),(T(!0),l(m,null,p(o.contentHits,e=>(T(),l(`div`,{key:e.path,class:`content-hit`},[c(`div`,{class:`content-hit-file`,title:e.relPath,onClick:t=>o.openContentHit(e,e.matches[0]?.line)},[(T(),l(`svg`,Rt,[c(`use`,{"xlink:href":`#${o.getFileIconClass(e.name)}`},null,8,zt)])),c(`span`,q,f(e.name),1),c(`span`,Bt,f(e.dir),1),c(`span`,Vt,f(e.total),1)],8,K),(T(!0),l(m,null,p(e.matches,t=>(T(),l(`div`,{key:`${e.path}:${t.line}`,class:`content-hit-line`,title:o.$t(`@EDITOR:点击跳到该行`),onClick:n=>o.openContentHit(e,t.line)},[c(`span`,Ut,f(t.line),1),c(`span`,Wt,[(T(!0),l(m,null,p(o.highlightText(t.text),(e,t)=>(T(),l(m,{key:t},[e.hit?(T(),l(`span`,Gt,f(e.text),1)):(T(),l(m,{key:1},[S(f(e.text),1)],64))],64))),128))])],8,Ht))),128))]))),128))],64)):E(`v-if`,!0)],8,Nt)):E(`v-if`,!0),!o.inlineInput&&(o.noAnySearchResults||o.treeNodes.length===0)?(T(),l(`div`,Kt,f(o.noAnySearchResults?o.$t(`@EDITOR:未找到匹配文件`):o.$t(`@EDITOR:暂无文件`)),1)):E(`v-if`,!0)]))],4),E(` 拖拽分隔条 `),c(`div`,{class:`editor-resizer`,onMousedown:o.startSidebarResize},null,32),E(` 右侧编辑区 `),c(`div`,Jt,[E(` 标签栏:没有打开文件时也留着 —— 右侧 g ai 面板的口子在它右端,
2
- 藏掉整条就是"不选文件就没法跟 g ai 说话"(用户 2026-10-21 反馈)。
3
- 此时左半边是空的,只留右端那几个按钮。 `),c(`div`,Yt,[(T(!0),l(m,null,p(o.tabs,e=>(T(),l(`div`,{key:e.path,class:d([`editor-tab`,{active:o.activeTabPath===e.path,dirty:e.isDirty}]),onClick:t=>o.activeTabPath=e.path,title:e.path},[c(`span`,Zt,f(e.name),1),e.isDirty?(T(),l(`span`,Qt)):E(`v-if`,!0),c(`button`,{class:`tab-close`,onClick:t=>o.closeTab(e.path,t)},[...r[26]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,$t)],10,Xt))),128)),r[30]||=c(`div`,{class:`editor-tabs-spacer`},null,-1),E(` 预览切换按钮 `),o.isPreviewable?(T(),l(`button`,{key:0,class:d([`preview-toggle-btn`,{active:o.showPreview}]),title:o.showPreview?o.$t(`@EDITOR:关闭预览`):o.$t(`@EDITOR:打开预览`),onClick:o.togglePreview},[E(` eye.svg(Tabler icons,MIT) `),r[27]||=c(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M10 12a2 2 0 1 0 4 0a2 2 0 0 0-4 0`}),c(`path`,{d:`M21 12c-2.4 4-5.4 6-9 6c-3.6 0-6.6-2-9-6c2.4-4 5.4-6 9-6c3.6 0 6.6 2 9 6`})],-1),c(`span`,null,f(o.$t(`@EDITOR:预览`)),1)],10,en)):E(`v-if`,!0),E(` 思维导图:整篇 markdown 渲染为一张大导图 `),o.isMindmapable?(T(),l(`button`,{key:1,class:d([`preview-toggle-btn mindmap-toggle-btn`,{active:o.showMindmap,disabled:!o.isMindmapable}]),disabled:!o.isMindmapable,title:o.isMindmapable?o.showMindmap?o.$t(`@EDITOR:关闭思维导图`):o.$t(`@EDITOR:打开思维导图`):o.$t(`@EDITOR:需要至少一个 # 标题`),onClick:o.toggleMindmap},[E(` topology-star.svg(Tabler icons,MIT):中心节点 + 四向辐射(与左栏「思维导图」同款) `),r[28]||=s(`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-fc2ebf13><path d="M8 18a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M20 6a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M8 6a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M20 18a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M14 12a2 2 0 1 0-4 0a2 2 0 0 0 4 0" data-v-fc2ebf13></path><path d="M7.5 7.5l3 3" data-v-fc2ebf13></path><path d="M7.5 16.5l3-3" data-v-fc2ebf13></path><path d="M13.5 13.5l3 3" data-v-fc2ebf13></path><path d="M16.5 7.5l-3 3" data-v-fc2ebf13></path></svg>`,1),c(`span`,null,f(o.$t(`@EDITOR:思维导图`)),1)],10,tn)):E(`v-if`,!0),E(` g ai 对话:文件空间右侧的智能体面板(与预览/思维导图互斥) `),c(`button`,{class:d([`preview-toggle-btn agent-toggle-btn`,{active:o.showAgentChat}]),title:o.showAgentChat?o.$t(`@EDITOR:关闭 g ai 对话`):o.$t(`@EDITOR:打开 g ai 对话`),onClick:o.toggleAgentChat},[E(` message-chatbot.svg(Tabler icons,MIT):对话气泡+机器人脸。
4
- 原来是自绘双星闪光 —— 用户偏好「AI 功能不用星星/闪光贴标签」,顺带换掉 `),r[29]||=s(`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" data-v-fc2ebf13><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" data-v-fc2ebf13></path><path d="M9.5 9h.01" data-v-fc2ebf13></path><path d="M14.5 9h.01" data-v-fc2ebf13></path><path d="M9.5 13a3.5 3.5 0 0 0 5 0" data-v-fc2ebf13></path></svg>`,1),c(`span`,null,f(o.$t(`@EDITOR:g ai 对话`)),1)],10,nn)]),E(` 无文件打开时的提示(g ai 面板开着时让位给它 —— 两个都是 flex:1 的话
5
- 对话区只剩半截高) `),o.tabs.length===0&&!o.showAgentChat?(T(),n(o.EmptyState,{key:0,class:`editor-empty`,title:o.$t(`@EDITOR:从左侧选择文件打开`),hint:o.$t(`@EDITOR:Ctrl+S 保存`)},{icon:b(()=>[...r[31]||=[c(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[c(`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`}),c(`polyline`,{points:`14 2 14 8 20 8`})],-1)]]),_:1},8,[`title`,`hint`])):E(`v-if`,!0),E(` Monaco 容器(始终挂载,tab 为空或 image tab 时隐藏) `),c(`div`,{class:d([`editor-body`,{"is-agent-fullscreen":o.agentFullscreen&&o.showAgentChat}])},[c(`div`,{class:d([`monaco-container`,{hidden:o.tabs.length===0||o.activeTabIsImage||o.activeTabIsOffice||o.activeTabIsMedia}]),ref:`editorContainerRef`},null,2),E(` 音视频 tab:播放器直接铺满主区域(不走右侧预览面板 —— 音频没必要和空编辑区平分) `),o.activeTabIsMedia&&o.activeTabRef?(T(),n(o.MediaPreview,{key:o.activeTabRef.path,"file-path":o.activeTabRef.path,"file-name":o.activeTabRef.name},null,8,[`file-path`,`file-name`])):E(`v-if`,!0),E(` 图片 tab 时的占位提示(主预览区在右侧 preview-panel) `),o.activeTabIsImage&&o.tabs.length>0&&!o.showPreview&&!o.showMindmap?(T(),l(`div`,rn,[(T(),l(`svg`,J,[...r[32]||=[c(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`},null,-1),c(`circle`,{cx:`9`,cy:`9`,r:`2`},null,-1),c(`path`,{d:`m21 15-5-5L5 21`},null,-1)]])),c(`p`,Y,f(o.activeTabRef?.name),1),c(`p`,X,f(o.$t(`@EDITOR:这是图片文件,已在右侧预览面板中打开`)),1)])):E(`v-if`,!0),E(` 分隔条:贴在右侧面板的**左边缘**(DOM 顺序在面板之前),向左拖 = 面板变宽。
6
- 以前靠 order:99 挂在容器最右端,用户根本分不清拖的是哪条边。 `),(o.showPreview||o.showMindmap||o.showAgentChat)&&o.tabs.length>0?(T(),l(`div`,{key:2,class:`preview-resizer`,onMousedown:o.startPreviewResize},null,32)):E(`v-if`,!0),E(` g ai 对话面板:v-if 懒挂载 + v-show 保状态(切到预览再切回来,进行中的流还在)。
7
- 不再要求 tabs.length > 0:不选文件也能聊(当前文档上下文自动为空)。 `),o.agentOpened?h((T(),n(o.EditorAgentPanel,{key:3,active:o.showAgentChat,"active-file-path":o.activeTabPath,"active-file-name":o.activeTabRef?.name??``,fullscreen:o.agentFullscreen&&o.showAgentChat,style:a(o.rightPaneStyle),onClose:o.closeAgentChat,onToggleFullscreen:o.toggleAgentFullscreen},null,8,[`active`,`active-file-path`,`active-file-name`,`fullscreen`,`style`])),[[ie,o.showAgentChat]]):E(`v-if`,!0),E(` 预览面板 `),(o.showPreview||o.showMindmap)&&o.tabs.length>0?(T(),l(`div`,{key:4,class:`preview-panel`,style:a(o.rightPaneStyle)},[c(`div`,an,[c(`span`,Z,f(o.showMindmap?o.$t(`@EDITOR:思维导图`):o.$t(`@EDITOR:预览`)),1),c(`span`,on,f(o.activeExt.toUpperCase()),1),r[34]||=c(`div`,{class:`preview-header-spacer`},null,-1),c(`button`,{class:`preview-close-btn`,title:o.showMindmap?o.$t(`@EDITOR:关闭思维导图`):o.$t(`@EDITOR:关闭预览`),onClick:r[8]||=e=>o.showMindmap?o.showMindmap=!1:o.showPreview=!1},[...r[33]||=[c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},[c(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),c(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,Q)]),c(`div`,sn,[E(` 复制栏:Markdown 预览导出到公众号 / 其它富文本编辑器 `),o.mdCopyAvailable?(T(),l(`div`,cn,[c(`button`,{class:d([`preview-copy-btn`,{done:o.mdCopiedType===`md`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制 Markdown 源码`),onClick:o.copyMarkdownSource},[r[35]||=c(`span`,{class:`preview-copy-btn-icon`},`{ }`,-1),c(`span`,null,f(o.mdCopiedType===`md`?o.$t(`@EDITOR:已复制`):`Markdown`),1)],10,ln),c(`button`,{class:d([`preview-copy-btn`,{done:o.mdCopiedType===`html`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制渲染后的 HTML(图片按开关内嵌)`),onClick:o.copyRenderedHtml},[r[36]||=c(`span`,{class:`preview-copy-btn-icon`},`</>`,-1),c(`span`,null,f(o.mdCopiedType===`html`?o.$t(`@EDITOR:已复制`):`HTML`),1)],10,$),c(`button`,{class:d([`preview-copy-btn preview-copy-btn--primary`,{done:o.mdCopiedType===`rich`}]),disabled:o.mdCopyBusy,title:o.$t(`@EDITOR:复制为富文本,可直接粘贴到公众号编辑器`),onClick:o.copyRichTextToClipboard},[r[37]||=c(`span`,{class:`preview-copy-btn-icon`},`⊞`,-1),c(`span`,null,f(o.mdCopyBusy?o.$t(`@EDITOR:转换图片中…`):o.mdCopiedType===`rich`?o.$t(`@EDITOR:已复制`):o.$t(`@EDITOR:复制富文本`)),1)],10,un),c(`label`,{class:`preview-copy-embed`,title:o.$t(`@EDITOR:复制时把本地图片转成 Base64 内嵌,关闭后保留原图地址`)},[h(c(`input`,{"onUpdate:modelValue":r[9]||=e=>o.mdCopyInlineImages=e,type:`checkbox`},null,512),[[ne,o.mdCopyInlineImages]]),c(`span`,null,f(o.$t(`@EDITOR:图片转 Base64`)),1)],8,dn)])):E(`v-if`,!0),E(` 思维导图:整篇 markdown → 一张大导图 `),o.showMindmap&&o.activeExt===`md`&&o.activeTabRef?(T(),n(o.MindmapPreview,{key:1,content:o.activeTabRef.content,class:`preview-mindmap`},null,8,[`content`])):o.showPreview&&o.activeExt===`md`&&o.activeTabRef?(T(),l(m,{key:2},[E(` Markdown → in-app 渲染 `),E(` :key 按文件路径切 —— 预览的滚动容器就是这个组件自己的根节点
8
- (.preview-markdown[overflow:auto]),不换 key 时切 tab 走的是同类型
9
- 组件 → Vue 复用同一个 DOM 节点、只把内容换掉,scrollTop 不在 patch
10
- 范围里,会从上一个文件原样带过来(表现为"新文件预览停在上一个文件的
11
- 滚动位置")。key 随路径变 → 重建节点,天然回到顶部。
12
- 注意 key 只取 path、不取 content:同一个文件里改字时预览是实时镜像,
13
- 那种情况下不该把用户踢回顶部。 `),(T(),n(o.MarkdownPreview,{ref:`mdPreviewRef`,key:o.activeTabRef.path,content:o.activeTabRef.content,"base-path":o.activeTabRef.path,class:`preview-markdown`},null,8,[`content`,`base-path`]))],2112)):o.showPreview&&[`html`,`htm`,`svg`].includes(o.activeExt)?(T(),l(m,{key:3},[E(` HTML / SVG → sandboxed iframe (JS 可执行,不透明 origin 隔离宿主) `),c(`iframe`,{class:`preview-iframe`,sandbox:o.PREVIEW_IFRAME_SANDBOX,srcdoc:o.previewSrcdoc},null,8,fn)],2112)):o.showPreview&&o.IMAGE_EXTS.has(o.activeExt)&&o.activeTabRef?(T(),l(m,{key:4},[E(` 图片预览(使用增强版 ImagePreview,支持缩放/拖拽) `),e(o.ImagePreview,{"file-path":o.activeTabRef.path,"file-name":o.activeTabRef.name},null,8,[`file-path`,`file-name`])],2112)):o.showPreview&&o.activeTabIsOffice&&o.activeTabRef?(T(),n(o.OfficePreview,{key:5,"file-path":o.activeTabRef.path},null,8,[`file-path`])):E(`v-if`,!0)])],4)):E(`v-if`,!0)],2)])],512),E(` 右键菜单 `),(T(),n(se,{to:`body`},[o.ctxMenu?(T(),l(`div`,{key:0,ref:`ctxMenuRef`,class:`ctx-menu`,style:a({left:o.ctxMenu.x+`px`,top:o.ctxMenu.y+`px`}),onClick:r[10]||=g(()=>{},[`stop`])},[c(`button`,{class:`ctx-menu-item`,onClick:o.ctxNewFile},[E(` file-plus.svg(Tabler icons,MIT) `),r[38]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M14 3v4a1 1 0 0 0 1 1h4`}),c(`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`}),c(`path`,{d:`M12 11l0 6`}),c(`path`,{d:`M9 14l6 0`})],-1),S(` `+f(o.$t(`@EDITOR:新建文件`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxNewFolder},[E(` folder-plus.svg(Tabler icons,MIT) `),r[39]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`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`}),c(`path`,{d:`M16 19h6`}),c(`path`,{d:`M19 16v6`})],-1),S(` `+f(o.$t(`@EDITOR:新建文件夹`)),1)]),r[46]||=c(`div`,{class:`ctx-menu-sep`},null,-1),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxCopyAbsolutePath},[E(` copy.svg(Tabler icons,MIT) `),r[40]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M7 9.667a2.667 2.667 0 0 1 2.667-2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1-2.667 2.667h-8.666a2.667 2.667 0 0 1-2.667-2.667l0-8.666`}),c(`path`,{d:`M4.012 16.737a2.005 2.005 0 0 1-1.012-1.737v-10c0-1.1.9-2 2-2h10c.75 0 1.158.385 1.5 1`})],-1),S(` `+f(o.$t(`@EDITOR:复制绝对路径`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxCopyRelativePath},[E(` link.svg(Tabler icons,MIT) `),r[41]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M9 15l6-6`}),c(`path`,{d:`M11 6l.463-.536a5 5 0 0 1 7.071 7.072l-.534.464`}),c(`path`,{d:`M13 18l-.397.534a5.068 5.068 0 0 1-7.127 0a4.972 4.972 0 0 1 0-7.071l.524-.463`})],-1),S(` `+f(o.$t(`@EDITOR:复制相对路径`)),1)]),r[47]||=c(`div`,{class:`ctx-menu-sep`},null,-1),E(` 只有 HTML 才有"用浏览器打开":浏览器能直接渲染出结果 `),o.ctxMenuCanOpenInBrowser?(T(),l(`button`,{key:0,class:`ctx-menu-item`,onClick:o.ctxOpenInBrowser},[E(` world.svg(Tabler icons,MIT) `),r[42]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M3 12a9 9 0 1 0 18 0a9 9 0 0 0-18 0`}),c(`path`,{d:`M3.6 9h16.8`}),c(`path`,{d:`M3.6 15h16.8`}),c(`path`,{d:`M11.5 3a17 17 0 0 0 0 18`}),c(`path`,{d:`M12.5 3a17 17 0 0 1 0 18`})],-1),S(` `+f(o.$t(`@EDITOR:在浏览器中打开`)),1)])):E(`v-if`,!0),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxRevealInExplorer},[E(` folder-open.svg(Tabler icons,MIT) `),r[43]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M5 19l2.757-7.351a1 1 0 0 1 .936-.649h12.307a1 1 0 0 1 .986 1.164l-.996 5.211a2 2 0 0 1-1.964 1.625h-14.026a2 2 0 0 1-2-2v-11a2 2 0 0 1 2-2h4l3 3h7a2 2 0 0 1 2 2v2`})],-1),S(` `+f(o.$t(`@EDITOR:在资源管理器中打开`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxOpenInVscode},[e(o.SvgIcon,{"icon-class":`vscode`,"class-name":`ctx-menu-icon`}),S(` `+f(o.$t(`@EDITOR:在 VSCode 中打开`)),1)]),c(`button`,{class:`ctx-menu-item`,onClick:o.ctxRename},[E(` edit.svg(Tabler icons,MIT) `),r[44]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M7 7h-1a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-1`}),c(`path`,{d:`M20.385 6.585a2.1 2.1 0 0 0-2.97-2.97l-8.415 8.385v3h3l8.385-8.415`}),c(`path`,{d:`M16 5l3 3`})],-1),S(` `+f(o.$t(`@EDITOR:重命名`)),1)]),c(`button`,{class:`ctx-menu-item ctx-menu-item--danger`,onClick:o.ctxDelete},[E(` trash.svg(Tabler icons,MIT) `),r[45]||=c(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,xmlns:`http://www.w3.org/2000/svg`},[c(`path`,{d:`M4 7l16 0`}),c(`path`,{d:`M10 11l0 6`}),c(`path`,{d:`M14 11l0 6`}),c(`path`,{d:`M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2l1-12`}),c(`path`,{d:`M9 7v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3`})],-1),S(` `+f(o.$t(`@EDITOR:删除`)),1)])],4)):E(`v-if`,!0)]))],64)}var mn=ce(z,[[`render`,pn],[`__scopeId`,`data-v-fc2ebf13`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/EditorView.vue`]]);export{mn as default};
@@ -1 +0,0 @@
1
- .mindmap-view[data-v-b157fbd3]{background:var(--bg-page);flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.mm-toolbar[data-v-b157fbd3]{background:var(--bg-container);border-bottom:1px solid var(--border-color);flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;display:flex}.mm-toolbar-left[data-v-b157fbd3],.mm-toolbar-right[data-v-b157fbd3]{align-items:center;gap:8px;min-width:0;display:flex}.mm-toolbar-left[data-v-b157fbd3]{flex:1}.mm-toolbar-right[data-v-b157fbd3]{flex-shrink:0}.mm-toolbar-right[data-v-b157fbd3] .el-button--primary.is-disabled{background:var(--bg-hover);border-color:var(--border-color);color:var(--text-meta)}.mm-dir-tag[data-v-b157fbd3]{flex-shrink:0}.mm-dir-tooltip[data-v-b157fbd3]{word-break:break-all;max-width:520px;line-height:1.6}.mm-dir-empty[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-meta);font-style:italic}.mm-status[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-secondary);align-items:center;gap:4px;margin-left:4px;display:flex}.mm-status-title[data-v-b157fbd3]{white-space:nowrap;text-overflow:ellipsis;max-width:160px;font-weight:500;overflow:hidden}.mm-status-dirty[data-v-b157fbd3]{color:var(--color-warning-dark);font-size:var(--font-size-base);line-height:1}.mm-body[data-v-b157fbd3]{flex:1;min-height:0;display:flex;overflow:hidden}.mm-sidebar[data-v-b157fbd3]{background:var(--bg-container);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;width:240px;display:flex}.mm-sidebar-header[data-v-b157fbd3]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.mm-sidebar-title[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-secondary);letter-spacing:.5px;text-transform:uppercase;font-weight:600}.mm-sidebar-list[data-v-b157fbd3]{flex:1;min-height:0;padding:4px;overflow-y:auto}.mm-sidebar-empty[data-v-b157fbd3]{padding:24px 12px}.mm-sidebar-error[data-v-b157fbd3]{text-align:center;font-size:var(--font-size-sm);color:var(--color-danger-dark);padding:24px 12px}.mm-group[data-v-b157fbd3]{margin-bottom:2px}.mm-group-header[data-v-b157fbd3]{border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast) ease;align-items:center;gap:6px;padding:6px;display:flex}.mm-group-header[data-v-b157fbd3]:hover{background:var(--bg-container-hover)}.mm-group-header.active[data-v-b157fbd3]{background:color-mix(in srgb, var(--color-primary) 12%, var(--bg-container))}.mm-group-caret[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--text-meta);transition:transform var(--transition-fast) ease;flex-shrink:0}.mm-group-caret.collapsed[data-v-b157fbd3]{transform:rotate(-90deg)}.mm-group-info[data-v-b157fbd3]{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.mm-group-name[data-v-b157fbd3]{align-items:baseline;gap:4px;min-width:0;display:flex}.mm-group-title[data-v-b157fbd3]{font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.mm-group-header.active .mm-group-title[data-v-b157fbd3]{color:var(--color-primary)}.mm-group-count[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0}.mm-group-path[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-group-body[data-v-b157fbd3]{padding-left:8px}.mm-group-error[data-v-b157fbd3]{font-size:var(--font-size-sm);color:var(--color-danger-dark);justify-content:space-between;align-items:center;gap:4px;padding:8px 8px 8px 12px;display:flex}.mm-file-item[data-v-b157fbd3]{border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast) ease;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.mm-file-item[data-v-b157fbd3]:hover{background:var(--bg-container-hover)}.mm-file-item.active[data-v-b157fbd3]{background:color-mix(in srgb, var(--color-primary) 12%, var(--bg-container))}.mm-file-item.active .mm-file-title[data-v-b157fbd3]{color:var(--color-primary);font-weight:600}.mm-file-info[data-v-b157fbd3]{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.mm-file-title[data-v-b157fbd3]{font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-file-meta[data-v-b157fbd3]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mm-file-actions[data-v-b157fbd3]{background:inherit;opacity:0;pointer-events:none;transition:opacity var(--transition-fast) ease, background var(--transition-fast) ease;align-items:center;gap:2px;padding-left:8px;display:flex;position:absolute;top:0;bottom:0;right:8px}.mm-file-item:hover .mm-file-actions[data-v-b157fbd3]{opacity:1;pointer-events:auto}html:not(.dark) .mm-file-actions[data-v-b157fbd3] .el-button--danger{color:var(--git-status-locked)}.mm-editor[data-v-b157fbd3]{background:var(--bg-container);flex:1;min-width:0;min-height:0;display:flex;position:relative}.mm-stage[data-v-b157fbd3]{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.mm-canvas[data-v-b157fbd3]{flex:1;min-width:0;min-height:0;position:relative}.mm-canvas[data-v-b157fbd3] .zm-mindmap,.mm-canvas[data-v-b157fbd3]>*{width:100%;height:100%}.mm-editor-empty[data-v-b157fbd3]{position:absolute;inset:0}.mm-ai-panel[data-v-b157fbd3]{flex-shrink:0}.mm-resizer[data-v-b157fbd3]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;width:7px;position:relative}.mm-resizer[data-v-b157fbd3]: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%)}.mm-resizer:hover[data-v-b157fbd3]{background:var(--tint-primary-06)}.mm-resizer:hover[data-v-b157fbd3]:after{background:var(--color-primary);width:2px}.mm-draft[data-v-b157fbd3]{background:var(--role-ai-surface);border-bottom:1px solid var(--role-ai-edge);min-height:34px;font-size:var(--font-size-sm);flex-shrink:0;align-items:center;gap:8px;padding:5px 8px 5px 12px;display:flex}.mm-draft-tag[data-v-b157fbd3]{border-radius:var(--radius-xs);background:var(--role-ai-wash);color:var(--role-ai-ink);font-size:var(--font-size-xs);letter-spacing:.04em;flex-shrink:0;padding:1px 6px;font-weight:700}.mm-draft-title[data-v-b157fbd3]{min-width:0;max-width:40%;color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.mm-draft-meta[data-v-b157fbd3]{color:var(--text-meta);font-size:var(--font-size-xs);flex-shrink:0}.mm-draft-spacer[data-v-b157fbd3]{flex:1;min-width:8px}.mm-draft-btn[data-v-b157fbd3]{border-radius:var(--radius-xs);color:var(--text-secondary);font-size:var(--font-size-sm);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;padding:3px 10px}.mm-draft-btn[data-v-b157fbd3]:hover{background:var(--bg-hover);color:var(--text-primary)}.mm-draft-btn[data-v-b157fbd3]:disabled{color:var(--text-meta);cursor:not-allowed;background:0 0}.mm-draft-btn--primary[data-v-b157fbd3]{color:var(--role-ai-ink);font-weight:600}.mm-draft-btn--primary[data-v-b157fbd3]:hover{background:var(--role-ai-wash);color:var(--role-ai-ink)}.mm-draft-close[data-v-b157fbd3]{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}.mm-draft-close[data-v-b157fbd3]:hover{background:var(--bg-hover);color:var(--text-secondary)}.mm-toolbar-right[data-v-b157fbd3] .mm-ai-btn.is-on{background:var(--role-ai-surface);border-color:var(--role-ai-edge);color:var(--role-ai-ink)}.ctx-menu[data-v-b157fbd3]{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-item[data-v-b157fbd3]{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-b157fbd3]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-b157fbd3]{color:var(--color-danger-dark)}.ctx-menu-item--danger[data-v-b157fbd3]:hover{background:#ef44441a}.ctx-menu-sep[data-v-b157fbd3]{background:var(--border-color);height:1px;margin:4px 2px}@media (width<=900px){.mm-sidebar[data-v-b157fbd3]{width:180px}}
@@ -1,4 +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 s,Mn as c,Sn as l,Tn as u,Un as ee,W as d,Wr as f,Xr as p,Yn as m,_n as h,a as g,ar as _,ct as te,gn as v,gr as y,i as b,ir as x,jr as S,kn as C,lr as w,mn as T,mt as ne,nr as E,on as D,qn as O,r as k,wn as A,xn as j,yn as M,z as re}from"./element-plus-Bz6lYur-.js";import{C as ie,S as ae,m as oe}from"./vendor-C2k0GBzj.js";import{n as N,t as se}from"./_plugin-vue_export-helper-BhdsvhKo.js";import{o as ce,t as le}from"./configStore-Drlw8KtR.js";import{n as ue,r as de}from"./flow-mindmap-cTg78Krq.js";import{V as fe,a as pe}from"./index-cDiVh_ZL.js";import{t as me}from"./EditorAgentPanel-KiHbQPJP.js";w(),i();function P(e){let t=(e||``).trim();if(!t)return``;let n=t.replace(/[\\/]+$/,``);return n?/^[a-z]:$/i.test(n)?`${n}\\`:n:t}function F(e){return P(e).replace(/\//g,`\\`).replace(/\\+$/,``).toLowerCase()}function I(e,t){let n=F(e),r=F(t);return!n||!r?!1:n===r||n.startsWith(r.endsWith(`\\`)?r:`${r}\\`)}function he(e){let t=Math.max(e.lastIndexOf(`\\`),e.lastIndexOf(`/`));return t>0?e.slice(0,t):e}var ge=ae(`mindmap`,()=>{let e=le(),t=y([]),n=y([]),r=y(null),i=y(!1),a=y(!1),o=y(null),s=y(``),c=y(``),l=j(()=>r.value!==null),u=j(()=>n.value.reduce((e,t)=>e+t.files.length,0)),ee=j(()=>n.value.some(e=>e.loading));function d(){e.ui.mindmapDirs=[...t.value]}function f(e){return n.value.find(t=>F(t.dir)===F(e))}function p(e){let t=f(e);if(t)return t;let r={dir:e,files:[],error:null,loading:!1};return n.value.push(r),r}function m(e){let n=P(e);return!n||t.value.some(e=>F(e)===F(n))?!1:(t.value.push(n),p(n),!0)}let h=new Map;async function g(e){let n=f(e);if(!n)return;let r=F(n.dir),i=(h.get(r)||0)+1;h.set(r,i),n.loading=!0,n.error=null;try{let e=await(await fetch(`/api/mindmap/list?dir=${encodeURIComponent(n.dir)}`)).json();if(h.get(r)!==i)return;if(e.success){let r=typeof e.dir==`string`&&e.dir?e.dir:n.dir;if(r!==n.dir){let e=t.value.findIndex(e=>F(e)===F(n.dir));e>=0&&(t.value[e]=r),n.dir=r,d()}n.files=e.files||[]}else n.error=e.error||`读取目录失败`,n.files=[]}catch(e){if(h.get(r)!==i)return;n.error=e?.message||String(e),n.files=[]}finally{h.get(r)===i&&(n.loading=!1)}}async function _(){await Promise.all(t.value.map(e=>g(e)))}async function te(){let n=Array.isArray(e.ui.mindmapDirs)?e.ui.mindmapDirs:[];for(let e of n)m(e);s.value&&!t.value.some(e=>F(e)===F(s.value))&&(s.value=``),await _()}async function v(e){let t=[];for(let n of e||[]){let e=P(n);e&&m(e)&&t.push(e)}return t.length===0?0:(d(),s.value||=t[0],await Promise.all(t.map(e=>g(e))),t.length)}function b(e){let r=F(e);t.value=t.value.filter(e=>F(e)!==r),n.value=n.value.filter(e=>F(e.dir)!==r),h.delete(r),s.value&&F(s.value)===r&&(s.value=``),d()}function x(){if(t.value.length===0)return{dir:null,ambiguous:!1};let e=t.value.find(e=>F(e)===F(s.value));if(e)return{dir:e,ambiguous:!1};let n=r.value?.path;if(n){let e=t.value.find(e=>I(n,e));if(e)return{dir:e,ambiguous:!1}}return t.value.length===1?{dir:t.value[0],ambiguous:!1}:{dir:null,ambiguous:!0}}async function S(e,n=!1){if(!n&&i.value&&r.value)throw Error(`UNSAVED_CHANGES`);a.value=!0,o.value=null;try{let n=await(await fetch(`/api/mindmap/read?path=${encodeURIComponent(e)}`)).json();if(n.success){r.value={path:n.path,title:n.title,content:n.content,mtime:n.mtime},c.value=n.content,i.value=!1;let e=t.value.find(e=>I(n.path,e));s.value=e||he(n.path)}else o.value=n.error||`读取文件失败`}catch(e){o.value=e?.message||String(e)}finally{a.value=!1}}async function C(e,t=!1,n){let l=n?P(n):x().dir;if(!l)throw Error(`未选择目录`);if(!t&&i.value&&r.value)throw Error(`UNSAVED_CHANGES`);a.value=!0,o.value=null;try{let t=await(await fetch(`/api/mindmap/create`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({dir:l,name:e})})).json();if(t.success)r.value={path:t.path,title:t.title,content:t.content,mtime:t.mtime},c.value=t.content,i.value=!1,s.value=l,await g(l);else throw o.value=t.error||`新建失败`,Error(t.error||`新建失败`)}catch(e){throw e.message===`UNSAVED_CHANGES`||(o.value=e?.message||String(e)),e}finally{a.value=!1}}async function w(e){if(!r.value)throw Error(`没有打开的文件`);a.value=!0,o.value=null;try{let t=await(await fetch(`/api/mindmap/save`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:r.value.path,content:e})})).json();if(t.success){let n=r.value.path;return r.value&&(r.value.content=e,r.value.mtime=t.mtime),c.value=e,i.value=!1,await T(n),t}throw o.value=t.error||`保存失败`,Error(t.error||`保存失败`)}catch(e){throw o.value=e?.message||String(e),e}finally{a.value=!1}}async function T(e){let t=n.value.find(t=>I(e,t.dir));t&&await g(t.dir)}async function ne(e){let t=await(await fetch(`/api/mindmap/delete`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})})).json();if(!t.success)throw Error(t.error||`删除失败`);return r.value&&r.value.path===e&&(r.value=null,i.value=!1,c.value=``),await T(e),t}async function E(e,t){let n=await(await fetch(`/api/mindmap/rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e,newName:t})})).json();if(!n.success)throw Error(n.error||`重命名失败`);return r.value&&e===r.value.path&&(r.value={...r.value,path:n.path,title:t}),await T(n.path||e),n}function D(){r.value&&(i.value=!0)}function O(){r.value=null,i.value=!1,c.value=``}return{dirs:t,groups:n,current:r,dirty:i,loading:a,refreshing:ee,error:o,activeDir:s,hasCurrent:l,filesCount:u,init:te,addDirs:v,removeDir:b,refresh:_,refreshDir:g,resolveTargetDir:x,openFile:S,createFile:C,saveCurrent:w,deleteFile:ne,renameFile:E,markDirty:D,closeCurrent:O}});i(),w();var _e=1500,ve=300,ye=320,be=c({__name:`MindmapView`,setup(e,{expose:n}){n();let i=ge(),a=le(),{currentLocale:o}=ie(ce()),s=j(()=>{let e=a.theme;return e===`dark`?!0:e===`light`?!1:window.matchMedia?.(`(prefers-color-scheme: dark)`).matches??!1}),c=y(null),l=y(!1);function u(){l.value=!0}async function d(e){l.value=!1;let t=(e||[]).filter(Boolean);if(t.length!==0)try{let e=await i.addDirs(t);e>0?b.success(N(`@MINDMAP:已添加目录`,{n:e})):b.info(N(`@MINDMAP:重复目录已忽略`))}catch(e){b.error(e?.message||N(`@MINDMAP:读取目录失败`))}}let f=y({});function p(e){f.value={...f.value,[e]:!f.value[e]},i.activeDir=e}function m(e){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/);return t[t.length-1]||e}function h(e){return!!i.activeDir&&i.activeDir.toLowerCase()===e.toLowerCase()}function g(){let{dir:e,ambiguous:t}=i.resolveTargetDir();return e||(b.warning(N(t?`@MINDMAP:请选择目标目录`:`@MINDMAP:请先添加目录`)),null)}async function _(e){let t=e||g();if(!t||(e&&(i.activeDir=e),!await w()))return;let n=``;try{n=(await k.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),b.success(N(`@MINDMAP:已新建并打开`))}catch(e){b.error(e?.message||N(`@MINDMAP:新建失败`))}}async function v(e=!1){if(i.current)try{let t=c.value?.exportData();if(!t){e||b.warning(N(`@MINDMAP:无法获取数据`));return}await i.saveCurrent(t),e||b.success(N(`@MINDMAP:已保存`))}catch(e){b.error(e?.message||N(`@MINDMAP:保存失败`))}}let x=null;function S(){i.current&&i.dirty&&(x&&clearTimeout(x),x=setTimeout(()=>{x=null,i.current&&i.dirty&&v(!0)},_e))}function C(){x&&=(clearTimeout(x),null)}async function w(){if(!i.dirty||!i.current)return!0;try{await k.confirm(N(`@MINDMAP:未保存提示`,{title:i.current.title}),N(`@MINDMAP:未保存的改动`),{confirmButtonText:N(`@MINDMAP:保存`),cancelButtonText:N(`@MINDMAP:丢弃`),distinguishCancelAndClose:!0,type:`warning`}),C();let e=c.value?.exportData();return e&&(await i.saveCurrent(e),b.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){b.error(e?.message||N(`@MINDMAP:打开失败`))}}async function D(e){let t=!!i.current&&I(i.current.path,e),n=N(`@MINDMAP:确认移除目录提示`,{dir:e});t&&(n=`${n} ${N(`@MINDMAP:当前文件将保持打开`)}`);try{await k.confirm(n,N(`@MINDMAP:移除目录`),{confirmButtonText:N(`@MINDMAP:移除目录`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}i.removeDir(e),b.success(N(`@MINDMAP:已移除目录`))}let O=y(null);function A(e,t){e.preventDefault(),O.value={x:e.clientX,y:e.clientY,dir:t}}function M(){O.value=null}async function re(){let e=O.value?.dir;if(M(),!e)return;let t=await fe(e);t.success?b.success(t.message||N(`@MINDMAP:已在文件管理器中打开`)):b.error(t.error||N(`@MINDMAP:打开目录失败`))}function ae(){let e=O.value?.dir;M(),e&&_(e)}function se(){let e=O.value?.dir;M(),e&&D(e)}async function P(e){try{await k.confirm(N(`@MINDMAP:确认删除提示`,{title:e.title}),N(`@MINDMAP:删除`),{confirmButtonText:N(`@MINDMAP:删除`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}try{await i.deleteFile(e.path),b.success(N(`@MINDMAP:已删除`))}catch(e){b.error(e?.message||N(`@MINDMAP:删除失败`))}}async function F(e){let t=``;try{t=(await k.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),b.success(N(`@MINDMAP:已重命名`))}catch(e){b.error(e?.message||N(`@MINDMAP:重命名失败`))}}function he(e){i.markDirty(),S()}function be(e){}async function xe(e){let t=e||g();if(!t)return;let n=``,r=``;try{n=(await k.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 k.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=ue(n,r),a=JSON.stringify(e,null,2);await i.saveCurrent(a),b.success(N(`@MINDMAP:已导入`))}catch(e){b.error(e?.message||N(`@MINDMAP:导入失败`))}}async function Se(){if(c.value)try{let e=c.value.getMarkdown();await navigator.clipboard.writeText(e),b.success(N(`@MINDMAP:已复制Markdown`))}catch(e){b.error(e?.message||N(`@MINDMAP:复制失败`))}}function L(e){if(e.key===`Escape`&&H.value){H.value=!1;return}(e.ctrlKey||e.metaKey)&&e.key===`s`&&(e.preventDefault(),i.current&&i.dirty&&(C(),v()))}let R=y(0);E(()=>i.current?.path,()=>{R.value++,Q.value=null});let z=y(!1);function Ce(){z.value=!z.value}let we=j(()=>{let e=i.current?.content;if(!e)return null;try{return JSON.parse(e)}catch{return null}}),B=y(!1),V=y(!1),H=y(!1),U=y(0),Te=j(()=>U.value<=0?{}:H.value?{flex:`0 0 ${U.value}px`}:{flex:`0 0 ${U.value}px`,maxWidth:`calc(100% - 320px)`});function Ee(){B.value=!B.value,V.value=!0}function De(){B.value=!1}let W=0;function G(){W&&cancelAnimationFrame(W),W=requestAnimationFrame(()=>{W=0,c.value?.resetView()})}E([B,H],()=>t(G)),E(B,e=>{e||(H.value=!1)});let Oe=j(()=>{let e=(i.current?.path||``).split(/[\\/]/);return e[e.length-1]||``}),ke=j(()=>{let e=i.current?.path||``;return String(o.value||``).toLowerCase().startsWith(`en`)?[`The user is in the mind map view.`,e?`The mind map currently open is \`${e}\` — a flow-mindmap document (nodes are {id,text,children}).`:`No mind map file is open right now.`,``,"To create or rewrite a mind map, output exactly one ```mindmap fenced block containing a markdown outline:","- `#` = the central topic (exactly one line)","- `##` = first-level branches, `###` = second-level, up to four levels",`- one node per line, no numbering, no explanation, no blank lines inside the block`,``,`The panel converts that block into a mind map, and the user applies it with one click ("apply to current" / "save as new"). So:`,`- do not emit JSON, and do not write the mind map file with write_file;`,`- applying replaces the whole map: even for a one-branch change, emit the complete outline;`,`- prose outside the block is fine — it is not part of the map.`].join(`
2
- `):[`用户此刻在「思维导图」视图里。`,e?`当前打开的导图文件是 \`${e}\`(flow-mindmap 的文档,节点形如 {id,text,children})。`:`当前没有打开任何导图文件。`,``,"要新建或改写导图时,**输出且只输出一个 ```mindmap 代码块**,块内是 markdown 大纲:","- `#` 写中心主题(只有一行)","- `##` 一级分支、`###` 二级分支,最多四层",`- 一行一个节点,不写编号、不写解释、块内不留空行`,``,`面板会把这个块转成导图,由用户一键「应用到当前导图」或「另存为新导图」,所以:`,`- 不要输出 JSON,也不要用 write_file 直接改导图文件;`,`- 应用是**整份替换**:哪怕只改一个分支,也要把完整大纲写进块里;`,`- 块外可以正常说明你改了什么(那部分不进导图)。`].join(`
3
- `)}),K=!1,q=0,J=0,Y=0;function Ae(e){let t=e.currentTarget,n=t.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=t.getBoundingClientRect();K=!0,q=e.clientX,J=r.right-i.right,Y=Math.max(ve,r.width-ye),document.addEventListener(`mousemove`,X),document.addEventListener(`mouseup`,Z),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,e.preventDefault()}function X(e){if(!K)return;let t=q-e.clientX;U.value=Math.round(Math.max(ve,Math.min(Y,J+t)))}function Z(){let e=K;K=!1,document.removeEventListener(`mousemove`,X),document.removeEventListener(`mouseup`,Z),document.body.style.cursor=``,document.body.style.userSelect=``,e&&G()}let Q=y(null);function je(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 Me({text:e}){let t=je(e);t&&(Q.value=t)}function Ne(){Q.value=null}function $(e,t){return JSON.stringify(ue(e.md,t),null,2)}async function Pe(){let e=Q.value;if(e&&i.current){try{await k.confirm(N(`@MINDMAP:覆盖当前导图确认`,{title:i.current.title}),N(`@MINDMAP:应用导图草稿`),{confirmButtonText:N(`@MINDMAP:覆盖`),cancelButtonText:N(`@MINDMAP:取消`),type:`warning`})}catch{return}try{C(),await i.saveCurrent($(e,e.title)),i.current&&(i.current.title=e.title),R.value++,Q.value=null,b.success(N(`@MINDMAP:已应用到当前导图`))}catch(e){b.error(e?.message||N(`@MINDMAP:应用草稿失败`))}}}async function Fe(){let e=Q.value;if(!e)return;let t=g();if(!t)return;let n=``;try{n=(await k.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($(e,n)),R.value++,Q.value=null,b.success(N(`@MINDMAP:已新建导图`))}catch(e){b.error(e?.message||N(`@MINDMAP:应用草稿失败`))}}r(async()=>{window.addEventListener(`keydown`,L),document.addEventListener(`click`,M),await i.init()}),ee(()=>{window.removeEventListener(`keydown`,L),document.removeEventListener(`click`,M),C(),Z()});function Ie(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 Le(e){return e?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`:`0 B`}let Re={store:i,configStore:a,currentLocale:o,isDark:s,mmRef:c,filePickerVisible:l,openDirPicker:u,onPickerConfirm:d,collapsedGroups:f,toggleGroup:p,baseName:m,isActiveDir:h,pickTargetDir:g,handleNewFile:_,handleSave:v,AUTOSAVE_DELAY:_e,get autosaveTimer(){return x},set autosaveTimer(e){x=e},scheduleAutosave:S,cancelAutosave:C,confirmDiscardIfDirty:w,handleOpenFile:T,handleRemoveDir:D,ctxMenu:O,openDirContextMenu:A,closeCtxMenu:M,ctxOpenDir:re,ctxNewFile:ae,ctxRemoveDir:se,handleDelete:P,handleRename:F,onMindMapChange:he,onMindMapSelect:be,handleImportMarkdown:xe,handleExportMarkdown:Se,onKeydown:L,mmKey:R,previewMode:z,onCanvasTogglePreview:Ce,mmData:we,showAi:B,aiOpened:V,aiFullscreen:H,aiWidth:U,aiStyle:Te,toggleAi:Ee,closeAi:De,get recenterRaf(){return W},set recenterRaf(e){W=e},recenterMindmap:G,currentFileName:Oe,aiContextNote:ke,AI_MIN_WIDTH:ve,CANVAS_MIN_WIDTH:ye,get isAiResizing(){return K},set isAiResizing(e){K=e},get aiResizeStartX(){return q},set aiResizeStartX(e){q=e},get aiResizeStartW(){return J},set aiResizeStartW(e){J=e},get aiResizeMaxW(){return Y},set aiResizeMaxW(e){Y=e},startAiResize:Ae,onAiResize:X,stopAiResize:Z,draft:Q,extractMindmapDraft:je,onAssistantDone:Me,dismissDraft:Ne,draftToContent:$,applyDraftToCurrent:Pe,applyDraftAsNew:Fe,formatTime:Ie,formatSize:Le,get $t(){return N},get Delete(){return te},get Edit(){return ne},get FilePicker(){return oe},get MindMap(){return de},EmptyState:pe,EditorAgentPanel:me};return Object.defineProperty(Re,"__isScriptSetup",{enumerable:!1,value:!0}),Re}});i(),S(),D();var xe={class:`mindmap-view`},Se={class:`mm-toolbar`},L={class:`mm-toolbar-left`},R={class:`mm-dir-tooltip`},z={key:1,class:`mm-dir-empty`},Ce={class:`mm-toolbar-right`},we={key:0,class:`mm-status`},B=[`title`],V={key:0,class:`mm-status-dirty`},H={class:`mm-body`},U={class:`mm-sidebar`},Te={class:`mm-sidebar-header`},Ee={class:`mm-sidebar-title`},De={class:`mm-sidebar-list`},W={key:0,class:`mm-sidebar-error`},G=[`title`,`onClick`,`onContextmenu`],Oe={class:`mm-group-info`},ke={class:`mm-group-name`},K={class:`mm-group-title`},q={class:`mm-group-count`},J={class:`mm-group-path`},Y={class:`mm-group-body`},Ae=[`title`],X=[`onClick`],Z={class:`mm-file-info`},Q=[`title`],je={class:`mm-file-meta`},Me={class:`mm-editor`},Ne={class:`mm-stage`},$={key:0,class:`mm-draft`},Pe={class:`mm-draft-tag`},Fe=[`title`],Ie={class:`mm-draft-meta`},Le=[`disabled`],Re=[`title`,`aria-label`],ze={class:`mm-canvas`};function Be(t,r,i,c,ee,te){let y=re,b=s,S=d,w=a,ne=g;return O(),u(`div`,xe,[A(` 顶部工具栏 `),l(`div`,Se,[l(`div`,L,[e(y,{size:`small`,onClick:c.openDirPicker},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:添加目录`)),1)]),_:1}),c.store.dirs.length>0?(O(),n(S,{key:0,placement:`bottom-start`,"show-after":200},{content:x(()=>[l(`div`,R,[(O(!0),u(h,null,m(c.store.dirs,e=>(O(),u(`div`,{key:e},p(e),1))),128))])]),default:x(()=>[e(b,{size:`small`,type:`info`,class:`mm-dir-tag`},{default:x(()=>[C(p(c.$t(`@MINDMAP:个目录`,{n:c.store.dirs.length})),1)]),_:1})]),_:1})):(O(),u(`span`,z,p(c.$t(`@MINDMAP:请先添加目录`)),1))]),l(`div`,Ce,[e(y,{size:`small`,disabled:c.store.dirs.length===0,onClick:r[0]||=e=>c.handleNewFile()},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:新建`)),1)]),_:1},8,[`disabled`]),e(y,{size:`small`,disabled:c.store.dirs.length===0,onClick:r[1]||=e=>c.handleImportMarkdown()},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:从MD导入`)),1)]),_:1},8,[`disabled`]),e(y,{size:`small`,disabled:!c.store.current,onClick:c.handleExportMarkdown},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:复制MD`)),1)]),_:1},8,[`disabled`]),e(y,{size:`small`,class:f([`mm-ai-btn`,{"is-on":c.showAi}]),title:c.showAi?c.$t(`@MINDMAP:关闭 g ai 对话`):c.$t(`@MINDMAP:打开 g ai 对话`),onClick:c.toggleAi},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:g ai 对话`)),1)]),_:1},8,[`class`,`title`]),e(y,{size:`small`,type:`primary`,disabled:!c.store.current||!c.store.dirty,loading:c.store.loading,onClick:r[2]||=()=>{c.cancelAutosave(),c.handleSave()}},{icon:x(()=>[...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:x(()=>[C(` `+p(c.$t(`@MINDMAP:保存`)),1)]),_:1},8,[`disabled`,`loading`]),c.store.current?(O(),u(`span`,we,[l(`span`,{class:`mm-status-title`,title:c.store.current.title},p(c.store.current.title),9,B),c.store.dirty?(O(),u(`span`,V,`●`)):A(`v-if`,!0)])):A(`v-if`,!0)])]),l(`div`,H,[A(` 左侧:按目录分组的文件列表 `),l(`div`,U,[l(`div`,Te,[l(`span`,Ee,p(c.$t(`@MINDMAP:文件列表`)),1),e(y,{size:`small`,text:``,loading:c.store.refreshing,onClick:r[3]||=e=>c.store.refresh(),disabled:c.store.dirs.length===0},{icon:x(()=>[...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`])]),_((O(),u(`div`,De,[c.store.error?(O(),u(`div`,W,p(c.store.error),1)):A(`v-if`,!0),c.store.dirs.length===0?(O(),n(c.EmptyState,{key:1,class:`mm-sidebar-empty`,size:`inline`,title:c.$t(`@MINDMAP:请先添加目录`)},null,8,[`title`])):(O(!0),u(h,{key:2},m(c.store.groups,t=>(O(),u(`div`,{key:t.dir,class:`mm-group`},[l(`div`,{class:f([`mm-group-header`,{active:c.isActiveDir(t.dir)}]),title:t.dir,onClick:e=>c.toggleGroup(t.dir),onContextmenu:e=>c.openDirContextMenu(e,t.dir)},[e(w,{class:f([`mm-group-caret`,{collapsed:c.collapsedGroups[t.dir]}])},{default:x(()=>[A(` 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`,Oe,[l(`div`,ke,[l(`span`,K,p(c.baseName(t.dir)),1),l(`span`,q,p(t.files.length),1)]),l(`div`,J,p(t.dir),1)])],42,G),_(l(`div`,Y,[t.error?(O(),u(`div`,{key:0,class:`mm-group-error`,title:t.error},[l(`span`,null,p(c.$t(`@MINDMAP:目录不存在或已删除`)),1),e(y,{size:`small`,text:``,type:`danger`,onClick:e=>c.handleRemoveDir(t.dir)},{default:x(()=>[C(p(c.$t(`@MINDMAP:移除目录`)),1)]),_:1},8,[`onClick`])],8,Ae)):t.files.length===0?(O(),n(c.EmptyState,{key:1,class:`mm-sidebar-empty`,size:`inline`,title:c.$t(`@MINDMAP:该目录暂无思维导图`)},null,8,[`title`])):(O(!0),u(h,{key:2},m(t.files,t=>(O(),u(`div`,{key:t.path,class:f([`mm-file-item`,{active:c.store.current?.path===t.path}]),onClick:e=>c.handleOpenFile(t.path)},[l(`div`,Z,[l(`div`,{class:`mm-file-title`,title:t.title},p(t.title),9,Q),l(`div`,je,p(c.formatTime(t.mtime))+` · `+p(c.formatSize(t.size)),1)]),l(`div`,{class:`mm-file-actions`,onClick:r[4]||=v(()=>{},[`stop`])},[e(y,{size:`small`,text:``,icon:c.Edit,onClick:e=>c.handleRename(t),title:c.$t(`@MINDMAP:重命名`)},null,8,[`icon`,`onClick`,`title`]),e(y,{size:`small`,text:``,type:`danger`,icon:c.Delete,onClick:e=>c.handleDelete(t),title:c.$t(`@MINDMAP:删除`)},null,8,[`icon`,`onClick`,`title`])])],10,X))),128))],512),[[T,!c.collapsedGroups[t.dir]]])]))),128))])),[[ne,c.store.refreshing]])]),A(` 右侧:画布 + g ai 面板(与文件空间同一套:分隔条贴在面板左边缘,向左拖变宽) `),l(`div`,Me,[l(`div`,Ne,[A(" AI 导图草稿条:模型在回答里给了 ```mindmap 大纲才有。\n 平铺一条通栏,不用「圆角 + 单边框」的卡片 —— 它是画布上的一条横幅,不是浮块。 "),c.draft?(O(),u(`div`,$,[l(`span`,Pe,p(c.$t(`@MINDMAP:AI 导图草稿`)),1),l(`span`,{class:`mm-draft-title`,title:c.draft.title},p(c.draft.title),9,Fe),l(`span`,Ie,p(c.$t(`@MINDMAP:个节点`,{n:c.draft.nodes})),1),r[17]||=l(`span`,{class:`mm-draft-spacer`},null,-1),c.store.current?(O(),u(`button`,{key:0,class:`mm-draft-btn mm-draft-btn--primary`,onClick:c.applyDraftToCurrent},p(c.$t(`@MINDMAP:应用到当前导图`)),1)):A(`v-if`,!0),l(`button`,{class:`mm-draft-btn`,disabled:c.store.dirs.length===0,onClick:c.applyDraftAsNew},p(c.$t(`@MINDMAP:另存为新导图`)),9,Le),l(`button`,{class:`mm-draft-close`,title:c.$t(`@MINDMAP:关闭草稿`),"aria-label":c.$t(`@MINDMAP:关闭草稿`),onClick:c.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,Re)])):A(`v-if`,!0),l(`div`,ze,[c.store.current?(O(),n(c.MindMap,{key:c.mmKey,ref:`mmRef`,data:c.mmData,"preview-mode":c.previewMode,onChange:c.onMindMapChange,onSelect:c.onMindMapSelect,onCanvasTogglePreview:c.onCanvasTogglePreview},null,8,[`data`,`preview-mode`])):(O(),n(c.EmptyState,{key:0,class:`mm-editor-empty`,title:c.$t(`@MINDMAP:思维导图编辑器`),hint:c.store.dirs.length>0?c.$t(`@MINDMAP:从左侧选择或新建`):c.$t(`@MINDMAP:先选择目录提示`)},{icon:x(()=>[...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`]))])]),A(` 分隔条:全屏时这一列整个让给面板 `),c.showAi&&!c.aiFullscreen?(O(),u(`div`,{key:0,class:`mm-resizer`,onMousedown:c.startAiResize},null,32)):A(`v-if`,!0),A(` g ai 对话:v-if 懒挂载 + v-show 保状态(切走再切回来,进行中的流还在) `),c.aiOpened?_((O(),n(c.EditorAgentPanel,{key:1,class:`mm-ai-panel`,active:c.showAi,"active-file-path":c.store.current?.path||``,"active-file-name":c.currentFileName,"context-note":c.aiContextNote,fullscreen:c.aiFullscreen&&c.showAi,style:o(c.aiStyle),onClose:c.closeAi,onToggleFullscreen:r[5]||=e=>c.aiFullscreen=!c.aiFullscreen,onAssistantDone:c.onAssistantDone},null,8,[`active`,`active-file-path`,`active-file-name`,`context-note`,`fullscreen`,`style`])),[[T,c.showAi]]):A(`v-if`,!0)])]),A(` 目录选择(local-file-picker,支持多选目录) `),A(` 传入当前目标目录作为 defaultPath:用户添加目录时不用每次都从根目录找,
4
- 已选过的话直接定位到上次的位置;无效时 picker 自动回落到用户目录 `),e(c.FilePicker,{visible:c.filePickerVisible,mode:`directory`,multiple:!0,theme:c.isDark?`dark`:`light`,locale:c.currentLocale,"default-path":c.store.activeDir||c.store.dirs[0]||``,onClose:r[6]||=e=>c.filePickerVisible=!1,onConfirm:c.onPickerConfirm},null,8,[`visible`,`theme`,`locale`,`default-path`]),A(` 目录右键菜单:打开目录 / 在此新建 / 移除目录 `),(O(),n(M,{to:`body`},[c.ctxMenu?(O(),u(`div`,{key:0,class:`ctx-menu`,style:o({left:c.ctxMenu.x+`px`,top:c.ctxMenu.y+`px`}),onClick:r[7]||=v(()=>{},[`stop`])},[l(`button`,{class:`ctx-menu-item`,onClick:c.ctxOpenDir},[A(` 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),C(` `+p(c.$t(`@MINDMAP:打开目录`)),1)]),l(`button`,{class:`ctx-menu-item`,onClick:c.ctxNewFile},[A(` 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),C(` `+p(c.$t(`@MINDMAP:在此新建`)),1)]),r[22]||=l(`div`,{class:`ctx-menu-sep`},null,-1),l(`button`,{class:`ctx-menu-item ctx-menu-item--danger`,onClick:c.ctxRemoveDir},[A(` 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),C(` `+p(c.$t(`@MINDMAP:移除目录`)),1)])],4)):A(`v-if`,!0)]))])}var Ve=se(be,[[`render`,Be],[`__scopeId`,`data-v-b157fbd3`],[`__file`,`D:/workspace/github_workspace/zen-gitsync/src/ui/client/src/views/MindmapView.vue`]]);export{Ve as default};
@@ -1 +0,0 @@
1
- .dir-chat[data-v-a2b1a866]{height:min(420px,42vh);min-height:200px;margin-top:var(--spacing-sm);border-top:1px solid var(--border-color-light);padding-top:var(--spacing-sm);flex-direction:column;display:flex}.dir-chat__bar[data-v-a2b1a866]{margin-bottom:var(--spacing-xs);flex-shrink:0;justify-content:flex-end;display:flex}.dir-chat__new[data-v-a2b1a866]{height:22px;padding:0 var(--spacing-base);border:1px solid var(--border-color);border-radius:var(--radius-base);color:var(--text-meta);font:inherit;font-size:var(--font-size-sm);cursor:pointer;transition:color var(--transition-fast), border-color var(--transition-fast);background:0 0;align-items:center;gap:4px;line-height:1;display:inline-flex}.dir-chat__new[data-v-a2b1a866]:hover{color:var(--color-primary);border-color:var(--color-primary)}.dir-chat__new[data-v-a2b1a866]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.dir-chat[data-v-a2b1a866]>.acu-chat{flex:1;min-width:0;min-height:0}.dir-chat--fill[data-v-a2b1a866]{flex:auto;height:auto;min-height:0}.dir-chat[data-v-a2b1a866] .acu-welcome{padding:var(--spacing-base);align-items:flex-start;overflow-y:auto}.dir-chat[data-v-a2b1a866] .acu-welcome-inner{margin-block:auto}.dir-chat[data-v-a2b1a866] .acu-welcome-logo{display:none}.dir-chat[data-v-a2b1a866] .acu-welcome-title{font-size:var(--font-size-lg);margin-bottom:var(--spacing-xs)}.dir-chat[data-v-a2b1a866] .acu-welcome-desc{font-size:var(--font-size-sm);margin-bottom:var(--spacing-base)}.dir-chat[data-v-a2b1a866] .acu-welcome-grid{gap:var(--spacing-sm)}.dir-chat[data-v-a2b1a866] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.dir-chat[data-v-a2b1a866] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.dir-chat[data-v-a2b1a866] .acu-message-meta{margin:0;position:absolute;top:0;right:0}