coding-tool-x 3.8.8 → 3.8.9

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 (60) hide show
  1. package/README.md +2 -2
  2. package/dist/web/assets/{AgentsDrawer-DRQuwi0m.js → AgentsDrawer-Cj5CJ4d9.js} +1 -1
  3. package/dist/web/assets/{Analytics-Cf5KwEdj.js → Analytics-1doS-8uC.js} +1 -1
  4. package/dist/web/assets/{AssetPathField-DyniM0pF.js → AssetPathField-C9TOPl7o.js} +1 -1
  5. package/dist/web/assets/{ChatHistoryDrawer-CrfS0KYV.js → ChatHistoryDrawer-BTmQ1aQr.js} +1 -1
  6. package/dist/web/assets/{CollapseItem-ClMsJuUu.js → CollapseItem-CwqJk3bE.js} +1 -1
  7. package/dist/web/assets/{CommandsDrawer-CzHelf56.js → CommandsDrawer-CaZWDI_G.js} +1 -1
  8. package/dist/web/assets/{ConfigExportDrawer-BEZ8wTby.js → ConfigExportDrawer-C3vSZEsS.js} +1 -1
  9. package/dist/web/assets/ConfigTemplates-gyERg9iC.js +1 -0
  10. package/dist/web/assets/{ConfigTemplatesDrawer-BqM32Im7.js → ConfigTemplatesDrawer-B17RqFi4.js} +1 -1
  11. package/dist/web/assets/{ConfigTemplatesPanel-lTdutC8H.js → ConfigTemplatesPanel-DKIC_FqG.js} +1 -1
  12. package/dist/web/assets/{FavoritesDrawer-DDyWUBJR.js → FavoritesDrawer-DaziQmBp.js} +1 -1
  13. package/dist/web/assets/{GatewayConvertDrawer-Rigtt_5J.js → GatewayConvertDrawer-OMgWUUSc.js} +1 -1
  14. package/dist/web/assets/{Home-tCSKmSHV.js → Home-DOSUTfrE.js} +1 -1
  15. package/dist/web/assets/{MarkdownEditor-BMMUufSc.js → MarkdownEditor-9TTwTS-U.js} +1 -1
  16. package/dist/web/assets/{McpDrawer-CmE-d7VW.js → McpDrawer-I8rl8lGH.js} +1 -1
  17. package/dist/web/assets/{McpFormDrawer-ByvS18od.js → McpFormDrawer-DEP3C7ut.js} +1 -1
  18. package/dist/web/assets/{PluginManager-C4kJlpVX.js → PluginManager-BuRcWuBj.js} +1 -1
  19. package/dist/web/assets/{PluginsDrawer-05R4k15x.js → PluginsDrawer-_zZENaQn.js} +1 -1
  20. package/dist/web/assets/{PluginsPanel-BCoEs7Og.js → PluginsPanel-Bs5qZ-TK.js} +1 -1
  21. package/dist/web/assets/ProjectList-BSxuL2td.js +1 -0
  22. package/dist/web/assets/ProjectList-VbIYSHbH.css +1 -0
  23. package/dist/web/assets/{PromptsDrawer-DnwBf_oW.js → PromptsDrawer-CoZ-ZtsY.js} +1 -1
  24. package/dist/web/assets/{RecentSessionsDrawer-B7d-38wH.js → RecentSessionsDrawer-B_17aJBG.js} +1 -1
  25. package/dist/web/assets/{SessionCard-BUgjHQwX.js → SessionCard-BL_x0d3t.js} +1 -1
  26. package/dist/web/assets/SessionList-DhRYZ6vl.js +1 -0
  27. package/dist/web/assets/{SettingsDrawer-BITzjQLl.js → SettingsDrawer-fYb0DU7X.js} +1 -1
  28. package/dist/web/assets/{SkillManager-D9jkNuRM.js → SkillManager-S698Hns8.js} +1 -1
  29. package/dist/web/assets/{SkillsDrawer-0Z4IefxC.js → SkillsDrawer-Ms4lPCow.js} +1 -1
  30. package/dist/web/assets/{SkillsPanel-BKIVOj7n.js → SkillsPanel-rqnqAOGL.js} +1 -1
  31. package/dist/web/assets/{SpeedTestDrawer-Bx1bYf5i.js → SpeedTestDrawer-Bbn38SfV.js} +1 -1
  32. package/dist/web/assets/{Upload-CzC4rGI4.js → Upload-CdyVHxCI.js} +1 -1
  33. package/dist/web/assets/{WorkspaceDrawer-eujtWpoq.js → WorkspaceDrawer-L7HJRc6u.js} +1 -1
  34. package/dist/web/assets/{WorkspaceManager-CQ-8Ej68.js → WorkspaceManager-DsoNg2z8.js} +1 -1
  35. package/dist/web/assets/{WorkspacePanel-Cql5qE2R.js → WorkspacePanel-Be8PVZah.js} +1 -1
  36. package/dist/web/assets/headers-B5JWGn3v.js +1 -0
  37. package/dist/web/assets/{index-Cnbe696C.css → index-3Lp6z8TQ.css} +1 -1
  38. package/dist/web/assets/index-BKlAWTH-.js +2 -0
  39. package/dist/web/assets/{sessions-DqlbocLJ.js → sessions-CC0j-KH_.js} +1 -1
  40. package/dist/web/assets/{useResponsiveDrawer-DZd5rNk5.js → useResponsiveDrawer-V_onl9NV.js} +1 -1
  41. package/dist/web/index.html +2 -2
  42. package/package.json +1 -1
  43. package/src/commands/daemon.js +27 -4
  44. package/src/platforms/channel-auth-registry.js +36 -6
  45. package/src/platforms/channel-auth-service.js +12 -2
  46. package/src/platforms/drivers/omp/prompts.js +58 -2
  47. package/src/platforms/drivers/omp/proxy-implementation.js +25 -1
  48. package/src/platforms/drivers/opencode/channels-implementation.js +25 -22
  49. package/src/platforms/drivers/opencode/channels.js +6 -1
  50. package/src/platforms/manifests/omp.json +2 -1
  51. package/src/platforms/manifests/opencode.json +28 -0
  52. package/src/platforms/native-oauth-adapters.js +318 -18
  53. package/src/platforms/oauth-credentials-service.js +344 -13
  54. package/src/server/index.js +35 -1
  55. package/dist/web/assets/ConfigTemplates-Crg3xWe5.js +0 -1
  56. package/dist/web/assets/ProjectList-BJt1OIaI.js +0 -1
  57. package/dist/web/assets/ProjectList-DG3yu8xZ.css +0 -1
  58. package/dist/web/assets/SessionList-B-bXZRFk.js +0 -1
  59. package/dist/web/assets/headers-BqDmkMjy.js +0 -1
  60. package/dist/web/assets/index-Cmmwj3Fx.js +0 -2
