coding-tool-x 3.8.10 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/web/assets/AgentsDrawer-CobzHziM.css +1 -0
- package/dist/web/assets/AgentsDrawer-MeGfH4I0.js +1 -0
- package/dist/web/assets/{Analytics-D5dUWXEa.js → Analytics-DTIvvMXu.js} +1 -1
- package/dist/web/assets/{AssetPathField-CLqalYv-.js → AssetPathField-jv-lopQ3.js} +1 -1
- package/dist/web/assets/{ChatHistoryDrawer-C1At65O3.js → ChatHistoryDrawer-T4OVnJzM.js} +1 -1
- package/dist/web/assets/{CollapseItem-CVWojShK.js → CollapseItem-P6BvSxEu.js} +1 -1
- package/dist/web/assets/{CommandsDrawer-BEoypGBf.js → CommandsDrawer-DtFJRtow.js} +1 -1
- package/dist/web/assets/{ConfigExportDrawer-DBvFDDWK.js → ConfigExportDrawer-Di7KXhVS.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-BpaWG-iC.js → ConfigTemplates-VdKE5Kp0.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesDrawer-C2lvyKMf.js → ConfigTemplatesDrawer-bQvPnUQ0.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesPanel-CorOY7kY.js → ConfigTemplatesPanel-ChdyQ3C6.js} +1 -1
- package/dist/web/assets/{FavoritesDrawer-uW88N6te.js → FavoritesDrawer-A25XfI7C.js} +1 -1
- package/dist/web/assets/{GatewayConvertDrawer-i5Wt9Dd9.js → GatewayConvertDrawer-TSJPvY4f.js} +1 -1
- package/dist/web/assets/{Home-BIxWvm29.js → Home-CzB85lKE.js} +1 -1
- package/dist/web/assets/{MarkdownEditor-Ul0bSGj-.js → MarkdownEditor-BXwTqbMo.js} +1 -1
- package/dist/web/assets/{McpDrawer-Cc2xq77I.js → McpDrawer-DIaiFq4R.js} +1 -1
- package/dist/web/assets/{McpFormDrawer-DLHX_nrI.js → McpFormDrawer-CQgTYAux.js} +1 -1
- package/dist/web/assets/{PluginManager-BGQ0xF2F.js → PluginManager-BkGrr21J.js} +1 -1
- package/dist/web/assets/{PluginsDrawer-STwHEqiF.js → PluginsDrawer-Bq1JkM5r.js} +1 -1
- package/dist/web/assets/{PluginsPanel-1zuNP7da.js → PluginsPanel-Clz1r67v.js} +1 -1
- package/dist/web/assets/{ProjectList-_pe2nk9c.js → ProjectList-QIC7-9ic.js} +1 -1
- package/dist/web/assets/{PromptsDrawer-CJN1xZk7.js → PromptsDrawer-BLeUYZWW.js} +1 -1
- package/dist/web/assets/{RecentSessionsDrawer-DX1HI8Nm.js → RecentSessionsDrawer-yOpScIwI.js} +1 -1
- package/dist/web/assets/{SessionCard-Op6PHvi0.js → SessionCard-DeKRHAzu.js} +1 -1
- package/dist/web/assets/{SessionList-Da_TAEYr.js → SessionList-B0fPT_VB.js} +1 -1
- package/dist/web/assets/SettingsDrawer-BFzaxbgC.css +1 -0
- package/dist/web/assets/SettingsDrawer-DpZoDj3M.js +1 -0
- package/dist/web/assets/{SkillManager-PcAa5EbF.js → SkillManager-BpPqV2o4.js} +1 -1
- package/dist/web/assets/{SkillsDrawer-DPdU4p6C.js → SkillsDrawer-BgMlJbgS.js} +1 -1
- package/dist/web/assets/{SkillsPanel-B9qzRqjd.js → SkillsPanel-CK-pSSHU.js} +1 -1
- package/dist/web/assets/{Upload-e1M9Yp5z.js → Upload-DtuQ7ady.js} +1 -1
- package/dist/web/assets/{WorkspaceDrawer-oS6mB1VZ.js → WorkspaceDrawer-Bu5mOGsF.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-6VvRWe3r.js → WorkspaceManager-D1mhnNV-.js} +1 -1
- package/dist/web/assets/{WorkspacePanel-CYq0Z8iY.js → WorkspacePanel-BIrkMC_5.js} +1 -1
- package/dist/web/assets/{index-Bn8BUnwP.css → index-B86H0_5y.css} +1 -1
- package/dist/web/assets/{index-BlUXw84U.js → index-Bw6YXbBA.js} +2 -2
- package/dist/web/assets/{useResponsiveDrawer-ChHZrTfl.js → useResponsiveDrawer-C-UacYVP.js} +1 -1
- package/dist/web/index.html +2 -2
- package/docs/analytics.png +0 -0
- package/docs/home.png +0 -0
- package/package.json +1 -1
- package/src/platforms/agents-service.js +50 -12
- package/src/platforms/drivers/omp/channels-implementation.js +1 -1
- package/src/platforms/drivers/omp/gateway.js +1 -1
- package/src/platforms/drivers/omp/model-role-settings.js +235 -0
- package/src/platforms/manifests/omp.json +3 -3
- package/src/platforms/remote-notification-providers.js +5 -5
- package/src/server/api/settings.js +33 -5
- package/src/server/services/model-definition-schema.js +2 -2
- package/dist/web/assets/AgentsDrawer-Bam7kBjG.js +0 -1
- package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +0 -1
- package/dist/web/assets/SettingsDrawer-DKLd4Sjy.js +0 -1
- package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +0 -1
|
@@ -9,6 +9,10 @@ const {
|
|
|
9
9
|
} = require('../../config/model-metadata');
|
|
10
10
|
const { getPlatformCatalog } = require('../services/platform-catalog');
|
|
11
11
|
const { loadConfig, saveConfig } = require('../../config/loader');
|
|
12
|
+
const {
|
|
13
|
+
readOmpModelRoleSettings,
|
|
14
|
+
updateOmpModelRoleSettings
|
|
15
|
+
} = require('../../platforms/drivers/omp/model-role-settings');
|
|
12
16
|
const {
|
|
13
17
|
MODEL_SCHEMA_VERSION,
|
|
14
18
|
getPublicModelFieldSchema,
|
|
@@ -46,9 +50,11 @@ function normalizeSpeedTestModels(value) {
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
function getModelPlatformEntries(catalog = getPlatformCatalog()) {
|
|
49
|
-
return catalog.list({ capability: 'channels' }).map(manifest => ({
|
|
53
|
+
return catalog.list({ capability: 'channels', enabledOnly: false }).map(manifest => ({
|
|
50
54
|
key: manifest.key,
|
|
51
|
-
|
|
55
|
+
label: manifest.label || manifest.title || manifest.key,
|
|
56
|
+
catalogKey: manifest.modelConfig?.catalogKey || manifest.key,
|
|
57
|
+
models: getModelIdsByToolType(manifest.modelConfig?.catalogKey || manifest.key)
|
|
52
58
|
}));
|
|
53
59
|
}
|
|
54
60
|
|
|
@@ -96,9 +102,7 @@ function handleGetModelSettings(req, res) {
|
|
|
96
102
|
const catalog = getPlatformCatalog();
|
|
97
103
|
const platformEntries = getModelPlatformEntries(catalog);
|
|
98
104
|
const defaultSpeedTestModels = resolveDefaultSpeedTestModels(config, catalog);
|
|
99
|
-
const toolModels = Object.fromEntries(
|
|
100
|
-
platformEntries.map(({ key, catalogKey }) => [key, getModelIdsByToolType(catalogKey)])
|
|
101
|
-
);
|
|
105
|
+
const toolModels = Object.fromEntries(platformEntries.map(({ key, models }) => [key, models]));
|
|
102
106
|
|
|
103
107
|
// Build merged table: built-in + user overrides
|
|
104
108
|
const merged = {};
|
|
@@ -128,6 +132,7 @@ function handleGetModelSettings(req, res) {
|
|
|
128
132
|
builtinModelIds: Object.keys(MODEL_METADATA),
|
|
129
133
|
lastUpdated: METADATA_LAST_UPDATED,
|
|
130
134
|
metadataSource: METADATA_SOURCE,
|
|
135
|
+
modelPlatforms: platformEntries,
|
|
131
136
|
toolModels,
|
|
132
137
|
defaultSpeedTestModels
|
|
133
138
|
});
|
|
@@ -268,4 +273,27 @@ function handleDeleteModelOverride(req, res) {
|
|
|
268
273
|
router.delete('/model-settings/:modelId', handleDeleteModelOverride);
|
|
269
274
|
router.delete('/model-metadata/:modelId', handleDeleteModelOverride);
|
|
270
275
|
|
|
276
|
+
router.get('/omp-model-roles', (req, res) => {
|
|
277
|
+
try {
|
|
278
|
+
res.json({ success: true, ...readOmpModelRoleSettings() });
|
|
279
|
+
} catch (error) {
|
|
280
|
+
console.error('Error getting OMP model roles:', error);
|
|
281
|
+
res.status(500).json({ error: error.message });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
router.put('/omp-model-roles', (req, res) => {
|
|
286
|
+
try {
|
|
287
|
+
const { roles } = req.body || {};
|
|
288
|
+
if (!roles || typeof roles !== 'object' || Array.isArray(roles)) {
|
|
289
|
+
return res.status(400).json({ error: 'roles must be an object' });
|
|
290
|
+
}
|
|
291
|
+
res.json({ success: true, ...updateOmpModelRoleSettings(roles) });
|
|
292
|
+
} catch (error) {
|
|
293
|
+
console.error('Error saving OMP model roles:', error);
|
|
294
|
+
const isValidationError = /^roles(?:\.| must be)/.test(error.message);
|
|
295
|
+
res.status(isValidationError ? 400 : 500).json({ error: error.message });
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
271
299
|
module.exports = router;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const MODEL_SCHEMA_VERSION = 2;
|
|
4
4
|
const MODEL_METADATA_MODES = ['auto', 'hybrid', 'manual'];
|
|
5
5
|
const THINKING_EFFORT_LEVELS = ['minimal', 'low', 'medium', 'high', 'xhigh'];
|
|
6
|
-
const THINKING_SELECTOR_LEVELS = [...THINKING_EFFORT_LEVELS, 'off'];
|
|
6
|
+
const THINKING_SELECTOR_LEVELS = [...THINKING_EFFORT_LEVELS, 'max', 'off'];
|
|
7
7
|
const THINKING_MODES = [
|
|
8
8
|
'effort',
|
|
9
9
|
'budget',
|
|
@@ -173,7 +173,7 @@ function compactObject(value = {}) {
|
|
|
173
173
|
|
|
174
174
|
function splitModelSelector(value = '') {
|
|
175
175
|
const raw = String(value || '').trim();
|
|
176
|
-
const match = raw.match(/:(minimal|low|medium|high|xhigh|off)$/i);
|
|
176
|
+
const match = raw.match(/:(minimal|low|medium|high|xhigh|max|off)$/i);
|
|
177
177
|
if (!match) return { modelId: raw, thinkingLevel: null };
|
|
178
178
|
return {
|
|
179
179
|
modelId: raw.slice(0, -match[0].length),
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as o,V as u,W as c,Y as d,Z as r,_t as p,b as v,et as f,g,ht as m,m as y,mt as h,r as b,st as k,w as _,x as w}from"./vue-vendor-BqZbbXHA.js";import{t as C}from"./client-BgcNg4Bt.js";import{r as j,s as x,t as M}from"./platforms-mqqe_82d.js";import{$ as z,At as P,Nt as N,O as U,R as I,S as $,V as F,_ as O,f as B,g as L,j as D,m as S}from"./icons-B-AzZoeE.js";import{l as q}from"./light-C2X7hegj.js";import{a as R,c as A,i as T,o as E,r as V,s as G,t as H}from"./AssetPathField-CLqalYv-.js";import{n as W,t as Y}from"./useResponsiveDrawer-ChHZrTfl.js";import{t as Z}from"./DrawerContent-ChXgZ1Xm.js";import{$ as K,Et as X,I as J,L as Q,M as ee,T as ae,X as le,Y as te,Z as se,ct as ne,ft as ie,j as oe,k as ue,st as ce,ut as de,w as re}from"./index-BlUXw84U.js";import{t as pe}from"./MarkdownEditor-Ul0bSGj-.js";async function ve(e=null,a="claude",l={}){const t=re("agents",a,l.scope||"",e||"");return ae(t,l=>C.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a},signal:l}).then(e=>e.data),"agents",`agents:${a}`)}var fe={class:"asset-card-main"},ge={class:"asset-card-top"},me={class:"asset-card-title-stack"},ye={class:"asset-card-title-row"},he={class:"asset-name"},be={class:"asset-tags"},ke={key:0,class:"asset-description"},_e={class:"asset-meta"},we={key:0,class:"asset-meta-item"},Ce={key:1,class:"asset-meta-item"},je={class:"asset-card-actions"},xe={class:"asset-platform-strip"},Me=["onClick"],ze=l({__name:"AgentCard",props:{agent:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(l,{emit:u}){const r=l,b=u,{byCapability:k}=X(),C=v(()=>k("agents"));return(u,v)=>{return c(),_("div",{class:m(["agent-card asset-card",{"is-project":"project"===l.agent.scope,"is-managed":l.registryInfo}]),onClick:v[4]||(v[4]=e=>b("click",l.agent))},[w("div",fe,[w("div",ge,[w("div",me,[w("div",ye,[w("span",{class:m(["asset-status-dot",{active:l.registryInfo?.enabled||"project"===l.agent.scope}])},null,2),w("span",he,p(l.agent.name),1)]),w("div",be,[i(h(de),{type:"user"===l.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:f(()=>[s(p("user"===l.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),l.registryInfo?(c(),o(h(de),{key:0,type:"success",size:"tiny",bordered:!1},{default:f(()=>[...v[5]||(v[5]=[s("托管",-1)])]),_:1})):t("",!0),l.agent.model?(c(),o(h(de),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(l.agent.model),1)]),_:1})):t("",!0)])])]),l.agent.description?(c(),_("div",ke,p((j=l.agent.description,j?j.length>80?j.slice(0,80)+"...":j:"")),1)):t("",!0),w("div",_e,[l.agent.tools?(c(),_("span",we,[i(h(e),{size:"12"},{default:f(()=>[i(h(F))]),_:1}),s(" "+p((k=l.agent.tools,k?k.length>30?k.slice(0,30)+"...":k:"")),1)])):t("",!0),l.agent.permissionMode?(c(),_("span",Ce,[i(h(e),{size:"12"},{default:f(()=>[i(h(B))]),_:1}),s(" "+p(l.agent.permissionMode),1)])):t("",!0)])]),w("div",je,[l.registryInfo?(c(),_(g,{key:0},[i(h(te),{trigger:"hover"},{trigger:f(()=>[i(h(oe),{value:l.registryInfo.enabled,size:"small",loading:l.toggling,"onUpdate:value":v[0]||(v[0]=e=>b("toggle-enabled",l.agent,e)),onClick:v[1]||(v[1]=y(()=>{},["stop"]))},null,8,["value","loading"])]),default:f(()=>[s(" "+p(l.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),w("div",xe,[(c(!0),_(g,null,n(C.value,a=>(c(),o(h(te),{key:a.key,trigger:"hover"},{trigger:f(()=>[w("span",{class:m(["asset-platform-icon",{active:l.registryInfo.platforms?.[a.key]}]),onClick:y(e=>b("toggle-platform",l.agent,a.key,!l.registryInfo.platforms?.[a.key]),["stop"])},[i(h(e),{size:"14"},{default:f(()=>[(c(),o(d(a.icon)))]),_:2},1024)],10,Me)]),default:f(()=>[s(" "+p(a.label||a.title||a.key)+" "+p(l.registryInfo.platforms?.[a.key]?"已启用":"未启用"),1)]),_:2},1024))),128))])],64)):(c(),_(g,{key:1},[i(h(a),{size:"tiny",tertiary:"",onClick:v[2]||(v[2]=y(e=>b("edit",l.agent),["stop"]))},{default:f(()=>[...v[6]||(v[6]=[s(" 编辑 ",-1)])]),_:1}),i(h(a),{size:"tiny",tertiary:"",type:"error",loading:r.deleting,onClick:v[3]||(v[3]=y(e=>b("delete",l.agent),["stop"]))},{default:f(()=>[...v[7]||(v[7]=[s(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var k,j}}},[["__scopeId","data-v-044e4192"]]),Pe={class:"asset-detail-drawer-header"},Ne={class:"asset-detail-identity"},Ue={class:"asset-detail-heading"},Ie={class:"asset-detail-name"},$e={class:"asset-detail-meta"},Fe={key:2,class:"asset-detail-subtle"},Oe={class:"asset-detail-body"},Be={key:0,class:"asset-detail-loading"},Le={class:"asset-detail-container"},De={class:"asset-detail-info-section"},Se={class:"asset-detail-description"},qe={class:"asset-detail-info-section"},Re={class:"asset-detail-list"},Ae={class:"asset-detail-row"},Te={class:"asset-detail-value"},Ee={key:0,class:"asset-detail-row"},Ve={class:"asset-detail-value mono"},Ge={key:1,class:"asset-detail-row"},He={class:"asset-detail-value mono"},We={key:2,class:"asset-detail-row"},Ye={class:"asset-detail-value"},Ze={key:3,class:"asset-detail-row"},Ke={class:"asset-detail-value"},Xe={key:4,class:"asset-detail-row"},Je={class:"asset-detail-value"},Qe={key:1,class:"asset-detail-info-section"},ea={class:"asset-detail-box"},aa={class:"asset-detail-code"},la={key:2,class:"asset-detail-empty"},ta={__name:"AgentDetailDrawer",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},platform:{type:String,default:"claude"},loading:{type:Boolean,default:!1}},emits:["update:visible"],setup(a,{emit:l}){const{drawerWidth:n}=Y(600),u=a,d=l,r=v({get:()=>u.visible,set:e=>d("update:visible",e)}),g={height:"100%",minHeight:0,overflow:"hidden"},m=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"")),y=v(()=>u.agent?.fileName?"codex"===u.platform?`[agents.${u.agent.fileName}]`:`${u.agent.fileName}.md`:""),b=v(()=>u.agent?"codex"===u.platform?u.agent.fullContent||"(无内容)":u.agent.systemPrompt||"(无内容)":"(无内容)"),k=v(()=>u.agent?.fullPath||u.agent?.path||"");function C(e){return"project"===e?"项目级":"用户级"}return(l,u)=>(c(),o(h(W),{show:r.value,"onUpdate:show":u[0]||(u[0]=e=>r.value=e),width:h(n),placement:"right","show-mask":!0},{default:f(()=>[i(h(Z),{closable:"","native-scrollbar":!1,"body-content-style":g},{header:f(()=>[w("div",Pe,[w("div",Ne,[i(h(e),{size:20,class:"asset-detail-icon"},{default:f(()=>[i(h(U))]),_:1}),w("div",Ue,[w("span",Ie,p(a.agent?.name||"代理详情"),1),w("div",$e,[a.agent?.scope?(c(),o(h(de),{key:0,type:"project"===a.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:f(()=>[s(p(C(a.agent.scope)),1)]),_:1},8,["type"])):t("",!0),a.agent?.model?(c(),o(h(de),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(a.agent.model),1)]),_:1})):t("",!0),m.value?(c(),_("span",Fe,p(m.value),1)):t("",!0)])])])])]),default:f(()=>[w("div",Oe,[a.loading&&!a.agent?(c(),_("div",Be,[i(h(ee),{size:"medium"}),u[1]||(u[1]=w("p",null,"加载代理详情中...",-1))])):a.agent?(c(),o(h(G),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:f(()=>[i(h(A),{name:"overview",tab:"概览"},{default:f(()=>[w("div",Le,["codex"===a.platform&&a.agent.configReadError?(c(),o(h(ne),{key:0,type:"warning",bordered:!1},{default:f(()=>[s(p(a.agent.configReadError),1)]),_:1})):t("",!0),w("div",De,[u[2]||(u[2]=w("h3",{class:"asset-detail-section-title"},"描述",-1)),w("p",Se,p(a.agent.description||"暂无描述"),1)]),w("div",qe,[u[9]||(u[9]=w("h3",{class:"asset-detail-section-title"},"基础信息",-1)),w("div",Re,[w("div",Ae,[u[3]||(u[3]=w("span",{class:"asset-detail-label"},"作用域",-1)),w("span",Te,p(C(a.agent.scope)),1)]),a.agent.fileName?(c(),_("div",Ee,[u[4]||(u[4]=w("span",{class:"asset-detail-label"},"文件名",-1)),w("span",Ve,p(y.value),1)])):t("",!0),"codex"===a.platform&&a.agent.configFile?(c(),_("div",Ge,[u[5]||(u[5]=w("span",{class:"asset-detail-label"},"config_file",-1)),w("span",He,p(a.agent.configFile),1)])):t("",!0),a.agent.model?(c(),_("div",We,[u[6]||(u[6]=w("span",{class:"asset-detail-label"},"模型",-1)),w("span",Ye,p(a.agent.model),1)])):t("",!0),a.agent.permissionMode?(c(),_("div",Ze,[u[7]||(u[7]=w("span",{class:"asset-detail-label"},"权限模式",-1)),w("span",Ke,p(a.agent.permissionMode),1)])):t("",!0),a.agent.skills?(c(),_("div",Xe,[u[8]||(u[8]=w("span",{class:"asset-detail-label"},"技能",-1)),w("span",Je,p(a.agent.skills),1)])):t("",!0)])]),a.agent.tools?(c(),_("div",Qe,[u[10]||(u[10]=w("h3",{class:"asset-detail-section-title"},"可用工具",-1)),w("div",ea,[i(h(e),{size:16},{default:f(()=>[i(h(F))]),_:1}),w("code",null,p(a.agent.tools),1)])])):t("",!0),i(H,{path:k.value},null,8,["path"])])]),_:1}),i(h(A),{name:"content",tab:"codex"===a.platform?"配置":"提示词"},{default:f(()=>[w("pre",aa,p(b.value),1)]),_:1},8,["tab"])]),_:1})):(c(),_("div",la,[i(h(e),{size:44,class:"asset-detail-empty-icon"},{default:f(()=>[i(h(z))]),_:1}),u[11]||(u[11]=w("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},sa={class:"config-edit-header"},na={class:"config-edit-identity"},ia={class:"config-edit-icon"},oa={class:"config-edit-title-stack"},ua={class:"config-edit-kicker"},ca={class:"config-edit-title"},da={class:"config-edit-badges"},ra={class:"config-edit-section"},pa={class:"section-heading"},va={class:"field-grid"},fa={class:"scope-option"},ga={class:"scope-path"},ma={class:"scope-option"},ya={class:"scope-path"},ha={key:0,class:"platform-note"},ba={class:"config-edit-section"},ka={class:"section-heading"},_a={key:1,class:"empty-config-box"},wa={class:"field-grid"},Ca={key:0,class:"config-edit-section content-section"},ja={class:"section-heading"},xa={class:"modal-footer"},Ma=l({__name:"AgentFormModal",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(l,{emit:n}){const u=l,d=n,y=v({get:()=>u.visible,set:e=>d("update:visible",e)}),b=v(()=>!!u.agent),j=v(()=>"codex"===u.platform),x=v(()=>"claude"===u.platform),M=v(()=>"codex"===u.platform||"opencode"===u.platform),P=v(()=>b.value?"编辑代理":"创建代理"),N=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"Claude Code")),$=v(()=>"codex"===u.platform?"~/.codex/config.toml":"opencode"===u.platform?"~/.config/opencode/agents/":"gemini"===u.platform?"~/.gemini/agents/":"~/.claude/agents/"),F=v(()=>"opencode"===u.platform?".opencode/agents/":"gemini"===u.platform?".gemini/agents/":".claude/agents/"),B=v(()=>"project"===H.value.scope?"项目级":"用户级"),L=v(()=>G.find(e=>e.value===H.value.configMode)?.label||"配置"),R=k(null),A=k(!1),T={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},E=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],V=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],G=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],H=k({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),W=v(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return x.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),j.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===H.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function Y(){H.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function Z(){y.value=!1,Y()}async function X(){try{await(R.value?.validate())}catch{return}A.value=!0;try{const e={...H.value,projectPath:u.projectPath};j.value?("custom"===H.value.configMode?e.configFile=H.value.configFile:delete e.configFile,"managed"===H.value.configMode||"custom"===H.value.configMode?e.configContent=H.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,t="claude"){return(await C.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(H.value.fileName,H.value.scope,e,u.platform),ue.success("代理更新成功")):(await async function(e,a="claude"){return(await C.post("/agents",{...e,platform:a})).data}(e,u.platform),ue.success("代理创建成功")),d("saved"),y.value=!1,Y()}catch(e){ue.error("操作失败: "+e.message)}finally{A.value=!1}}return r(()=>u.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");H.value={fileName:e.fileName||"",scope:e.scope||"user",name:e.name||"",description:e.description||"",configMode:a,configFile:e.configFile||"",configContent:e.fullContent||"",tools:e.tools||"",model:e.model||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else Y()},{immediate:!0}),r(()=>u.platform,e=>{"codex"===e&&(H.value.scope="user",H.value.configMode||(H.value.configMode="none"))},{immediate:!0}),(l,n)=>(c(),o(h(q),{show:y.value,"onUpdate:show":n[13]||(n[13]=e=>y.value=e),preset:"card",title:P.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":T,"mask-closable":!1,class:"config-edit-modal"},{footer:f(()=>[w("div",xa,[i(h(a),{onClick:Z},{default:f(()=>[...n[21]||(n[21]=[s("取消",-1)])]),_:1}),i(h(a),{type:"primary",loading:A.value,onClick:X},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(O))]),_:1})]),default:f(()=>[s(" "+p(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:f(()=>[w("div",sa,[w("div",na,[w("span",ia,[i(h(e),{size:22},{default:f(()=>[i(h(U))]),_:1})]),w("div",oa,[w("span",ua,p(N.value),1),w("span",ca,p(b.value?H.value.fileName||"编辑代理":"创建新代理"),1)])]),w("div",da,[i(h(de),{size:"small",bordered:!1,type:"info"},{default:f(()=>[s(p(B.value),1)]),_:1}),j.value?(c(),o(h(de),{key:0,size:"small",bordered:!1,type:"success"},{default:f(()=>[...n[14]||(n[14]=[s("Codex 用户级",-1)])]),_:1})):t("",!0),j.value&&"none"!==H.value.configMode?(c(),o(h(de),{key:1,size:"small",bordered:!1,type:"warning"},{default:f(()=>[s(p(L.value),1)]),_:1})):t("",!0)])]),i(h(Q),{ref_key:"formRef",ref:R,model:H.value,rules:W.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:f(()=>[w("div",{class:m(["config-edit-grid",{"is-codex":j.value}])},[w("section",ra,[w("div",pa,[i(h(e),{size:16},{default:f(()=>[i(h(D))]),_:1}),n[15]||(n[15]=w("span",null,"基础信息",-1))]),w("div",va,[i(h(J),{label:"文件名",path:"fileName"},{default:f(()=>[i(h(ce),{value:H.value.fileName,"onUpdate:value":n[0]||(n[0]=e=>H.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),x.value?(c(),o(h(J),{key:0,label:"显示名称",path:"name"},{default:f(()=>[i(h(ce),{value:H.value.name,"onUpdate:value":n[1]||(n[1]=e=>H.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):t("",!0)]),i(h(J),{label:"作用域",path:"scope"},{default:f(()=>[i(h(le),{value:H.value.scope,"onUpdate:value":n[2]||(n[2]=e=>H.value.scope=e),disabled:b.value,class:m(["scope-picker",{"single-option":j.value}])},{default:f(()=>[i(h(se),{value:"user"},{default:f(()=>[w("span",fa,[n[16]||(n[16]=w("span",{class:"scope-title"},"用户级",-1)),w("span",ga,p($.value),1)])]),_:1}),j.value?t("",!0):(c(),o(h(se),{key:0,value:"project"},{default:f(()=>[w("span",ma,[n[17]||(n[17]=w("span",{class:"scope-title"},"项目级",-1)),w("span",ya,p(F.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),i(h(J),{label:"描述",path:"description"},{default:f(()=>[i(h(ce),{value:H.value.description,"onUpdate:value":n[3]||(n[3]=e=>H.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),j.value?(c(),_("div",ha,[i(h(e),{size:16},{default:f(()=>[i(h(I))]),_:1}),n[18]||(n[18]=w("span",null,[s("Codex agents 写入用户级配置。描述会进入 "),w("code",null,"~/.codex/config.toml"),s(",TOML 配置可托管到 "),w("code",null,"~/.codex/agents/"),s("。")],-1))])):t("",!0)]),w("section",ba,[w("div",ka,[i(h(e),{size:16},{default:f(()=>[i(h(S))]),_:1}),w("span",null,p(j.value?"运行配置":"模型与权限"),1)]),j.value?(c(),_(g,{key:0},[i(h(J),{label:"配置模式",path:"configMode"},{default:f(()=>[i(h(K),{value:H.value.configMode,"onUpdate:value":n[4]||(n[4]=e=>H.value.configMode=e),options:G,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===H.value.configMode?(c(),o(h(J),{key:0,label:"配置文件路径",path:"configFile"},{default:f(()=>[i(h(ce),{value:H.value.configFile,"onUpdate:value":n[5]||(n[5]=e=>H.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):t("",!0),"none"===H.value.configMode?(c(),_("div",_a,[i(h(e),{size:18},{default:f(()=>[i(h(z))]),_:1}),n[19]||(n[19]=w("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(c(),o(h(J),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:f(()=>[i(h(ce),{value:H.value.configContent,"onUpdate:value":n[6]||(n[6]=e=>H.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(c(),_(g,{key:1},[i(h(J),{label:"可用工具",path:"tools"},{default:f(()=>[i(h(ce),{value:H.value.tools,"onUpdate:value":n[7]||(n[7]=e=>H.value.tools=e),placeholder:"Read, Edit, Bash"},null,8,["value"])]),_:1}),i(h(J),{label:"模型",path:"model"},{default:f(()=>[M.value?(c(),o(h(ce),{key:0,value:H.value.model,"onUpdate:value":n[8]||(n[8]=e=>H.value.model=e),placeholder:"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value"])):(c(),o(h(K),{key:1,value:H.value.model,"onUpdate:value":n[9]||(n[9]=e=>H.value.model=e),options:E,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),w("div",wa,["opencode"!==u.platform?(c(),o(h(J),{key:0,label:"权限模式",path:"permissionMode"},{default:f(()=>[i(h(K),{value:H.value.permissionMode,"onUpdate:value":n[10]||(n[10]=e=>H.value.permissionMode=e),options:V,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})):t("",!0),"opencode"!==u.platform?(c(),o(h(J),{key:1,label:"技能",path:"skills"},{default:f(()=>[i(h(ce),{value:H.value.skills,"onUpdate:value":n[11]||(n[11]=e=>H.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1})):t("",!0)])],64))]),j.value?t("",!0):(c(),_("section",Ca,[w("div",ja,[i(h(e),{size:16},{default:f(()=>[i(h(z))]),_:1}),n[20]||(n[20]=w("span",null,"系统提示词",-1))]),i(h(J),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:f(()=>[i(pe,{modelValue:H.value.systemPrompt,"onUpdate:modelValue":n[12]||(n[12]=e=>H.value.systemPrompt=e),rows:10,"min-height":240,placeholder:"定义代理的行为、边界和输出要求","default-editing":!b.value},null,8,["modelValue","default-editing"])]),_:1})]))],2)]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-00915421"]]),za={key:0,class:"asset-panel-header"},Pa={class:"asset-title-group"},Na={class:"asset-heading"},Ua={class:"asset-title-row"},Ia={class:"asset-platform-pill"},$a={key:0,class:"asset-action-row"},Fa={key:1,class:"asset-drawer-toolbar"},Oa={key:0,class:"asset-action-row"},Ba={class:"asset-summary"},La={class:"asset-summary-item"},Da={class:"asset-summary-value"},Sa={class:"asset-summary-item"},qa={class:"asset-summary-value"},Ra={class:"asset-summary-item"},Aa={class:"asset-summary-value"},Ta={class:"asset-summary-item"},Ea={class:"asset-summary-value"},Va={class:"asset-filter-bar"},Ga={class:"asset-panel-content"},Ha={key:0,class:"asset-empty"},Wa={key:1,class:"asset-list"},Ya={class:"asset-footer"},Za=l({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(l,{emit:d}){const y=l,z=d,F=M(),O=b(),B=k([]),D=k(!1),S=k(""),q=k("all"),A=k(!1),G=k(!1),H=k(null),W=k(!1),Y=k(null),Z=k({}),J=k({}),Q=k({});let le=0;const{byCapability:te}=X(),se=v(()=>te("agents").map(e=>e.key)),ne=v(()=>se.value.includes(oe.value)),oe=v(()=>String(y.platform||j(O)||"").trim().toLowerCase()),de=v(()=>"opencode"===oe.value?"使用 @agent 或 Task 在 OpenCode 中调用":"gemini"===oe.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),pe=v(()=>{const e=F.get(oe.value)||x(oe.value);return e.label||e.title||"Claude Code"}),fe=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],ge=v(()=>B.value.filter(e=>"user"===e.scope).length),me=v(()=>B.value.filter(e=>"project"===e.scope).length),ye=v(()=>Object.keys(J.value).length);function he(e){if(!e)return"";const a="string"==typeof e.scope&&e.scope.trim()?e.scope.trim():"unknown",l="string"==typeof e.path&&e.path.trim()?e.path.trim():"",t="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||t}`}function be(e){if(!e)return"";const a=[];if("string"==typeof e.path&&e.path.trim()&&a.push(e.path.trim()),"string"==typeof e.fileName&&e.fileName.trim()){const l=e.fileName.trim();a.push(`${l}.md`,l)}"string"==typeof e.name&&e.name.trim()&&a.push(e.name.trim());for(const l of a)if(J.value[l])return l;return a[0]||""}const ke=v(()=>{let e=B.value;if("user"===q.value?e=e.filter(e=>"user"===e.scope):"project"===q.value?e=e.filter(e=>"project"===e.scope):"managed"===q.value&&(e=e.filter(e=>J.value[be(e)])),S.value.trim()){const a=S.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a)||e.fileName?.toLowerCase().includes(a))}return e}),_e=v(()=>S.value?"没有匹配的代理":"user"===q.value?"暂无用户级代理":"project"===q.value?"暂无项目级代理":"managed"===q.value?"暂无托管的代理":ne.value?"暂无自定义代理":`${pe.value} 暂未提供 Agents 能力`);async function we(){if(!ne.value)return B.value=[],J.value={},void(D.value=!1);D.value=!0;try{const[e,a]=await Promise.all([ve(y.projectPath,oe.value),V("agents",{platform:oe.value,projectPath:y.projectPath})]);if(e.success&&(B.value=e.agents||[]),a.success){J.value={};for(const[e,l]of Object.entries(a.items||{}))J.value[e]=l}}catch(e){ue.error("加载代理列表失败: "+e.message)}finally{D.value=!1}}async function Ce(e,a){const l=be(e);if(l){Q.value[l]=!0;try{(await R("agents",l,a)).success&&(ue.success(a?"已启用":"已禁用"),await we())}catch(t){ue.error("切换失败: "+t.message)}finally{delete Q.value[l]}}else ue.error("未找到代理对应的托管配置键")}async function je(e,a,l){const t=be(e);if(t){Q.value[t]=!0;try{(await E("agents",t,a,l)).success&&(ue.success(`${a} ${l?"已启用":"已禁用"}`),await we())}catch(s){ue.error("切换失败: "+s.message)}finally{delete Q.value[t]}}else ue.error("未找到代理对应的托管配置键")}async function xe(){D.value=!0;try{const e=await T("agents");e?.success||ue.warning(e?.message||"同步失败,已继续刷新列表")}catch(e){ue.warning("同步失败,已继续刷新列表: "+e.message)}await we()}function Me(){Y.value=null,A.value=!0}function Pe(e){A.value=e,e||(Y.value=null)}function Ne(e){Ie(e,!0)}async function Ue(e){const a=he(e);Z.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await C.delete(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,y.projectPath,oe.value)).success&&(ue.success("代理已删除"),await we(),z("updated"))}catch(l){ue.error("删除失败: "+l.message)}finally{delete Z.value[a]}}async function Ie(e,a=!1){if(!e)return;const l=++le;W.value=!0,a||(H.value=null,G.value=!0);try{const t=await async function(e,a,l=null,t="claude"){const s={};t&&(s.platform=t),l&&(s.projectPath=l);const n=re(`agent-detail:${e}`,t,a||"",l||"");return ae(n,l=>C.get(`/agents/${a}/${e}`,{params:s,signal:l}).then(e=>e.data),"agent-detail",`agent-detail:${t}`)}(e.fileName,e.scope,y.projectPath,oe.value);if(l!==le)return;const s=t?.agent||e;a?(Y.value=s,A.value=!0):H.value=s}catch(t){if(l!==le)return;ue.error("加载代理详情失败: "+t.message),a?(Y.value=e,A.value=!0):H.value=e}finally{l===le&&(W.value=!1)}}function $e(e){Ie(e,!1)}function Fe(){Y.value=null,we(),z("updated")}function Oe(){z("back")}return u(()=>{we()}),r(oe,()=>{le+=1,W.value=!1,H.value=null,we()}),(u,d)=>(c(),_("div",{class:m(["agents-panel asset-panel",{"in-drawer":y.inDrawer}])},[y.inDrawer?t("",!0):(c(),_("div",za,[w("div",Pa,[y.hideBack?t("",!0):(c(),o(h(a),{key:0,text:"",onClick:Oe,class:"back-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(P))]),_:1})]),_:1})),w("div",Na,[w("div",Ua,[d[3]||(d[3]=w("span",{class:"asset-title"},"代理管理",-1)),w("span",Ia,p(pe.value),1)]),d[4]||(d[4]=w("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),ne.value?(c(),_("div",$a,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(N))]),_:1})]),default:f(()=>[d[5]||(d[5]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:xe,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h($))]),_:1})]),default:f(()=>[d[6]||(d[6]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),y.inDrawer?(c(),_("div",Fa,[ne.value?(c(),_("div",Oa,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(N))]),_:1})]),default:f(()=>[d[7]||(d[7]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:xe,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h($))]),_:1})]),default:f(()=>[d[8]||(d[8]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),w("div",Ba,[w("span",La,[d[9]||(d[9]=w("span",{class:"asset-summary-label"},"全部",-1)),w("span",Da,p(B.value.length),1)]),w("span",Sa,[d[10]||(d[10]=w("span",{class:"asset-summary-label"},"用户级",-1)),w("span",qa,p(ge.value),1)]),w("span",Ra,[d[11]||(d[11]=w("span",{class:"asset-summary-label"},"项目级",-1)),w("span",Aa,p(me.value),1)]),w("span",Ta,[d[12]||(d[12]=w("span",{class:"asset-summary-label"},"托管",-1)),w("span",Ea,p(ye.value),1)])]),w("div",Va,[i(h(ce),{value:S.value,"onUpdate:value":d[0]||(d[0]=e=>S.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:f(()=>[i(h(e),null,{default:f(()=>[i(h(L))]),_:1})]),_:1},8,["value"]),i(h(K),{value:q.value,"onUpdate:value":d[1]||(d[1]=e=>q.value=e),options:fe,size:"small",class:"asset-filter"},null,8,["value"])]),w("div",Ga,[i(h(ee),{show:D.value},{default:f(()=>[0!==ke.value.length||D.value?(c(),_("div",Wa,[(c(!0),_(g,null,n(ke.value,e=>(c(),o(ze,{key:he(e),agent:e,deleting:!!Z.value[he(e)],"registry-info":J.value[be(e)],toggling:!!Q.value[be(e)],onEdit:Ne,onDelete:Ue,onClick:$e,onToggleEnabled:Ce,onTogglePlatform:je},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(c(),_("div",Ha,[i(h(ie),{description:_e.value},{icon:f(()=>[i(h(e),{size:"48",color:"var(--text-quaternary)"},{default:f(()=>[i(h(U))]),_:1})]),extra:f(()=>[ne.value?(c(),o(h(a),{key:0,size:"small",onClick:Me},{default:f(()=>[...d[13]||(d[13]=[s(" 创建第一个代理 ",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),w("div",Ya,[i(h(e),{size:"14",class:"asset-info-icon"},{default:f(()=>[i(h(I))]),_:1}),w("span",null,p(de.value),1)]),i(Ma,{visible:A.value,"onUpdate:visible":Pe,agent:Y.value,"project-path":l.projectPath,platform:oe.value,onSaved:Fe},null,8,["visible","agent","project-path","platform"]),i(ta,{visible:G.value,"onUpdate:visible":d[2]||(d[2]=e=>G.value=e),agent:H.value,platform:oe.value,loading:W.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-b673c699"]]),Ka=l({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:s}=Y(720),n=v({get:()=>l.visible,set:e=>t("update:visible",e)}),u={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(c(),o(h(W),{show:n.value,"onUpdate:show":a[1]||(a[1]=e=>n.value=e),width:h(s),placement:"right","mask-closable":!0},{default:f(()=>[i(h(Z),{closable:"","native-scrollbar":!1,"body-content-style":u},{header:f(()=>[...a[2]||(a[2]=[w("div",{class:"drawer-header"},[w("span",null,"代理管理")],-1)])]),default:f(()=>[i(Za,{onBack:a[0]||(a[0]=e=>n.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b9b7a7fa"]]);export{Ka as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.asset-meta-item[data-v-044e4192]{max-width:150px}.config-edit-header[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:18px;margin:-4px 0 18px;padding:16px;display:flex}.config-edit-identity[data-v-00915421]{align-items:center;gap:12px;min-width:0;display:flex}.config-edit-icon[data-v-00915421]{width:42px;height:42px;color:var(--primary-color);background:oklch(62% .15 151/.1);border:1px solid oklch(62% .15 151/.28);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.config-edit-title-stack[data-v-00915421]{flex-direction:column;gap:3px;min-width:0;display:flex}.config-edit-kicker[data-v-00915421]{color:var(--text-tertiary);font-size:12px;line-height:1.3}.config-edit-title[data-v-00915421]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:18px;font-weight:650;line-height:1.3;overflow:hidden}.config-edit-badges[data-v-00915421]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.config-edit-form[data-v-00915421]{min-width:0}.config-edit-grid[data-v-00915421]{grid-template-columns:minmax(280px,.9fr) minmax(340px,1.1fr);gap:14px;display:grid}.config-edit-grid.is-codex[data-v-00915421]{align-items:start}.config-edit-section[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;min-width:0;padding:16px}.content-section[data-v-00915421]{grid-column:1/-1}.section-heading[data-v-00915421]{color:var(--text-primary);align-items:center;gap:8px;margin-bottom:14px;font-size:13px;font-weight:650;display:flex}.field-grid[data-v-00915421]{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.scope-picker[data-v-00915421]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;width:100%;display:grid}.scope-picker.single-option[data-v-00915421]{grid-template-columns:1fr}.scope-picker[data-v-00915421] .n-radio{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;align-items:flex-start;min-width:0;margin:0;padding:10px}.scope-option[data-v-00915421]{flex-direction:column;gap:2px;min-width:0;display:flex}.scope-title[data-v-00915421]{color:var(--text-primary);font-size:13px;font-weight:600}.scope-path[data-v-00915421]{overflow-wrap:anywhere;color:var(--text-tertiary);font-family:var(--font-mono);font-size:11px;line-height:1.4}.platform-note[data-v-00915421],.empty-config-box[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-secondary);border-radius:8px;align-items:flex-start;gap:8px;padding:11px 12px;font-size:12px;line-height:1.6;display:flex}.platform-note code[data-v-00915421]{font-family:var(--font-mono);font-size:11px}.empty-config-box[data-v-00915421]{align-items:center;margin-top:4px}.editor-form-item[data-v-00915421]{margin-bottom:0}.toml-editor[data-v-00915421] textarea{font-family:var(--font-mono);font-size:12px;line-height:1.65}.modal-footer[data-v-00915421]{justify-content:flex-end;gap:10px;padding-top:2px;display:flex}@media (width<=760px){.config-edit-header[data-v-00915421]{flex-direction:column}.config-edit-grid[data-v-00915421],.field-grid[data-v-00915421],.scope-picker[data-v-00915421]{grid-template-columns:1fr}}.back-btn[data-v-b673c699]{padding:4px}.action-btn[data-v-b673c699]{padding:4px 8px}.drawer-header[data-v-b9b7a7fa]{color:var(--text-primary);font-size:16px;font-weight:600}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as e,F as a,I as t,Mt as l,N as s,P as n,bt as i,gn as o,gt as r,hn as u,ht as d,i as c,m as p,p as v,s as f,t as m,vn as y,xn as g,xt as h,yn as b}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as w,C as x,D as k,I as _,K as z,M as C,O as P,S,V as O,W as U,Y as j,Z as N,_t as I,b as A,dt as L,et as $,f as B,g as T,ht as M,l as E,m as D,mt as R,rt as W,st as Y,tt as J,u as q,w as F,x as H}from"./vue-vendor-BqZbbXHA.js";import{t as V}from"./client-BgcNg4Bt.js";import{a as X,c as Z,l as K,o as G,t as Q,u as ee}from"./platforms-mqqe_82d.js";import{N as ae,Nt as te,P as le,_ as se,_t as ne,d as ie,ht as oe,j as re,m as ue,o as de,ot as ce,p as pe,r as ve,t as fe,vt as me,yt as ye}from"./icons-B-AzZoeE.js";import{h as ge}from"./use-message-DBsCm7FJ.js";import{l as he}from"./light-C2X7hegj.js";import{t as be}from"./Divider-BLLhMTSt.js";import{n as we,t as xe}from"./useResponsiveDrawer-ChHZrTfl.js";import{t as ke}from"./DrawerContent-ChXgZ1Xm.js";import{$ as _e,A as ze,D as Ce,E as Pe,H as Se,M as Oe,P as Ue,St as je,X as Ne,Z as Ie,at as Ae,ct as Le,ft as $e,j as Be,k as Te,rt as Me,st as Ee,ut as De,y as Re}from"./index-BlUXw84U.js";var We=w({name:"SlotMachineNumber",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],required:!0},oldOriginalNumber:{type:Number,default:void 0},newOriginalNumber:{type:Number,default:void 0}},setup(e){const a=Y(null),t=Y(e.value),l=Y(e.value),s=Y("up"),n=Y(!1),i=A(()=>n.value?`${e.clsPrefix}-base-slot-machine-current-number--${s.value}-scroll`:null),o=A(()=>n.value?`${e.clsPrefix}-base-slot-machine-old-number--${s.value}-scroll`:null);function r(){const a=e.newOriginalNumber,t=e.oldOriginalNumber;void 0!==t&&void 0!==a&&(a>t?u("up"):t>a&&u("down"))}function u(e){s.value=e,n.value=!1,_(()=>{var e;null===(e=a.value)||void 0===e||e.offsetWidth,n.value=!0})}return N(L(e,"value"),(e,a)=>{t.value=a,l.value=e,_(r)}),()=>{const{clsPrefix:s}=e;return C("span",{ref:a,class:`${s}-base-slot-machine-number`},null!==t.value?C("span",{class:[`${s}-base-slot-machine-old-number ${s}-base-slot-machine-old-number--top`,o.value]},t.value):null,C("span",{class:[`${s}-base-slot-machine-current-number`,i.value]},C("span",{ref:"numberWrapper",class:[`${s}-base-slot-machine-current-number__inner`,"number"!=typeof e.value&&`${s}-base-slot-machine-current-number__inner--not-number`]},l.value)),null!==t.value?C("span",{class:[`${s}-base-slot-machine-old-number ${s}-base-slot-machine-old-number--bottom`,o.value]},t.value):null)}}}),{cubicBezierEaseOut:Ye}=a;var Je=u([u("@keyframes n-base-slot-machine-fade-up-in","\n from {\n transform: translateY(60%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n "),u("@keyframes n-base-slot-machine-fade-down-in","\n from {\n transform: translateY(-60%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n "),u("@keyframes n-base-slot-machine-fade-up-out","\n from {\n transform: translateY(0%);\n opacity: 1;\n }\n to {\n transform: translateY(-60%);\n opacity: 0;\n }\n "),u("@keyframes n-base-slot-machine-fade-down-out","\n from {\n transform: translateY(0%);\n opacity: 1;\n }\n to {\n transform: translateY(60%);\n opacity: 0;\n }\n "),o("base-slot-machine","\n overflow: hidden;\n white-space: nowrap;\n display: inline-block;\n height: 18px;\n line-height: 18px;\n ",[o("base-slot-machine-number","\n display: inline-block;\n position: relative;\n height: 18px;\n width: .6em;\n max-width: .6em;\n ",[function({duration:e=".2s"}={}){return[u("&.fade-up-width-expand-transition-leave-active",{transition:`\n opacity ${e} ${Ye},\n max-width ${e} ${Ye},\n transform ${e} ${Ye}\n `}),u("&.fade-up-width-expand-transition-enter-active",{transition:`\n opacity ${e} ${Ye},\n max-width ${e} ${Ye},\n transform ${e} ${Ye}\n `}),u("&.fade-up-width-expand-transition-enter-to",{opacity:1,transform:"translateX(0) translateY(0)"}),u("&.fade-up-width-expand-transition-enter-from",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"}),u("&.fade-up-width-expand-transition-leave-from",{opacity:1,transform:"translateY(0)"}),u("&.fade-up-width-expand-transition-leave-to",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"})]}({duration:".2s"}),p({duration:".2s",delay:"0s"}),o("base-slot-machine-old-number","\n display: inline-block;\n opacity: 0;\n position: absolute;\n left: 0;\n right: 0;\n ",[b("top",{transform:"translateY(-100%)"}),b("bottom",{transform:"translateY(100%)"}),b("down-scroll",{animation:"n-base-slot-machine-fade-down-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),b("up-scroll",{animation:"n-base-slot-machine-fade-up-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1})]),o("base-slot-machine-current-number","\n display: inline-block;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n transform: translateY(0);\n width: .6em;\n ",[b("down-scroll",{animation:"n-base-slot-machine-fade-down-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),b("up-scroll",{animation:"n-base-slot-machine-fade-up-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),y("inner","\n display: inline-block;\n position: absolute;\n right: 0;\n top: 0;\n width: .6em;\n ",[b("not-number","\n right: unset;\n left: 0;\n ")])])])])]),qe=w({name:"BaseSlotMachine",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],default:0},max:{type:Number,default:void 0},appeared:{type:Boolean,required:!0}},setup(a){n("-base-slot-machine",Je,L(a,"clsPrefix"));const t=Y(),l=Y(),s=A(()=>{if("string"==typeof a.value)return[];if(a.value<1)return[0];const e=[];let t=a.value;for(void 0!==a.max&&(t=Math.min(a.max,t));t>=1;)e.push(t%10),t/=10,t=Math.floor(t);return e.reverse(),e});return N(L(a,"value"),(e,a)=>{"string"==typeof e?(l.value=void 0,t.value=void 0):"string"==typeof a?(l.value=e,t.value=void 0):(l.value=e,t.value=a)}),()=>{const{value:n,clsPrefix:i}=a;return"number"==typeof n?C("span",{class:`${i}-base-slot-machine`},C(q,{name:"fade-up-width-expand-transition",tag:"span"},{default:()=>s.value.map((e,a)=>C(We,{clsPrefix:i,key:s.value.length-a-1,oldOriginalNumber:t.value,newOriginalNumber:l.value,value:e}))}),C(e,{key:"+",width:!0},{default:()=>void 0!==a.max&&a.max<n?C(We,{clsPrefix:i,value:"+"}):null})):C("span",{class:`${i}-base-slot-machine`},n)}}}),Fe=u([u("@keyframes badge-wave-spread",{from:{boxShadow:"0 0 0.5px 0px var(--n-ripple-color)",opacity:.6},to:{boxShadow:"0 0 0.5px 4.5px var(--n-ripple-color)",opacity:0}}),o("badge","\n display: inline-flex;\n position: relative;\n vertical-align: middle;\n font-family: var(--n-font-family);\n ",[b("as-is",[o("badge-sup",{position:"static",transform:"translateX(0)"},[ge({transformOrigin:"left bottom",originalTransform:"translateX(0)"})])]),b("dot",[o("badge-sup","\n height: 8px;\n width: 8px;\n padding: 0;\n min-width: 8px;\n left: 100%;\n bottom: calc(100% - 4px);\n ",[u("::before","border-radius: 4px;")])]),o("badge-sup","\n background: var(--n-color);\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n color: #FFF;\n position: absolute;\n height: 18px;\n line-height: 18px;\n border-radius: 9px;\n padding: 0 6px;\n text-align: center;\n font-size: var(--n-font-size);\n transform: translateX(-50%);\n left: 100%;\n bottom: calc(100% - 9px);\n font-variant-numeric: tabular-nums;\n z-index: 2;\n display: flex;\n align-items: center;\n ",[ge({transformOrigin:"left bottom",originalTransform:"translateX(-50%)"}),o("base-wave",{zIndex:1,animationDuration:"2s",animationIterationCount:"infinite",animationDelay:"1s",animationTimingFunction:"var(--n-ripple-bezier)",animationName:"badge-wave-spread"}),u("&::before",'\n opacity: 0;\n transform: scale(1);\n border-radius: 9px;\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n ')])])]),He=w({name:"Badge",props:Object.assign(Object.assign({},s.props),{value:[String,Number],max:Number,dot:Boolean,type:{type:String,default:"default"},show:{type:Boolean,default:!0},showZero:Boolean,processing:Boolean,color:String,offset:Array}),setup(e,{slots:a}){const{mergedClsPrefixRef:n,inlineThemeDisabled:o,mergedRtlRef:u}=r(e),c=s("Badge","-badge",Fe,Ae,e,n),p=Y(!1),v=A(()=>e.show&&(e.dot||void 0!==e.value&&!(!e.showZero&&Number(e.value)<=0)||!i(a.value)));O(()=>{v.value&&(p.value=!0)});const f=t("Badge",u,n),m=A(()=>{const{type:a,color:t}=e,{common:{cubicBezierEaseInOut:l,cubicBezierEaseOut:s},self:{[g("color",a)]:n,fontFamily:i,fontSize:o}}=c.value;return{"--n-font-size":o,"--n-font-family":i,"--n-color":t||n,"--n-ripple-color":t||n,"--n-bezier":l,"--n-ripple-bezier":s}}),y=o?d("badge",A(()=>{let a="";const{type:t,color:s}=e;return t&&(a+=t[0]),s&&(a+=l(s)),a}),m,e):void 0,h=A(()=>{const{offset:a}=e;if(!a)return;const[t,l]=a,s="number"==typeof t?`${t}px`:t,n="number"==typeof l?`${l}px`:l;return{transform:`translate(calc(${(null==f?void 0:f.value)?"50%":"-50%"} + ${s}), ${n})`}});return{rtlEnabled:f,mergedClsPrefix:n,appeared:p,showBadge:v,handleAfterEnter:()=>{p.value=!0},handleAfterLeave:()=>{p.value=!1},cssVars:o?void 0:m,themeClass:null==y?void 0:y.themeClass,onRender:null==y?void 0:y.onRender,offsetStyle:h}},render(){var e;const{mergedClsPrefix:a,onRender:t,themeClass:l,$slots:s}=this;null==t||t();const n=null===(e=s.default)||void 0===e?void 0:e.call(s);return C("div",{class:[`${a}-badge`,this.rtlEnabled&&`${a}-badge--rtl`,l,{[`${a}-badge--dot`]:this.dot,[`${a}-badge--as-is`]:!n}],style:this.cssVars},n,C(E,{name:"fade-in-scale-up-transition",onAfterEnter:this.handleAfterEnter,onAfterLeave:this.handleAfterLeave},{default:()=>this.showBadge?C("sup",{class:`${a}-badge-sup`,title:je(this.value),style:this.offsetStyle},h(s.value,()=>[this.dot?null:C(qe,{clsPrefix:a,appeared:this.appeared,max:this.max,value:this.value})]),this.processing?C(v,{clsPrefix:a}):null):null}))}}),Ve={class:"remote-provider-fields"},Xe={class:"remote-field-label"},Ze=m({__name:"RemoteProviderFields",props:{provider:{type:Object,required:!0},definition:{type:Object,default:null}},setup(e){const a=e,t=A(()=>Array.isArray(a.definition?.fields)?a.definition.fields:[]);function l(e){const t=e?.visibleWhen;return!t||"object"!=typeof t||a.provider?.config?.[t.key]===t.equals}function s(e){return"secret"===e.type?"password":"text"}return(a,n)=>(U(),F("div",Ve,[(U(!0),F(T,null,z(t.value,a=>J((U(),F("div",{key:a.key,class:M(["remote-field",{"remote-field-wide":!0===a.wide}])},[H("span",Xe,I(a.label),1),"select"===a.type?(U(),S(R(_e),{key:0,value:e.provider.config[a.key],"onUpdate:value":t=>e.provider.config[a.key]=t,size:"small",options:a.options||[],placeholder:a.placeholder},null,8,["value","onUpdate:value","options","placeholder"])):(U(),S(R(Ee),{key:1,value:e.provider.config[a.key],"onUpdate:value":t=>e.provider.config[a.key]=t,size:"small",type:s(a),"show-password-on":"secret"===a.type?"click":void 0,placeholder:a.placeholder},null,8,["value","onUpdate:value","type","show-password-on","placeholder"]))],2)),[[B,l(a)]])),128))]))}},[["__scopeId","data-v-44913e2a"]]);var Ke={class:"settings-container"},Ge={class:"settings-sidebar"},Qe={class:"sidebar-header"},ea={class:"settings-menu"},aa=["onClick"],ta={class:"menu-label"},la={class:"settings-content"},sa={class:"settings-panel"},na={class:"panel-header"},ia={class:"panel-title-row"},oa={class:"panel-body"},ra={class:"setting-group"},ua={class:"setting-item"},da={class:"setting-label"},ca={class:"visibility-options"},pa={class:"visibility-item"},va={class:"visibility-info"},fa={class:"visibility-item"},ma={class:"visibility-info"},ya={class:"visibility-item"},ga={class:"visibility-info"},ha={class:"setting-item"},ba={class:"setting-label"},wa={class:"home-cli-settings"},xa={class:"platform-catalog-list"},ka={key:0,class:"platform-order-actions"},_a={class:"home-cli-actions"},za={class:"setting-item"},Ca={class:"setting-label"},Pa={class:"simple-theme-options"},Sa={class:"theme-text"},Oa={key:0,class:"theme-check"},Ua={class:"theme-text"},ja={key:0,class:"theme-check"},Na={class:"settings-panel"},Ia={class:"panel-header"},Aa={class:"panel-title-row"},La={class:"panel-body"},$a={class:"setting-group"},Ba={class:"setting-item"},Ta={class:"setting-label"},Ma={class:"notification-options"},Ea={class:"visibility-item"},Da={class:"visibility-info"},Ra={key:1,class:"notification-type-section"},Wa={class:"radio-content"},Ya={class:"radio-content"},Ja={class:"radio-content"},qa={style:{"font-size":"13px"}},Fa={class:"setting-item"},Ha={class:"setting-label"},Va={class:"notification-options"},Xa={class:"remote-provider-toolbar"},Za={class:"remote-provider-header"},Ka={class:"remote-provider-title-row"},Ga={class:"remote-provider-avatar"},Qa={class:"remote-provider-title"},et={class:"remote-provider-name-row"},at={class:"remote-provider-fields"},tt={class:"remote-field remote-field-wide"},lt={class:"remote-fields-descriptor"},st={class:"remote-provider-actions"},nt={class:"panel-footer"},it={class:"settings-panel"},ot={class:"panel-header"},rt={class:"panel-title-row"},ut={class:"panel-body"},dt={class:"setting-group"},ct={class:"setting-item"},pt={class:"setting-label"},vt={class:"ports-grid"},ft={class:"setting-item"},mt={class:"setting-label"},yt={class:"advanced-options"},gt={class:"option-field"},ht={class:"option-label"},bt={class:"setting-item"},wt={class:"setting-label"},xt={class:"advanced-options"},kt={class:"option-field"},_t={class:"option-label"},zt={class:"option-field"},Ct={class:"option-label"},Pt={class:"option-field"},St={class:"option-label"},Ot={class:"option-field"},Ut={class:"option-label"},jt={class:"setting-item"},Nt={class:"setting-label"},It={style:{"margin-top":"16px"}},At={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},Lt={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},$t={class:"panel-footer"},Bt={class:"settings-panel"},Tt={class:"panel-header"},Mt={class:"panel-title-row"},Et={class:"panel-body"},Dt={class:"setting-group"},Rt={class:"setting-item"},Wt={class:"setting-label"},Yt={class:"security-status"},Jt={class:"setting-item"},qt={class:"setting-label"},Ft={class:"security-form"},Ht={class:"panel-footer"},Vt={class:"settings-panel"},Xt={class:"panel-header"},Zt={class:"panel-title-row"},Kt={class:"panel-body"},Gt={class:"setting-item",style:{"margin-bottom":"12px"}},Qt={class:"model-meta-section"},el={class:"speed-test-defaults"},al={class:"speed-test-default-label"},tl={class:"model-toolbar"},ll={class:"model-filter-row"},sl={key:0,class:"setting-item"},nl={key:1,class:"model-list"},il=["onClick"],ol={class:"model-card-id"},rl={key:0,class:"model-card-body"},ul={class:"model-meta-editor"},dl={class:"model-meta-section"},cl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},pl={class:"model-meta-section",style:{"margin-top":"8px"}},vl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},fl={class:"panel-footer"},ml={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},yl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},gl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},hl=m({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:t,isMobile:l}=xe(720),s=Q(),{uiConfig:n}=X();async function i(e){return(await V.post("/settings/model-settings",e)).data}async function o(e){return(await V.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const r=e,u=a,d=A({get:()=>r.visible,set:e=>u("update:visible",e)}),p=Y("appearance"),{isDark:v,toggleTheme:m}=Re(),y=Y(!0),g=Y(!0),h=Y(!1),b=Y({webUI:19999}),w=Y({webUI:19999}),_=A(()=>[{key:"webUI",label:"Web UI",defaultPort:19999},...s.all.filter(e=>e.portKey&&Number.isFinite(e.defaultPort)).sort((e,a)=>(e.sortOrder||0)-(a.sortOrder||0)).map(e=>({key:e.portKey,label:e.portLabel||e.label||e.key,defaultPort:e.defaultPort}))]),C=Y(!1),L=Y([...G]),E=Y([...G]),q=Y(!1),ge=Y(!1),je=Y(!1),Ae=A(()=>ge.value?"[v] 已启用":"未启用"),We=A(()=>ge.value?"重启电脑时 coding-tool-x 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 coding-tool-x 会自动启动");function Ye(e={}){const a=(e?.omp&&"object"==typeof e.omp&&!Array.isArray(e.omp)?e.omp:null)||e,t=Number.isInteger(a.intervalSeconds)&&a.intervalSeconds>=1&&a.intervalSeconds<=60?a.intervalSeconds:5;return{enabled:"boolean"!=typeof a.enabled||a.enabled,intervalSeconds:t}}function Je(e={}){return{maxLogs:e.maxLogs??100,statsInterval:e.statsInterval??30,enableSessionBinding:!1!==e.enableSessionBinding,nativeCliLogs:Ye(e.nativeCliLogs)}}const qe=Y(Je()),Fe=Y(Je()),Ve=Y([]),Xe=Y([]);function hl(e={}){const a=String(e.key||"").trim();return a?{key:a,label:String(e.label||a),description:"string"==typeof e.description?e.description:"",implementation:"string"==typeof e.implementation?e.implementation:"",externalMessage:"string"==typeof e.externalMessage?e.externalMessage:"",hints:Array.isArray(e.hints)?e.hints.filter(e=>"string"==typeof e):[]}:null}function bl(e={}){return{enabled:!0===e.enabled,type:"dialog"===e.type||"browser"===e.type?e.type:"notification",external:!0===e.external}}function wl(e,a=Xe.value){return a.find(a=>a.type===e)||null}function xl(e){return wl(e)?.label||e||"远程通知"}function kl(e){const a=xl(e).trim();return Array.from(a)[0]||"通"}function _l(e={},a=Ve.value,t=Xe.value){const l={enabled:e?.stopHook?.enabled,type:e?.stopHook?.type},s=e.platforms&&"object"==typeof e.platforms&&!Array.isArray(e.platforms)?e.platforms:{};return{platforms:Object.fromEntries(a.map(e=>[e.key,bl(s[e.key]||("claude"===e.key?l:{}))])),remoteNotifications:{providers:Array.isArray(e?.remoteNotifications?.providers)?e.remoteNotifications.providers.map(e=>function(e={},a=Xe.value){const t=String(e.type||"").trim(),l=wl(t,a)||a[0],s=l?.type||t;if(!s)return null;const n=l?.defaults&&"object"==typeof l.defaults?l.defaults:{};return{id:e.id||`${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:s,name:e.name||l?.label||s,enabled:!0===e.enabled,config:{...n,...e.config&&"object"==typeof e.config?e.config:{}}}}(e,t)).filter(Boolean):[]}}}const zl=Y(_l()),Cl=Y(_l()),Pl=Y(!1),Sl=Y(""),Ol=Y(""),Ul=A(()=>Xe.value.map(e=>({label:e.label||e.type,value:e.type}))),jl=Y(""),Nl=Y("default"),Il=A(()=>"undefined"!=typeof window&&"undefined"!=typeof Notification&&(!!window.isSecureContext||["localhost","127.0.0.1","::1"].includes(window.location.hostname))),Al=A(()=>Il.value?"granted"===Nl.value?"已授权":"denied"===Nl.value?"已被浏览器拒绝,请在浏览器站点设置里重新开启":"尚未授权,保存时会请求浏览器权限":"当前环境不支持浏览器通知,请使用 localhost 或 HTTPS 页面");function Ll(e="notification"){if("browser"===e)return"浏览器通知";if("dialog"===e)return"确认式弹窗";switch(jl.value){case"win32":return"右上角悬浮卡片";case"darwin":return"角落横幅通知";case"linux":return"桌面环境通知";default:return"轻提醒卡片"}}function $l(e="notification"){return"browser"===e?Il.value?"granted"===Nl.value?"通过当前打开的 Web 页面显示浏览器原生通知":"denied"===Nl.value?"浏览器通知权限已被拒绝,需要先在浏览器中重新授权":"通过当前打开的 Web 页面显示原生通知,保存时会请求权限":"当前页面环境不支持浏览器通知":"dialog"===e?"强制提醒,需要手动点击确认才能关闭":"win32"===jl.value?"轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒)":"轻量提醒,几秒后自动消失,带提示音"}function Bl(){"undefined"!=typeof Notification?Nl.value=Notification.permission:Nl.value="unsupported"}function Tl(){const e=function(e=Xe.value[0]?.type){const a=wl(e);return a?{id:`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:e,name:xl(e),enabled:!1,config:{...a.defaults&&"object"==typeof a.defaults?a.defaults:{}}}:null}(Ol.value);e&&zl.value.remoteNotifications.providers.push(e)}const Ml=Y({hasPassword:!1}),El=Y(!1),Dl=Y(!1),Rl=Y({currentPassword:"",newPassword:"",confirmPassword:""}),Wl=Y(!1),Yl=A(()=>{const e=Rl.value.currentPassword.trim(),a=Rl.value.newPassword,t=Rl.value.confirmPassword;return Ml.value.hasPassword&&!e?"请输入当前密码":a?a.length<4?"新密码至少需要 4 位":t&&a!==t?"两次输入的新密码不一致":"":""}),Jl=A(()=>{const e=Rl.value;return(!Ml.value.hasPassword||Boolean(e.currentPassword.trim()))&&e.newPassword.length>=4&&e.newPassword===e.confirmPassword});let ql=null;const Fl=Y({name:"Models.dev",url:"",lastUpdated:""}),Hl=Y(!1),Vl=Y(!1),Xl=Y({}),Zl=Y({}),Kl=Y({}),Gl=Y(""),Ql=Y("all"),es=Y(!1),as=Y({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),ts=Y(new Set),ls=Y({}),ss=Y({}),ns=A(()=>Object.keys(ls.value).map(e=>{const a="function"==typeof s.get?s.get(e):null;return{key:e,label:a?.label||a?.title||e}})),is=Y(new Set),os=A(()=>Object.keys(Kl.value).length>0),rs=A(()=>os.value||JSON.stringify(ls.value)!==JSON.stringify(ss.value)),us=A(()=>{const e=String(as.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(Xl.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(as.value.context)||as.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(as.value.output)||as.value.output<=0?"Max Output 必须为正数":as.value.inputPrice<0||as.value.outputPrice<0||as.value.cacheCreationPrice<0||as.value.cacheReadPrice<0?"价格不能为负数":""});function ds(){as.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},es.value=!0}function cs(){es.value=!1}function ps(){if(us.value)return;const e=String(as.value.modelId||"").trim(),a={limit:{context:as.value.context,output:as.value.output},pricing:{input:as.value.inputPrice,output:as.value.outputPrice,cacheCreation:as.value.cacheCreationPrice,cacheRead:as.value.cacheReadPrice}};Xl.value[e]=a,Kl.value[e]={limit:{...a.limit},pricing:{...a.pricing}},Gl.value=e,es.value=!1,Te.success("模型已新增,请点击“保存设置”使其生效")}function vs(e){return ts.value.has(e)}function fs(e){return!vs(e)}const ms={claude:"claude",openai:"codex",gemini:"gemini"},ys=A(()=>{const e=Object.keys(Xl.value),a=Gl.value.trim().toLowerCase(),t=Ql.value,l=ms[t];return e.filter(e=>{if(a&&!e.toLowerCase().includes(a))return!1;const s=Xl.value[e];return"compatible"===t?!!Array.isArray(s?.toolTypes)&&(s.toolTypes.includes("opencode")||s.toolTypes.includes("omp")):l?Array.isArray(s?.toolTypes)?s.toolTypes.includes(l):gs(e,s)===l:"overrides"!==t||!!Zl.value[e]})});function gs(e,a=Xl.value[e]){const t=String(e||"").trim().toLowerCase(),l=hs(a);return l.length>0?l[0]:t.startsWith("claude-")?"claude":t.startsWith("gemini-")?"gemini":t.startsWith("gpt-")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")?"codex":""}function hs(e={}){return Array.isArray(e?.toolTypes)?[...new Set(e.toolTypes.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean))]:[]}const bs=A(()=>{const e=Object.fromEntries(ns.value.map(e=>[e.key,[]]));for(const[a,t]of Object.entries(Xl.value||{})){if(!t||"object"!=typeof t||!t.limit||!t.pricing)continue;const l=hs(t),s=l.length>0?"":gs(a,t);for(const t of l.length>0?l:[s])t&&e[t]&&e[t].push({label:a,value:a})}for(const a of Object.keys(e))e[a].sort((e,a)=>e.label.localeCompare(a.label));for(const a of ns.value){const t=String(ls.value[a.key]||"").trim();t&&e[a.key]&&(e[a.key].some(e=>e.value===t)||e[a.key].push({label:`${t}(自定义)`,value:t}))}return e});function ws(e,a,t){return void 0!==Kl.value[e]?.[a]?.[t]?Kl.value[e][a][t]:Xl.value[e]?.[a]?.[t]??null}function xs(e,a,t,l){if(!Kl.value[e]){const a=Xl.value[e]||{};Kl.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}Kl.value[e][a]||(Kl.value[e][a]={}),Kl.value[e][a][t]=l}async function ks(){Hl.value=!0;try{const e=await async function(){return(await V.get("/settings/model-settings")).data}(),a=e.metadataSource||{};Fl.value={name:a.name||"Models.dev",url:a.url||"",lastUpdated:a.lastUpdated||""},Xl.value=e.models&&"object"==typeof e.models&&!Array.isArray(e.models)?e.models:{};const t=e.overrides??e.modelMetadataOverrides;Zl.value={...t&&"object"==typeof t&&!Array.isArray(t)?t:{}};const l=Array.isArray(e.builtinModelIds)?e.builtinModelIds:Object.keys(Xl.value);ts.value=new Set(l.filter(e=>"string"==typeof e&&e.trim())),ls.value=Object.fromEntries(Object.entries(e.defaultSpeedTestModels||{}).filter(([,e])=>"string"==typeof e&&e.trim())),function(){const e={...ls.value};let a=!1;for(const t of ns.value){const l=bs.value[t.key]||[];0!==l.length&&(new Set(l.map(e=>e.value)).has(e[t.key])||(e[t.key]=l[0].value,a=!0))}a&&(ls.value=e)}(),ss.value={...ls.value},Kl.value={}}catch(e){}finally{Hl.value=!1}}async function _s(){Vl.value=!0;try{const e={...Zl.value};for(const[a,t]of Object.entries(Kl.value)){const l=e[a]||{};e[a]={limit:{...l.limit||{},...t.limit||{}},pricing:{...l.pricing||{},...t.pricing||{}}}}await i({overrides:e,defaultSpeedTestModels:ls.value}),Zl.value=e,ss.value={...ls.value},Kl.value={},await ks(),Te.success("模型设置已保存")}catch(e){Te.error("保存失败:"+e.message)}finally{Vl.value=!1}}async function zs(){try{await i({overrides:{},defaultSpeedTestModels:ls.value}),Zl.value={},Kl.value={},await ks(),Te.success("全部模型设置已重置为内置默认值")}catch(e){Te.error("重置失败:"+e.message)}}const Cs=A(()=>{const e=Object.keys(b.value).some(e=>b.value[e]!==w.value[e]),a=qe.value.nativeCliLogs.enabled!==Fe.value.nativeCliLogs.enabled||qe.value.nativeCliLogs.intervalSeconds!==Fe.value.nativeCliLogs.intervalSeconds;return e||qe.value.maxLogs!==Fe.value.maxLogs||qe.value.statsInterval!==Fe.value.statsInterval||qe.value.enableSessionBinding!==Fe.value.enableSessionBinding||a}),Ps=A(()=>[{key:"appearance",label:"外观设置",icon:W(ce)},{key:"notification",label:"通知设置",icon:W(ae)},{key:"advanced",label:"高级设置",icon:W(re)},{key:"security",label:"安全设置",icon:W(pe)},{key:"model-settings",label:"模型设置",icon:W(ie)}]),Ss=A(()=>{const e=Array.isArray(s.all)?s.all:[],a=new Map(e.map(e=>[e.key,e])),t=L.value.map(e=>a.get(e)).filter(Boolean),l=new Set(t.map(e=>e.key)),n=e.filter(e=>!l.has(e.key));return[...t,...n]});function Os(e){return String(e||"").trim().toLowerCase()}function Us(e=Ve.value){const a=new Set((Array.isArray(s.all)?s.all:[]).map(e=>Os(e.key)).filter(Boolean)),t=new Set(L.value.map(Os).filter(Boolean));return e.filter(e=>{const l=Os(e.key);return!a.has(l)||t.has(l)})}const js=A(()=>Us());const Ns=A(()=>JSON.stringify(L.value)!==JSON.stringify(E.value));function Is(e){return L.value.indexOf(e)}function As(e,a){const t=Is(e),l=t+a;if(t<0||l<0||l>=L.value.length)return;const s=[...L.value],[n]=s.splice(t,1);s.splice(l,0,n),L.value=s}function Ls(){L.value=[...G]}async function $s(){try{const e=await Z();if(e.success&&e.config){y.value=!1!==e.config.panelVisibility?.showChannels,g.value=!1!==e.config.panelVisibility?.showLogs,h.value=!0===e.config.channelBalance?.showRemaining;const a=Array.isArray(e.config.enabledCliPlatforms)?e.config.enabledCliPlatforms:G;L.value=[...a],E.value=[...a]}}catch(e){}}async function Bs(){q.value=!0;try{const e=await K({enabledCliPlatforms:[...L.value]});if(!e.success)throw new Error(e.message||"保存失败");const a=Array.isArray(e.config?.enabledCliPlatforms)?[...e.config.enabledCliPlatforms]:[...L.value];L.value=[...a],E.value=[...a],n.value={...n.value,enabledCliPlatforms:[...a]},window.dispatchEvent(new CustomEvent("enabled-cli-platforms-change",{detail:{enabledCliPlatforms:[...a]}})),Te.success("首页 CLI 显示已保存")}catch(e){Te.error("保存失败: "+e.message)}finally{q.value=!1}}async function Ts(){try{await ee("panelVisibility","showChannels",y.value),await ee("panelVisibility","showLogs",g.value),await ee("channelBalance","showRemaining",h.value)}catch(e){}}function Ms(e){y.value=e,Ts(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:g.value}}))}function Es(e){g.value=e,Ts(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:y.value,showLogs:e}}))}function Ds(e){h.value=e,Ts(),window.dispatchEvent(new CustomEvent("channel-balance-visibility-change",{detail:{showRemaining:e}}))}async function Rs(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:b.value,maxLogs:qe.value.maxLogs,statsInterval:qe.value.statsInterval,enableSessionBinding:e,nativeCliLogs:qe.value.nativeCliLogs})})).ok?(Fe.value=Je(qe.value),Te.success(e?"会话绑定已开启":"会话绑定已关闭")):(qe.value.enableSessionBinding=!e,Te.error("保存失���"))}catch(a){qe.value.enableSessionBinding=!e,Te.error("保存失败: "+a.message)}}function Ws(e={}){const a=function(e={}){const a=Array.isArray(e.platformDefinitions)?e.platformDefinitions.map(hl).filter(Boolean):[];if(a.length>0)return a;const t=e.platforms&&"object"==typeof e.platforms&&!Array.isArray(e.platforms)?e.platforms:{},l=Object.keys(t);return 0===l.length&&e.stopHook&&"object"==typeof e.stopHook&&l.push("claude"),l.map(e=>hl({key:e,label:e})).filter(Boolean)}(e),t=function(e={}){const a=Array.isArray(e.remoteProviderTypes)?e.remoteProviderTypes.map(e=>({...e,type:String(e?.type||"").trim()})).filter(e=>e.type):[],t=new Set(a.map(e=>e.type)),l=Array.isArray(e.remoteNotifications?.providers)?e.remoteNotifications.providers:[];for(const s of l){const e=String(s?.type||"").trim();e&&!t.has(e)&&(a.push({type:e,label:e,description:"",hint:"",defaults:{},fields:[]}),t.add(e))}return a}(e);return Ve.value=a,Xe.value=t,t.some(e=>e.type===Ol.value)||(Ol.value=t[0]?.type||""),{definitions:a,providerDefinitions:t}}async function Ys(){try{const e=await fetch("/api/hooks");if(e.ok){const a=await e.json(),{definitions:t,providerDefinitions:l}=Ws(a),s=_l(a,Us(t),l);zl.value=s,Cl.value=JSON.parse(JSON.stringify(s)),jl.value=a.platform||"",Bl()}}catch(e){}}async function Js(){Pl.value=!0;try{const e=new Set(js.value.map(e=>e.key));Object.entries(zl.value.platforms||{}).filter(([a])=>e.has(a)).some(([,e])=>!0===e?.enabled&&"browser"===e.type)&&await async function(){if(!Il.value)throw new Error("当前页面环境不支持浏览器通知,请改用 HTTPS 或 localhost 页面");if(Bl(),"granted"===Nl.value)return;const e=await Notification.requestPermission();if(Nl.value=e,"granted"!==e)throw new Error("浏览器通知权限未授予")}();const a=await fetch("/api/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({platforms:Object.fromEntries(Object.entries(zl.value.platforms||{}).filter(([a])=>e.has(a)).map(([e,a])=>[e,{enabled:a.enabled,type:a.type}])),remoteNotifications:{providers:zl.value.remoteNotifications.providers}})});if(a.ok){const e=await a.json(),{definitions:t,providerDefinitions:l}=Ws(e),s=_l(e,Us(t),l);zl.value=s,Cl.value=JSON.parse(JSON.stringify(s)),jl.value=e.platform||jl.value,Te.success("通知设置已保存")}else{const e=await a.json();Te.error("保存失败:"+(e.error||"未知错误"))}}catch(e){Te.error("保存失败:"+e.message)}finally{Pl.value=!1}}function qs(){Rl.value={currentPassword:"",newPassword:"",confirmPassword:""}}async function Fs(e=!1){return Dl.value&&ql?ql:El.value&&!e?Promise.resolve():(Dl.value=!0,ql=(async()=>{try{const e=await Pe();e.success&&(Ml.value={hasPassword:Boolean(e.hasPassword)},El.value=!0)}catch(e){}finally{Dl.value=!1,ql=null}})(),ql)}async function Hs(){if(!Jl.value)return void Te.warning("请完善密码信息");const e=Ml.value.hasPassword;Wl.value=!0;try{const a={newPassword:Rl.value.newPassword};Ml.value.hasPassword&&(a.currentPassword=Rl.value.currentPassword);const t=await Ce(a);t.success?(Ml.value.hasPassword=!0,El.value=!0,qs(),Te.success(e?"密码已更新":"密码已设置")):Te.error(t.error||"保存失败")}catch(a){Te.error(a.response?.data?.error||"保存失败")}finally{Wl.value=!1}}async function Vs(){C.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:b.value,maxLogs:qe.value.maxLogs,statsInterval:qe.value.statsInterval,enableSessionBinding:qe.value.enableSessionBinding,nativeCliLogs:qe.value.nativeCliLogs})});if(e.ok)w.value={...b.value},Fe.value=Je(qe.value),window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:qe.value.maxLogs,statsInterval:qe.value.statsInterval}})),Te.success("配置已保存,端口修改需要重启服务器生效;OMP 原生会话日志配置立即生效");else{const a=await e.json();Te.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Te.error("保存失败:"+e.message)}finally{C.value=!1}}async function Xs(){try{const e=await async function(){return(await V.get("/pm2-autostart")).data}();e&&e.success?ge.value=e.data?.enabled||!1:ge.value=!1}catch(e){ge.value=!1}}async function Zs(){je.value=!0;try{const e=await async function(){return(await V.post("/pm2-autostart",{action:"enable"})).data}();if(e.success)ge.value=!0,Te.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Te.warning(a):Te.error(a)}}catch(e){Te.error(e.message||"启用失败:未知错误")}finally{je.value=!1}}async function Ks(){je.value=!0;try{const e=await async function(){return(await V.post("/pm2-autostart",{action:"disable"})).data}();if(e.success)ge.value=!1,Te.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Te.warning(a):Te.error(a)}}catch(e){Te.error(e.message||"禁用失败:未知错误")}finally{je.value=!1}}return O(()=>{"function"==typeof s.load&&s.load(),$s(),Fs(),ks(),r.visible&&Ys()}),N(d,e=>{e?($s(),async function(){try{"function"==typeof s.load&&await s.load();const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json(),t={};for(const e of _.value)t[e.key]=a.ports?.[e.key]||e.defaultPort;b.value=t,w.value={...b.value},qe.value=Je({maxLogs:a.maxLogs||100,statsInterval:a.statsInterval||30,enableSessionBinding:!1!==a.enableSessionBinding,nativeCliLogs:a.nativeCliLogs}),Fe.value=Je(qe.value)}}catch(e){}}(),Xs(),Ys(),ks(),Fs(!0)):qs()}),N(p,(e,a)=>{"security"===e&&Fs(),"security"===a&&"security"!==e&&qs()}),(e,a)=>(U(),S(R(we),{show:d.value,"onUpdate:show":a[25]||(a[25]=e=>d.value=e),width:R(t),placement:"right","show-mask":!0},{default:$(()=>[P(R(ke),{"show-header":!1,closable:"","native-scrollbar":!1},{default:$(()=>[H("div",Ke,[H("div",Ge,[H("div",Qe,[P(R(c),{size:"20",color:"var(--text-secondary)"},{default:$(()=>[P(R(ue))]),_:1}),a[26]||(a[26]=H("span",{class:"sidebar-title"},"设置分类",-1))]),H("div",ea,[(U(!0),F(T,null,z(Ps.value,e=>(U(),F("div",{key:e.key,class:M(["menu-item",{active:p.value===e.key}]),onClick:a=>p.value=e.key},[P(R(c),{size:18,class:"menu-icon"},{default:$(()=>[(U(),S(j(e.icon)))]),_:2},1024),H("span",ta,I(e.label),1),e.badge?(U(),S(R(He),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):x("",!0)],10,aa))),128))])]),H("div",la,[J(H("div",sa,[H("div",na,[H("div",ia,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(ce))]),_:1}),H("div",null,[a[28]||(a[28]=H("h3",{class:"panel-title"},"外观设置",-1)),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[27]||(a[27]=[k("自定义界面外观和主题",-1)])]),_:1})])])]),H("div",oa,[H("div",ra,[H("div",ua,[H("div",da,[P(R(ze),{strong:""},{default:$(()=>[...a[29]||(a[29]=[k("面板显示",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[30]||(a[30]=[k(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),H("div",ca,[H("div",pa,[H("div",va,[P(R(ze),{strong:""},{default:$(()=>[...a[31]||(a[31]=[k("显示渠道列表",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[32]||(a[32]=[k(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),P(R(Be),{value:y.value,"onUpdate:value":Ms},null,8,["value"])]),H("div",fa,[H("div",ma,[P(R(ze),{strong:""},{default:$(()=>[...a[33]||(a[33]=[k("显示实时日志",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[34]||(a[34]=[k(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),P(R(Be),{value:g.value,"onUpdate:value":Es},null,8,["value"])]),H("div",ya,[H("div",ga,[P(R(ze),{strong:""},{default:$(()=>[...a[35]||(a[35]=[k("显示剩余金额",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[36]||(a[36]=[k(" 在渠道卡片显示可识别 API 网关的余额 ",-1)])]),_:1})]),P(R(Be),{value:h.value,"onUpdate:value":Ds},null,8,["value"])])])]),P(R(be)),H("div",ha,[H("div",ba,[P(R(ze),{strong:""},{default:$(()=>[...a[37]||(a[37]=[k("首页 CLI 显示",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[38]||(a[38]=[k(" 从已注册的平台目录中选择并排序首页显示的 CLI ",-1)])]),_:1})]),H("div",wa,[H("div",xa,[(U(!0),F(T,null,z(Ss.value,e=>(U(),F("div",{key:e.key,class:"platform-catalog-item"},[P(R(Me),{checked:L.value.includes(e.key),"onUpdate:checked":a=>function(e,a){const t=L.value.filter(a=>a!==e);a&&t.push(e),L.value=t}(e.key,a)},{default:$(()=>[k(I(e.label||e.title||e.key),1)]),_:2},1032,["checked","onUpdate:checked"]),L.value.includes(e.key)?(U(),F("div",ka,[P(R(f),{text:"",size:"small",disabled:0===Is(e.key),"aria-label":"上移",onClick:a=>As(e.key,-1)},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(oe))]),_:1})]),_:1},8,["disabled","onClick"]),P(R(f),{text:"",size:"small",disabled:Is(e.key)===L.value.length-1,"aria-label":"下移",onClick:a=>As(e.key,1)},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(me))]),_:1})]),_:1},8,["disabled","onClick"])])):x("",!0)]))),128))]),H("div",_a,[P(R(f),{size:"small",onClick:Ls},{default:$(()=>[...a[39]||(a[39]=[k("恢复默认显示",-1)])]),_:1}),P(R(f),{type:"primary",size:"small",loading:q.value,disabled:!Ns.value,onClick:Bs},{default:$(()=>[...a[40]||(a[40]=[k(" 保存首页显示 ",-1)])]),_:1},8,["loading","disabled"])])])]),P(R(be)),H("div",za,[H("div",Ca,[P(R(ze),{strong:""},{default:$(()=>[...a[41]||(a[41]=[k("界面主题",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[42]||(a[42]=[k(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),H("div",Pa,[H("div",{class:M(["simple-theme-item",{active:!R(v)}]),onClick:a[0]||(a[0]=e=>R(v)&&R(m)())},[P(R(c),{size:20,class:"theme-icon"},{default:$(()=>[P(R(de))]),_:1}),H("div",Sa,[P(R(ze),{strong:""},{default:$(()=>[...a[43]||(a[43]=[k("亮色模式",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[44]||(a[44]=[k("经典的浅色主题",-1)])]),_:1})]),R(v)?x("",!0):(U(),F("div",Oa,[P(R(c),{size:20,color:"#18a058"},{default:$(()=>[P(R(ye))]),_:1})]))],2),H("div",{class:M(["simple-theme-item",{active:R(v)}]),onClick:a[1]||(a[1]=e=>!R(v)&&R(m)())},[P(R(c),{size:20,class:"theme-icon"},{default:$(()=>[P(R(le))]),_:1}),H("div",Ua,[P(R(ze),{strong:""},{default:$(()=>[...a[45]||(a[45]=[k("暗色模式",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[46]||(a[46]=[k("护眼的深色主题",-1)])]),_:1})]),R(v)?(U(),F("div",ja,[P(R(c),{size:20,color:"#18a058"},{default:$(()=>[P(R(ye))]),_:1})])):x("",!0)],2)])])])])],512),[[B,"appearance"===p.value]]),J(H("div",Na,[H("div",Ia,[H("div",Aa,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(ae))]),_:1}),H("div",null,[a[48]||(a[48]=H("h3",{class:"panel-title"},"通知设置",-1)),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[47]||(a[47]=[k("配置任务完成时的系统通知",-1)])]),_:1})])])]),H("div",La,[H("div",$a,[(U(!0),F(T,null,z(js.value,(e,t)=>(U(),F(T,{key:e.key},[H("div",Ba,[H("div",Ta,[P(R(ze),{strong:""},{default:$(()=>[k(I(e.label),1)]),_:2},1024),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[k(I(e.description),1)]),_:2},1024)]),H("div",Ma,[H("div",Ea,[H("div",Da,[P(R(ze),{strong:""},{default:$(()=>[...a[49]||(a[49]=[k("启用任务完成通知",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[k(I(e.implementation),1)]),_:2},1024)]),P(R(Be),{value:zl.value.platforms[e.key].enabled,"onUpdate:value":a=>zl.value.platforms[e.key].enabled=a},null,8,["value","onUpdate:value"])]),zl.value.platforms[e.key].external?(U(),S(R(Le),{key:0,type:"warning",bordered:!1,style:{"margin-top":"16px"}},{default:$(()=>[k(I(e.externalMessage),1)]),_:2},1024)):x("",!0),zl.value.platforms[e.key].enabled?(U(),F("div",Ra,[P(R(ze),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:$(()=>[...a[50]||(a[50]=[k(" 选择通知方式 ",-1)])]),_:1}),P(R(Ne),{value:zl.value.platforms[e.key].type,"onUpdate:value":a=>zl.value.platforms[e.key].type=a},{default:$(()=>[P(R(Se),{vertical:""},{default:$(()=>[P(R(Ie),{value:"notification"},{default:$(()=>[H("div",Wa,[P(R(ze),{strong:""},{default:$(()=>[k(I(Ll("notification")),1)]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(I($l("notification")),1)]),_:1})])]),_:1}),P(R(Ie),{value:"browser",disabled:!Il.value},{default:$(()=>[H("div",Ya,[P(R(ze),{strong:""},{default:$(()=>[k(I(Ll("browser")),1)]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(I($l("browser")),1)]),_:1})])]),_:1},8,["disabled"]),P(R(Ie),{value:"dialog"},{default:$(()=>[H("div",Ja,[P(R(ze),{strong:""},{default:$(()=>[k(I(Ll("dialog")),1)]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(I($l("dialog")),1)]),_:1})])]),_:1})]),_:1})]),_:1},8,["value","onUpdate:value"]),"claude"===e.key&&"darwin"===jl.value?(U(),S(R(Le),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:$(()=>[H("div",qa,[P(R(ze),{strong:""},{default:$(()=>[...a[51]||(a[51]=[k("[TIP] 更好的通知体验",-1)])]),_:1}),P(R(ze),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:$(()=>[...a[52]||(a[52]=[k(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),P(R(ze),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:$(()=>[...a[53]||(a[53]=[k(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):x("",!0),"browser"===zl.value.platforms[e.key].type?(U(),S(R(Le),{key:1,type:"info",bordered:!1,style:{"margin-top":"16px"}},{default:$(()=>[k(" 当前权限状态:"+I(Al.value),1)]),_:1})):x("",!0)])):x("",!0)])]),t<js.value.length-1?(U(),S(R(be),{key:0})):x("",!0)],64))),128)),P(R(be)),H("div",Fa,[H("div",Ha,[P(R(ze),{strong:""},{default:$(()=>[...a[54]||(a[54]=[k("远程通知渠道",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[55]||(a[55]=[k(" 支持服务端注册的远程通知渠道 ",-1)])]),_:1})]),H("div",Va,[H("div",Xa,[P(R(_e),{value:Ol.value,"onUpdate:value":a[2]||(a[2]=e=>Ol.value=e),options:Ul.value,size:"small",style:{"max-width":"220px"}},null,8,["value","options"]),P(R(f),{size:"small",secondary:"",type:"primary",onClick:Tl},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(te))]),_:1})]),default:$(()=>[a[56]||(a[56]=k(" 添加渠道 ",-1))]),_:1})]),0===zl.value.remoteNotifications.providers.length?(U(),S(R($e),{key:0,description:"还没有远程通知渠道",style:{padding:"20px 0"}})):x("",!0),(U(!0),F(T,null,z(zl.value.remoteNotifications.providers,e=>(U(),F("div",{key:e.id,class:"remote-provider-card"},[H("div",Za,[H("div",Ka,[H("div",Ga,I(kl(e.type)),1),H("div",Qa,[H("div",et,[P(R(ze),{strong:""},{default:$(()=>[k(I(e.name||xl(e.type)),1)]),_:2},1024),P(R(De),{size:"tiny",bordered:!1,type:e.enabled?"success":"default"},{default:$(()=>[k(I(e.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"])]),P(R(ze),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>{return[k(I((a=e.type,wl(a)?.description||"")),1)];var a}),_:2},1024)])]),P(R(Se),{size:"small",align:"center"},{default:$(()=>[P(R(Be),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),P(R(f),{size:"small",quaternary:"",circle:"",type:"error",onClick:a=>{return t=e.id,void(zl.value.remoteNotifications.providers=zl.value.remoteNotifications.providers.filter(e=>e.id!==t));var t}},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(ve))]),_:1})]),_:1},8,["onClick"])]),_:2},1024)]),H("div",at,[H("div",tt,[a[57]||(a[57]=H("span",{class:"remote-field-label"},"渠道名称",-1)),P(R(Ee),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"例如:我的飞书"},null,8,["value","onUpdate:value"])]),H("div",lt,[P(Ze,{provider:e,definition:wl(e.type)},null,8,["provider","definition"])])]),H("div",st,[P(R(f),{size:"small",secondary:"",loading:Sl.value===e.id,onClick:a=>async function(e){Sl.value=e.id;try{const a=await fetch("/api/hooks/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e})}),t=await a.json().catch(()=>({}));if(!a.ok)throw new Error(t.error||"测试通知发送失败");Te.success(t.message||"测试通知已发送")}catch(a){Te.error("测试失败:"+a.message)}finally{Sl.value=""}}(e)},{default:$(()=>[...a[58]||(a[58]=[k(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>{return[k(I((a=e.type,wl(a)?.hint||"")),1)];var a}),_:2},1024)])]))),128))])])])]),H("div",nt,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[3]||(a[3]=e=>d.value=!1)},{default:$(()=>[...a[59]||(a[59]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:Pl.value,disabled:JSON.stringify(zl.value)===JSON.stringify(Cl.value),onClick:Js},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[60]||(a[60]=k(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"notification"===p.value]]),J(H("div",it,[H("div",ot,[H("div",rt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(re))]),_:1}),H("div",null,[a[62]||(a[62]=H("h3",{class:"panel-title"},"高级设置",-1)),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[61]||(a[61]=[k("端口配置和高级选项",-1)])]),_:1})])])]),H("div",ut,[H("div",dt,[H("div",ct,[H("div",pt,[P(R(ze),{strong:""},{default:$(()=>[...a[63]||(a[63]=[k("端口配置",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[64]||(a[64]=[k(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),H("div",vt,[(U(!0),F(T,null,z(_.value,e=>(U(),F("div",{key:e.key,class:"port-field"},[P(R(ze),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:$(()=>[k(I(e.label),1)]),_:2},1024),P(R(Ue),{value:b.value[e.key],"onUpdate:value":a=>b.value[e.key]=a,min:1024,max:65535,"show-button":!1,placeholder:String(e.defaultPort)},{prefix:$(()=>[P(R(c),null,{default:$(()=>[P(R(re))]),_:1})]),_:1},8,["value","onUpdate:value","placeholder"])]))),128))])]),P(R(be)),H("div",ft,[H("div",mt,[P(R(ze),{strong:""},{default:$(()=>[...a[65]||(a[65]=[k("负载均衡",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[66]||(a[66]=[k(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),H("div",yt,[H("div",gt,[H("div",ht,[P(R(ze),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[67]||(a[67]=[k("多渠道负载会话绑定",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[68]||(a[68]=[k("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),P(R(Be),{value:qe.value.enableSessionBinding,"onUpdate:value":[a[4]||(a[4]=e=>qe.value.enableSessionBinding=e),Rs],size:"medium"},null,8,["value"])])])]),P(R(be)),H("div",bt,[H("div",wt,[P(R(ze),{strong:""},{default:$(()=>[...a[69]||(a[69]=[k("日志和性能",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[70]||(a[70]=[k(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),H("div",xt,[H("div",kt,[H("div",_t,[P(R(ze),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[71]||(a[71]=[k("实时日志保留数量",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[72]||(a[72]=[k("超过此数量将自动清理旧日志",-1)])]),_:1})]),P(R(Ue),{value:qe.value.maxLogs,"onUpdate:value":a[5]||(a[5]=e=>qe.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:$(()=>[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[73]||(a[73]=[k("条",-1)])]),_:1})]),_:1},8,["value"])]),H("div",zt,[H("div",Ct,[P(R(ze),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[74]||(a[74]=[k("统计数据刷新间隔",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[75]||(a[75]=[k("自动刷新今日统计的时间间隔",-1)])]),_:1})]),P(R(Ue),{value:qe.value.statsInterval,"onUpdate:value":a[6]||(a[6]=e=>qe.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:$(()=>[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[76]||(a[76]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])]),H("div",Pt,[H("div",St,[P(R(ze),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[77]||(a[77]=[k("CLI 原生会话日志",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[78]||(a[78]=[k("读取各 CLI 工具自己的会话日志,配置保存后立即生效",-1)])]),_:1})]),P(R(Be),{value:qe.value.nativeCliLogs.enabled,"onUpdate:value":a[7]||(a[7]=e=>qe.value.nativeCliLogs.enabled=e),size:"medium"},null,8,["value"])]),H("div",Ot,[H("div",Ut,[P(R(ze),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[79]||(a[79]=[k("CLI 原生日志读取间隔",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[80]||(a[80]=[k("轮询原生会话日志的时间间隔",-1)])]),_:1})]),P(R(Ue),{value:qe.value.nativeCliLogs.intervalSeconds,"onUpdate:value":a[8]||(a[8]=e=>qe.value.nativeCliLogs.intervalSeconds=e),min:1,max:60,step:1,style:{width:"140px"}},{suffix:$(()=>[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[81]||(a[81]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),P(R(be)),H("div",jt,[H("div",Nt,[P(R(ze),{strong:""},{default:$(()=>[...a[82]||(a[82]=[k("开机自启",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[83]||(a[83]=[k(" 启用此选项后,重启电脑时 coding-tool-x 会自动启动 ",-1)])]),_:1})]),H("div",It,[H("div",At,[H("div",Lt,[P(R(ze),{strong:"",style:{flex:"1"}},{default:$(()=>[k(I(Ae.value),1)]),_:1}),ge.value?(U(),S(R(f),{key:1,type:"warning",size:"small",loading:je.value,onClick:Ks},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(fe))]),_:1})]),default:$(()=>[a[85]||(a[85]=k(" 禁用自启 ",-1))]),_:1},8,["loading"])):(U(),S(R(f),{key:0,type:"primary",size:"small",loading:je.value,onClick:Zs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(ye))]),_:1})]),default:$(()=>[a[84]||(a[84]=k(" 启用自启 ",-1))]),_:1},8,["loading"]))]),P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(I(We.value),1)]),_:1})])])])])]),H("div",$t,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[9]||(a[9]=e=>d.value=!1)},{default:$(()=>[...a[86]||(a[86]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:C.value,disabled:!Cs.value,onClick:Vs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[87]||(a[87]=k(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"advanced"===p.value]]),J(H("div",Bt,[H("div",Tt,[H("div",Mt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(pe))]),_:1}),H("div",null,[a[89]||(a[89]=H("h3",{class:"panel-title"},"安全设置",-1)),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[88]||(a[88]=[k("设置访问密码,保护面板访问",-1)])]),_:1})])])]),H("div",Et,[H("div",Dt,[H("div",Rt,[H("div",Wt,[P(R(ze),{strong:""},{default:$(()=>[...a[90]||(a[90]=[k("访问保护",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[91]||(a[91]=[k(" 启用后,重新打开面板时需要先输入访问密码 ",-1)])]),_:1})]),H("div",Yt,[Ml.value.hasPassword?(U(),S(R(De),{key:0,type:"success",bordered:!1},{default:$(()=>[...a[92]||(a[92]=[k(" 已启用 ",-1)])]),_:1})):(U(),S(R(De),{key:1,type:"warning",bordered:!1},{default:$(()=>[...a[93]||(a[93]=[k(" 未启用 ",-1)])]),_:1}))])]),P(R(be)),H("div",Jt,[H("div",qt,[P(R(ze),{strong:""},{default:$(()=>[k(I(Ml.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[94]||(a[94]=[k(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),P(R(ze),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:$(()=>[a[96]||(a[96]=k(" 忘记密码可在终端执行 ",-1)),P(R(ze),{code:""},{default:$(()=>[...a[95]||(a[95]=[k("ctx security reset",-1)])]),_:1}),a[97]||(a[97]=k(" 关闭密码 ",-1))]),_:1})]),H("div",Ft,[Ml.value.hasPassword?(U(),S(R(Ee),{key:0,value:Rl.value.currentPassword,"onUpdate:value":a[10]||(a[10]=e=>Rl.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):x("",!0),P(R(Ee),{value:Rl.value.newPassword,"onUpdate:value":a[11]||(a[11]=e=>Rl.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),P(R(Ee),{value:Rl.value.confirmPassword,"onUpdate:value":a[12]||(a[12]=e=>Rl.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),Yl.value?(U(),S(R(ze),{key:1,depth:"3",class:"security-error"},{default:$(()=>[k(I(Yl.value),1)]),_:1})):x("",!0)])])])]),H("div",Ht,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[13]||(a[13]=e=>d.value=!1)},{default:$(()=>[...a[98]||(a[98]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:Wl.value,disabled:!Jl.value,onClick:Hs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[99]||(a[99]=k(" 保存密码 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"security"===p.value]]),J(H("div",Vt,[H("div",Xt,[H("div",Zt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(ie))]),_:1}),H("div",null,[a[101]||(a[101]=H("h3",{class:"panel-title"},"模型设置",-1)),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[100]||(a[100]=[k("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1}),P(R(ze),{depth:"3",class:"panel-subtitle"},{default:$(()=>[k(" 价格来源:Models.dev 参考价格(离线快照) · "+I(Fl.value.lastUpdated||"日期未知"),1)]),_:1})])])]),H("div",Kt,[P(R(Oe),{show:Hl.value},{default:$(()=>[H("div",Gt,[H("div",Qt,[P(R(ze),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[102]||(a[102]=[k("默认测速模型",-1)])]),_:1}),H("div",el,[(U(!0),F(T,null,z(ns.value,e=>(U(),F("div",{key:e.key,class:"speed-test-default-row"},[H("div",al,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(I(e.label),1)]),_:2},1024)]),P(R(_e),{value:ls.value[e.key],"onUpdate:value":a=>ls.value[e.key]=a,options:bs.value[e.key],placeholder:`选择或输入${e.label}默认测速模型`,disabled:0===(bs.value[e.key]||[]).length,size:"small",filterable:"",tag:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])]))),128))])])]),H("div",tl,[P(R(Ee),{value:Gl.value,"onUpdate:value":a[14]||(a[14]=e=>Gl.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),P(R(f),{size:"small",type:"primary",onClick:ds},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(te))]),_:1})]),default:$(()=>[a[103]||(a[103]=k(" 新增 ",-1))]),_:1})]),H("div",ll,[P(R(Ne),{value:Ql.value,"onUpdate:value":a[15]||(a[15]=e=>Ql.value=e),size:"small"},{default:$(()=>[P(R(Ie),{value:"all"},{default:$(()=>[...a[104]||(a[104]=[k("全部",-1)])]),_:1}),P(R(Ie),{value:"claude"},{default:$(()=>[...a[105]||(a[105]=[k("Claude",-1)])]),_:1}),P(R(Ie),{value:"openai"},{default:$(()=>[...a[106]||(a[106]=[k("OpenAI",-1)])]),_:1}),P(R(Ie),{value:"gemini"},{default:$(()=>[...a[107]||(a[107]=[k("Gemini",-1)])]),_:1}),P(R(Ie),{value:"compatible"},{default:$(()=>[...a[108]||(a[108]=[k("OpenCode / OMP",-1)])]),_:1}),P(R(Ie),{value:"overrides"},{default:$(()=>[...a[109]||(a[109]=[k("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===ys.value.length?(U(),F("div",sl,[P(R($e),{description:"没有匹配的模型"})])):(U(),F("div",nl,[(U(!0),F(T,null,z(ys.value,e=>(U(),F("div",{key:e,class:M(["model-card",{expanded:is.value.has(e)}])},[H("div",{class:"model-card-header",onClick:a=>(e=>{is.value.has(e)?is.value.delete(e):is.value.add(e),is.value=new Set(is.value)})(e)},[P(R(c),{size:"14",class:"expand-icon"},{default:$(()=>[P(R(ne))]),_:1}),H("span",ol,I(e),1),Zl.value[e]?(U(),S(R(De),{key:0,type:"warning",size:"tiny",bordered:!1},{default:$(()=>[...a[110]||(a[110]=[k("自定义",-1)])]),_:1})):x("",!0),H("div",{class:"model-card-actions",onClick:a[16]||(a[16]=D(()=>{},["stop"]))},[Zl.value[e]&&vs(e)?(U(),S(R(f),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await o(e),delete Zl.value[e],delete Kl.value[e],await ks(),Te.success(`${e} 已重置为内置默认值`)}catch(a){Te.error("重置失败:"+a.message)}}(e)},{default:$(()=>[...a[111]||(a[111]=[k(" 重置 ",-1)])]),_:1},8,["onClick"])):x("",!0),fs(e)?(U(),S(R(f),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!Zl.value[e];a&&(await o(e),delete Zl.value[e]),delete Kl.value[e],fs(e)?delete Xl.value[e]:a&&await ks(),Te.success(`已删除模型:${e}`)}catch(a){Te.error("删除失败:"+a.message)}}(e)},{default:$(()=>[...a[112]||(a[112]=[k(" 删除 ",-1)])]),_:1},8,["onClick"])):x("",!0)])],8,il),is.value.has(e)?(U(),F("div",rl,[H("div",ul,[H("div",dl,[P(R(ze),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[113]||(a[113]=[k("上下文限制",-1)])]),_:1}),H("div",cl,[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[114]||(a[114]=[k("Context 窗口 (tokens)",-1)])]),_:1}),P(R(Ue),{value:ws(e,"limit","context"),"onUpdate:value":a=>xs(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[115]||(a[115]=[k("Max Output (tokens)",-1)])]),_:1}),P(R(Ue),{value:ws(e,"limit","output"),"onUpdate:value":a=>xs(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),H("div",pl,[P(R(ze),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[116]||(a[116]=[k("定价(USD / 百万 tokens)",-1)])]),_:1}),H("div",vl,[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[117]||(a[117]=[k("输入价格",-1)])]),_:1}),P(R(Ue),{value:ws(e,"pricing","input"),"onUpdate:value":a=>xs(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[118]||(a[118]=[k("输出价格",-1)])]),_:1}),P(R(Ue),{value:ws(e,"pricing","output"),"onUpdate:value":a=>xs(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[119]||(a[119]=[k("缓存写入价格",-1)])]),_:1}),P(R(Ue),{value:ws(e,"pricing","cacheCreation"),"onUpdate:value":a=>xs(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[120]||(a[120]=[k("缓存读取价格",-1)])]),_:1}),P(R(Ue),{value:ws(e,"pricing","cacheRead"),"onUpdate:value":a=>xs(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):x("",!0)],2))),128))]))]),_:1},8,["show"])]),H("div",fl,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:zs,disabled:0===Object.keys(Zl.value).length},{default:$(()=>[...a[121]||(a[121]=[k(" 重置全部 ",-1)])]),_:1},8,["disabled"]),P(R(f),{type:"primary",size:"large",loading:Vl.value,disabled:!rs.value,onClick:_s},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[122]||(a[122]=k(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"model-settings"===p.value]])])]),P(R(he),{show:es.value,"onUpdate:show":a[24]||(a[24]=e=>es.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:$(()=>[P(R(Se),{vertical:"",size:12},{default:$(()=>[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[123]||(a[123]=[k("模型 ID",-1)])]),_:1}),P(R(Ee),{value:as.value.modelId,"onUpdate:value":a[17]||(a[17]=e=>as.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),H("div",ml,[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[124]||(a[124]=[k("Context 窗口",-1)])]),_:1}),P(R(Ue),{value:as.value.context,"onUpdate:value":a[18]||(a[18]=e=>as.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[125]||(a[125]=[k("Max Output",-1)])]),_:1}),P(R(Ue),{value:as.value.output,"onUpdate:value":a[19]||(a[19]=e=>as.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),H("div",yl,[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[126]||(a[126]=[k("输入价格",-1)])]),_:1}),P(R(Ue),{value:as.value.inputPrice,"onUpdate:value":a[20]||(a[20]=e=>as.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[127]||(a[127]=[k("输出价格",-1)])]),_:1}),P(R(Ue),{value:as.value.outputPrice,"onUpdate:value":a[21]||(a[21]=e=>as.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),H("div",gl,[H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[128]||(a[128]=[k("缓存写入价格",-1)])]),_:1}),P(R(Ue),{value:as.value.cacheCreationPrice,"onUpdate:value":a[22]||(a[22]=e=>as.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),H("div",null,[P(R(ze),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[129]||(a[129]=[k("缓存读取价格",-1)])]),_:1}),P(R(Ue),{value:as.value.cacheReadPrice,"onUpdate:value":a[23]||(a[23]=e=>as.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),us.value?(U(),S(R(ze),{key:0,depth:"3",class:"security-error"},{default:$(()=>[k(I(us.value),1)]),_:1})):x("",!0),P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{onClick:cs},{default:$(()=>[...a[130]||(a[130]=[k("取消",-1)])]),_:1}),P(R(f),{type:"primary",disabled:!!us.value,onClick:ps},{default:$(()=>[...a[131]||(a[131]=[k(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f0261ba5"]]);export{hl as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.remote-provider-fields[data-v-44913e2a]{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.remote-field[data-v-44913e2a]{flex-direction:column;gap:5px;min-width:0;display:flex}.remote-field-wide[data-v-44913e2a]{grid-column:1/-1}.remote-field-label[data-v-44913e2a]{color:var(--text-tertiary);font-size:11px;font-weight:600}@media (width<=600px){.remote-provider-fields[data-v-44913e2a]{grid-template-columns:1fr}}.settings-container[data-v-f0261ba5]{gap:0;height:100vh;display:flex}.settings-sidebar[data-v-f0261ba5]{background:var(--bg-secondary);border-right:1px solid var(--border-primary);flex-direction:column;flex-shrink:0;width:240px;display:flex;overflow:hidden}[data-theme=dark] .settings-sidebar[data-v-f0261ba5]{background:#0f172a80;border-right:1px solid #94a3b81a}.sidebar-header[data-v-f0261ba5]{border-bottom:1px solid var(--border-primary);align-items:center;gap:12px;padding:28px 20px 24px;display:flex}[data-theme=dark] .sidebar-header[data-v-f0261ba5]{border-bottom:1px solid #94a3b81a}.sidebar-title[data-v-f0261ba5]{color:var(--text-primary);letter-spacing:-.3px;font-size:16px;font-weight:700}.settings-menu[data-v-f0261ba5]{flex:1;padding:16px 12px;overflow-y:auto}.menu-item[data-v-f0261ba5]{cursor:pointer;border-radius:8px;align-items:center;gap:12px;margin-bottom:4px;padding:12px 16px;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;position:relative}.menu-item[data-v-f0261ba5]:hover{background:var(--hover-bg)}[data-theme=dark] .menu-item[data-v-f0261ba5]:hover{background:#47556940}.menu-item.active[data-v-f0261ba5]{background:#94a3b826}[data-theme=dark] .menu-item.active[data-v-f0261ba5]{background:linear-gradient(90deg,#94a3b833 0%,#94a3b826 100%);border:1px solid #94a3b840;box-shadow:0 0 0 1px #94a3b81a}.menu-item.active[data-v-f0261ba5]:before{content:"";background:var(--border-secondary);border-radius:0 2px 2px 0;width:3px;height:60%;position:absolute;top:50%;left:0;transform:translateY(-50%)}[data-theme=dark] .menu-item.active[data-v-f0261ba5]:before{background:linear-gradient(#94a3b8e6 0%,#94a3b8b3 50%,#94a3b880 100%);box-shadow:0 0 8px #94a3b84d}.menu-icon[data-v-f0261ba5]{color:var(--text-tertiary);flex-shrink:0;transition:all .25s}.menu-item:hover .menu-icon[data-v-f0261ba5]{color:var(--text-primary);transform:scale(1.1)}.menu-item.active .menu-icon[data-v-f0261ba5]{color:var(--text-primary)}[data-theme=dark] .menu-item.active .menu-icon[data-v-f0261ba5]{color:#94a3b8e6}.menu-label[data-v-f0261ba5]{color:var(--text-primary);flex:1;font-size:14px;font-weight:500;transition:all .2s}.menu-item.active .menu-label[data-v-f0261ba5]{color:var(--text-primary);font-weight:600}[data-theme=dark] .menu-item.active .menu-label[data-v-f0261ba5]{color:#94a3b8f2;font-weight:600}.settings-content[data-v-f0261ba5]{background:var(--bg-primary);flex:1;overflow-y:auto}.settings-panel[data-v-f0261ba5]{flex-direction:column;height:100%;display:flex}.panel-header[data-v-f0261ba5]{border-bottom:1px solid var(--border-primary);padding:28px 32px}[data-theme=dark] .panel-header[data-v-f0261ba5]{border-bottom:1px solid #94a3b81a}.panel-title-row[data-v-f0261ba5]{align-items:flex-start;gap:16px;display:flex}.panel-title[data-v-f0261ba5]{color:var(--text-primary);margin:0;font-size:20px;font-weight:700}.panel-subtitle[data-v-f0261ba5]{margin-top:6px;font-size:13px;display:block}.panel-body[data-v-f0261ba5]{flex:1;padding:28px;overflow-y:auto}.setting-group[data-v-f0261ba5]{flex-direction:column;gap:24px;display:flex}.setting-item[data-v-f0261ba5]{flex-direction:column;gap:12px;display:flex}.setting-label[data-v-f0261ba5]{flex-direction:column;display:flex}.panel-footer[data-v-f0261ba5]{border-top:1px solid var(--border-primary);background:var(--bg-secondary);padding:20px 32px}[data-theme=dark] .panel-footer[data-v-f0261ba5]{background:#0f172a80;border-top:1px solid #94a3b81a}[data-v-f0261ba5] .n-select{width:100%}[data-v-f0261ba5] .n-drawer-body-content-wrapper{padding:0!important}[data-v-f0261ba5] .n-drawer-header{display:none!important}[data-v-f0261ba5] .n-drawer-body{padding:0!important}[data-v-f0261ba5] .n-drawer-content{flex-direction:column;height:100%;display:flex}[data-v-f0261ba5] .n-drawer-content__body{flex:1;overflow:hidden;padding:0!important}.visibility-options[data-v-f0261ba5]{flex-direction:column;gap:16px;margin-top:16px;display:flex}.visibility-item[data-v-f0261ba5]{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:10px;justify-content:space-between;align-items:center;padding:16px;transition:all .2s;display:flex}[data-theme=dark] .visibility-item[data-v-f0261ba5]{background:#1e293b66;border:1px solid #94a3b826}.visibility-item[data-v-f0261ba5]:hover{border-color:var(--border-secondary);box-shadow:0 2px 8px #94a3b81a}.visibility-info[data-v-f0261ba5]{flex-direction:column;flex:1;gap:4px;margin-right:16px;display:flex}.simple-theme-options[data-v-f0261ba5]{flex-direction:column;gap:12px;margin-top:16px;display:flex}.simple-theme-item[data-v-f0261ba5]{background:var(--bg-secondary);border:1px solid var(--border-primary);cursor:pointer;border-radius:10px;align-items:center;gap:12px;padding:16px;transition:all .2s;display:flex}[data-theme=dark] .simple-theme-item[data-v-f0261ba5]{background:#1e293b66;border:1px solid #94a3b826}.simple-theme-item[data-v-f0261ba5]:hover{border-color:var(--border-secondary);box-shadow:0 2px 8px #94a3b81a}.simple-theme-item.active[data-v-f0261ba5]{border-color:var(--border-secondary);background:#94a3b814}[data-theme=dark] .simple-theme-item.active[data-v-f0261ba5]{background:#94a3b826;border-color:#94a3b866}.simple-theme-item .theme-icon[data-v-f0261ba5]{color:var(--text-secondary);flex-shrink:0;transition:all .2s}.simple-theme-item:hover .theme-icon[data-v-f0261ba5]{color:var(--text-primary);transform:scale(1.1)}.simple-theme-item.active .theme-icon[data-v-f0261ba5]{color:var(--text-primary)}[data-theme=dark] .simple-theme-item.active .theme-icon[data-v-f0261ba5]{color:#94a3b8e6}.theme-text[data-v-f0261ba5]{flex-direction:column;flex:1;gap:2px;display:flex}.theme-check[data-v-f0261ba5]{flex-shrink:0;justify-content:center;align-items:center;display:flex}.ports-grid[data-v-f0261ba5]{flex-direction:column;gap:16px;margin-top:16px;display:flex}.port-field[data-v-f0261ba5]{flex-direction:column;display:flex}.port-field[data-v-f0261ba5] .n-input-number{width:100%}.port-field[data-v-f0261ba5] .n-input-number .n-input__input{font-family:monospace;font-size:13px}.home-cli-settings[data-v-f0261ba5]{flex-direction:column;gap:12px;margin-top:16px;display:flex}.platform-catalog-list[data-v-f0261ba5]{flex-direction:column;gap:8px;display:flex}.platform-catalog-item[data-v-f0261ba5]{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;display:flex}.platform-order-actions[data-v-f0261ba5]{gap:2px;display:flex}.home-cli-actions[data-v-f0261ba5]{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.option-field[data-v-f0261ba5]:hover{border-color:var(--border-secondary);box-shadow:0 2px 8px #94a3b81a}.option-label[data-v-f0261ba5]{flex-direction:column;flex:1;gap:4px;margin-right:16px;display:flex}.notification-options[data-v-f0261ba5]{flex-direction:column;gap:16px;margin-top:16px;display:flex}.notification-type-section[data-v-f0261ba5]{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:10px;margin-top:8px;padding:16px}[data-theme=dark] .notification-type-section[data-v-f0261ba5]{background:#1e293b66;border:1px solid #94a3b826}.radio-content[data-v-f0261ba5]{flex-direction:column;gap:2px;padding:4px 0;display:flex}.remote-provider-toolbar[data-v-f0261ba5]{grid-template-columns:minmax(180px,220px) auto 1fr;align-items:center;gap:10px;display:grid}.remote-provider-card[data-v-f0261ba5]{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:8px;padding:14px;transition:border-color .18s,box-shadow .18s}.remote-provider-card[data-v-f0261ba5]:hover{border-color:var(--border-secondary);box-shadow:0 2px 8px #94a3b81a}[data-theme=dark] .remote-provider-card[data-v-f0261ba5]{background:#1e293b66;border-color:#94a3b826}.remote-provider-header[data-v-f0261ba5]{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:14px;display:flex}.remote-provider-title-row[data-v-f0261ba5]{align-items:flex-start;gap:10px;min-width:0;display:flex}.remote-provider-avatar[data-v-f0261ba5]{width:30px;height:30px;color:var(--text-secondary);background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:8px;flex:0 0 30px;justify-content:center;align-items:center;font-size:13px;font-weight:700;display:flex}[data-theme=dark] .remote-provider-avatar[data-v-f0261ba5]{background:#0f172a8c;border-color:#94a3b829}.remote-provider-title[data-v-f0261ba5]{min-width:0}.remote-provider-name-row[data-v-f0261ba5]{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:3px;display:flex}.remote-provider-fields[data-v-f0261ba5]{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.remote-field[data-v-f0261ba5]{flex-direction:column;gap:5px;min-width:0;display:flex}.remote-field-wide[data-v-f0261ba5],.remote-fields-descriptor[data-v-f0261ba5]{grid-column:1/-1}.remote-field-label[data-v-f0261ba5]{color:var(--text-tertiary);font-size:11px;font-weight:600;line-height:1.2}.remote-provider-actions[data-v-f0261ba5]{border-top:1px solid var(--border-primary);justify-content:space-between;align-items:center;gap:12px;margin-top:12px;padding-top:12px;display:flex}[data-theme=dark] .remote-provider-actions[data-v-f0261ba5]{border-top-color:#94a3b81f}@media (width<=768px){.remote-provider-toolbar[data-v-f0261ba5]{grid-template-columns:1fr}.remote-provider-header[data-v-f0261ba5],.remote-provider-actions[data-v-f0261ba5]{flex-direction:column;align-items:stretch}.remote-provider-fields[data-v-f0261ba5]{grid-template-columns:1fr}}.security-status[data-v-f0261ba5]{align-items:center;gap:8px;display:flex}.security-form[data-v-f0261ba5]{flex-direction:column;gap:12px;max-width:360px;display:flex}.security-error[data-v-f0261ba5]{color:#d03050;font-size:12px}.command-config-card[data-v-f0261ba5]{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:10px;margin-bottom:16px;padding:16px;transition:all .2s}.command-config-card[data-v-f0261ba5]:last-child{margin-bottom:0}.command-config-card[data-v-f0261ba5]:hover{border-color:var(--border-secondary);box-shadow:0 2px 8px #94a3b81a}[data-theme=dark] .command-config-card[data-v-f0261ba5]{background:#1e293b66;border:1px solid #94a3b826}[data-theme=dark] .command-config-card[data-v-f0261ba5]:hover{border-color:#94a3b84d;box-shadow:0 2px 8px #94a3b81a}.command-card-header[data-v-f0261ba5]{border-bottom:1px solid var(--border-primary);align-items:center;gap:10px;margin-bottom:16px;padding-bottom:12px;display:flex}[data-theme=dark] .command-card-header[data-v-f0261ba5]{border-bottom:1px solid #94a3b81a}.command-fields[data-v-f0261ba5]{flex-direction:column;gap:12px;display:flex}.command-field[data-v-f0261ba5]{flex-direction:column;display:flex}.command-field[data-v-f0261ba5] .n-input{font-family:SF Mono,Monaco,Cascadia Code,monospace}.command-field[data-v-f0261ba5] .n-input .n-input__input-el{font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:13px}.model-meta-editor[data-v-f0261ba5]{padding:4px 2px 8px}.model-meta-section[data-v-f0261ba5]{background:var(--bg-secondary,#00000008);border-radius:8px;padding:10px 12px}.speed-test-defaults[data-v-f0261ba5]{flex-direction:column;gap:10px;display:flex}.speed-test-default-row[data-v-f0261ba5]{grid-template-columns:132px 1fr;align-items:center;gap:10px;display:grid}.speed-test-default-label[data-v-f0261ba5]{min-width:0}.model-toolbar[data-v-f0261ba5]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.model-filter-row[data-v-f0261ba5]{margin-bottom:12px}.model-list[data-v-f0261ba5]{flex-direction:column;gap:2px;display:flex}.model-card[data-v-f0261ba5]{border:1px solid var(--border-primary);border-radius:8px;transition:border-color .2s;overflow:hidden}.model-card[data-v-f0261ba5]:hover{border-color:var(--border-hover,#63b3ed66)}.model-card.expanded[data-v-f0261ba5]{border-color:var(--primary-color,#63b3ed)}.model-card-header[data-v-f0261ba5]{cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--bg-secondary,#00000005);align-items:center;gap:8px;padding:8px 12px;transition:background .15s;display:flex}.model-card-header[data-v-f0261ba5]:hover{background:var(--bg-hover,#0000000a)}.expand-icon[data-v-f0261ba5]{color:var(--text-tertiary);flex-shrink:0;transition:transform .2s}.model-card.expanded .expand-icon[data-v-f0261ba5]{transform:rotate(90deg)}.model-card-id[data-v-f0261ba5]{color:var(--text-primary);flex:1;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:12px}.model-card-actions[data-v-f0261ba5]{gap:4px;margin-left:auto;display:flex}.model-card-body[data-v-f0261ba5]{border-top:1px solid var(--border-primary);background:var(--bg-primary)}[data-theme=dark] .model-card[data-v-f0261ba5]{border-color:#94a3b826}[data-theme=dark] .model-card[data-v-f0261ba5]:hover{border-color:#63b3ed4d}[data-theme=dark] .model-card.expanded[data-v-f0261ba5]{border-color:#63b3ed80}[data-theme=dark] .model-card-header[data-v-f0261ba5]{background:#1e293b66}[data-theme=dark] .model-card-header[data-v-f0261ba5]:hover{background:#1e293b99}[data-theme=dark] .model-card-body[data-v-f0261ba5]{border-color:#94a3b826}@media (width<=768px){.speed-test-default-row[data-v-f0261ba5]{grid-template-columns:1fr;gap:6px}}
|