@@ -1 +1 @@
1
- import{N as e,gn as a,gt as l,hn as t,ht as s,i,s as r,t as o}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as n,C as u,D as c,K as d,M as v,O as p,S as f,V as m,W as y,Z as b,_t as h,at as k,b as g,et as w,g as _,ht as j,m as C,mt as P,p as S,r as x,st as z,w as U,x as L}from"./vue-vendor-BqZbbXHA.js";import{r as $,s as T,t as O}from"./platforms-DWXgmy2w.js";import{C as B,K,Nt as G,Pt as A,W as E,X as M,_ as H,dt as I,et as D,h as N,it as R,jt as q,q as V,tt as F,z as W}from"./icons-DmFe4b5j.js";import{t as J}from"./use-message-DqCwefG6.js";import{O as Z,l as Q,n as X}from"./light-0eavxNvt.js";import{c as Y,n as ee,s as ae,t as le}from"./AssetPathField-DyniM0pF.js";import{n as te,t as se}from"./Upload-CzC4rGI4.js";import{n as ie,t as re}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as oe}from"./DrawerContent-ChXgZ1Xm.js";import{B as ne,F as ue,I as ce,K as de,N as ve,P as pe,V as fe,a as me,c as ye,d as be,dt as he,f as ke,ft as ge,gt as we,h as _e,i as je,jt as Ce,l as Pe,m as Se,mt as xe,n as ze,o as Ue,p as Le,r as $e,rt as Te,s as Oe,t as Be,u as Ke}from"./index-Cmmwj3Fx.js";import{t as Ge}from"./clipboard-B46yyoz_.js";import{t as Ae}from"./markdown-u082bbtj.js";import{t as Ee}from"./MarkdownEditor-BMMUufSc.js";import{a as Me,c as He}from"./project-config-B2baPzYL.js";import{n as Ie,t as De}from"./skill-repo-input-B_fkGlUK.js";var Ne=a("p","\n box-sizing: border-box;\n transition: color .3s var(--n-bezier);\n margin: var(--n-margin);\n font-size: var(--n-font-size);\n line-height: var(--n-line-height);\n color: var(--n-text-color);\n",[t("&:first-child","margin-top: 0;"),t("&:last-child","margin-bottom: 0;")]),Re=n({name:"P",props:Object.assign(Object.assign({},e.props),{depth:[String,Number]}),setup(a){const{mergedClsPrefixRef:t,inlineThemeDisabled:i}=l(a),r=e("Typography","-p",Ne,X,a,t),o=g(()=>{const{depth:e}=a,l=e||"1",{common:{cubicBezierEaseInOut:t},self:{pFontSize:s,pLineHeight:i,pMargin:o,pTextColor:n,[`pTextColor${l}Depth`]:u}}=r.value;return{"--n-bezier":t,"--n-font-size":s,"--n-line-height":i,"--n-margin":o,"--n-text-color":void 0===e?n:u}}),n=i?s("p",g(()=>`${a.depth||""}`),o,a):void 0;return{mergedClsPrefix:t,cssVars:i?void 0:o,themeClass:null==n?void 0:n.themeClass,onRender:null==n?void 0:n.onRender}},render(){var e;return null===(e=this.onRender)||void 0===e||e.call(this),v("p",{class:[`${this.mergedClsPrefix}-p`,this.themeClass],style:this.cssVars},this.$slots)}});function qe(e={}){return Boolean(e?.isLocal||"local"===e?.source)}function Ve(e={}){return Boolean("local-repo"===e?.source||"local"===e?.repoProvider||e?.repoLocalPath)}function Fe(e={}){return Boolean("gitlab"===e?.repoProvider||e?.repoProjectPath)}function We(e={}){return Boolean("github"===e?.repoProvider||(e?.repoOwner||e?.repoName)&&!Fe(e)&&!Ve(e))}function Je(e={}){return e?.protected||"system-installed"===e?.source?"系统":e?.sourceProvider?`${{native:"OMP 原生","omp-plugins":"OMP 插件",claude:"Claude","claude-plugins":"Claude 插件",agents:"Agents",codex:"Codex",opencode:"OpenCode",github:"GitHub",gitlab:"GitLab","local-repo":"本地仓库",remote:"远端",custom:"自定义","cc-tool":"本地技能"}[e.sourceProvider]||e.sourceProvider} · ${"project"===e.sourceScope?"项目":"全局"}`:"native-installed"===e?.source?"原生":Ve(e)?"本地仓库":qe(e)?"本地技能":Fe(e)?"GitLab":We(e)?"GitHub":""}function Ze(e={}){return qe(e)&&!Ve(e)?"":Ve(e)?e?.repoLocalPath||"":Fe(e)?e?.repoProjectPath||[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):We(e)?[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):""}function Qe(e={}){return qe(e)||Ve(e)?null:e?.readmeUrl||e?.repoUrl||null}function Xe(e={}){return Fe(e)?"GitLab":We(e)?"GitHub":"仓库"}function Ye(e={}){const a=Je(e),l=Ze(e);return a&&l?`${a} · ${l}`:a||"未知来源"}var ea={class:"asset-card-main"},aa={class:"asset-card-top"},la={class:"asset-card-title-stack"},ta={class:"asset-card-title-row"},sa={class:"asset-name"},ia={class:"asset-tags"},ra={key:0,class:"asset-description"},oa={class:"asset-meta"},na={class:"asset-meta-item mono"},ua=["title"],ca=["href"],da=o({__name:"SkillCard",props:{skill:{type:Object,required:!0},toggling:{type:Boolean,default:!1},panelScope:{type:String,default:"user"}},emits:["click","toggle","approve"],setup:e=>(a,l)=>{return y(),U("div",{class:j(["skill-card asset-card",{"is-enabled":e.skill.enabled,"is-protected":e.skill.protected}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.skill))},[L("div",ea,[L("div",aa,[L("div",la,[L("div",ta,[L("span",{class:j(["asset-status-dot",{active:e.skill.enabled}])},null,2),L("span",sa,h(e.skill.name),1)]),L("div",ia,[e.skill.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[5]||(l[5]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[6]||(l[6]=[c("已关闭",-1)])]),_:1})),e.skill.cached?(y(),f(P(xe),{key:2,type:"info",size:"tiny",bordered:!1},{default:w(()=>[...l[7]||(l[7]=[c("已缓存",-1)])]),_:1})):u("",!0),"approved"===e.skill.trust?(y(),f(P(xe),{key:3,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[8]||(l[8]=[c("已批准",-1)])]),_:1})):u("",!0),"blocked"===e.skill.trust?(y(),f(P(xe),{key:4,type:"error",size:"tiny",bordered:!1},{default:w(()=>[...l[9]||(l[9]=[c("已阻止",-1)])]),_:1})):u("",!0),"pending"===e.skill.trust?(y(),f(P(xe),{key:5,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[10]||(l[10]=[c("待审批",-1)])]),_:1})):u("",!0),"needs_review"===e.skill.trust?(y(),f(P(xe),{key:6,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[11]||(l[11]=[c("需复审",-1)])]),_:1})):u("",!0),e.skill.protected?(y(),f(P(xe),{key:7,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[12]||(l[12]=[c("受保护",-1)])]),_:1})):u("",!0),"unsupported"===e.skill.projection?.state?(y(),f(P(xe),{key:8,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[13]||(l[13]=[c("不支持投影",-1)])]),_:1})):u("",!0),P(Je)(e.skill)?(y(),f(P(xe),{key:9,type:"info",size:"tiny",bordered:!1},{default:w(()=>[c(h(P(Je)(e.skill)),1)]),_:1})):u("",!0)])])]),e.skill.description?(y(),U("div",ra,h((t=e.skill.description,s=120,t?.length>s?t.slice(0,s)+"...":t)),1)):u("",!0),L("div",oa,[L("span",na,h(e.skill.directory),1),P(Ze)(e.skill)?(y(),U("span",{key:0,class:"asset-meta-item source-item",title:P(Ze)(e.skill)},h(P(Ze)(e.skill)),9,ua)):u("",!0),P(Qe)(e.skill)?(y(),U("a",{key:1,class:"asset-link",href:P(Qe)(e.skill),target:"_blank",rel:"noopener noreferrer",onClick:l[0]||(l[0]=C(()=>{},["stop"]))},h(P(Xe)(e.skill)),9,ca)):u("",!0)])]),L("div",{class:"asset-card-actions",onClick:l[3]||(l[3]=C(()=>{},["stop"]))},[!["pending","needs_review"].includes(e.skill.trust)||"project"===e.panelScope&&"project"!==e.skill.sourceScope?u("",!0):(y(),f(P(r),{key:0,size:"small",tertiary:"",type:"warning",onClick:l[1]||(l[1]=l=>a.$emit("approve",e.skill))},{default:w(()=>[...l[14]||(l[14]=[c("审批",-1)])]),_:1})),p(P(ue),{value:e.skill.enabled,loading:e.toggling,disabled:e.skill.protected||e.skill.readonly||!1===e.skill.managed||!e.skill.cached||"approved"!==e.skill.trust||"unsupported"===e.skill.projection?.state||"project"===e.panelScope&&"project"!==e.skill.sourceScope,"aria-label":`${e.skill.name} 开关`,"onUpdate:value":l[2]||(l[2]=l=>a.$emit("toggle",e.skill,l))},null,8,["value","loading","disabled","aria-label"])])],2);var t,s}},[["__scopeId","data-v-f428a4a6"]]),va={class:"repo-manager"},pa={class:"repo-list"},fa={class:"repo-main"},ma={class:"repo-info"},ya={class:"repo-name-row"},ba={class:"repo-name"},ha={class:"repo-branch"},ka={key:0,class:"repo-auth-hint"},ga={class:"repo-actions"},wa={key:0,class:"empty-hint"},_a={class:"add-repo"},ja={class:"add-form"},Ca={class:"tips"},Pa={class:"recommended"},Sa={class:"recommended-list"},xa=["onClick"],za={class:"rec-info"},Ua={class:"rec-name"},La={class:"rec-desc"},$a={key:0,class:"auth-manager"},Ta={class:"auth-meta"},Oa={class:"auth-meta-row"},Ba={class:"auth-value"},Ka={class:"auth-meta-row"},Ga={class:"auth-value"},Aa={class:"auth-meta-row"},Ea={class:"auth-value"},Ma={class:"auth-actions"},Ha=o({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const l=e,t=a,s=g({get:()=>l.visible,set:e=>t("update:visible",e)}),o=z([]),n=z(!1),v=z(!1),k=z(!1),C=z(null),x=z(!1),$=z(!1),T=z({token:""}),O=z({input:"",branch:"main"}),B=g(()=>C.value?("gitlab"===C.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),K=g(()=>"codex"===l.platform?[{provider:"github",owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===l.platform?[{provider:"github",owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===l.platform?[{provider:"github",owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{provider:"github",owner:"anthropics",name:"skills",description:"官方技能库",branch:"main",directory:"skills"},{provider:"github",owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{provider:"github",owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]);function G(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=De(e.directory),t=e.branch||"main";return"local"===a?`local:${e.localPath||""}::${l}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${t}::${l}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${t}::${l}`}function E(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function M(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function H(e){return"github"===e?.provider||"gitlab"===e?.provider}function I(e){return H(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function D(){k.value=!1,C.value=null,T.value.token="",x.value=!1,$.value=!1}const N=g(()=>Ie(O.value.input)),R=g(()=>!!N.value);async function q(){n.value=!0;try{const e=await Oe(l.platform);e.success&&(o.value=e.repos||[])}catch(e){ve.error("加载仓库失败: "+e.message)}finally{n.value=!1}}async function V(){if(!R.value)return;const e=N.value;v.value=!0;try{const a=await Be({...e,branch:O.value.branch||"main",enabled:!0},l.platform);a.success&&(o.value=a.repos,O.value.input="",O.value.branch="main",ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}async function F(){const e=C.value,a=T.value.token.trim();if(e&&a){x.value=!0;try{const s=await _e(e,{token:a},l.platform);s.success&&(o.value=s.repos||[],ve.success("仓库 Token 已保存"),t("updated"),D())}catch(s){ve.error("保存 Token 失败: "+s.message)}finally{x.value=!1}}}async function W(){const e=C.value;if(e){$.value=!0;try{const a=await _e(e,{clearToken:!0},l.platform);a.success&&(o.value=a.repos||[],ve.success("仓库 Token 已清除"),t("updated"),D())}catch(a){ve.error("清除 Token 失败: "+a.message)}finally{$.value=!1}}}function J(e){const a=G(e);return o.value.some(e=>G(e)===a)}function Z(){D(),t("update:visible",!1)}return b(()=>l.visible,e=>{e&&q()}),b(()=>l.platform,()=>{l.visible&&q()}),m(()=>{l.visible&&q()}),(e,a)=>(y(),U(_,null,[p(P(Q),{show:s.value,"onUpdate:show":a[2]||(a[2]=e=>s.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:Z},{default:w(()=>[L("div",va,[L("div",pa,[p(P(ce),{show:n.value},{default:w(()=>[(y(!0),U(_,null,d(o.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[L("div",fa,[p(P(ue),{value:e.enabled,size:"small","onUpdate:value":a=>async function(e,a){try{const s=await Le(e,a,l.platform);s.success&&(o.value=s.repos,t("updated"))}catch(s){ve.error("操作失败: "+s.message)}}(e,a)},null,8,["value","onUpdate:value"]),L("div",ma,[L("div",ya,[L("div",ba,h(E(e)),1),H(e)?(y(),f(P(xe),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:w(()=>[c(h(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):u("",!0)]),L("div",ha,h(M(e)),1),H(e)?(y(),U("div",ka,h(I(e)),1)):u("",!0)])]),L("div",ga,[H(e)?(y(),f(P(r),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){H(e)&&(C.value=e,T.value.token="",k.value=!0)}(e)},{default:w(()=>[...a[5]||(a[5]=[c(" 认证 ",-1)])]),_:1},8,["onClick"])):u("",!0),p(P(r),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>async function(e){try{const a=await Ke(e,l.platform);a.success&&(o.value=a.repos,ve.success("仓库已删除"),t("updated"))}catch(a){ve.error("删除失败: "+a.message)}}(e)},{default:w(()=>[...a[6]||(a[6]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===o.value.length?(y(),U("div",wa," 暂无仓库,请添加 ")):u("",!0)]),_:1},8,["show"])]),L("div",_a,[a[8]||(a[8]=L("div",{class:"add-title"},"添加仓库",-1)),L("div",ja,[p(P(he),{value:O.value.input,"onUpdate:value":a[0]||(a[0]=e=>O.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:S(V,["enter"])},null,8,["value"]),p(P(he),{value:O.value.branch,"onUpdate:value":a[1]||(a[1]=e=>O.value.branch=e),placeholder:"分支(本地可忽略)",size:"small",class:"branch-input"},null,8,["value"]),p(P(r),{type:"primary",size:"small",disabled:!R.value,loading:v.value,focusable:!1,onClick:V},{default:w(()=>[...a[7]||(a[7]=[c(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[9]||(a[9]=L("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),L("div",Ca,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>[...a[10]||(a[10]=[c(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),L("div",Pa,[a[12]||(a[12]=L("div",{class:"recommended-title"},"推荐仓库",-1)),L("div",Sa,[(y(!0),U(_,null,d(K.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:j(["recommended-item",{added:J(e)}]),onClick:a=>!J(e)&&async function(e){v.value=!0;try{const a=await Be({...e,branch:e.branch||"main",directory:e.directory||"",enabled:!0},l.platform);a.success&&(ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),o.value=a.repos,t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}(e)},[L("div",za,[L("span",Ua,h(E(e)),1),L("span",La,h(e.description),1)]),J(e)?(y(),f(P(xe),{key:0,size:"tiny",type:"success",bordered:!1},{default:w(()=>[...a[11]||(a[11]=[c(" 已添加 ",-1)])]),_:1})):(y(),f(P(i),{key:1,class:"add-icon"},{default:w(()=>[p(P(A))]),_:1}))],10,xa))),128))])])])]),_:1},8,["show"]),p(P(Q),{show:k.value,"onUpdate:show":a[4]||(a[4]=e=>k.value=e),preset:"card",title:B.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:D},{default:w(()=>[C.value?(y(),U("div",$a,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>{return[c(h((e=C.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),L("div",Ta,[L("div",Oa,[a[13]||(a[13]=L("span",{class:"auth-label"},"仓库",-1)),L("span",Ba,h(E(C.value)),1)]),L("div",Ka,[a[14]||(a[14]=L("span",{class:"auth-label"},"来源",-1)),L("span",Ga,h("gitlab"===C.value.provider?"GitLab":"GitHub"),1)]),L("div",Aa,[a[15]||(a[15]=L("span",{class:"auth-label"},"当前状态",-1)),L("span",Ea,h(C.value.hasToken?`已配置 ${C.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),p(P(he),{value:T.value.token,"onUpdate:value":a[3]||(a[3]=e=>T.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:S(F,["enter"])},null,8,["value"]),a[19]||(a[19]=L("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),L("div",Ma,[p(P(r),{focusable:!1,onClick:D},{default:w(()=>[...a[16]||(a[16]=[c(" 取消 ",-1)])]),_:1}),C.value.hasToken?(y(),f(P(r),{key:0,type:"warning",secondary:"",focusable:!1,loading:$.value,onClick:W},{default:w(()=>[...a[17]||(a[17]=[c(" 清除 Token ",-1)])]),_:1},8,["loading"])):u("",!0),p(P(r),{type:"primary",focusable:!1,disabled:!T.value.token.trim(),loading:x.value,onClick:F},{default:w(()=>[...a[18]||(a[18]=[c(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):u("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-059e6be9"]]),Ia={style:{"margin-bottom":"12px"}},Da={class:"file-list"},Na={class:"file-item"},Ra={class:"file-info"},qa={class:"file-path"},Va={key:1,class:"file-size"},Fa={class:"file-actions"},Wa={class:"modal-footer"},Ja=o({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","created"],setup(e,{emit:a}){const l=e,t=g(()=>({...l.projectPath?{cwd:l.projectPath}:{},...l.scope&&"user"!==l.scope?{scope:l.scope}:{}})),s=a,o=g({get:()=>l.visible,set:e=>s("update:visible",e)}),n=z("simple"),v=z(null),m=z({directory:"",name:"",description:"",content:""}),k={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},C=z(null),S=z({directory:"",files:[]}),x={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},$=z(!1),T=z(!1),O=z(null),B=z(""),G=z(-1),E=z(!1),M=z(""),H=z(""),I=g(()=>S.value.files.some(e=>"SKILL.md"===e.path));function N(e){const a=e.toLowerCase().substring(e.lastIndexOf("."));return[".md",".txt",".json",".js",".ts",".py",".sh",".yaml",".yml",".toml",".xml",".html",".css"].includes(a)}function R({file:e}){return!0}async function q({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{const t=N(e.name);let s=e.name;e.file?.webkitRelativePath&&(s=e.file.webkitRelativePath.split("/").slice(1).join("/")),S.value.files.push({path:s,content:t?l.target.result:btoa(l.target.result),isBase64:!t,size:e.file.size}),a()},t.onerror=l,N(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function W(){G.value>=0&&(S.value.files[G.value].content=B.value),T.value=!1,O.value=null,B.value="",G.value=-1}function J(){M.value.trim()?S.value.files.some(e=>e.path===M.value)?ve.warning("文件已存在"):(S.value.files.push({path:M.value,content:H.value,isBase64:!1,size:new Blob([H.value]).size}),E.value=!1,M.value="",H.value=""):ve.warning("请输入文件路径")}function X(){const e=`---\nname: "${S.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;S.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function ee(){"simple"===n.value?await async function(){try{await(v.value?.validate())}catch(e){return}$.value=!0;try{const e=await ze({name:m.value.name||m.value.directory,directory:m.value.directory,description:m.value.description,content:m.value.content,...t.value},l.platform);e.success?(ve.success("技能已缓存,当前为关闭状态,审批后可启用"),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}():await async function(){try{await(C.value?.validate())}catch(e){return}if(!I.value)return void ve.error("必须包含 SKILL.md 文件");$.value=!0;try{const e=await $e({directory:S.value.directory,files:S.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64})),...t.value},l.platform);e.success?(ve.success(`技能已缓存,当前为关闭状态,包含 ${e.fileCount} 个文件`),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}()}function le(){s("update:visible",!1)}return b(()=>l.visible,e=>{e||(n.value="simple",m.value={directory:"",name:"",description:"",content:""},S.value={directory:"",files:[]},O.value=null,B.value="",G.value=-1,M.value="",H.value="")}),(e,a)=>(y(),f(P(Q),{show:o.value,"onUpdate:show":a[14]||(a[14]=e=>o.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:le},{footer:w(()=>[L("div",Wa,[p(P(r),{onClick:le},{default:w(()=>[...a[24]||(a[24]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",loading:$.value,onClick:ee},{default:w(()=>[...a[25]||(a[25]=[c(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:w(()=>[p(P(ae),{value:n.value,"onUpdate:value":a[6]||(a[6]=e=>n.value=e),type:"line",animated:""},{default:w(()=>[p(P(Y),{name:"simple",tab:"简单模式"},{default:w(()=>[p(P(fe),{ref_key:"simpleFormRef",ref:v,model:m.value,rules:k,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[15]||(a[15]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:m.value.directory,"onUpdate:value":a[0]||(a[0]=e=>m.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"技能名称",path:"name"},{default:w(()=>[p(P(he),{value:m.value.name,"onUpdate:value":a[1]||(a[1]=e=>m.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1}),p(P(ne),{label:"描述",path:"description"},{default:w(()=>[p(P(he),{value:m.value.description,"onUpdate:value":a[2]||(a[2]=e=>m.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),p(P(ne),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:w(()=>[p(Ee,{modelValue:m.value.content,"onUpdate:modelValue":a[3]||(a[3]=e=>m.value.content=e),rows:10,"min-height":200,placeholder:"输入技能的详细指令内容,支持 Markdown 格式..."},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1}),p(P(Y),{name:"advanced",tab:"高级模式 (多文件)"},{default:w(()=>[p(P(fe),{ref_key:"advancedFormRef",ref:C,model:S.value,rules:x,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[16]||(a[16]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:S.value.directory,"onUpdate:value":a[4]||(a[4]=e=>S.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"文件上传"},{default:w(()=>[p(P(se),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":q,onBeforeUpload:R},{default:w(()=>[p(P(te),null,{default:w(()=>[L("div",Ia,[p(P(i),{size:"48",depth:3},{default:w(()=>[p(P(V))]),_:1})]),p(P(pe),{style:{"font-size":"16px"}},{default:w(()=>[...a[17]||(a[17]=[c(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),p(P(Re),{depth:"3",style:{margin:"8px 0 0 0"}},{default:w(()=>[...a[18]||(a[18]=[c(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),S.value.files.length>0?(y(),f(P(ne),{key:0,label:"已添加的文件"},{default:w(()=>[L("div",Da,[(y(!0),U(_,null,d(S.value.files,(e,l)=>(y(),f(P(Z),{key:e.path,size:"small",class:j({"skill-md":"SKILL.md"===e.path})},{default:w(()=>{return[L("div",Na,[L("div",Ra,[p(P(i),{size:16,class:"file-icon"},{default:w(()=>[e.isDirectory?(y(),f(P(K),{key:1})):(y(),f(P(F),{key:0}))]),_:2},1024),L("span",qa,h(e.path),1),"SKILL.md"===e.path?(y(),f(P(xe),{key:0,size:"small",type:"primary"},{default:w(()=>[...a[19]||(a[19]=[c("必需",-1)])]),_:1})):u("",!0),e.size?(y(),U("span",Va,h((t=e.size,t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB")),1)):u("",!0)]),L("div",Fa,[N(e.path)?(y(),f(P(r),{key:0,size:"small",text:"",onClick:e=>function(e){const a=S.value.files[e];O.value=a,B.value=a.content,G.value=e,T.value=!0}(l)},{default:w(()=>[...a[20]||(a[20]=[c(" 编辑 ",-1)])]),_:1},8,["onClick"])):u("",!0),"SKILL.md"!==e.path?(y(),f(P(r),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){S.value.files.splice(e,1)}(l)},{default:w(()=>[...a[21]||(a[21]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])):u("",!0)])])];var t}),_:2},1032,["class"]))),128))])]),_:1})):u("",!0),p(P(ne),null,{default:w(()=>[p(P(de),null,{default:w(()=>[p(P(r),{onClick:a[5]||(a[5]=e=>E.value=!0)},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[a[22]||(a[22]=c(" 添加文件 ",-1))]),_:1}),I.value?u("",!0):(y(),f(P(r),{key:0,onClick:X},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(D))]),_:1})]),default:w(()=>[a[23]||(a[23]=c(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),p(P(Q),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:w(()=>[...a[26]||(a[26]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:W},{default:w(()=>[...a[27]||(a[27]=[c("保存",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(ne),{label:O.value?.path||"文件内容"},{default:w(()=>[p(P(he),{value:B.value,"onUpdate:value":a[7]||(a[7]=e=>B.value=e),type:"textarea",rows:15,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["label"])]),_:1},8,["show"]),p(P(Q),{show:E.value,"onUpdate:show":a[13]||(a[13]=e=>E.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[12]||(a[12]=e=>E.value=!1)},{default:w(()=>[...a[29]||(a[29]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:J},{default:w(()=>[...a[30]||(a[30]=[c("添加",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(fe),{"label-placement":"top"},{default:w(()=>[p(P(ne),{label:"文件路径"},{feedback:w(()=>[...a[28]||(a[28]=[c(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:w(()=>[p(P(he),{value:M.value,"onUpdate:value":a[10]||(a[10]=e=>M.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),p(P(ne),{label:"文件内容"},{default:w(()=>[p(P(he),{value:H.value,"onUpdate:value":a[11]||(a[11]=e=>H.value=e),type:"textarea",rows:10,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1},8,["show"]))}},[["__scopeId","data-v-d5c75ec8"]]),Za={class:"asset-detail-drawer-header"},Qa={class:"asset-detail-identity"},Xa={class:"asset-detail-heading"},Ya={class:"asset-detail-name"},el={class:"asset-detail-meta"},al={key:3,class:"asset-detail-subtle"},ll={class:"asset-detail-body"},tl={key:0,class:"asset-detail-loading"},sl={key:1,class:"asset-detail-error"},il={class:"asset-detail-container"},rl={class:"asset-detail-info-section"},ol={class:"asset-detail-description"},nl={key:0,class:"asset-detail-info-section"},ul={class:"asset-detail-box"},cl=["href"],dl={key:1},vl={class:"asset-detail-info-section"},pl={class:"asset-detail-actions"},fl=["innerHTML"],ml={key:1,class:"asset-detail-empty"},yl={__name:"SkillDetailDrawer",props:{visible:{type:Boolean,default:!1},skill:{type:Object,default:null},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","updated"],setup(e,{emit:a}){const{drawerWidth:l}=re(600),t=e,s=a,o=g({get:()=>t.visible,set:e=>s("update:visible",e)}),n=z(!1),d=z(""),v=z(null),m=z(!1),k=z(0),_={height:"100%",minHeight:0,overflow:"hidden"};function j(e){const a=String(e);if("undefined"==typeof document)return a.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi,"").replace(/\son[a-z]+\s*=\s*(['"])[\s\S]*?\1/gi,"").replace(/\s(?:href|src)\s*=\s*(['"])\s*(?:javascript|vbscript|data):[\s\S]*?\1/gi,"");const l=new Set(["a","abbr","b","blockquote","br","code","del","div","em","h1","h2","h3","h4","h5","h6","hr","i","img","input","li","ol","p","pre","span","strong","sub","sup","table","tbody","td","tfoot","th","thead","tr","ul"]),t=new Set(["alt","checked","class","disabled","href","id","rel","src","target","title","type"]),s=(e,a)=>{const l=String(e||"").trim();return!(!l.startsWith("#")&&!l.startsWith("/"))||(!("a"!==a||!/^mailto:/i.test(l))||/^https?:\/\//i.test(l))},i=document.createElement("template");return i.innerHTML=a,i.content.querySelectorAll("*").forEach(e=>{const a=e.tagName.toLowerCase();if(l.has(a))for(const l of[...e.attributes]){const i=l.name.toLowerCase();t.has(i)&&!/^on/i.test(i)?"href"!==i&&"src"!==i||s(l.value,a)||e.removeAttribute(l.name):e.removeAttribute(l.name)}else e.remove()}),i.innerHTML}const C=g(()=>{if(!v.value?.content)return"";try{return j(Ae(v.value.content,{breaks:!0,gfm:!0}))}catch{return j(v.value.content)}}),S=g(()=>v.value?Ze(v.value):""),x=g(()=>v.value?Qe(v.value):""),$=g(()=>v.value?Xe(v.value):""),T=g(()=>v.value?.installPath||v.value?.path||v.value?.fullPath||""),O=g(()=>({...t.projectPath?{cwd:t.projectPath}:{},...t.scope&&"user"!==t.scope?{scope:t.scope}:{}}));async function B(){if(!t.skill?.directory)return;const e=++k.value;n.value=!0,d.value="";try{const l=await me(t.skill.directory,t.platform,(a=t.skill,{id:a.repoId,provider:a.repoProvider,host:a.repoHost,owner:a.repoOwner,name:a.repoName,branch:a.repoBranch||"main",directory:a.repoDirectory||"",projectPath:a.repoProjectPath,localPath:a.repoLocalPath,repoUrl:a.repoUrl}),t.skill.fullDirectory||null,O.value);if(e!==k.value)return;l.success?v.value={...t.skill,...l,source:l.source||t.skill?.source,repoProvider:l.repoProvider||t.skill?.repoProvider,repoOwner:l.repoOwner||t.skill?.repoOwner,repoName:l.repoName||t.skill?.repoName,repoProjectPath:l.repoProjectPath||t.skill?.repoProjectPath,repoLocalPath:l.repoLocalPath||t.skill?.repoLocalPath,repoUrl:l.repoUrl||t.skill?.repoUrl}:d.value=l.message||"加载失败"}catch(l){if(e!==k.value)return;d.value=l.response?.data?.message||l.message||"加载失败"}finally{e===k.value&&(n.value=!1)}var a}async function K(){if(!m.value&&v.value&&v.value.controlKey&&!v.value.protected&&!v.value.readonly&&!1!==v.value.managed&&"approved"===v.value.trust&&"unsupported"!==v.value.projection?.state&&v.value.cached&&("project"!==t.scope||"project"===v.value.sourceScope)){m.value=!0;try{const e="project"===t.scope?await He(t.projectPath,t.platform,v.value.controlKey,!v.value.enabled):await ke(v.value.controlKey,!v.value.enabled,t.platform,O.value);if("needs_approval"===e.status)return void ve.warning("该技能需要先审批");if("unsupported"===e.status)return void ve.error("当前平台不支持安全投影");if("conflict"===e.status)return void ve.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===e.status)return void ve.error(e.lastError||"Skill 投影失败");v.value.enabled=e.enabled,v.value.projection=e.projection||v.value.projection,ve.success(e.enabled?"技能已启用":"技能已关闭"),s("updated")}catch(e){ve.error("切换失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function A(){if(v.value?.controlKey&&["pending","needs_review"].includes(v.value.trust)){m.value=!0;try{const e=await be(v.value.controlKey,"approved",t.platform,O.value);v.value.trust=e.trust,ve.success("技能已批准,当前仍保持关闭"),s("updated")}catch(e){ve.error("审批失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function H(){if(v.value?.content)try{if("manual"===(await Ge(v.value.content))?.method)return void ve.warning("自动复制失败,已弹出手动复制框");ve.success("已复制到剪贴板")}catch{ve.error("复制失败")}}return b(()=>[t.visible,t.skill],([e,a])=>{e&&a?B():(k.value+=1,n.value=!1,v.value=null,d.value="")}),(a,t)=>(y(),f(P(ie),{show:o.value,"onUpdate:show":t[0]||(t[0]=e=>o.value=e),width:P(l),placement:"right","show-mask":!0},{default:w(()=>[p(P(oe),{closable:"","native-scrollbar":!1,"body-content-style":_},{header:w(()=>[L("div",Za,[L("div",Qa,[p(P(i),{size:20,class:"asset-detail-icon"},{default:w(()=>[p(P(M))]),_:1}),L("div",Xa,[L("span",Ya,h(v.value?.name||e.skill?.name||"技能详情"),1),L("div",el,[v.value?.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...t[1]||(t[1]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[2]||(t[2]=[c("已关闭",-1)])]),_:1})),v.value?.protected?(y(),f(P(xe),{key:2,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[3]||(t[3]=[c("受保护",-1)])]),_:1})):u("",!0),v.value?(y(),U("span",al,h(P(Ye)(v.value)),1)):u("",!0)])])])])]),default:w(()=>[L("div",ll,[n.value?(y(),U("div",tl,[p(P(ce),{size:"medium"}),t[4]||(t[4]=L("p",null,"加载技能详情中...",-1))])):d.value?(y(),U("div",sl,[p(P(i),{size:44,class:"asset-detail-error-icon"},{default:w(()=>[p(P(G))]),_:1}),L("p",null,h(d.value),1),p(P(r),{size:"small",onClick:B},{default:w(()=>[...t[5]||(t[5]=[c("重试",-1)])]),_:1})])):v.value?(y(),f(P(ae),{key:2,type:"line",animated:"",class:"asset-detail-tabs"},{default:w(()=>[p(P(Y),{name:"overview",tab:"概览"},{default:w(()=>[L("div",il,[L("div",rl,[t[6]||(t[6]=L("h3",{class:"asset-detail-section-title"},"描述",-1)),L("p",ol,h(v.value.description||"暂无描述"),1)]),p(le,{path:T.value},null,8,["path"]),S.value||x.value?(y(),U("div",nl,[t[7]||(t[7]=L("h3",{class:"asset-detail-section-title"},"来源",-1)),L("div",ul,[p(P(i),{size:16},{default:w(()=>[p(P(E))]),_:1}),x.value?(y(),U("a",{key:0,class:"asset-detail-link",href:x.value,target:"_blank",rel:"noopener noreferrer"},h($.value),9,cl)):(y(),U("code",dl,h(S.value),1))])])):u("",!0),L("div",vl,[t[12]||(t[12]=L("h3",{class:"asset-detail-section-title"},"操作",-1)),L("div",pl,[!v.value.controlKey||"approved"!==v.value.trust||!v.value.cached||v.value.protected||"unsupported"===v.value.projection?.state||"project"===e.scope&&"project"!==v.value.sourceScope?v.value.controlKey&&["pending","needs_review"].includes(v.value.trust)&&("project"!==e.scope||"project"===v.value.sourceScope)?(y(),f(P(r),{key:1,tertiary:"",type:"warning",size:"small",loading:m.value,onClick:A},{default:w(()=>[...t[8]||(t[8]=[c(" 审批 ",-1)])]),_:1},8,["loading"])):v.value.protected?(y(),f(P(r),{key:2,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[9]||(t[9]=[c(" 受保护 ",-1)])]),_:1})):"unsupported"===v.value.projection?.state?(y(),f(P(r),{key:3,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[10]||(t[10]=[c(" 不支持投影 ",-1)])]),_:1})):["pending","needs_review"].includes(v.value.trust)?(y(),f(P(r),{key:4,tertiary:"",size:"small",disabled:""},{default:w(()=>[c(h("needs_review"===v.value.trust?"需复审":"待审批"),1)]),_:1})):u("",!0):(y(),f(P(r),{key:0,type:"primary",size:"small",loading:m.value,onClick:K},{default:w(()=>[c(h(v.value.enabled?"关闭此技能":"启用此技能"),1)]),_:1},8,["loading"])),p(P(r),{text:"",size:"small",disabled:!v.value.content,onClick:H},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(R))]),_:1})]),default:w(()=>[t[11]||(t[11]=c(" 复制内容 ",-1))]),_:1},8,["disabled"])])])])]),_:1}),p(P(Y),{name:"content",tab:"内容"},{default:w(()=>[v.value.content?(y(),U("div",{key:0,class:"asset-detail-content",innerHTML:C.value},null,8,fl)):(y(),U("div",ml,[p(P(i),{size:44,class:"asset-detail-empty-icon"},{default:w(()=>[p(P(D))]),_:1}),t[13]||(t[13]=L("p",null,"暂无技能内容",-1))]))]),_:1})]),_:1})):u("",!0)])]),_:1})]),_:1},8,["show","width"]))}},bl=["enableCodexUser","enableClaudeUser","enablePiUser","enablePiProject"];function hl(e){if(null===e||"object"!=typeof e)return!1;const a=Object.getPrototypeOf(e);return a===Object.prototype||null===a}function kl(e){if(!hl(e)||!0!==e.success)throw new Error("响应未明确标记成功");if(!hl(e.settings)||!bl.every(a=>"boolean"==typeof e.settings[a]))throw new Error("响应 settings 必须包含四个布尔字段");return Object.fromEntries(bl.map(a=>[a,e.settings[a]]))}function gl(e){return"omp"===e}async function wl(e,a){return function(e,a){const l=kl(e);if(!bl.every(e=>l[e]===a[e]))throw new Error("响应 settings 与提交值不一致");return l}(await a(e),e)}var _l={key:1,class:"scan-settings"},jl={class:"setting-copy"},Cl=["id"],Pl={class:"setting-description"},Sl={class:"modal-actions"},xl=o({__name:"OmpSkillSettingsModal",props:{visible:Boolean,operationToken:{type:Number,default:0}},emits:["update:visible","saved"],setup(e,{emit:a}){const l=e,t=a,s=J(),i=z(!1),o=z(!1),n=z(""),u=bl,v=k(Object.fromEntries(u.map(e=>[e,!0])));let m=0,j=0;const C=[{key:"enableCodexUser",label:"Codex 用户",description:"扫描 Codex 用户技能目录"},{key:"enableClaudeUser",label:"Claude 用户与插件",description:"扫描 Claude 用户目录和插件技能"},{key:"enablePiUser",label:"OMP 用户与插件",description:"扫描 OMP 用户目录和插件技能"},{key:"enablePiProject",label:"当前项目 .omp/skills",description:"扫描当前项目的 OMP 技能目录"}],S=g({get:()=>l.visible,set:e=>{o.value||t("update:visible",e)}});function x(e){try{if(e instanceof Error)return e.message;if("string"==typeof e)return e;if(null==e)return"未知错误";if("object"==typeof e&&"string"==typeof e.message)return e.message}catch{}try{const a=JSON.stringify(e);if("string"==typeof a)return a}catch{}try{return String(e)}catch{return"未知错误"}}async function $(){const e=++m;i.value=!0,n.value="";try{const a=kl(await je());if(e!==m||!l.visible)return;Object.assign(v,a)}catch(a){if(e!==m||!l.visible)return;n.value=`加载技能扫描设置失败: ${x(a)}`,s.error(n.value)}finally{e===m&&(i.value=!1)}}async function T(){if(i.value||o.value||n.value)return;const e=++j,a=l.operationToken,r=Object.fromEntries(u.map(e=>[e,v[e]]));o.value=!0;try{const s=await wl(r,Se);if(e!==j||a!==l.operationToken||!l.visible)return;t("saved",s,a)}catch(c){if(e!==j||a!==l.operationToken||!l.visible)return;s.error(`保存技能扫描设置失败: ${x(c)}`)}finally{e===j&&a===l.operationToken&&l.visible&&(o.value=!1)}}return b(()=>l.visible,e=>{e?$():(m+=1,j+=1,o.value=!1,i.value=!1,n.value="")},{immediate:!0}),(e,a)=>(y(),f(P(Q),{show:S.value,"onUpdate:show":a[1]||(a[1]=e=>S.value=e),preset:"card",title:"技能扫描设置",bordered:!1,closable:!o.value,"mask-closable":!o.value,"close-on-esc":!o.value,style:{width:"420px","max-width":"92vw"}},{footer:w(()=>[L("div",Sl,[p(P(r),{disabled:o.value,onClick:a[0]||(a[0]=e=>S.value=!1)},{default:w(()=>[...a[4]||(a[4]=[c("取消",-1)])]),_:1},8,["disabled"]),p(P(r),{type:"primary",loading:o.value,disabled:i.value||o.value||!!n.value,onClick:T},{default:w(()=>[...a[5]||(a[5]=[c(" 保存 ",-1)])]),_:1},8,["loading","disabled"])])]),default:w(()=>[p(P(ce),{show:i.value},{default:w(()=>[n.value?(y(),f(P(ge),{key:0,type:"error","show-icon":!0},{action:w(()=>[p(P(r),{size:"small",disabled:i.value||o.value,onClick:$},{default:w(()=>[...a[2]||(a[2]=[c("重试",-1)])]),_:1},8,["disabled"])]),default:w(()=>[c(h(n.value)+" ",1)]),_:1})):(y(),U("div",_l,[a[3]||(a[3]=L("div",{class:"section-title"},"扫描来源",-1)),(y(),U(_,null,d(C,e=>L("div",{key:e.key,class:"setting-row"},[L("div",jl,[L("div",{id:`${e.key}-label`,class:"setting-label"},h(e.label),9,Cl),L("div",Pl,h(e.description),1)]),p(P(ue),{value:v[e.key],"onUpdate:value":a=>v[e.key]=a,disabled:i.value||o.value,"aria-labelledby":`${e.key}-label`},null,8,["value","onUpdate:value","disabled","aria-labelledby"])])),64))]))]),_:1},8,["show"])]),_:1},8,["show","closable","mask-closable","close-on-esc"]))}},[["__scopeId","data-v-c6883975"]]),zl={key:0,class:"asset-panel-header"},Ul={class:"asset-title-group"},Ll={class:"asset-heading"},$l={class:"asset-title-row"},Tl={class:"asset-platform-pill"},Ol={key:0,class:"asset-action-row"},Bl={key:1,class:"asset-drawer-toolbar"},Kl={key:0,class:"asset-action-row"},Gl={class:"asset-summary"},Al={class:"asset-summary-item"},El={class:"asset-summary-value"},Ml={class:"asset-summary-item"},Hl={class:"asset-summary-value"},Il={class:"asset-summary-item"},Dl={class:"asset-summary-value"},Nl={class:"asset-filter-bar"},Rl={class:"asset-panel-content"},ql={key:0,class:"asset-empty"},Vl={class:"asset-list"},Fl={key:2,class:"asset-footer"},Wl={key:3,class:"asset-refresh-status"},Jl={key:0},Zl={key:1},Ql=o({__name:"SkillsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""},scope:{type:String,default:"user"}},emits:["back","updated"],setup(e){const a=e,l=x(),t=O(),s=J(),o=z(!1),n=z([]),v=z(""),k=z("all"),C=z(!1),S=z(!1),K=z(!1),G=z(!1),D=z(0),R=z(null),V=z({}),F=z(!1),Z=z(null),Q=z(!1),X=z(0),Y=z(0),{byCapability:ae}=Ce(),le=g(()=>ae("skills").map(e=>e.key)),te=g(()=>le.value.includes(de.value)),se=g(()=>t.get(de.value)||T(de.value)),ie=g(()=>se.value?.resourceActions?.skills||{}),re=g(()=>!1!==ie.value.create),oe=g(()=>!1!==ie.value.repositories),ne=g(()=>!1!==ie.value.import),ue=g(()=>!1!==ie.value.refresh),de=g(()=>String(a.platform||$(l)||"claude").trim().toLowerCase()),ve=g(()=>({...a.projectPath?{cwd:a.projectPath}:{},...a.scope&&"user"!==a.scope?{scope:a.scope}:{}})),pe=g(()=>gl(de.value)),fe=g(()=>{const e=t.get(de.value)||T(de.value);return e.label||e.title||"Claude Code"}),me=[{label:"全部",value:"all"},{label:"已启用",value:"enabled"},{label:"已关闭",value:"disabled"},{label:"待审批 / 需复审",value:"pending"}],ge=g(()=>n.value.filter(e=>e.enabled).length),_e=g(()=>({never_fetched:"从未刷新",queued:"排队中",running:"刷新中",succeeded:"已完成",partial:"部分成功",failed:"失败",interrupted:"已中断",idle:"已完成"}[Z.value?.status||Z.value?.state]||"")),je=g(()=>n.value.filter(e=>["pending","needs_review"].includes(e.trust)).length),Se=g(()=>{let e=n.value;if("enabled"===k.value?e=e.filter(e=>e.enabled):"disabled"===k.value?e=e.filter(e=>!e.enabled):"pending"===k.value&&(e=e.filter(e=>["pending","needs_review"].includes(e.trust))),v.value.trim()){const a=v.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a))}return[...e].sort((e,a)=>e.enabled===a.enabled?0:e.enabled?-1:1)}),xe=g(()=>v.value?"没有匹配的技能":"enabled"===k.value?"暂无已启用的技能":"disabled"===k.value?"暂无已关闭的技能":"pending"===k.value?"暂无待审批的技能":te.value?re.value||oe.value||ue.value?"暂无可用技能,请配置仓库源":`${fe.value} 当前没有可管理的技能`:`${fe.value} 暂未提供 Skills 能力`);async function ze({notifyError:e=!0}={}){const l=++X.value,t=de.value;if(!te.value)return n.value=[],o.value=!1,!1;o.value=!0;try{const e="project"===a.scope?await Me(a.projectPath,t):await ye(t,ve.value),s="project"===a.scope?[...Array.isArray(e?.project)?e.project:[],...Array.isArray(e?.inherited)?e.inherited:[]]:function(e){if(!hl(e))throw new Error("技能列表响应必须是普通对象");if(!0!==e.success)throw new Error("string"==typeof e.message&&e.message?e.message:"技能列表响应未明确标记成功");if(!Array.isArray(e.skills))throw new Error("技能列表响应 skills 必须是数组");return e.skills}(e);return l===X.value&&t===de.value&&(n.value=s,Z.value=e.refresh||null,!0)}catch(i){return l!==X.value||t!==de.value||e&&s.error("加载技能失败: "+(i?.message||String(i))),!1}finally{l===X.value&&t===de.value&&(o.value=!1)}}async function Le(){if(te.value&&ne.value&&"claude"===de.value){Q.value=!0;try{const e=await ee("skills");e.success?(s.success(`成功导入 ${e.imported} 个技能`),await ze()):s.error(e.message||"导入失败")}catch(e){s.error("导入失败: "+e.message)}finally{Q.value=!1}}}async function $e(e,l){if(!te.value)return;if(!e.controlKey||e.protected||e.readonly||!1===e.managed||"project"===a.scope&&"project"!==e.sourceScope)return;if(l&&"approved"!==e.trust)return void s.warning("blocked"===e.trust?"该技能已被阻止":"该技能需要先审批");if("unsupported"===e.projection?.state)return void s.error("当前平台不支持安全投影,无法切换该项目技能");if(l&&!e.cached)return void s.warning("该技能尚无完整缓存,请先手动刷新远端");const t=e.controlKey;V.value[t]=!0;try{const i="project"===a.scope?await He(a.projectPath,de.value,t,l):await ke(t,l,de.value,ve.value);if("needs_approval"===i.status)return void s.warning("该技能需要先审批");if("blocked"===i.status)return void s.error("该技能已被阻止");if("unsupported"===i.status)return void s.error("当前平台不支持安全投影");if("conflict"===i.status)return void s.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===i.status)return void s.error(i.lastError||"Skill 投影失败");const r=n.value.find(e=>e.controlKey===t);r&&(r.enabled=i.enabled,r.installed=i.enabled,r.projection=i.projection||r.projection),s.success(l?`技能 "${e.name}" 已启用`:`技能 "${e.name}" 已关闭`)}catch(i){s.error("切换失败: "+(i.response?.data?.message||i.message))}finally{delete V.value[t]}}async function Oe(e){if(!te.value)return;if(!e.controlKey||!["pending","needs_review"].includes(e.trust))return;if("project"===a.scope&&"project"!==e.sourceScope)return;const l=e.controlKey;V.value[l]=!0;try{const a=await be(l,"approved",de.value,ve.value),t=n.value.find(e=>e.controlKey===l);t&&(t.trust=a.trust),s.success(`技能 "${e.name}" 已批准,当前仍保持关闭`)}catch(t){s.error("审批失败: "+(t.response?.data?.message||t.message))}finally{delete V.value[l]}}async function Be(){if(!te.value||!ue.value||F.value)return;const e=Y.value,l=JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""}),t=()=>e===Y.value&&l===JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""});F.value=!0;try{const e=de.value,a=await Pe(e,ve.value);if(!t())return;Z.value=a.task||null;let l=a.task;for(;l&&["queued","running"].includes(l.status);){await new Promise(e=>setTimeout(e,250));const e=await Ue(l.id,{...ve.value,platform:de.value});if(!t())return;l=e.task,Z.value=l}if(!t())return;"failed"===l?.status?s.error(l.error||"远端刷新失败"):"partial"===l?.status?s.warning("远端刷新部分成功"):s.success("远端 Skill 刷新完成"),await ze()}catch(i){t()&&s.error("刷新失败: "+(i.response?.data?.message||i.message))}finally{t()&&(F.value=!1)}}function Ke(){pe.value&&(D.value+=1,G.value=!0)}async function Ge(e,a){if("omp"!==de.value||!G.value||a!==D.value)return;const l=de.value;G.value=!1;const t=await async function(e,a){return e(),a({notifyError:!1})}(()=>{},ze);l===de.value&&a===D.value&&(t?s.success("技能扫描设置已保存"):s.error("设置已保存,但技能列表刷新失败"))}function Ae(e){R.value=e,K.value=!0}return m(()=>{a.inDrawer&&!a.drawerVisible||ze()}),b(()=>a.drawerVisible,e=>{e&&ze()}),b([()=>de.value,()=>a.scope,()=>a.projectPath],([e])=>{Y.value+=1,F.value=!1,Z.value=null,D.value+=1,gl(e)||(G.value=!1),ze()}),(l,t)=>(y(),U("div",{class:j(["skills-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?u("",!0):(y(),U("div",zl,[L("div",Ul,[e.hideBack?u("",!0):(y(),f(P(r),{key:0,text:"",onClick:t[0]||(t[0]=e=>l.$emit("back")),class:"back-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(q))]),_:1})]),_:1})),L("div",Ll,[L("div",$l,[t[12]||(t[12]=L("span",{class:"asset-title"},"技能管理",-1)),L("span",Tl,h(fe.value),1)]),t[13]||(t[13]=L("div",{class:"asset-subtitle"},"缓存并控制当前平台可用的技能",-1))])]),te.value?(y(),U("div",Ol,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[1]||(t[1]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[14]||(t[14]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[2]||(t[2]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[15]||(t[15]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[16]||(t[16]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[17]||(t[17]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[18]||(t[18]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])),e.inDrawer?(y(),U("div",Bl,[te.value?(y(),U("div",Kl,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[3]||(t[3]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[19]||(t[19]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[4]||(t[4]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[20]||(t[20]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[21]||(t[21]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[22]||(t[22]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[23]||(t[23]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])):u("",!0),L("div",Gl,[L("span",Al,[t[24]||(t[24]=L("span",{class:"asset-summary-label"},"全部",-1)),L("span",El,h(n.value.length),1)]),L("span",Ml,[t[25]||(t[25]=L("span",{class:"asset-summary-label"},"已启用",-1)),L("span",Hl,h(ge.value),1)]),L("span",Il,[t[26]||(t[26]=L("span",{class:"asset-summary-label"},"待审批",-1)),L("span",Dl,h(je.value),1)])]),L("div",Nl,[p(P(he),{value:v.value,"onUpdate:value":t[5]||(t[5]=e=>v.value=e),placeholder:"搜索技能名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:w(()=>[p(P(i),null,{default:w(()=>[p(P(H))]),_:1})]),_:1},8,["value"]),p(P(Te),{value:k.value,"onUpdate:value":t[6]||(t[6]=e=>k.value=e),options:me,size:"small",class:"asset-filter"},null,8,["value"])]),L("div",Rl,[p(P(ce),{show:o.value},{default:w(()=>[0!==Se.value.length||o.value?u("",!0):(y(),U("div",ql,[p(P(we),{description:xe.value},{icon:w(()=>[p(P(i),{size:"48",color:"var(--text-quaternary)"},{default:w(()=>[p(P(M))]),_:1})]),extra:w(()=>[te.value&&oe.value&&0===n.value.length?(y(),f(P(r),{key:0,size:"small",onClick:t[7]||(t[7]=e=>C.value=!0)},{default:w(()=>[...t[27]||(t[27]=[c("配置仓库源",-1)])]),_:1})):u("",!0)]),_:1},8,["description"])])),L("div",Vl,[(y(!0),U(_,null,d(Se.value,e=>(y(),f(da,{key:e.controlKey||e.key,skill:e,toggling:!!V.value[e.controlKey||e.key],"panel-scope":a.scope,onClick:Ae,onToggle:$e,onApprove:Oe},null,8,["skill","toggling","panel-scope"]))),128))])]),_:1},8,["show"])]),ue.value?(y(),U("div",Fl,[p(P(i),{size:"14",class:"asset-info-icon"},{default:w(()=>[p(P(W))]),_:1}),L("span",null,"开关变更后需重启 "+h(fe.value)+" 生效;远端刷新只在手动点击后执行",1)])):u("",!0),_e.value?(y(),U("div",Wl,[c(" 刷新任务:"+h(_e.value)+" ",1),void 0!==Z.value?.fetchedSkills?(y(),U("span",Jl," · 已处理 "+h(Z.value.fetchedSkills)+" 个 Skill",1)):u("",!0),Z.value?.failedRepos?.length?(y(),U("span",Zl," · 失败仓库 "+h(Z.value.failedRepos.length),1)):u("",!0)])):u("",!0),p(Ha,{visible:C.value,"onUpdate:visible":t[8]||(t[8]=e=>C.value=e),platform:de.value,onUpdated:ze},null,8,["visible","platform"]),p(Ja,{visible:S.value,"onUpdate:visible":t[9]||(t[9]=e=>S.value=e),platform:de.value,scope:a.scope,"project-path":a.projectPath,onCreated:ze},null,8,["visible","platform","scope","project-path"]),p(yl,{visible:K.value,"onUpdate:visible":t[10]||(t[10]=e=>K.value=e),skill:R.value,platform:de.value,scope:a.scope,"project-path":a.projectPath,onUpdated:ze},null,8,["visible","skill","platform","scope","project-path"]),p(xl,{visible:G.value,"onUpdate:visible":t[11]||(t[11]=e=>G.value=e),"operation-token":D.value,onSaved:Ge},null,8,["visible","operation-token"])],2))}},[["__scopeId","data-v-efda7d55"]]);export{Ql as t};
1
+ import{N as e,gn as a,gt as l,hn as t,ht as s,i,s as r,t as o}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as n,C as u,D as c,K as d,M as v,O as p,S as f,V as m,W as y,Z as b,_t as h,at as k,b as g,et as w,g as _,ht as j,m as C,mt as P,p as S,r as x,st as z,w as U,x as L}from"./vue-vendor-BqZbbXHA.js";import{r as $,s as T,t as O}from"./platforms-DWXgmy2w.js";import{C as B,K,Nt as G,Pt as A,W as E,X as M,_ as H,dt as I,et as D,h as N,it as R,jt as q,q as V,tt as F,z as W}from"./icons-DmFe4b5j.js";import{t as J}from"./use-message-DqCwefG6.js";import{O as Z,l as Q,n as X}from"./light-0eavxNvt.js";import{c as Y,n as ee,s as ae,t as le}from"./AssetPathField-C9TOPl7o.js";import{n as te,t as se}from"./Upload-CdyVHxCI.js";import{n as ie,t as re}from"./useResponsiveDrawer-V_onl9NV.js";import{t as oe}from"./DrawerContent-ChXgZ1Xm.js";import{B as ne,F as ue,I as ce,K as de,N as ve,P as pe,V as fe,a as me,c as ye,d as be,dt as he,f as ke,ft as ge,gt as we,h as _e,i as je,jt as Ce,l as Pe,m as Se,mt as xe,n as ze,o as Ue,p as Le,r as $e,rt as Te,s as Oe,t as Be,u as Ke}from"./index-BKlAWTH-.js";import{t as Ge}from"./clipboard-B46yyoz_.js";import{t as Ae}from"./markdown-u082bbtj.js";import{t as Ee}from"./MarkdownEditor-9TTwTS-U.js";import{a as Me,c as He}from"./project-config-B2baPzYL.js";import{n as Ie,t as De}from"./skill-repo-input-B_fkGlUK.js";var Ne=a("p","\n box-sizing: border-box;\n transition: color .3s var(--n-bezier);\n margin: var(--n-margin);\n font-size: var(--n-font-size);\n line-height: var(--n-line-height);\n color: var(--n-text-color);\n",[t("&:first-child","margin-top: 0;"),t("&:last-child","margin-bottom: 0;")]),Re=n({name:"P",props:Object.assign(Object.assign({},e.props),{depth:[String,Number]}),setup(a){const{mergedClsPrefixRef:t,inlineThemeDisabled:i}=l(a),r=e("Typography","-p",Ne,X,a,t),o=g(()=>{const{depth:e}=a,l=e||"1",{common:{cubicBezierEaseInOut:t},self:{pFontSize:s,pLineHeight:i,pMargin:o,pTextColor:n,[`pTextColor${l}Depth`]:u}}=r.value;return{"--n-bezier":t,"--n-font-size":s,"--n-line-height":i,"--n-margin":o,"--n-text-color":void 0===e?n:u}}),n=i?s("p",g(()=>`${a.depth||""}`),o,a):void 0;return{mergedClsPrefix:t,cssVars:i?void 0:o,themeClass:null==n?void 0:n.themeClass,onRender:null==n?void 0:n.onRender}},render(){var e;return null===(e=this.onRender)||void 0===e||e.call(this),v("p",{class:[`${this.mergedClsPrefix}-p`,this.themeClass],style:this.cssVars},this.$slots)}});function qe(e={}){return Boolean(e?.isLocal||"local"===e?.source)}function Ve(e={}){return Boolean("local-repo"===e?.source||"local"===e?.repoProvider||e?.repoLocalPath)}function Fe(e={}){return Boolean("gitlab"===e?.repoProvider||e?.repoProjectPath)}function We(e={}){return Boolean("github"===e?.repoProvider||(e?.repoOwner||e?.repoName)&&!Fe(e)&&!Ve(e))}function Je(e={}){return e?.protected||"system-installed"===e?.source?"系统":e?.sourceProvider?`${{native:"OMP 原生","omp-plugins":"OMP 插件",claude:"Claude","claude-plugins":"Claude 插件",agents:"Agents",codex:"Codex",opencode:"OpenCode",github:"GitHub",gitlab:"GitLab","local-repo":"本地仓库",remote:"远端",custom:"自定义","cc-tool":"本地技能"}[e.sourceProvider]||e.sourceProvider} · ${"project"===e.sourceScope?"项目":"全局"}`:"native-installed"===e?.source?"原生":Ve(e)?"本地仓库":qe(e)?"本地技能":Fe(e)?"GitLab":We(e)?"GitHub":""}function Ze(e={}){return qe(e)&&!Ve(e)?"":Ve(e)?e?.repoLocalPath||"":Fe(e)?e?.repoProjectPath||[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):We(e)?[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):""}function Qe(e={}){return qe(e)||Ve(e)?null:e?.readmeUrl||e?.repoUrl||null}function Xe(e={}){return Fe(e)?"GitLab":We(e)?"GitHub":"仓库"}function Ye(e={}){const a=Je(e),l=Ze(e);return a&&l?`${a} · ${l}`:a||"未知来源"}var ea={class:"asset-card-main"},aa={class:"asset-card-top"},la={class:"asset-card-title-stack"},ta={class:"asset-card-title-row"},sa={class:"asset-name"},ia={class:"asset-tags"},ra={key:0,class:"asset-description"},oa={class:"asset-meta"},na={class:"asset-meta-item mono"},ua=["title"],ca=["href"],da=o({__name:"SkillCard",props:{skill:{type:Object,required:!0},toggling:{type:Boolean,default:!1},panelScope:{type:String,default:"user"}},emits:["click","toggle","approve"],setup:e=>(a,l)=>{return y(),U("div",{class:j(["skill-card asset-card",{"is-enabled":e.skill.enabled,"is-protected":e.skill.protected}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.skill))},[L("div",ea,[L("div",aa,[L("div",la,[L("div",ta,[L("span",{class:j(["asset-status-dot",{active:e.skill.enabled}])},null,2),L("span",sa,h(e.skill.name),1)]),L("div",ia,[e.skill.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[5]||(l[5]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[6]||(l[6]=[c("已关闭",-1)])]),_:1})),e.skill.cached?(y(),f(P(xe),{key:2,type:"info",size:"tiny",bordered:!1},{default:w(()=>[...l[7]||(l[7]=[c("已缓存",-1)])]),_:1})):u("",!0),"approved"===e.skill.trust?(y(),f(P(xe),{key:3,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[8]||(l[8]=[c("已批准",-1)])]),_:1})):u("",!0),"blocked"===e.skill.trust?(y(),f(P(xe),{key:4,type:"error",size:"tiny",bordered:!1},{default:w(()=>[...l[9]||(l[9]=[c("已阻止",-1)])]),_:1})):u("",!0),"pending"===e.skill.trust?(y(),f(P(xe),{key:5,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[10]||(l[10]=[c("待审批",-1)])]),_:1})):u("",!0),"needs_review"===e.skill.trust?(y(),f(P(xe),{key:6,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[11]||(l[11]=[c("需复审",-1)])]),_:1})):u("",!0),e.skill.protected?(y(),f(P(xe),{key:7,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[12]||(l[12]=[c("受保护",-1)])]),_:1})):u("",!0),"unsupported"===e.skill.projection?.state?(y(),f(P(xe),{key:8,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[13]||(l[13]=[c("不支持投影",-1)])]),_:1})):u("",!0),P(Je)(e.skill)?(y(),f(P(xe),{key:9,type:"info",size:"tiny",bordered:!1},{default:w(()=>[c(h(P(Je)(e.skill)),1)]),_:1})):u("",!0)])])]),e.skill.description?(y(),U("div",ra,h((t=e.skill.description,s=120,t?.length>s?t.slice(0,s)+"...":t)),1)):u("",!0),L("div",oa,[L("span",na,h(e.skill.directory),1),P(Ze)(e.skill)?(y(),U("span",{key:0,class:"asset-meta-item source-item",title:P(Ze)(e.skill)},h(P(Ze)(e.skill)),9,ua)):u("",!0),P(Qe)(e.skill)?(y(),U("a",{key:1,class:"asset-link",href:P(Qe)(e.skill),target:"_blank",rel:"noopener noreferrer",onClick:l[0]||(l[0]=C(()=>{},["stop"]))},h(P(Xe)(e.skill)),9,ca)):u("",!0)])]),L("div",{class:"asset-card-actions",onClick:l[3]||(l[3]=C(()=>{},["stop"]))},[!["pending","needs_review"].includes(e.skill.trust)||"project"===e.panelScope&&"project"!==e.skill.sourceScope?u("",!0):(y(),f(P(r),{key:0,size:"small",tertiary:"",type:"warning",onClick:l[1]||(l[1]=l=>a.$emit("approve",e.skill))},{default:w(()=>[...l[14]||(l[14]=[c("审批",-1)])]),_:1})),p(P(ue),{value:e.skill.enabled,loading:e.toggling,disabled:e.skill.protected||e.skill.readonly||!1===e.skill.managed||!e.skill.cached||"approved"!==e.skill.trust||"unsupported"===e.skill.projection?.state||"project"===e.panelScope&&"project"!==e.skill.sourceScope,"aria-label":`${e.skill.name} 开关`,"onUpdate:value":l[2]||(l[2]=l=>a.$emit("toggle",e.skill,l))},null,8,["value","loading","disabled","aria-label"])])],2);var t,s}},[["__scopeId","data-v-f428a4a6"]]),va={class:"repo-manager"},pa={class:"repo-list"},fa={class:"repo-main"},ma={class:"repo-info"},ya={class:"repo-name-row"},ba={class:"repo-name"},ha={class:"repo-branch"},ka={key:0,class:"repo-auth-hint"},ga={class:"repo-actions"},wa={key:0,class:"empty-hint"},_a={class:"add-repo"},ja={class:"add-form"},Ca={class:"tips"},Pa={class:"recommended"},Sa={class:"recommended-list"},xa=["onClick"],za={class:"rec-info"},Ua={class:"rec-name"},La={class:"rec-desc"},$a={key:0,class:"auth-manager"},Ta={class:"auth-meta"},Oa={class:"auth-meta-row"},Ba={class:"auth-value"},Ka={class:"auth-meta-row"},Ga={class:"auth-value"},Aa={class:"auth-meta-row"},Ea={class:"auth-value"},Ma={class:"auth-actions"},Ha=o({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const l=e,t=a,s=g({get:()=>l.visible,set:e=>t("update:visible",e)}),o=z([]),n=z(!1),v=z(!1),k=z(!1),C=z(null),x=z(!1),$=z(!1),T=z({token:""}),O=z({input:"",branch:"main"}),B=g(()=>C.value?("gitlab"===C.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),K=g(()=>"codex"===l.platform?[{provider:"github",owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===l.platform?[{provider:"github",owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===l.platform?[{provider:"github",owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{provider:"github",owner:"anthropics",name:"skills",description:"官方技能库",branch:"main",directory:"skills"},{provider:"github",owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{provider:"github",owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]);function G(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=De(e.directory),t=e.branch||"main";return"local"===a?`local:${e.localPath||""}::${l}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${t}::${l}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${t}::${l}`}function E(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function M(e){const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function H(e){return"github"===e?.provider||"gitlab"===e?.provider}function I(e){return H(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function D(){k.value=!1,C.value=null,T.value.token="",x.value=!1,$.value=!1}const N=g(()=>Ie(O.value.input)),R=g(()=>!!N.value);async function q(){n.value=!0;try{const e=await Oe(l.platform);e.success&&(o.value=e.repos||[])}catch(e){ve.error("加载仓库失败: "+e.message)}finally{n.value=!1}}async function V(){if(!R.value)return;const e=N.value;v.value=!0;try{const a=await Be({...e,branch:O.value.branch||"main",enabled:!0},l.platform);a.success&&(o.value=a.repos,O.value.input="",O.value.branch="main",ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}async function F(){const e=C.value,a=T.value.token.trim();if(e&&a){x.value=!0;try{const s=await _e(e,{token:a},l.platform);s.success&&(o.value=s.repos||[],ve.success("仓库 Token 已保存"),t("updated"),D())}catch(s){ve.error("保存 Token 失败: "+s.message)}finally{x.value=!1}}}async function W(){const e=C.value;if(e){$.value=!0;try{const a=await _e(e,{clearToken:!0},l.platform);a.success&&(o.value=a.repos||[],ve.success("仓库 Token 已清除"),t("updated"),D())}catch(a){ve.error("清除 Token 失败: "+a.message)}finally{$.value=!1}}}function J(e){const a=G(e);return o.value.some(e=>G(e)===a)}function Z(){D(),t("update:visible",!1)}return b(()=>l.visible,e=>{e&&q()}),b(()=>l.platform,()=>{l.visible&&q()}),m(()=>{l.visible&&q()}),(e,a)=>(y(),U(_,null,[p(P(Q),{show:s.value,"onUpdate:show":a[2]||(a[2]=e=>s.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:Z},{default:w(()=>[L("div",va,[L("div",pa,[p(P(ce),{show:n.value},{default:w(()=>[(y(!0),U(_,null,d(o.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[L("div",fa,[p(P(ue),{value:e.enabled,size:"small","onUpdate:value":a=>async function(e,a){try{const s=await Le(e,a,l.platform);s.success&&(o.value=s.repos,t("updated"))}catch(s){ve.error("操作失败: "+s.message)}}(e,a)},null,8,["value","onUpdate:value"]),L("div",ma,[L("div",ya,[L("div",ba,h(E(e)),1),H(e)?(y(),f(P(xe),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:w(()=>[c(h(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):u("",!0)]),L("div",ha,h(M(e)),1),H(e)?(y(),U("div",ka,h(I(e)),1)):u("",!0)])]),L("div",ga,[H(e)?(y(),f(P(r),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){H(e)&&(C.value=e,T.value.token="",k.value=!0)}(e)},{default:w(()=>[...a[5]||(a[5]=[c(" 认证 ",-1)])]),_:1},8,["onClick"])):u("",!0),p(P(r),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>async function(e){try{const a=await Ke(e,l.platform);a.success&&(o.value=a.repos,ve.success("仓库已删除"),t("updated"))}catch(a){ve.error("删除失败: "+a.message)}}(e)},{default:w(()=>[...a[6]||(a[6]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===o.value.length?(y(),U("div",wa," 暂无仓库,请添加 ")):u("",!0)]),_:1},8,["show"])]),L("div",_a,[a[8]||(a[8]=L("div",{class:"add-title"},"添加仓库",-1)),L("div",ja,[p(P(he),{value:O.value.input,"onUpdate:value":a[0]||(a[0]=e=>O.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:S(V,["enter"])},null,8,["value"]),p(P(he),{value:O.value.branch,"onUpdate:value":a[1]||(a[1]=e=>O.value.branch=e),placeholder:"分支(本地可忽略)",size:"small",class:"branch-input"},null,8,["value"]),p(P(r),{type:"primary",size:"small",disabled:!R.value,loading:v.value,focusable:!1,onClick:V},{default:w(()=>[...a[7]||(a[7]=[c(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[9]||(a[9]=L("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),L("div",Ca,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>[...a[10]||(a[10]=[c(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),L("div",Pa,[a[12]||(a[12]=L("div",{class:"recommended-title"},"推荐仓库",-1)),L("div",Sa,[(y(!0),U(_,null,d(K.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:j(["recommended-item",{added:J(e)}]),onClick:a=>!J(e)&&async function(e){v.value=!0;try{const a=await Be({...e,branch:e.branch||"main",directory:e.directory||"",enabled:!0},l.platform);a.success&&(ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),o.value=a.repos,t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}(e)},[L("div",za,[L("span",Ua,h(E(e)),1),L("span",La,h(e.description),1)]),J(e)?(y(),f(P(xe),{key:0,size:"tiny",type:"success",bordered:!1},{default:w(()=>[...a[11]||(a[11]=[c(" 已添加 ",-1)])]),_:1})):(y(),f(P(i),{key:1,class:"add-icon"},{default:w(()=>[p(P(A))]),_:1}))],10,xa))),128))])])])]),_:1},8,["show"]),p(P(Q),{show:k.value,"onUpdate:show":a[4]||(a[4]=e=>k.value=e),preset:"card",title:B.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:D},{default:w(()=>[C.value?(y(),U("div",$a,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>{return[c(h((e=C.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),L("div",Ta,[L("div",Oa,[a[13]||(a[13]=L("span",{class:"auth-label"},"仓库",-1)),L("span",Ba,h(E(C.value)),1)]),L("div",Ka,[a[14]||(a[14]=L("span",{class:"auth-label"},"来源",-1)),L("span",Ga,h("gitlab"===C.value.provider?"GitLab":"GitHub"),1)]),L("div",Aa,[a[15]||(a[15]=L("span",{class:"auth-label"},"当前状态",-1)),L("span",Ea,h(C.value.hasToken?`已配置 ${C.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),p(P(he),{value:T.value.token,"onUpdate:value":a[3]||(a[3]=e=>T.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:S(F,["enter"])},null,8,["value"]),a[19]||(a[19]=L("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),L("div",Ma,[p(P(r),{focusable:!1,onClick:D},{default:w(()=>[...a[16]||(a[16]=[c(" 取消 ",-1)])]),_:1}),C.value.hasToken?(y(),f(P(r),{key:0,type:"warning",secondary:"",focusable:!1,loading:$.value,onClick:W},{default:w(()=>[...a[17]||(a[17]=[c(" 清除 Token ",-1)])]),_:1},8,["loading"])):u("",!0),p(P(r),{type:"primary",focusable:!1,disabled:!T.value.token.trim(),loading:x.value,onClick:F},{default:w(()=>[...a[18]||(a[18]=[c(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):u("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-059e6be9"]]),Ia={style:{"margin-bottom":"12px"}},Da={class:"file-list"},Na={class:"file-item"},Ra={class:"file-info"},qa={class:"file-path"},Va={key:1,class:"file-size"},Fa={class:"file-actions"},Wa={class:"modal-footer"},Ja=o({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","created"],setup(e,{emit:a}){const l=e,t=g(()=>({...l.projectPath?{cwd:l.projectPath}:{},...l.scope&&"user"!==l.scope?{scope:l.scope}:{}})),s=a,o=g({get:()=>l.visible,set:e=>s("update:visible",e)}),n=z("simple"),v=z(null),m=z({directory:"",name:"",description:"",content:""}),k={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},C=z(null),S=z({directory:"",files:[]}),x={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},$=z(!1),T=z(!1),O=z(null),B=z(""),G=z(-1),E=z(!1),M=z(""),H=z(""),I=g(()=>S.value.files.some(e=>"SKILL.md"===e.path));function N(e){const a=e.toLowerCase().substring(e.lastIndexOf("."));return[".md",".txt",".json",".js",".ts",".py",".sh",".yaml",".yml",".toml",".xml",".html",".css"].includes(a)}function R({file:e}){return!0}async function q({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{const t=N(e.name);let s=e.name;e.file?.webkitRelativePath&&(s=e.file.webkitRelativePath.split("/").slice(1).join("/")),S.value.files.push({path:s,content:t?l.target.result:btoa(l.target.result),isBase64:!t,size:e.file.size}),a()},t.onerror=l,N(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function W(){G.value>=0&&(S.value.files[G.value].content=B.value),T.value=!1,O.value=null,B.value="",G.value=-1}function J(){M.value.trim()?S.value.files.some(e=>e.path===M.value)?ve.warning("文件已存在"):(S.value.files.push({path:M.value,content:H.value,isBase64:!1,size:new Blob([H.value]).size}),E.value=!1,M.value="",H.value=""):ve.warning("请输入文件路径")}function X(){const e=`---\nname: "${S.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;S.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function ee(){"simple"===n.value?await async function(){try{await(v.value?.validate())}catch(e){return}$.value=!0;try{const e=await ze({name:m.value.name||m.value.directory,directory:m.value.directory,description:m.value.description,content:m.value.content,...t.value},l.platform);e.success?(ve.success("技能已缓存,当前为关闭状态,审批后可启用"),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}():await async function(){try{await(C.value?.validate())}catch(e){return}if(!I.value)return void ve.error("必须包含 SKILL.md 文件");$.value=!0;try{const e=await $e({directory:S.value.directory,files:S.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64})),...t.value},l.platform);e.success?(ve.success(`技能已缓存,当前为关闭状态,包含 ${e.fileCount} 个文件`),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}()}function le(){s("update:visible",!1)}return b(()=>l.visible,e=>{e||(n.value="simple",m.value={directory:"",name:"",description:"",content:""},S.value={directory:"",files:[]},O.value=null,B.value="",G.value=-1,M.value="",H.value="")}),(e,a)=>(y(),f(P(Q),{show:o.value,"onUpdate:show":a[14]||(a[14]=e=>o.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:le},{footer:w(()=>[L("div",Wa,[p(P(r),{onClick:le},{default:w(()=>[...a[24]||(a[24]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",loading:$.value,onClick:ee},{default:w(()=>[...a[25]||(a[25]=[c(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:w(()=>[p(P(ae),{value:n.value,"onUpdate:value":a[6]||(a[6]=e=>n.value=e),type:"line",animated:""},{default:w(()=>[p(P(Y),{name:"simple",tab:"简单模式"},{default:w(()=>[p(P(fe),{ref_key:"simpleFormRef",ref:v,model:m.value,rules:k,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[15]||(a[15]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:m.value.directory,"onUpdate:value":a[0]||(a[0]=e=>m.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"技能名称",path:"name"},{default:w(()=>[p(P(he),{value:m.value.name,"onUpdate:value":a[1]||(a[1]=e=>m.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1}),p(P(ne),{label:"描述",path:"description"},{default:w(()=>[p(P(he),{value:m.value.description,"onUpdate:value":a[2]||(a[2]=e=>m.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),p(P(ne),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:w(()=>[p(Ee,{modelValue:m.value.content,"onUpdate:modelValue":a[3]||(a[3]=e=>m.value.content=e),rows:10,"min-height":200,placeholder:"输入技能的详细指令内容,支持 Markdown 格式..."},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1}),p(P(Y),{name:"advanced",tab:"高级模式 (多文件)"},{default:w(()=>[p(P(fe),{ref_key:"advancedFormRef",ref:C,model:S.value,rules:x,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[16]||(a[16]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:S.value.directory,"onUpdate:value":a[4]||(a[4]=e=>S.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"文件上传"},{default:w(()=>[p(P(se),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":q,onBeforeUpload:R},{default:w(()=>[p(P(te),null,{default:w(()=>[L("div",Ia,[p(P(i),{size:"48",depth:3},{default:w(()=>[p(P(V))]),_:1})]),p(P(pe),{style:{"font-size":"16px"}},{default:w(()=>[...a[17]||(a[17]=[c(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),p(P(Re),{depth:"3",style:{margin:"8px 0 0 0"}},{default:w(()=>[...a[18]||(a[18]=[c(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),S.value.files.length>0?(y(),f(P(ne),{key:0,label:"已添加的文件"},{default:w(()=>[L("div",Da,[(y(!0),U(_,null,d(S.value.files,(e,l)=>(y(),f(P(Z),{key:e.path,size:"small",class:j({"skill-md":"SKILL.md"===e.path})},{default:w(()=>{return[L("div",Na,[L("div",Ra,[p(P(i),{size:16,class:"file-icon"},{default:w(()=>[e.isDirectory?(y(),f(P(K),{key:1})):(y(),f(P(F),{key:0}))]),_:2},1024),L("span",qa,h(e.path),1),"SKILL.md"===e.path?(y(),f(P(xe),{key:0,size:"small",type:"primary"},{default:w(()=>[...a[19]||(a[19]=[c("必需",-1)])]),_:1})):u("",!0),e.size?(y(),U("span",Va,h((t=e.size,t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB")),1)):u("",!0)]),L("div",Fa,[N(e.path)?(y(),f(P(r),{key:0,size:"small",text:"",onClick:e=>function(e){const a=S.value.files[e];O.value=a,B.value=a.content,G.value=e,T.value=!0}(l)},{default:w(()=>[...a[20]||(a[20]=[c(" 编辑 ",-1)])]),_:1},8,["onClick"])):u("",!0),"SKILL.md"!==e.path?(y(),f(P(r),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){S.value.files.splice(e,1)}(l)},{default:w(()=>[...a[21]||(a[21]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])):u("",!0)])])];var t}),_:2},1032,["class"]))),128))])]),_:1})):u("",!0),p(P(ne),null,{default:w(()=>[p(P(de),null,{default:w(()=>[p(P(r),{onClick:a[5]||(a[5]=e=>E.value=!0)},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[a[22]||(a[22]=c(" 添加文件 ",-1))]),_:1}),I.value?u("",!0):(y(),f(P(r),{key:0,onClick:X},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(D))]),_:1})]),default:w(()=>[a[23]||(a[23]=c(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),p(P(Q),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:w(()=>[...a[26]||(a[26]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:W},{default:w(()=>[...a[27]||(a[27]=[c("保存",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(ne),{label:O.value?.path||"文件内容"},{default:w(()=>[p(P(he),{value:B.value,"onUpdate:value":a[7]||(a[7]=e=>B.value=e),type:"textarea",rows:15,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["label"])]),_:1},8,["show"]),p(P(Q),{show:E.value,"onUpdate:show":a[13]||(a[13]=e=>E.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[12]||(a[12]=e=>E.value=!1)},{default:w(()=>[...a[29]||(a[29]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:J},{default:w(()=>[...a[30]||(a[30]=[c("添加",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(fe),{"label-placement":"top"},{default:w(()=>[p(P(ne),{label:"文件路径"},{feedback:w(()=>[...a[28]||(a[28]=[c(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:w(()=>[p(P(he),{value:M.value,"onUpdate:value":a[10]||(a[10]=e=>M.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),p(P(ne),{label:"文件内容"},{default:w(()=>[p(P(he),{value:H.value,"onUpdate:value":a[11]||(a[11]=e=>H.value=e),type:"textarea",rows:10,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1},8,["show"]))}},[["__scopeId","data-v-d5c75ec8"]]),Za={class:"asset-detail-drawer-header"},Qa={class:"asset-detail-identity"},Xa={class:"asset-detail-heading"},Ya={class:"asset-detail-name"},el={class:"asset-detail-meta"},al={key:3,class:"asset-detail-subtle"},ll={class:"asset-detail-body"},tl={key:0,class:"asset-detail-loading"},sl={key:1,class:"asset-detail-error"},il={class:"asset-detail-container"},rl={class:"asset-detail-info-section"},ol={class:"asset-detail-description"},nl={key:0,class:"asset-detail-info-section"},ul={class:"asset-detail-box"},cl=["href"],dl={key:1},vl={class:"asset-detail-info-section"},pl={class:"asset-detail-actions"},fl=["innerHTML"],ml={key:1,class:"asset-detail-empty"},yl={__name:"SkillDetailDrawer",props:{visible:{type:Boolean,default:!1},skill:{type:Object,default:null},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","updated"],setup(e,{emit:a}){const{drawerWidth:l}=re(600),t=e,s=a,o=g({get:()=>t.visible,set:e=>s("update:visible",e)}),n=z(!1),d=z(""),v=z(null),m=z(!1),k=z(0),_={height:"100%",minHeight:0,overflow:"hidden"};function j(e){const a=String(e);if("undefined"==typeof document)return a.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi,"").replace(/\son[a-z]+\s*=\s*(['"])[\s\S]*?\1/gi,"").replace(/\s(?:href|src)\s*=\s*(['"])\s*(?:javascript|vbscript|data):[\s\S]*?\1/gi,"");const l=new Set(["a","abbr","b","blockquote","br","code","del","div","em","h1","h2","h3","h4","h5","h6","hr","i","img","input","li","ol","p","pre","span","strong","sub","sup","table","tbody","td","tfoot","th","thead","tr","ul"]),t=new Set(["alt","checked","class","disabled","href","id","rel","src","target","title","type"]),s=(e,a)=>{const l=String(e||"").trim();return!(!l.startsWith("#")&&!l.startsWith("/"))||(!("a"!==a||!/^mailto:/i.test(l))||/^https?:\/\//i.test(l))},i=document.createElement("template");return i.innerHTML=a,i.content.querySelectorAll("*").forEach(e=>{const a=e.tagName.toLowerCase();if(l.has(a))for(const l of[...e.attributes]){const i=l.name.toLowerCase();t.has(i)&&!/^on/i.test(i)?"href"!==i&&"src"!==i||s(l.value,a)||e.removeAttribute(l.name):e.removeAttribute(l.name)}else e.remove()}),i.innerHTML}const C=g(()=>{if(!v.value?.content)return"";try{return j(Ae(v.value.content,{breaks:!0,gfm:!0}))}catch{return j(v.value.content)}}),S=g(()=>v.value?Ze(v.value):""),x=g(()=>v.value?Qe(v.value):""),$=g(()=>v.value?Xe(v.value):""),T=g(()=>v.value?.installPath||v.value?.path||v.value?.fullPath||""),O=g(()=>({...t.projectPath?{cwd:t.projectPath}:{},...t.scope&&"user"!==t.scope?{scope:t.scope}:{}}));async function B(){if(!t.skill?.directory)return;const e=++k.value;n.value=!0,d.value="";try{const l=await me(t.skill.directory,t.platform,(a=t.skill,{id:a.repoId,provider:a.repoProvider,host:a.repoHost,owner:a.repoOwner,name:a.repoName,branch:a.repoBranch||"main",directory:a.repoDirectory||"",projectPath:a.repoProjectPath,localPath:a.repoLocalPath,repoUrl:a.repoUrl}),t.skill.fullDirectory||null,O.value);if(e!==k.value)return;l.success?v.value={...t.skill,...l,source:l.source||t.skill?.source,repoProvider:l.repoProvider||t.skill?.repoProvider,repoOwner:l.repoOwner||t.skill?.repoOwner,repoName:l.repoName||t.skill?.repoName,repoProjectPath:l.repoProjectPath||t.skill?.repoProjectPath,repoLocalPath:l.repoLocalPath||t.skill?.repoLocalPath,repoUrl:l.repoUrl||t.skill?.repoUrl}:d.value=l.message||"加载失败"}catch(l){if(e!==k.value)return;d.value=l.response?.data?.message||l.message||"加载失败"}finally{e===k.value&&(n.value=!1)}var a}async function K(){if(!m.value&&v.value&&v.value.controlKey&&!v.value.protected&&!v.value.readonly&&!1!==v.value.managed&&"approved"===v.value.trust&&"unsupported"!==v.value.projection?.state&&v.value.cached&&("project"!==t.scope||"project"===v.value.sourceScope)){m.value=!0;try{const e="project"===t.scope?await He(t.projectPath,t.platform,v.value.controlKey,!v.value.enabled):await ke(v.value.controlKey,!v.value.enabled,t.platform,O.value);if("needs_approval"===e.status)return void ve.warning("该技能需要先审批");if("unsupported"===e.status)return void ve.error("当前平台不支持安全投影");if("conflict"===e.status)return void ve.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===e.status)return void ve.error(e.lastError||"Skill 投影失败");v.value.enabled=e.enabled,v.value.projection=e.projection||v.value.projection,ve.success(e.enabled?"技能已启用":"技能已关闭"),s("updated")}catch(e){ve.error("切换失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function A(){if(v.value?.controlKey&&["pending","needs_review"].includes(v.value.trust)){m.value=!0;try{const e=await be(v.value.controlKey,"approved",t.platform,O.value);v.value.trust=e.trust,ve.success("技能已批准,当前仍保持关闭"),s("updated")}catch(e){ve.error("审批失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function H(){if(v.value?.content)try{if("manual"===(await Ge(v.value.content))?.method)return void ve.warning("自动复制失败,已弹出手动复制框");ve.success("已复制到剪贴板")}catch{ve.error("复制失败")}}return b(()=>[t.visible,t.skill],([e,a])=>{e&&a?B():(k.value+=1,n.value=!1,v.value=null,d.value="")}),(a,t)=>(y(),f(P(ie),{show:o.value,"onUpdate:show":t[0]||(t[0]=e=>o.value=e),width:P(l),placement:"right","show-mask":!0},{default:w(()=>[p(P(oe),{closable:"","native-scrollbar":!1,"body-content-style":_},{header:w(()=>[L("div",Za,[L("div",Qa,[p(P(i),{size:20,class:"asset-detail-icon"},{default:w(()=>[p(P(M))]),_:1}),L("div",Xa,[L("span",Ya,h(v.value?.name||e.skill?.name||"技能详情"),1),L("div",el,[v.value?.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...t[1]||(t[1]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[2]||(t[2]=[c("已关闭",-1)])]),_:1})),v.value?.protected?(y(),f(P(xe),{key:2,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[3]||(t[3]=[c("受保护",-1)])]),_:1})):u("",!0),v.value?(y(),U("span",al,h(P(Ye)(v.value)),1)):u("",!0)])])])])]),default:w(()=>[L("div",ll,[n.value?(y(),U("div",tl,[p(P(ce),{size:"medium"}),t[4]||(t[4]=L("p",null,"加载技能详情中...",-1))])):d.value?(y(),U("div",sl,[p(P(i),{size:44,class:"asset-detail-error-icon"},{default:w(()=>[p(P(G))]),_:1}),L("p",null,h(d.value),1),p(P(r),{size:"small",onClick:B},{default:w(()=>[...t[5]||(t[5]=[c("重试",-1)])]),_:1})])):v.value?(y(),f(P(ae),{key:2,type:"line",animated:"",class:"asset-detail-tabs"},{default:w(()=>[p(P(Y),{name:"overview",tab:"概览"},{default:w(()=>[L("div",il,[L("div",rl,[t[6]||(t[6]=L("h3",{class:"asset-detail-section-title"},"描述",-1)),L("p",ol,h(v.value.description||"暂无描述"),1)]),p(le,{path:T.value},null,8,["path"]),S.value||x.value?(y(),U("div",nl,[t[7]||(t[7]=L("h3",{class:"asset-detail-section-title"},"来源",-1)),L("div",ul,[p(P(i),{size:16},{default:w(()=>[p(P(E))]),_:1}),x.value?(y(),U("a",{key:0,class:"asset-detail-link",href:x.value,target:"_blank",rel:"noopener noreferrer"},h($.value),9,cl)):(y(),U("code",dl,h(S.value),1))])])):u("",!0),L("div",vl,[t[12]||(t[12]=L("h3",{class:"asset-detail-section-title"},"操作",-1)),L("div",pl,[!v.value.controlKey||"approved"!==v.value.trust||!v.value.cached||v.value.protected||"unsupported"===v.value.projection?.state||"project"===e.scope&&"project"!==v.value.sourceScope?v.value.controlKey&&["pending","needs_review"].includes(v.value.trust)&&("project"!==e.scope||"project"===v.value.sourceScope)?(y(),f(P(r),{key:1,tertiary:"",type:"warning",size:"small",loading:m.value,onClick:A},{default:w(()=>[...t[8]||(t[8]=[c(" 审批 ",-1)])]),_:1},8,["loading"])):v.value.protected?(y(),f(P(r),{key:2,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[9]||(t[9]=[c(" 受保护 ",-1)])]),_:1})):"unsupported"===v.value.projection?.state?(y(),f(P(r),{key:3,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[10]||(t[10]=[c(" 不支持投影 ",-1)])]),_:1})):["pending","needs_review"].includes(v.value.trust)?(y(),f(P(r),{key:4,tertiary:"",size:"small",disabled:""},{default:w(()=>[c(h("needs_review"===v.value.trust?"需复审":"待审批"),1)]),_:1})):u("",!0):(y(),f(P(r),{key:0,type:"primary",size:"small",loading:m.value,onClick:K},{default:w(()=>[c(h(v.value.enabled?"关闭此技能":"启用此技能"),1)]),_:1},8,["loading"])),p(P(r),{text:"",size:"small",disabled:!v.value.content,onClick:H},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(R))]),_:1})]),default:w(()=>[t[11]||(t[11]=c(" 复制内容 ",-1))]),_:1},8,["disabled"])])])])]),_:1}),p(P(Y),{name:"content",tab:"内容"},{default:w(()=>[v.value.content?(y(),U("div",{key:0,class:"asset-detail-content",innerHTML:C.value},null,8,fl)):(y(),U("div",ml,[p(P(i),{size:44,class:"asset-detail-empty-icon"},{default:w(()=>[p(P(D))]),_:1}),t[13]||(t[13]=L("p",null,"暂无技能内容",-1))]))]),_:1})]),_:1})):u("",!0)])]),_:1})]),_:1},8,["show","width"]))}},bl=["enableCodexUser","enableClaudeUser","enablePiUser","enablePiProject"];function hl(e){if(null===e||"object"!=typeof e)return!1;const a=Object.getPrototypeOf(e);return a===Object.prototype||null===a}function kl(e){if(!hl(e)||!0!==e.success)throw new Error("响应未明确标记成功");if(!hl(e.settings)||!bl.every(a=>"boolean"==typeof e.settings[a]))throw new Error("响应 settings 必须包含四个布尔字段");return Object.fromEntries(bl.map(a=>[a,e.settings[a]]))}function gl(e){return"omp"===e}async function wl(e,a){return function(e,a){const l=kl(e);if(!bl.every(e=>l[e]===a[e]))throw new Error("响应 settings 与提交值不一致");return l}(await a(e),e)}var _l={key:1,class:"scan-settings"},jl={class:"setting-copy"},Cl=["id"],Pl={class:"setting-description"},Sl={class:"modal-actions"},xl=o({__name:"OmpSkillSettingsModal",props:{visible:Boolean,operationToken:{type:Number,default:0}},emits:["update:visible","saved"],setup(e,{emit:a}){const l=e,t=a,s=J(),i=z(!1),o=z(!1),n=z(""),u=bl,v=k(Object.fromEntries(u.map(e=>[e,!0])));let m=0,j=0;const C=[{key:"enableCodexUser",label:"Codex 用户",description:"扫描 Codex 用户技能目录"},{key:"enableClaudeUser",label:"Claude 用户与插件",description:"扫描 Claude 用户目录和插件技能"},{key:"enablePiUser",label:"OMP 用户与插件",description:"扫描 OMP 用户目录和插件技能"},{key:"enablePiProject",label:"当前项目 .omp/skills",description:"扫描当前项目的 OMP 技能目录"}],S=g({get:()=>l.visible,set:e=>{o.value||t("update:visible",e)}});function x(e){try{if(e instanceof Error)return e.message;if("string"==typeof e)return e;if(null==e)return"未知错误";if("object"==typeof e&&"string"==typeof e.message)return e.message}catch{}try{const a=JSON.stringify(e);if("string"==typeof a)return a}catch{}try{return String(e)}catch{return"未知错误"}}async function $(){const e=++m;i.value=!0,n.value="";try{const a=kl(await je());if(e!==m||!l.visible)return;Object.assign(v,a)}catch(a){if(e!==m||!l.visible)return;n.value=`加载技能扫描设置失败: ${x(a)}`,s.error(n.value)}finally{e===m&&(i.value=!1)}}async function T(){if(i.value||o.value||n.value)return;const e=++j,a=l.operationToken,r=Object.fromEntries(u.map(e=>[e,v[e]]));o.value=!0;try{const s=await wl(r,Se);if(e!==j||a!==l.operationToken||!l.visible)return;t("saved",s,a)}catch(c){if(e!==j||a!==l.operationToken||!l.visible)return;s.error(`保存技能扫描设置失败: ${x(c)}`)}finally{e===j&&a===l.operationToken&&l.visible&&(o.value=!1)}}return b(()=>l.visible,e=>{e?$():(m+=1,j+=1,o.value=!1,i.value=!1,n.value="")},{immediate:!0}),(e,a)=>(y(),f(P(Q),{show:S.value,"onUpdate:show":a[1]||(a[1]=e=>S.value=e),preset:"card",title:"技能扫描设置",bordered:!1,closable:!o.value,"mask-closable":!o.value,"close-on-esc":!o.value,style:{width:"420px","max-width":"92vw"}},{footer:w(()=>[L("div",Sl,[p(P(r),{disabled:o.value,onClick:a[0]||(a[0]=e=>S.value=!1)},{default:w(()=>[...a[4]||(a[4]=[c("取消",-1)])]),_:1},8,["disabled"]),p(P(r),{type:"primary",loading:o.value,disabled:i.value||o.value||!!n.value,onClick:T},{default:w(()=>[...a[5]||(a[5]=[c(" 保存 ",-1)])]),_:1},8,["loading","disabled"])])]),default:w(()=>[p(P(ce),{show:i.value},{default:w(()=>[n.value?(y(),f(P(ge),{key:0,type:"error","show-icon":!0},{action:w(()=>[p(P(r),{size:"small",disabled:i.value||o.value,onClick:$},{default:w(()=>[...a[2]||(a[2]=[c("重试",-1)])]),_:1},8,["disabled"])]),default:w(()=>[c(h(n.value)+" ",1)]),_:1})):(y(),U("div",_l,[a[3]||(a[3]=L("div",{class:"section-title"},"扫描来源",-1)),(y(),U(_,null,d(C,e=>L("div",{key:e.key,class:"setting-row"},[L("div",jl,[L("div",{id:`${e.key}-label`,class:"setting-label"},h(e.label),9,Cl),L("div",Pl,h(e.description),1)]),p(P(ue),{value:v[e.key],"onUpdate:value":a=>v[e.key]=a,disabled:i.value||o.value,"aria-labelledby":`${e.key}-label`},null,8,["value","onUpdate:value","disabled","aria-labelledby"])])),64))]))]),_:1},8,["show"])]),_:1},8,["show","closable","mask-closable","close-on-esc"]))}},[["__scopeId","data-v-c6883975"]]),zl={key:0,class:"asset-panel-header"},Ul={class:"asset-title-group"},Ll={class:"asset-heading"},$l={class:"asset-title-row"},Tl={class:"asset-platform-pill"},Ol={key:0,class:"asset-action-row"},Bl={key:1,class:"asset-drawer-toolbar"},Kl={key:0,class:"asset-action-row"},Gl={class:"asset-summary"},Al={class:"asset-summary-item"},El={class:"asset-summary-value"},Ml={class:"asset-summary-item"},Hl={class:"asset-summary-value"},Il={class:"asset-summary-item"},Dl={class:"asset-summary-value"},Nl={class:"asset-filter-bar"},Rl={class:"asset-panel-content"},ql={key:0,class:"asset-empty"},Vl={class:"asset-list"},Fl={key:2,class:"asset-footer"},Wl={key:3,class:"asset-refresh-status"},Jl={key:0},Zl={key:1},Ql=o({__name:"SkillsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""},scope:{type:String,default:"user"}},emits:["back","updated"],setup(e){const a=e,l=x(),t=O(),s=J(),o=z(!1),n=z([]),v=z(""),k=z("all"),C=z(!1),S=z(!1),K=z(!1),G=z(!1),D=z(0),R=z(null),V=z({}),F=z(!1),Z=z(null),Q=z(!1),X=z(0),Y=z(0),{byCapability:ae}=Ce(),le=g(()=>ae("skills").map(e=>e.key)),te=g(()=>le.value.includes(de.value)),se=g(()=>t.get(de.value)||T(de.value)),ie=g(()=>se.value?.resourceActions?.skills||{}),re=g(()=>!1!==ie.value.create),oe=g(()=>!1!==ie.value.repositories),ne=g(()=>!1!==ie.value.import),ue=g(()=>!1!==ie.value.refresh),de=g(()=>String(a.platform||$(l)||"claude").trim().toLowerCase()),ve=g(()=>({...a.projectPath?{cwd:a.projectPath}:{},...a.scope&&"user"!==a.scope?{scope:a.scope}:{}})),pe=g(()=>gl(de.value)),fe=g(()=>{const e=t.get(de.value)||T(de.value);return e.label||e.title||"Claude Code"}),me=[{label:"全部",value:"all"},{label:"已启用",value:"enabled"},{label:"已关闭",value:"disabled"},{label:"待审批 / 需复审",value:"pending"}],ge=g(()=>n.value.filter(e=>e.enabled).length),_e=g(()=>({never_fetched:"从未刷新",queued:"排队中",running:"刷新中",succeeded:"已完成",partial:"部分成功",failed:"失败",interrupted:"已中断",idle:"已完成"}[Z.value?.status||Z.value?.state]||"")),je=g(()=>n.value.filter(e=>["pending","needs_review"].includes(e.trust)).length),Se=g(()=>{let e=n.value;if("enabled"===k.value?e=e.filter(e=>e.enabled):"disabled"===k.value?e=e.filter(e=>!e.enabled):"pending"===k.value&&(e=e.filter(e=>["pending","needs_review"].includes(e.trust))),v.value.trim()){const a=v.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a))}return[...e].sort((e,a)=>e.enabled===a.enabled?0:e.enabled?-1:1)}),xe=g(()=>v.value?"没有匹配的技能":"enabled"===k.value?"暂无已启用的技能":"disabled"===k.value?"暂无已关闭的技能":"pending"===k.value?"暂无待审批的技能":te.value?re.value||oe.value||ue.value?"暂无可用技能,请配置仓库源":`${fe.value} 当前没有可管理的技能`:`${fe.value} 暂未提供 Skills 能力`);async function ze({notifyError:e=!0}={}){const l=++X.value,t=de.value;if(!te.value)return n.value=[],o.value=!1,!1;o.value=!0;try{const e="project"===a.scope?await Me(a.projectPath,t):await ye(t,ve.value),s="project"===a.scope?[...Array.isArray(e?.project)?e.project:[],...Array.isArray(e?.inherited)?e.inherited:[]]:function(e){if(!hl(e))throw new Error("技能列表响应必须是普通对象");if(!0!==e.success)throw new Error("string"==typeof e.message&&e.message?e.message:"技能列表响应未明确标记成功");if(!Array.isArray(e.skills))throw new Error("技能列表响应 skills 必须是数组");return e.skills}(e);return l===X.value&&t===de.value&&(n.value=s,Z.value=e.refresh||null,!0)}catch(i){return l!==X.value||t!==de.value||e&&s.error("加载技能失败: "+(i?.message||String(i))),!1}finally{l===X.value&&t===de.value&&(o.value=!1)}}async function Le(){if(te.value&&ne.value&&"claude"===de.value){Q.value=!0;try{const e=await ee("skills");e.success?(s.success(`成功导入 ${e.imported} 个技能`),await ze()):s.error(e.message||"导入失败")}catch(e){s.error("导入失败: "+e.message)}finally{Q.value=!1}}}async function $e(e,l){if(!te.value)return;if(!e.controlKey||e.protected||e.readonly||!1===e.managed||"project"===a.scope&&"project"!==e.sourceScope)return;if(l&&"approved"!==e.trust)return void s.warning("blocked"===e.trust?"该技能已被阻止":"该技能需要先审批");if("unsupported"===e.projection?.state)return void s.error("当前平台不支持安全投影,无法切换该项目技能");if(l&&!e.cached)return void s.warning("该技能尚无完整缓存,请先手动刷新远端");const t=e.controlKey;V.value[t]=!0;try{const i="project"===a.scope?await He(a.projectPath,de.value,t,l):await ke(t,l,de.value,ve.value);if("needs_approval"===i.status)return void s.warning("该技能需要先审批");if("blocked"===i.status)return void s.error("该技能已被阻止");if("unsupported"===i.status)return void s.error("当前平台不支持安全投影");if("conflict"===i.status)return void s.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===i.status)return void s.error(i.lastError||"Skill 投影失败");const r=n.value.find(e=>e.controlKey===t);r&&(r.enabled=i.enabled,r.installed=i.enabled,r.projection=i.projection||r.projection),s.success(l?`技能 "${e.name}" 已启用`:`技能 "${e.name}" 已关闭`)}catch(i){s.error("切换失败: "+(i.response?.data?.message||i.message))}finally{delete V.value[t]}}async function Oe(e){if(!te.value)return;if(!e.controlKey||!["pending","needs_review"].includes(e.trust))return;if("project"===a.scope&&"project"!==e.sourceScope)return;const l=e.controlKey;V.value[l]=!0;try{const a=await be(l,"approved",de.value,ve.value),t=n.value.find(e=>e.controlKey===l);t&&(t.trust=a.trust),s.success(`技能 "${e.name}" 已批准,当前仍保持关闭`)}catch(t){s.error("审批失败: "+(t.response?.data?.message||t.message))}finally{delete V.value[l]}}async function Be(){if(!te.value||!ue.value||F.value)return;const e=Y.value,l=JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""}),t=()=>e===Y.value&&l===JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""});F.value=!0;try{const e=de.value,a=await Pe(e,ve.value);if(!t())return;Z.value=a.task||null;let l=a.task;for(;l&&["queued","running"].includes(l.status);){await new Promise(e=>setTimeout(e,250));const e=await Ue(l.id,{...ve.value,platform:de.value});if(!t())return;l=e.task,Z.value=l}if(!t())return;"failed"===l?.status?s.error(l.error||"远端刷新失败"):"partial"===l?.status?s.warning("远端刷新部分成功"):s.success("远端 Skill 刷新完成"),await ze()}catch(i){t()&&s.error("刷新失败: "+(i.response?.data?.message||i.message))}finally{t()&&(F.value=!1)}}function Ke(){pe.value&&(D.value+=1,G.value=!0)}async function Ge(e,a){if("omp"!==de.value||!G.value||a!==D.value)return;const l=de.value;G.value=!1;const t=await async function(e,a){return e(),a({notifyError:!1})}(()=>{},ze);l===de.value&&a===D.value&&(t?s.success("技能扫描设置已保存"):s.error("设置已保存,但技能列表刷新失败"))}function Ae(e){R.value=e,K.value=!0}return m(()=>{a.inDrawer&&!a.drawerVisible||ze()}),b(()=>a.drawerVisible,e=>{e&&ze()}),b([()=>de.value,()=>a.scope,()=>a.projectPath],([e])=>{Y.value+=1,F.value=!1,Z.value=null,D.value+=1,gl(e)||(G.value=!1),ze()}),(l,t)=>(y(),U("div",{class:j(["skills-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?u("",!0):(y(),U("div",zl,[L("div",Ul,[e.hideBack?u("",!0):(y(),f(P(r),{key:0,text:"",onClick:t[0]||(t[0]=e=>l.$emit("back")),class:"back-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(q))]),_:1})]),_:1})),L("div",Ll,[L("div",$l,[t[12]||(t[12]=L("span",{class:"asset-title"},"技能管理",-1)),L("span",Tl,h(fe.value),1)]),t[13]||(t[13]=L("div",{class:"asset-subtitle"},"缓存并控制当前平台可用的技能",-1))])]),te.value?(y(),U("div",Ol,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[1]||(t[1]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[14]||(t[14]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[2]||(t[2]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[15]||(t[15]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[16]||(t[16]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[17]||(t[17]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[18]||(t[18]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])),e.inDrawer?(y(),U("div",Bl,[te.value?(y(),U("div",Kl,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[3]||(t[3]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[19]||(t[19]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[4]||(t[4]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[20]||(t[20]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[21]||(t[21]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[22]||(t[22]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[23]||(t[23]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])):u("",!0),L("div",Gl,[L("span",Al,[t[24]||(t[24]=L("span",{class:"asset-summary-label"},"全部",-1)),L("span",El,h(n.value.length),1)]),L("span",Ml,[t[25]||(t[25]=L("span",{class:"asset-summary-label"},"已启用",-1)),L("span",Hl,h(ge.value),1)]),L("span",Il,[t[26]||(t[26]=L("span",{class:"asset-summary-label"},"待审批",-1)),L("span",Dl,h(je.value),1)])]),L("div",Nl,[p(P(he),{value:v.value,"onUpdate:value":t[5]||(t[5]=e=>v.value=e),placeholder:"搜索技能名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:w(()=>[p(P(i),null,{default:w(()=>[p(P(H))]),_:1})]),_:1},8,["value"]),p(P(Te),{value:k.value,"onUpdate:value":t[6]||(t[6]=e=>k.value=e),options:me,size:"small",class:"asset-filter"},null,8,["value"])]),L("div",Rl,[p(P(ce),{show:o.value},{default:w(()=>[0!==Se.value.length||o.value?u("",!0):(y(),U("div",ql,[p(P(we),{description:xe.value},{icon:w(()=>[p(P(i),{size:"48",color:"var(--text-quaternary)"},{default:w(()=>[p(P(M))]),_:1})]),extra:w(()=>[te.value&&oe.value&&0===n.value.length?(y(),f(P(r),{key:0,size:"small",onClick:t[7]||(t[7]=e=>C.value=!0)},{default:w(()=>[...t[27]||(t[27]=[c("配置仓库源",-1)])]),_:1})):u("",!0)]),_:1},8,["description"])])),L("div",Vl,[(y(!0),U(_,null,d(Se.value,e=>(y(),f(da,{key:e.controlKey||e.key,skill:e,toggling:!!V.value[e.controlKey||e.key],"panel-scope":a.scope,onClick:Ae,onToggle:$e,onApprove:Oe},null,8,["skill","toggling","panel-scope"]))),128))])]),_:1},8,["show"])]),ue.value?(y(),U("div",Fl,[p(P(i),{size:"14",class:"asset-info-icon"},{default:w(()=>[p(P(W))]),_:1}),L("span",null,"开关变更后需重启 "+h(fe.value)+" 生效;远端刷新只在手动点击后执行",1)])):u("",!0),_e.value?(y(),U("div",Wl,[c(" 刷新任务:"+h(_e.value)+" ",1),void 0!==Z.value?.fetchedSkills?(y(),U("span",Jl," · 已处理 "+h(Z.value.fetchedSkills)+" 个 Skill",1)):u("",!0),Z.value?.failedRepos?.length?(y(),U("span",Zl," · 失败仓库 "+h(Z.value.failedRepos.length),1)):u("",!0)])):u("",!0),p(Ha,{visible:C.value,"onUpdate:visible":t[8]||(t[8]=e=>C.value=e),platform:de.value,onUpdated:ze},null,8,["visible","platform"]),p(Ja,{visible:S.value,"onUpdate:visible":t[9]||(t[9]=e=>S.value=e),platform:de.value,scope:a.scope,"project-path":a.projectPath,onCreated:ze},null,8,["visible","platform","scope","project-path"]),p(yl,{visible:K.value,"onUpdate:visible":t[10]||(t[10]=e=>K.value=e),skill:R.value,platform:de.value,scope:a.scope,"project-path":a.projectPath,onUpdated:ze},null,8,["visible","skill","platform","scope","project-path"]),p(xl,{visible:G.value,"onUpdate:visible":t[11]||(t[11]=e=>G.value=e),"operation-token":D.value,onSaved:Ge},null,8,["visible","operation-token"])],2))}},[["__scopeId","data-v-efda7d55"]]);export{Ql as t};
@@ -1 +1 @@
1
- import{i as e,s as a,t as s}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as l,H as n,K as c,O as u,S as i,W as r,Z as o,_t as d,b as v,et as m,g as p,gt as y,ht as g,mt as f,st as h,w as b,x as k}from"./vue-vendor-BqZbbXHA.js";import{D as w,Nt as C,d as N,i as I}from"./icons-DmFe4b5j.js";import{n as L,t as O}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as _}from"./DrawerContent-ChXgZ1Xm.js";import{C as x,E as D,I as E,N as S,T,rt as A,w as z}from"./index-Cmmwj3Fx.js";var $={class:"drawer-header"},j={class:"header-icon-wrapper"},U={class:"speed-test-container"},F={class:"test-controls"},M={key:0,class:"test-run-list","aria-live":"polite"},R={key:1,class:"test-summary"},J={class:"summary-item"},P={class:"summary-value"},G={class:"summary-item success"},B={class:"summary-value"},H={class:"summary-item failed"},W={class:"summary-value"},K={class:"summary-item avg"},X={class:"summary-value"},Z={class:"results-list"},q={key:0,class:"loading-state"},Q={key:1,class:"empty-state"},V={class:"empty-icon-wrapper"},Y={class:"empty-title"},ee={class:"empty-desc"},ae={key:2,class:"result-cards"},se={class:"result-header"},te={class:"channel-info"},le={class:"channel-name"},ne={class:"result-status"},ce={key:1,class:"status-badge failed"},ue={key:0,class:"result-details"},ie={class:"latency-bar"},re={key:1,class:"error-info"},oe={class:"error-container"},de={class:"error-msg"},ve={key:0,class:"error-latency"},me={key:1,class:"result-meta"},pe={class:"meta-item status-indicator"},ye={class:"meta-item status-indicator"},ge={key:0,class:"meta-item http-code"},fe={key:1,class:"meta-item time"},he={key:2,class:"cache-hint"},be="speedTestResults",ke="speedTestSummary",we="speedTestTime",Ce=s({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(s,{emit:Ce}){const{drawerWidth:Ne}=O(520),Ie=s,Le=Ce,Oe=v({get:()=>Ie.visible,set:e=>Le("update:visible",e)}),_e=h(!1),xe=h([]),De=h(null),Ee=h("all"),Se=h(!1),Te=h([]),Ae=h(null),ze=h(!0),$e=v(()=>Te.value.some(e=>"failed"===e.status||"timeout"===e.status)),je=v(()=>$e.value?"部分测速未完成":Te.value.length>0?"没有可测试的渠道":"暂无测试结果"),Ue=v(()=>$e.value?"请查看上方各 CLI 的错误信息后重试":Te.value.length>0?"所选 CLI 暂无可测速的渠道":"点击上方按钮开始测试渠道连接速度"),Fe=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}];function Me(e,a){const s=function(e){const a=e.filter(e=>e.success),s=a.map(e=>e.latency).filter(e=>Number.isFinite(e));return{total:e.length,success:a.length,failed:e.length-a.length,avgLatency:s.length>0?Math.round(s.reduce((e,a)=>e+a,0)/s.length):null}}(a);return{total:Number.isFinite(e?.total)?e.total:s.total,success:Number.isFinite(e?.success)?e.success:s.success,failed:Number.isFinite(e?.failed)?e.failed:s.failed,avgLatency:Number.isFinite(e?.avgLatency)?e.avgLatency:s.avgLatency}}function Re(e,a){const s=Te.value.find(a=>a.type===e);s&&Object.assign(s,a)}function Je(e){return"ERR_CANCELED"===e?.code||"CanceledError"===e?.name}function Pe(e){return"ECONNABORTED"===e?.code||"ETIMEDOUT"===e?.code||408===e?.status||504===e?.status||/timeout|超时/i.test(e?.message||"")}function Ge(e){return Pe(e)?"请求超过 3 分钟仍未完成":e?.message||"请求失败,请稍后重试"}function Be(e){return"testing"===e.status||"cancelling"===e.status}function He(e){switch(e.status){case"pending":return"等待测试";case"testing":return"正在测试...";case"cancelling":return"正在取消...";case"completed":return e.total>0?`${e.success}/${e.total} 成功`:e.message||"没有可测试的渠道";case"timeout":return`请求超时:${e.error}`;case"failed":return`测试失败:${e.error}`;case"cancelled":return"已取消";default:return""}}function We({notify:e=!0}={}){const a=Ae.value;if(!a||a.signal.aborted)return;ze.value=e;const s=Te.value.find(e=>"testing"===e.status);s&&(s.status="cancelling"),a.abort()}async function Ke(){const e=new AbortController;Ae.value=e,ze.value=!0,_e.value=!0,xe.value=[],De.value=null,Se.value=!1;const a=[];"all"!==Ee.value&&"claude"!==Ee.value||a.push({type:"claude",fn:x}),"all"!==Ee.value&&"codex"!==Ee.value||a.push({type:"codex",fn:z}),"all"!==Ee.value&&"gemini"!==Ee.value||a.push({type:"gemini",fn:T}),"all"!==Ee.value&&"opencode"!==Ee.value||a.push({type:"opencode",fn:D}),Te.value=a.map(({type:e})=>({type:e,status:"pending",total:0,success:0,message:"",error:""}));let s=[],t={total:0,success:0,failed:0,avgLatency:null},l=0,n=0,c=!1;try{for(const{type:r,fn:o}of a)if(e.signal.aborted)c=!0,Re(r,{status:"cancelled"});else{Re(r,{status:"testing",error:""});try{const a=await o(1e4,{signal:e.signal}),c=Array.isArray(a?.results)?a.results:[],u=Me(a?.summary,c),i=c.map(e=>({...e,channelType:r,channelName:`[${r.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));s=s.concat(i),xe.value=[...s],t.total+=u.total,t.success+=u.success,t.failed+=u.failed,null!==u.avgLatency&&u.success>0&&(l+=u.avgLatency*u.success,n+=u.success),Re(r,{status:"completed",total:u.total,success:u.success,message:a?.message||""})}catch(u){e.signal.aborted||Je(u)?(c=!0,Re(r,{status:"cancelled"})):Re(r,{status:Pe(u)?"timeout":"failed",error:Ge(u)})}if(c)break}c&&Te.value.filter(e=>"pending"===e.status).forEach(e=>{e.status="cancelled"}),t.avgLatency=n>0?Math.round(l/n):null,xe.value=s.sort((e,a)=>e.success&&!a.success?-1:!e.success&&a.success?1:e.success&&a.success?(null===e.latency||void 0===e.latency?1/0:e.latency)-(null===a.latency||void 0===a.latency?1/0:a.latency):0),De.value=t;const i=Te.value.filter(e=>"failed"===e.status||"timeout"===e.status);c||0!==i.length||function(){try{localStorage.setItem(be,JSON.stringify(xe.value)),localStorage.setItem(ke,JSON.stringify(De.value)),localStorage.setItem(we,Date.now().toString())}catch(e){}}(),c?ze.value&&S.info("测速已取消,已保留完成批次的结果"):i.length===a.length?S.error("测速未完成,请查看各 CLI 的失败原因后重试"):i.length>0?S.warning(`测速部分完成,${i.length} 个 CLI 批次失败`):0===t.total?S.info("没有找到可测试的渠道"):S.success(`测试完成: ${t.success}/${t.total} 成功`)}catch(u){S.error("测试失败: "+u.message)}finally{Ae.value===e&&(Ae.value=null),_e.value=!1}}function Xe(e){switch(e){case"excellent":return"优秀";case"good":return"良好";case"fair":return"一般";case"poor":return"较差";default:return"-"}}function Ze(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";case"opencode":return"OpenCode";default:return e?.toUpperCase()||""}}function qe(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";case"opencode":return"type-opencode";default:return""}}return o(()=>Ie.visible,e=>{e?(_e.value||(Te.value=[]),function(){try{const e=localStorage.getItem(we);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(be),a=localStorage.getItem(ke);return e&&(xe.value=JSON.parse(e),Se.value=!0),a&&(De.value=JSON.parse(a)),!0}}catch(e){}}()):We({notify:!1})},{immediate:!0}),n(()=>We({notify:!1})),(s,n)=>(r(),i(f(L),{show:Oe.value,"onUpdate:show":n[1]||(n[1]=e=>Oe.value=e),width:f(Ne),placement:"right","show-mask":!0},{default:m(()=>[u(f(_),{closable:"","native-scrollbar":!1},{header:m(()=>[k("div",$,[k("div",j,[u(f(e),{size:18},{default:m(()=>[u(f(N))]),_:1})]),n[2]||(n[2]=k("span",null,"渠道速度测试",-1))])]),default:m(()=>[k("div",U,[k("div",F,[u(f(a),{type:"primary",loading:_e.value,disabled:_e.value,onClick:Ke,class:"test-btn"},{icon:m(()=>[u(f(e),null,{default:m(()=>[u(f(w))]),_:1})]),default:m(()=>[l(" "+d(_e.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),_e.value?(r(),i(f(a),{key:0,secondary:"",type:"warning",onClick:We},{default:m(()=>[...n[3]||(n[3]=[l(" 取消测试 ",-1)])]),_:1})):t("",!0),u(f(A),{value:Ee.value,"onUpdate:value":n[0]||(n[0]=e=>Ee.value=e),options:Fe,disabled:_e.value,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value","disabled"])]),Te.value.length?(r(),b("div",M,[(r(!0),b(p,null,c(Te.value,a=>(r(),b("div",{key:a.type,class:"test-run-item"},[k("span",{class:g(["channel-type-badge",qe(a.type)])},d(Ze(a.type)),3),k("div",{class:g(["test-run-status",a.status])},[Be(a)?(r(),i(f(E),{key:0,size:13})):"failed"===a.status||"timeout"===a.status?(r(),i(f(e),{key:1,size:14},{default:m(()=>[u(f(C))]),_:1})):t("",!0),k("span",null,d(He(a)),1)],2)]))),128))])):t("",!0),De.value?(r(),b("div",R,[k("div",J,[n[4]||(n[4]=k("span",{class:"summary-label"},"总计",-1)),k("span",P,d(De.value.total),1)]),k("div",G,[n[5]||(n[5]=k("span",{class:"summary-label"},"成功",-1)),k("span",B,d(De.value.success),1)]),k("div",H,[n[6]||(n[6]=k("span",{class:"summary-label"},"失败",-1)),k("span",W,d(De.value.failed),1)]),k("div",K,[n[7]||(n[7]=k("span",{class:"summary-label"},"平均延迟",-1)),k("span",X,d(null!==De.value.avgLatency&&void 0!==De.value.avgLatency?De.value.avgLatency+"ms":"-"),1)])])):t("",!0),k("div",Z,[_e.value&&0===xe.value.length?(r(),b("div",q,[u(f(E),{size:"large"}),n[8]||(n[8]=k("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==xe.value.length||_e.value?(r(),b("div",ae,[(r(!0),b(p,null,c(xe.value,a=>{return r(),b("div",{key:a.channelId,class:g(["result-card",[a.success?"success":"failed",a.testing?"testing":""]])},[k("div",se,[k("div",te,[k("span",{class:g(["channel-type-badge",qe(a.channelType)])},d(Ze(a.channelType)),3),k("span",le,d((c=a.channelName,c?c.replace(/^\[(CLAUDE|CODEX|GEMINI|OPENCODE)\]\s*/i,""):"")),1)]),k("div",ne,[a.testing?(r(),i(f(E),{key:0,size:14})):(r(),b(p,{key:1},[a.success?(r(),b("span",{key:0,class:g(["latency-badge",a.level])},d(a.latency)+"ms ",3)):(r(),b("span",ce,"失败"))],64))])]),a.testing?t("",!0):(r(),b("div",ue,[a.success?(r(),b(p,{key:0},[k("div",ie,[k("div",{class:g(["latency-fill",a.level]),style:y({width:(n=a.latency,(null==n?0:Math.min(n/3e3*100,100))+"%")})},null,6)]),k("span",{class:g(["latency-level",a.level])},d(Xe(a.level)),3)],64)):(r(),b("div",re,[k("div",oe,[u(f(e),{size:14,class:"error-icon"},{default:m(()=>[u(f(C))]),_:1}),k("span",de,d(a.error),1)]),null!==a.latency&&void 0!==a.latency?(r(),b("span",ve," 响应 "+d(a.latency)+"ms ",1)):t("",!0)]))])),a.testing?t("",!0):(r(),b("div",me,[k("span",pe,[k("span",{class:g(["status-dot",a.networkOk?"ok":"fail"])},null,2),l(" 网络"+d(a.networkOk?"正常":"异常"),1)]),k("span",ye,[k("span",{class:g(["status-dot",a.apiOk?"ok":"fail"])},null,2),l(" API"+d(a.apiOk?"可用":"不可用"),1)]),a.statusCode?(r(),b("span",ge,"HTTP "+d(a.statusCode),1)):t("",!0),a.testedAt?(r(),b("span",fe,d((s=a.testedAt,s?new Date(s).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"")),1)):t("",!0)]))],2);var s,n,c}),128))])):(r(),b("div",Q,[k("div",V,[u(f(e),{size:32},{default:m(()=>[u(f(N))]),_:1})]),k("p",Y,d(je.value),1),k("p",ee,d(Ue.value),1)]))]),Se.value&&!_e.value?(r(),b("div",he,[u(f(e),{size:14},{default:m(()=>[u(f(I))]),_:1}),n[9]||(n[9]=k("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):t("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-98709d7a"]]);export{Ce as default};
1
+ import{i as e,s as a,t as s}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as l,H as n,K as c,O as u,S as i,W as r,Z as o,_t as d,b as v,et as m,g as p,gt as y,ht as g,mt as f,st as h,w as b,x as k}from"./vue-vendor-BqZbbXHA.js";import{D as w,Nt as C,d as N,i as I}from"./icons-DmFe4b5j.js";import{n as L,t as O}from"./useResponsiveDrawer-V_onl9NV.js";import{t as _}from"./DrawerContent-ChXgZ1Xm.js";import{C as x,E as D,I as E,N as S,T,rt as A,w as z}from"./index-BKlAWTH-.js";var $={class:"drawer-header"},j={class:"header-icon-wrapper"},U={class:"speed-test-container"},F={class:"test-controls"},M={key:0,class:"test-run-list","aria-live":"polite"},R={key:1,class:"test-summary"},J={class:"summary-item"},P={class:"summary-value"},G={class:"summary-item success"},B={class:"summary-value"},H={class:"summary-item failed"},W={class:"summary-value"},K={class:"summary-item avg"},X={class:"summary-value"},Z={class:"results-list"},q={key:0,class:"loading-state"},Q={key:1,class:"empty-state"},V={class:"empty-icon-wrapper"},Y={class:"empty-title"},ee={class:"empty-desc"},ae={key:2,class:"result-cards"},se={class:"result-header"},te={class:"channel-info"},le={class:"channel-name"},ne={class:"result-status"},ce={key:1,class:"status-badge failed"},ue={key:0,class:"result-details"},ie={class:"latency-bar"},re={key:1,class:"error-info"},oe={class:"error-container"},de={class:"error-msg"},ve={key:0,class:"error-latency"},me={key:1,class:"result-meta"},pe={class:"meta-item status-indicator"},ye={class:"meta-item status-indicator"},ge={key:0,class:"meta-item http-code"},fe={key:1,class:"meta-item time"},he={key:2,class:"cache-hint"},be="speedTestResults",ke="speedTestSummary",we="speedTestTime",Ce=s({__name:"SpeedTestDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(s,{emit:Ce}){const{drawerWidth:Ne}=O(520),Ie=s,Le=Ce,Oe=v({get:()=>Ie.visible,set:e=>Le("update:visible",e)}),_e=h(!1),xe=h([]),De=h(null),Ee=h("all"),Se=h(!1),Te=h([]),Ae=h(null),ze=h(!0),$e=v(()=>Te.value.some(e=>"failed"===e.status||"timeout"===e.status)),je=v(()=>$e.value?"部分测速未完成":Te.value.length>0?"没有可测试的渠道":"暂无测试结果"),Ue=v(()=>$e.value?"请查看上方各 CLI 的错误信息后重试":Te.value.length>0?"所选 CLI 暂无可测速的渠道":"点击上方按钮开始测试渠道连接速度"),Fe=[{label:"全部渠道",value:"all"},{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"}];function Me(e,a){const s=function(e){const a=e.filter(e=>e.success),s=a.map(e=>e.latency).filter(e=>Number.isFinite(e));return{total:e.length,success:a.length,failed:e.length-a.length,avgLatency:s.length>0?Math.round(s.reduce((e,a)=>e+a,0)/s.length):null}}(a);return{total:Number.isFinite(e?.total)?e.total:s.total,success:Number.isFinite(e?.success)?e.success:s.success,failed:Number.isFinite(e?.failed)?e.failed:s.failed,avgLatency:Number.isFinite(e?.avgLatency)?e.avgLatency:s.avgLatency}}function Re(e,a){const s=Te.value.find(a=>a.type===e);s&&Object.assign(s,a)}function Je(e){return"ERR_CANCELED"===e?.code||"CanceledError"===e?.name}function Pe(e){return"ECONNABORTED"===e?.code||"ETIMEDOUT"===e?.code||408===e?.status||504===e?.status||/timeout|超时/i.test(e?.message||"")}function Ge(e){return Pe(e)?"请求超过 3 分钟仍未完成":e?.message||"请求失败,请稍后重试"}function Be(e){return"testing"===e.status||"cancelling"===e.status}function He(e){switch(e.status){case"pending":return"等待测试";case"testing":return"正在测试...";case"cancelling":return"正在取消...";case"completed":return e.total>0?`${e.success}/${e.total} 成功`:e.message||"没有可测试的渠道";case"timeout":return`请求超时:${e.error}`;case"failed":return`测试失败:${e.error}`;case"cancelled":return"已取消";default:return""}}function We({notify:e=!0}={}){const a=Ae.value;if(!a||a.signal.aborted)return;ze.value=e;const s=Te.value.find(e=>"testing"===e.status);s&&(s.status="cancelling"),a.abort()}async function Ke(){const e=new AbortController;Ae.value=e,ze.value=!0,_e.value=!0,xe.value=[],De.value=null,Se.value=!1;const a=[];"all"!==Ee.value&&"claude"!==Ee.value||a.push({type:"claude",fn:x}),"all"!==Ee.value&&"codex"!==Ee.value||a.push({type:"codex",fn:z}),"all"!==Ee.value&&"gemini"!==Ee.value||a.push({type:"gemini",fn:T}),"all"!==Ee.value&&"opencode"!==Ee.value||a.push({type:"opencode",fn:D}),Te.value=a.map(({type:e})=>({type:e,status:"pending",total:0,success:0,message:"",error:""}));let s=[],t={total:0,success:0,failed:0,avgLatency:null},l=0,n=0,c=!1;try{for(const{type:r,fn:o}of a)if(e.signal.aborted)c=!0,Re(r,{status:"cancelled"});else{Re(r,{status:"testing",error:""});try{const a=await o(1e4,{signal:e.signal}),c=Array.isArray(a?.results)?a.results:[],u=Me(a?.summary,c),i=c.map(e=>({...e,channelType:r,channelName:`[${r.toUpperCase()}] ${e.channelName}`,testedAt:Date.now()}));s=s.concat(i),xe.value=[...s],t.total+=u.total,t.success+=u.success,t.failed+=u.failed,null!==u.avgLatency&&u.success>0&&(l+=u.avgLatency*u.success,n+=u.success),Re(r,{status:"completed",total:u.total,success:u.success,message:a?.message||""})}catch(u){e.signal.aborted||Je(u)?(c=!0,Re(r,{status:"cancelled"})):Re(r,{status:Pe(u)?"timeout":"failed",error:Ge(u)})}if(c)break}c&&Te.value.filter(e=>"pending"===e.status).forEach(e=>{e.status="cancelled"}),t.avgLatency=n>0?Math.round(l/n):null,xe.value=s.sort((e,a)=>e.success&&!a.success?-1:!e.success&&a.success?1:e.success&&a.success?(null===e.latency||void 0===e.latency?1/0:e.latency)-(null===a.latency||void 0===a.latency?1/0:a.latency):0),De.value=t;const i=Te.value.filter(e=>"failed"===e.status||"timeout"===e.status);c||0!==i.length||function(){try{localStorage.setItem(be,JSON.stringify(xe.value)),localStorage.setItem(ke,JSON.stringify(De.value)),localStorage.setItem(we,Date.now().toString())}catch(e){}}(),c?ze.value&&S.info("测速已取消,已保留完成批次的结果"):i.length===a.length?S.error("测速未完成,请查看各 CLI 的失败原因后重试"):i.length>0?S.warning(`测速部分完成,${i.length} 个 CLI 批次失败`):0===t.total?S.info("没有找到可测试的渠道"):S.success(`测试完成: ${t.success}/${t.total} 成功`)}catch(u){S.error("测试失败: "+u.message)}finally{Ae.value===e&&(Ae.value=null),_e.value=!1}}function Xe(e){switch(e){case"excellent":return"优秀";case"good":return"良好";case"fair":return"一般";case"poor":return"较差";default:return"-"}}function Ze(e){switch(e){case"claude":return"Claude";case"codex":return"Codex";case"gemini":return"Gemini";case"opencode":return"OpenCode";default:return e?.toUpperCase()||""}}function qe(e){switch(e){case"claude":return"type-claude";case"codex":return"type-codex";case"gemini":return"type-gemini";case"opencode":return"type-opencode";default:return""}}return o(()=>Ie.visible,e=>{e?(_e.value||(Te.value=[]),function(){try{const e=localStorage.getItem(we);if(e&&Date.now()-parseInt(e)<3e5){const e=localStorage.getItem(be),a=localStorage.getItem(ke);return e&&(xe.value=JSON.parse(e),Se.value=!0),a&&(De.value=JSON.parse(a)),!0}}catch(e){}}()):We({notify:!1})},{immediate:!0}),n(()=>We({notify:!1})),(s,n)=>(r(),i(f(L),{show:Oe.value,"onUpdate:show":n[1]||(n[1]=e=>Oe.value=e),width:f(Ne),placement:"right","show-mask":!0},{default:m(()=>[u(f(_),{closable:"","native-scrollbar":!1},{header:m(()=>[k("div",$,[k("div",j,[u(f(e),{size:18},{default:m(()=>[u(f(N))]),_:1})]),n[2]||(n[2]=k("span",null,"渠道速度测试",-1))])]),default:m(()=>[k("div",U,[k("div",F,[u(f(a),{type:"primary",loading:_e.value,disabled:_e.value,onClick:Ke,class:"test-btn"},{icon:m(()=>[u(f(e),null,{default:m(()=>[u(f(w))]),_:1})]),default:m(()=>[l(" "+d(_e.value?"测试中...":"开始全部测试"),1)]),_:1},8,["loading","disabled"]),_e.value?(r(),i(f(a),{key:0,secondary:"",type:"warning",onClick:We},{default:m(()=>[...n[3]||(n[3]=[l(" 取消测试 ",-1)])]),_:1})):t("",!0),u(f(A),{value:Ee.value,"onUpdate:value":n[0]||(n[0]=e=>Ee.value=e),options:Fe,disabled:_e.value,placeholder:"选择渠道类型",style:{width:"140px"}},null,8,["value","disabled"])]),Te.value.length?(r(),b("div",M,[(r(!0),b(p,null,c(Te.value,a=>(r(),b("div",{key:a.type,class:"test-run-item"},[k("span",{class:g(["channel-type-badge",qe(a.type)])},d(Ze(a.type)),3),k("div",{class:g(["test-run-status",a.status])},[Be(a)?(r(),i(f(E),{key:0,size:13})):"failed"===a.status||"timeout"===a.status?(r(),i(f(e),{key:1,size:14},{default:m(()=>[u(f(C))]),_:1})):t("",!0),k("span",null,d(He(a)),1)],2)]))),128))])):t("",!0),De.value?(r(),b("div",R,[k("div",J,[n[4]||(n[4]=k("span",{class:"summary-label"},"总计",-1)),k("span",P,d(De.value.total),1)]),k("div",G,[n[5]||(n[5]=k("span",{class:"summary-label"},"成功",-1)),k("span",B,d(De.value.success),1)]),k("div",H,[n[6]||(n[6]=k("span",{class:"summary-label"},"失败",-1)),k("span",W,d(De.value.failed),1)]),k("div",K,[n[7]||(n[7]=k("span",{class:"summary-label"},"平均延迟",-1)),k("span",X,d(null!==De.value.avgLatency&&void 0!==De.value.avgLatency?De.value.avgLatency+"ms":"-"),1)])])):t("",!0),k("div",Z,[_e.value&&0===xe.value.length?(r(),b("div",q,[u(f(E),{size:"large"}),n[8]||(n[8]=k("p",{class:"loading-text"},"正在测试渠道连接速度和 API 可用性...",-1))])):0!==xe.value.length||_e.value?(r(),b("div",ae,[(r(!0),b(p,null,c(xe.value,a=>{return r(),b("div",{key:a.channelId,class:g(["result-card",[a.success?"success":"failed",a.testing?"testing":""]])},[k("div",se,[k("div",te,[k("span",{class:g(["channel-type-badge",qe(a.channelType)])},d(Ze(a.channelType)),3),k("span",le,d((c=a.channelName,c?c.replace(/^\[(CLAUDE|CODEX|GEMINI|OPENCODE)\]\s*/i,""):"")),1)]),k("div",ne,[a.testing?(r(),i(f(E),{key:0,size:14})):(r(),b(p,{key:1},[a.success?(r(),b("span",{key:0,class:g(["latency-badge",a.level])},d(a.latency)+"ms ",3)):(r(),b("span",ce,"失败"))],64))])]),a.testing?t("",!0):(r(),b("div",ue,[a.success?(r(),b(p,{key:0},[k("div",ie,[k("div",{class:g(["latency-fill",a.level]),style:y({width:(n=a.latency,(null==n?0:Math.min(n/3e3*100,100))+"%")})},null,6)]),k("span",{class:g(["latency-level",a.level])},d(Xe(a.level)),3)],64)):(r(),b("div",re,[k("div",oe,[u(f(e),{size:14,class:"error-icon"},{default:m(()=>[u(f(C))]),_:1}),k("span",de,d(a.error),1)]),null!==a.latency&&void 0!==a.latency?(r(),b("span",ve," 响应 "+d(a.latency)+"ms ",1)):t("",!0)]))])),a.testing?t("",!0):(r(),b("div",me,[k("span",pe,[k("span",{class:g(["status-dot",a.networkOk?"ok":"fail"])},null,2),l(" 网络"+d(a.networkOk?"正常":"异常"),1)]),k("span",ye,[k("span",{class:g(["status-dot",a.apiOk?"ok":"fail"])},null,2),l(" API"+d(a.apiOk?"可用":"不可用"),1)]),a.statusCode?(r(),b("span",ge,"HTTP "+d(a.statusCode),1)):t("",!0),a.testedAt?(r(),b("span",fe,d((s=a.testedAt,s?new Date(s).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"")),1)):t("",!0)]))],2);var s,n,c}),128))])):(r(),b("div",Q,[k("div",V,[u(f(e),{size:32},{default:m(()=>[u(f(N))]),_:1})]),k("p",Y,d(je.value),1),k("p",ee,d(Ue.value),1)]))]),Se.value&&!_e.value?(r(),b("div",he,[u(f(e),{size:14},{default:m(()=>[u(f(I))]),_:1}),n[9]||(n[9]=k("span",null,"显示的是缓存的测试结果,点击按钮重新测试",-1))])):t("",!0)])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-98709d7a"]]);export{Ce as default};