coding-tool-x 3.9.9-261027 → 3.9.9-261105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/web/assets/AgentsDrawer-DWnAsTH_.js +1 -0
  3. package/dist/web/assets/Analytics-D_WWRO5h.js +1 -0
  4. package/dist/web/assets/AssetPathField-CoIuoSZr.js +1 -0
  5. package/dist/web/assets/ChatHistoryDrawer-B_OnCpxR.js +1 -0
  6. package/dist/web/assets/CollapseItem-DEV7PQ-o.js +1 -0
  7. package/dist/web/assets/CommandsDrawer-gG61nb7a.js +1 -0
  8. package/dist/web/assets/ConfigExportDrawer-BkSzLSuZ.js +1 -0
  9. package/dist/web/assets/ConfigTemplates-DvEDpIso.js +1 -0
  10. package/dist/web/assets/ConfigTemplatesDrawer-DMPO4gjt.js +1 -0
  11. package/dist/web/assets/ConfigTemplatesPanel-BQe31_bq.js +1 -0
  12. package/dist/web/assets/Divider-CEqaZMTW.js +1 -0
  13. package/dist/web/assets/DrawerContent-BYlV968f.js +1 -0
  14. package/dist/web/assets/FavoritesDrawer-Y-MmIIE9.js +1 -0
  15. package/dist/web/assets/{Forward-DLCL7aMY.js → Forward-kgMPT2RI.js} +1 -1
  16. package/dist/web/assets/GatewayConvertDrawer-BvYhzJD6.js +1 -0
  17. package/dist/web/assets/Home-BOwk4kTa.js +1 -0
  18. package/dist/web/assets/MarkdownEditor-Bf9QKKaV.js +1 -0
  19. package/dist/web/assets/McpDrawer-B7cwI24B.js +1 -0
  20. package/dist/web/assets/McpFormDrawer-Djt5CJyE.js +1 -0
  21. package/dist/web/assets/PluginManager-B4J_hR0V.js +1 -0
  22. package/dist/web/assets/PluginsDrawer-Ch4x66-E.js +1 -0
  23. package/dist/web/assets/PluginsPanel-mqXBlKZg.js +1 -0
  24. package/dist/web/assets/ProjectList-DtmQyoPc.css +1 -0
  25. package/dist/web/assets/ProjectList-xToRgLVw.js +1 -0
  26. package/dist/web/assets/PromptsDrawer-VYrlk-F6.js +1 -0
  27. package/dist/web/assets/RecentSessionsDrawer-DCsgGSBu.js +1 -0
  28. package/dist/web/assets/SessionCard-C9n9lC_Y.css +1 -0
  29. package/dist/web/assets/SessionCard-DwzxeSe9.js +1 -0
  30. package/dist/web/assets/{SessionList-qG_XpPBJ.css → SessionList-CCuKp6ib.css} +1 -1
  31. package/dist/web/assets/SessionList-GqzUHgOu.js +1 -0
  32. package/dist/web/assets/SettingsDrawer-Q_aTOBhf.js +1 -0
  33. package/dist/web/assets/SkillManager-B1B58WKe.js +1 -0
  34. package/dist/web/assets/SkillsDrawer-Ch1b1hLn.js +1 -0
  35. package/dist/web/assets/SkillsPanel-B_xxyDpy.js +1 -0
  36. package/dist/web/assets/{Upload-xqorL26i.js → Upload-B6Kn1TvG.js} +1 -1
  37. package/dist/web/assets/WorkspaceDrawer-C3w-Z87U.js +1 -0
  38. package/dist/web/assets/WorkspaceManager-BFzjeEWh.js +1 -0
  39. package/dist/web/assets/WorkspacePanel-DkrwFSLs.js +1 -0
  40. package/dist/web/assets/_plugin-vue_export-helper-DyHLuIR4.js +1 -0
  41. package/dist/web/assets/{client-oU6RT-6I.js → client-B31QOzWk.js} +1 -1
  42. package/dist/web/assets/{dsh-agent-presets-DjJRVMT6.js → dsh-agent-presets-DopJnuAZ.js} +1 -1
  43. package/dist/web/assets/headers-nTUGmJee.js +1 -0
  44. package/dist/web/assets/{icons-B-AzZoeE.js → icons-C6KNTFqo.js} +1 -1
  45. package/dist/web/assets/index-BXWpib7P.js +2 -0
  46. package/dist/web/assets/{index-DjIuAtaS.css → index-CvL_fRpL.css} +1 -1
  47. package/dist/web/assets/light-DeIjG9s_.js +1 -0
  48. package/dist/web/assets/markdown-xLK9ekFg.js +1 -0
  49. package/dist/web/assets/platforms-BdTllxKt.js +1 -0
  50. package/dist/web/assets/{platforms-p9AiybLU.js → platforms-CDltfh5G.js} +1 -1
  51. package/dist/web/assets/{project-config-CzFKBw_m.js → project-config-C16yaWHF.js} +1 -1
  52. package/dist/web/assets/rolldown-runtime-DcNxTHDL.js +1 -0
  53. package/dist/web/assets/sessions-B4RD8wDx.js +1 -0
  54. package/dist/web/assets/{sessions-DJiJJgvg.js → sessions-Xl0HAvhA.js} +1 -1
  55. package/dist/web/assets/use-lock-html-scroll-Bu94jdUB.js +1 -0
  56. package/dist/web/assets/use-message-BYx0IRj1.js +1 -0
  57. package/dist/web/assets/useResponsiveDrawer-Deh7Xdcj.js +1 -0
  58. package/dist/web/assets/vendors-CvGw6U_t.js +1 -0
  59. package/dist/web/assets/vue-vendor-Cr_NLmXY.js +1 -0
  60. package/dist/web/assets/{workspaces-D2yLnT-B.js → workspaces-Y7hS24p2.js} +1 -1
  61. package/dist/web/assets/xml-B78loRzO.js +1 -0
  62. package/dist/web/index.html +13 -12
  63. package/package.json +3 -3
  64. package/src/config/model-metadata.json +30 -4
  65. package/src/platforms/drivers/dsh/api-operations.js +1 -1
  66. package/src/platforms/drivers/dsh/channels-implementation.js +10 -0
  67. package/src/platforms/drivers/dsh/channels.js +10 -0
  68. package/src/platforms/drivers/dsh/proxy-implementation.js +7 -1
  69. package/src/platforms/drivers/dsh/sessions.js +5 -1
  70. package/src/platforms/manifest-schema.js +1 -1
  71. package/src/platforms/manifests/dsh.json +8 -0
  72. package/src/server/services/model-detector.js +22 -3
  73. package/dist/web/assets/AgentsDrawer-CKEf8ie1.js +0 -1
  74. package/dist/web/assets/Analytics-0BCMxQ-o.js +0 -1
  75. package/dist/web/assets/AssetPathField-pfN6L814.js +0 -1
  76. package/dist/web/assets/ChatHistoryDrawer-nuUPRqje.js +0 -1
  77. package/dist/web/assets/CollapseItem-B2SdqQp2.js +0 -1
  78. package/dist/web/assets/CommandsDrawer-D8m0qLzQ.js +0 -1
  79. package/dist/web/assets/ConfigExportDrawer-BlCBLdue.js +0 -1
  80. package/dist/web/assets/ConfigTemplates-CePBARK8.js +0 -1
  81. package/dist/web/assets/ConfigTemplatesDrawer-DbVY4rD1.js +0 -1
  82. package/dist/web/assets/ConfigTemplatesPanel-CwYPLEFV.js +0 -1
  83. package/dist/web/assets/Divider-BLLhMTSt.js +0 -1
  84. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +0 -1
  85. package/dist/web/assets/FavoritesDrawer-BKAKQNqP.js +0 -1
  86. package/dist/web/assets/GatewayConvertDrawer-D2MFXcqS.js +0 -1
  87. package/dist/web/assets/Home-BmElvXVZ.js +0 -1
  88. package/dist/web/assets/MarkdownEditor-buNC2iDj.js +0 -1
  89. package/dist/web/assets/McpDrawer-NBjAyFU5.js +0 -1
  90. package/dist/web/assets/McpFormDrawer-BUnW9j4A.js +0 -1
  91. package/dist/web/assets/PluginManager-BgHpsF5S.js +0 -1
  92. package/dist/web/assets/PluginsDrawer-CFnmqzV0.js +0 -1
  93. package/dist/web/assets/PluginsPanel-ClSdnSCu.js +0 -1
  94. package/dist/web/assets/ProjectList-CjlHEyU1.js +0 -1
  95. package/dist/web/assets/ProjectList-VbIYSHbH.css +0 -1
  96. package/dist/web/assets/PromptsDrawer-xeSGgpCd.js +0 -1
  97. package/dist/web/assets/RecentSessionsDrawer-DELB6-rU.js +0 -1
  98. package/dist/web/assets/SessionCard-BaH42eOe.js +0 -1
  99. package/dist/web/assets/SessionCard-aM2NHu6i.css +0 -1
  100. package/dist/web/assets/SessionList-BGB9GwYE.js +0 -1
  101. package/dist/web/assets/SettingsDrawer-DdYC8GIa.js +0 -1
  102. package/dist/web/assets/SkillManager-CF7EiSps.js +0 -1
  103. package/dist/web/assets/SkillsDrawer-Bc5zA1bk.js +0 -1
  104. package/dist/web/assets/SkillsPanel-SnzwzqW5.js +0 -1
  105. package/dist/web/assets/WorkspaceDrawer-DBiEnZ7j.js +0 -1
  106. package/dist/web/assets/WorkspaceManager-C1dNfoAy.js +0 -1
  107. package/dist/web/assets/WorkspacePanel-CWNQZjm1.js +0 -1
  108. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +0 -1
  109. package/dist/web/assets/headers-DbowkmZJ.js +0 -1
  110. package/dist/web/assets/index-BKpL4XdU.js +0 -2
  111. package/dist/web/assets/light-C2X7hegj.js +0 -1
  112. package/dist/web/assets/markdown-u082bbtj.js +0 -1
  113. package/dist/web/assets/platforms-Cq6XDXfy.js +0 -1
  114. package/dist/web/assets/sessions-DSLpMXCq.js +0 -1
  115. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +0 -1
  116. package/dist/web/assets/use-message-DBsCm7FJ.js +0 -1
  117. package/dist/web/assets/useResponsiveDrawer-CTQPBATk.js +0 -1
  118. package/dist/web/assets/vendors-D0c_0KLP.js +0 -1
  119. package/dist/web/assets/vue-vendor-BqZbbXHA.js +0 -1
  120. package/dist/web/assets/xml-CgY3RMlX.js +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "source": "models.dev",
3
3
  "sourceUrl": "https://models.dev/api.json",
4
- "lastUpdated": "2026-10-27",
4
+ "lastUpdated": "2026-10-30",
5
5
  "defaultModels": {
6
6
  "claude": [
7
7
  "claude-opus-4-7",
@@ -152,6 +152,7 @@
152
152
  "mistral-large-2411": "mistral/mistral-large-2411",
153
153
  "mistral-large-2512": "mistral/mistral-large-2512",
154
154
  "mistral-large-4": "mistral/mistral-large-4",
155
+ "mistral-large-4-0-8": "mistral/mistral-large-4-0-8",
155
156
  "mistral-large-latest": "mistral/mistral-large-latest",
156
157
  "mistral-medium-2505": "mistral/mistral-medium-2505",
157
158
  "mistral-medium-2508": "mistral/mistral-medium-2508",
@@ -3548,9 +3549,9 @@
3548
3549
  },
3549
3550
  "name": "Mistral Large 4",
3550
3551
  "pricing": {
3551
- "cacheRead": 0.14,
3552
- "input": 1.36,
3553
- "output": 4.18
3552
+ "cacheRead": 0.07,
3553
+ "input": 0.7,
3554
+ "output": 2.1
3554
3555
  },
3555
3556
  "provider": "mistral",
3556
3557
  "reasoning": true,
@@ -3561,6 +3562,31 @@
3561
3562
  "omp"
3562
3563
  ]
3563
3564
  },
3565
+ "mistral/mistral-large-4-0-8": {
3566
+ "id": "mistral/mistral-large-4-0-8",
3567
+ "input": [
3568
+ "text",
3569
+ "image"
3570
+ ],
3571
+ "limit": {
3572
+ "context": 1048576,
3573
+ "output": 262144
3574
+ },
3575
+ "name": "Mistral Large 4.0.8",
3576
+ "pricing": {
3577
+ "cacheRead": 0.07,
3578
+ "input": 0.7,
3579
+ "output": 2.1
3580
+ },
3581
+ "provider": "mistral",
3582
+ "reasoning": true,
3583
+ "sourceId": "mistral/mistral-large-4-0-8",
3584
+ "supportsTools": true,
3585
+ "toolTypes": [
3586
+ "opencode",
3587
+ "omp"
3588
+ ]
3589
+ },
3564
3590
  "mistral/mistral-large-latest": {
3565
3591
  "id": "mistral/mistral-large-latest",
3566
3592
  "input": [
@@ -222,7 +222,7 @@ function createDriver(context = {}) {
222
222
 
223
223
  // Keep the aggregate DSH API driver compatible with the manifest consistency
224
224
  // contract. Actual descriptor requests are still dispatched by capability.
225
- for (const operation of ['list', 'current', 'enabled', 'poolStatus', 'create', 'update', 'remove', 'applyToSettings', 'sync', 'order', 'models', 'probeModels', 'speedTest']) {
225
+ for (const operation of ['list', 'current', 'enabled', 'poolStatus', 'create', 'update', 'remove', 'applyToSettings', 'sync', 'order', 'models', 'modelsFromConfig', 'probeModels', 'speedTest']) {
226
226
  driver[operation] = (...args) => channels[operation](...args);
227
227
  }
228
228
  for (const operation of ['status', 'start', 'stop']) {
@@ -254,6 +254,16 @@ class DshChannelService extends BaseChannelService {
254
254
  if (!SUPPORTED_PROVIDER_APIS.has(channel.providerApi)) {
255
255
  throw new Error(`Unsupported DSH provider api: ${channel.providerApi}`);
256
256
  }
257
+ const previous = _allChannels.find(item => item.id === channel.id);
258
+ const enablingUnsupported = channel.enabled !== false
259
+ && channel.providerApi !== 'openai-completions'
260
+ && (!previous || previous.enabled === false || previous.providerApi !== channel.providerApi);
261
+ if (isProxyModeEnabled() && enablingUnsupported) {
262
+ const error = new Error('DSH 动态代理仅支持 OpenAI Chat Completions;请先停止代理或禁用该渠道');
263
+ error.statusCode = 409;
264
+ error.code = 'dsh_proxy_provider_api_unsupported';
265
+ throw error;
266
+ }
257
267
  if (!channel.model || !channel.models.length) {
258
268
  throw new Error('DSH channel requires at least one model');
259
269
  }
@@ -118,6 +118,16 @@ function createDriver(context = {}) {
118
118
  forceRefresh: request?.query?.forceRefresh === 'true' || request?.query?.force === '1'
119
119
  });
120
120
  }),
121
+ modelsFromConfig: request => withAsyncResult(request, 'modelsFromConfig', async () => {
122
+ const { fetchModelsFromProvider } = require('../../../server/services/model-detector');
123
+ const channel = bodyOf(request);
124
+ if (!String(channel.baseUrl || '').trim()) {
125
+ throw Object.assign(new Error('DSH channel baseUrl is required'), { statusCode: 400 });
126
+ }
127
+ return fetchModelsFromProvider(channel, channelTypeForSpeed(channel), {
128
+ forceRefresh: channel.forceRefresh === true || channel.force === true
129
+ });
130
+ }),
121
131
  probeModels: request => withAsyncResult(request, 'probeModels', async () => {
122
132
  const { probeModelAvailability } = require('../../../server/services/model-detector');
123
133
  const input = bodyOf(request);
@@ -63,7 +63,13 @@ async function startDshProxyServer(options = {}) {
63
63
  return { success: true, port: currentPort, provider: 'ctx-dsh-proxy', activeChannel };
64
64
  }
65
65
 
66
- if (openAiChannels().length === 0) {
66
+ const enabledChannels = getEnabledChannels();
67
+ const incompatibleChannels = enabledChannels.filter(channel => channel.providerApi !== 'openai-completions');
68
+ if (incompatibleChannels.length > 0) {
69
+ const names = incompatibleChannels.map(channel => channel.name || channel.providerKey).join(', ');
70
+ throw new Error(`DSH 动态代理仅支持 OpenAI Chat Completions;请先禁用不兼容渠道:${names}`);
71
+ }
72
+ if (enabledChannels.length === 0) {
67
73
  throw new Error('DSH 动态代理当前只支持 openai-completions;请先添加并启用至少一个兼容渠道');
68
74
  }
69
75
 
@@ -442,7 +442,11 @@ function createDriver(context = {}) {
442
442
  return {
443
443
  sessions,
444
444
  totalSize: all.reduce((sum, session) => sum + (Number(session.size) || 0), 0),
445
- projectInfo: { sessionCount: all.length, totalSize: all.reduce((sum, session) => sum + (Number(session.size) || 0), 0) },
445
+ projectInfo: {
446
+ sessionCount: all.length,
447
+ totalSize: all.reduce((sum, session) => sum + (Number(session.size) || 0), 0),
448
+ readOnly: true
449
+ },
446
450
  pagination: { page, limit, total: all.length, hasMore: page * limit < all.length }
447
451
  };
448
452
  };
@@ -115,7 +115,7 @@ const CAPABILITY_OPERATIONS = Object.freeze({
115
115
  'updateSkill',
116
116
  'deleteSkill'
117
117
  ]),
118
- channels: new Set(['applyToSettings', 'bestForRestore', 'catalogMetadata', 'create', 'current', 'enabled', 'getAuth', 'getAuthQuota', 'list', 'models', 'order', 'poolStatus', 'probeModels', 'remove', 'resetHealth', 'speedTest', 'sync', 'syncLocalAuth', 'update']),
118
+ channels: new Set(['applyToSettings', 'bestForRestore', 'catalogMetadata', 'create', 'current', 'enabled', 'getAuth', 'getAuthQuota', 'list', 'models', 'modelsFromConfig', 'order', 'poolStatus', 'probeModels', 'remove', 'resetHealth', 'speedTest', 'sync', 'syncLocalAuth', 'update']),
119
119
  health: new Set(['healthCheck']),
120
120
  hooks: new Set(['getHooks', 'saveHooks', 'testHooks']),
121
121
  projects: new Set(['createProject', 'deleteProject', 'listProjects', 'saveProjectOrder']),
@@ -259,6 +259,14 @@
259
259
  "request": "default",
260
260
  "response": "default"
261
261
  },
262
+ {
263
+ "method": "POST",
264
+ "path": "/channels/models",
265
+ "capability": "channels",
266
+ "operation": "modelsFromConfig",
267
+ "request": "default",
268
+ "response": "default"
269
+ },
262
270
  {
263
271
  "method": "POST",
264
272
  "path": "/channels/:channelId/speed-test",
@@ -161,6 +161,18 @@ const PROVIDER_CAPABILITIES = {
161
161
  }
162
162
  };
163
163
 
164
+ function getProviderCapability(channelType, channel) {
165
+ if (channelType === 'claude' && channel?.providerApi === 'anthropic-messages') {
166
+ return {
167
+ supportsModelList: true,
168
+ modelListEndpoint: '/v1/models',
169
+ authHeader: 'x-api-key',
170
+ anthropicVersion: '2023-06-01'
171
+ };
172
+ }
173
+ return PROVIDER_CAPABILITIES[channelType];
174
+ }
175
+
164
176
  /**
165
177
  * Auto-detect channel type based on baseUrl
166
178
  * @param {Object} channel - Channel configuration
@@ -325,6 +337,9 @@ function buildRequestHeaders(channelType, channel) {
325
337
  if (channelType === 'codex' || channelType === 'openai_compatible') {
326
338
  headers['OpenAI-Beta'] = 'assistants=v2';
327
339
  }
340
+ if (channelType === 'claude' && channel?.providerApi === 'anthropic-messages') {
341
+ headers['anthropic-version'] = '2023-06-01';
342
+ }
328
343
 
329
344
  return headers;
330
345
  }
@@ -693,6 +708,7 @@ function buildChannelCacheSignature(channel, payload = {}) {
693
708
  name: channel?.name || '',
694
709
  baseUrl: channel?.baseUrl || '',
695
710
  apiKey: channel?.apiKey || '',
711
+ providerApi: channel?.providerApi || '',
696
712
  gatewaySourceType: channel?.gatewaySourceType || '',
697
713
  wireApi: channel?.wireApi || '',
698
714
  model: channel?.model || '',
@@ -1011,7 +1027,7 @@ async function fetchModelsFromProvider(channel, channelType, options = {}) {
1011
1027
  }
1012
1028
 
1013
1029
  // Check if provider supports model listing
1014
- const capability = PROVIDER_CAPABILITIES[channelType];
1030
+ const capability = getProviderCapability(channelType, channel);
1015
1031
  if (!capability || !capability.supportsModelList) {
1016
1032
  return {
1017
1033
  models: [],
@@ -1050,8 +1066,11 @@ async function fetchModelsFromProvider(channel, channelType, options = {}) {
1050
1066
  const headers = buildRequestHeaders(channelType, channel);
1051
1067
 
1052
1068
  // Add authentication header
1053
- if (capability.authHeader) {
1054
- if (channel.apiKey) {
1069
+ if (capability.authHeader && channel.apiKey) {
1070
+ if (capability.authHeader.toLowerCase() === 'x-api-key') {
1071
+ headers[capability.authHeader] = channel.apiKey;
1072
+ if (capability.anthropicVersion) headers['anthropic-version'] = capability.anthropicVersion;
1073
+ } else {
1055
1074
  headers['Authorization'] = `Bearer ${channel.apiKey}`;
1056
1075
  }
1057
1076
  }
@@ -1 +0,0 @@
1
- import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as t,K as n,O as i,S as o,V as u,W as d,Y as r,Z as c,_t as v,b as p,et as m,g,ht as f,m as y,mt as h,r as b,st as k,w,x as _}from"./vue-vendor-BqZbbXHA.js";import{t as C}from"./client-oU6RT-6I.js";import{c as j,i as x,t as M}from"./platforms-Cq6XDXfy.js";import{$ as z,At as P,Nt as O,O as U,R as A,S as N,V as L,_ as I,f as S,g as $,j as F,m as D}from"./icons-B-AzZoeE.js";import{t as R}from"./use-message-DBsCm7FJ.js";import{l as B}from"./light-C2X7hegj.js";import{a as q,c as E,i as T,o as H,r as J,s as V,t as G}from"./AssetPathField-pfN6L814.js";import{n as Y,t as W}from"./useResponsiveDrawer-CTQPBATk.js";import{t as X}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Z,Et as K,I as Q,L as ee,M as ae,P as le,T as se,X as te,Y as ne,Z as ie,ct as oe,ft as ue,j as de,k as re,st as ce,ut as ve,w as pe}from"./index-BKpL4XdU.js";import{t as me}from"./MarkdownEditor-buNC2iDj.js";import{i as ge,n as fe,r as ye,t as he}from"./dsh-agent-presets-DjJRVMT6.js";async function be(e=null,a="claude",l={}){const s=pe("agents",a,l.scope||"",e||"");return se(s,l=>C.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a},signal:l}).then(e=>e.data),"agents",`agents:${a}`)}var ke={class:"asset-card-main"},we={class:"asset-card-top"},_e={class:"asset-card-title-stack"},Ce={class:"asset-card-title-row"},je={class:"asset-name"},xe={class:"asset-tags"},Me={key:0,class:"asset-description"},ze={class:"asset-meta"},Pe={key:0,class:"asset-meta-item"},Oe={key:1,class:"asset-meta-item"},Ue={class:"asset-card-actions"},Ae={class:"asset-platform-strip"},Ne=["onClick"],Le=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 c=l,b=u,{byCapability:k}=K(),C=p(()=>k("agents"));return(u,p)=>{return d(),w("div",{class:f(["agent-card asset-card",{"is-project":"project"===l.agent.scope,"is-managed":l.registryInfo}]),onClick:p[4]||(p[4]=e=>b("click",l.agent))},[_("div",ke,[_("div",we,[_("div",_e,[_("div",Ce,[_("span",{class:f(["asset-status-dot",{active:l.registryInfo?.enabled||"project"===l.agent.scope}])},null,2),_("span",je,v(l.agent.name),1)]),_("div",xe,[i(h(ve),{type:"user"===l.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:m(()=>[t(v("user"===l.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),l.registryInfo?(d(),o(h(ve),{key:0,type:"success",size:"tiny",bordered:!1},{default:m(()=>[...p[5]||(p[5]=[t("托管",-1)])]),_:1})):s("",!0),l.agent.model?(d(),o(h(ve),{key:1,type:"warning",size:"tiny",bordered:!1},{default:m(()=>[t(v(l.agent.model),1)]),_:1})):s("",!0)])])]),l.agent.description?(d(),w("div",Me,v((j=l.agent.description,j?j.length>80?j.slice(0,80)+"...":j:"")),1)):s("",!0),_("div",ze,[l.agent.tools?(d(),w("span",Pe,[i(h(e),{size:"12"},{default:m(()=>[i(h(L))]),_:1}),t(" "+v((k=l.agent.tools,k?k.length>30?k.slice(0,30)+"...":k:"")),1)])):s("",!0),l.agent.permissionMode?(d(),w("span",Oe,[i(h(e),{size:"12"},{default:m(()=>[i(h(S))]),_:1}),t(" "+v(l.agent.permissionMode),1)])):s("",!0)])]),_("div",Ue,[l.registryInfo?(d(),w(g,{key:0},[i(h(ne),{trigger:"hover"},{trigger:m(()=>[i(h(de),{value:l.registryInfo.enabled,size:"small",loading:l.toggling,"onUpdate:value":p[0]||(p[0]=e=>b("toggle-enabled",l.agent,e)),onClick:p[1]||(p[1]=y(()=>{},["stop"]))},null,8,["value","loading"])]),default:m(()=>[t(" "+v(l.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),_("div",Ae,[(d(!0),w(g,null,n(C.value,a=>(d(),o(h(ne),{key:a.key,trigger:"hover"},{trigger:m(()=>[_("span",{class:f(["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:m(()=>[(d(),o(r(a.icon)))]),_:2},1024)],10,Ne)]),default:m(()=>[t(" "+v(a.label||a.title||a.key)+" "+v(l.registryInfo.platforms?.[a.key]?"已启用":"未启用"),1)]),_:2},1024))),128))])],64)):(d(),w(g,{key:1},[i(h(a),{size:"tiny",tertiary:"",onClick:p[2]||(p[2]=y(e=>b("edit",l.agent),["stop"]))},{default:m(()=>[...p[6]||(p[6]=[t(" 编辑 ",-1)])]),_:1}),i(h(a),{size:"tiny",tertiary:"",type:"error",loading:c.deleting,onClick:p[3]||(p[3]=y(e=>b("delete",l.agent),["stop"]))},{default:m(()=>[...p[7]||(p[7]=[t(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var k,j}}},[["__scopeId","data-v-044e4192"]]),Ie={class:"asset-detail-drawer-header"},Se={class:"asset-detail-identity"},$e={class:"asset-detail-heading"},Fe={class:"asset-detail-name"},De={class:"asset-detail-meta"},Re={key:2,class:"asset-detail-subtle"},Be={class:"asset-detail-body"},qe={key:0,class:"asset-detail-loading"},Ee={class:"asset-detail-container"},Te={class:"asset-detail-info-section"},He={class:"asset-detail-description"},Je={class:"asset-detail-info-section"},Ve={class:"asset-detail-list"},Ge={class:"asset-detail-row"},Ye={class:"asset-detail-value"},We={key:0,class:"asset-detail-row"},Xe={class:"asset-detail-value mono"},Ze={key:1,class:"asset-detail-row"},Ke={class:"asset-detail-value mono"},Qe={key:2,class:"asset-detail-row"},ea={class:"asset-detail-value"},aa={key:3,class:"asset-detail-row"},la={class:"asset-detail-value"},sa={key:4,class:"asset-detail-row"},ta={class:"asset-detail-value"},na={key:1,class:"asset-detail-info-section"},ia={class:"asset-detail-box"},oa={class:"asset-detail-code"},ua={key:2,class:"asset-detail-empty"},da={__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}=W(600),u=a,r=l,c=p({get:()=>u.visible,set:e=>r("update:visible",e)}),g={height:"100%",minHeight:0,overflow:"hidden"},f=p(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"")),y=p(()=>u.agent?.fileName?"codex"===u.platform?`[agents.${u.agent.fileName}]`:`${u.agent.fileName}.md`:""),b=p(()=>u.agent?"codex"===u.platform?u.agent.fullContent||"(无内容)":u.agent.systemPrompt||"(无内容)":"(无内容)"),k=p(()=>u.agent?.fullPath||u.agent?.path||"");function C(e){return"project"===e?"项目级":"用户级"}return(l,u)=>(d(),o(h(Y),{show:c.value,"onUpdate:show":u[0]||(u[0]=e=>c.value=e),width:h(n),placement:"right","show-mask":!0},{default:m(()=>[i(h(X),{closable:"","native-scrollbar":!1,"body-content-style":g},{header:m(()=>[_("div",Ie,[_("div",Se,[i(h(e),{size:20,class:"asset-detail-icon"},{default:m(()=>[i(h(U))]),_:1}),_("div",$e,[_("span",Fe,v(a.agent?.name||"代理详情"),1),_("div",De,[a.agent?.scope?(d(),o(h(ve),{key:0,type:"project"===a.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:m(()=>[t(v(C(a.agent.scope)),1)]),_:1},8,["type"])):s("",!0),a.agent?.model?(d(),o(h(ve),{key:1,type:"warning",size:"tiny",bordered:!1},{default:m(()=>[t(v(a.agent.model),1)]),_:1})):s("",!0),f.value?(d(),w("span",Re,v(f.value),1)):s("",!0)])])])])]),default:m(()=>[_("div",Be,[a.loading&&!a.agent?(d(),w("div",qe,[i(h(ae),{size:"medium"}),u[1]||(u[1]=_("p",null,"加载代理详情中...",-1))])):a.agent?(d(),o(h(V),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:m(()=>[i(h(E),{name:"overview",tab:"概览"},{default:m(()=>[_("div",Ee,["codex"===a.platform&&a.agent.configReadError?(d(),o(h(oe),{key:0,type:"warning",bordered:!1},{default:m(()=>[t(v(a.agent.configReadError),1)]),_:1})):s("",!0),_("div",Te,[u[2]||(u[2]=_("h3",{class:"asset-detail-section-title"},"描述",-1)),_("p",He,v(a.agent.description||"暂无描述"),1)]),_("div",Je,[u[9]||(u[9]=_("h3",{class:"asset-detail-section-title"},"基础信息",-1)),_("div",Ve,[_("div",Ge,[u[3]||(u[3]=_("span",{class:"asset-detail-label"},"作用域",-1)),_("span",Ye,v(C(a.agent.scope)),1)]),a.agent.fileName?(d(),w("div",We,[u[4]||(u[4]=_("span",{class:"asset-detail-label"},"文件名",-1)),_("span",Xe,v(y.value),1)])):s("",!0),"codex"===a.platform&&a.agent.configFile?(d(),w("div",Ze,[u[5]||(u[5]=_("span",{class:"asset-detail-label"},"config_file",-1)),_("span",Ke,v(a.agent.configFile),1)])):s("",!0),a.agent.model?(d(),w("div",Qe,[u[6]||(u[6]=_("span",{class:"asset-detail-label"},"模型",-1)),_("span",ea,v(a.agent.model),1)])):s("",!0),a.agent.permissionMode?(d(),w("div",aa,[u[7]||(u[7]=_("span",{class:"asset-detail-label"},"权限模式",-1)),_("span",la,v(a.agent.permissionMode),1)])):s("",!0),a.agent.skills?(d(),w("div",sa,[u[8]||(u[8]=_("span",{class:"asset-detail-label"},"技能",-1)),_("span",ta,v(a.agent.skills),1)])):s("",!0)])]),a.agent.tools?(d(),w("div",na,[u[10]||(u[10]=_("h3",{class:"asset-detail-section-title"},"可用工具",-1)),_("div",ia,[i(h(e),{size:16},{default:m(()=>[i(h(L))]),_:1}),_("code",null,v(a.agent.tools),1)])])):s("",!0),i(G,{path:k.value},null,8,["path"])])]),_:1}),i(h(E),{name:"content",tab:"codex"===a.platform?"配置":"提示词"},{default:m(()=>[_("pre",oa,v(b.value),1)]),_:1},8,["tab"])]),_:1})):(d(),w("div",ua,[i(h(e),{size:44,class:"asset-detail-empty-icon"},{default:m(()=>[i(h(z))]),_:1}),u[11]||(u[11]=_("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},ra={class:"config-edit-header"},ca={class:"config-edit-identity"},va={class:"config-edit-icon"},pa={class:"config-edit-title-stack"},ma={class:"config-edit-kicker"},ga={class:"config-edit-title"},fa={class:"config-edit-badges"},ya={class:"config-edit-section"},ha={class:"section-heading"},ba={class:"field-grid"},ka={class:"scope-option"},wa={class:"scope-path"},_a={class:"scope-option"},Ca={class:"scope-path"},ja={key:0,class:"platform-note"},xa={class:"config-edit-section"},Ma={class:"section-heading"},za={key:1,class:"empty-config-box"},Pa={key:0,class:"field-grid"},Oa={class:"field-grid"},Ua={key:0,class:"config-edit-section content-section"},Aa={class:"section-heading"},Na={class:"modal-footer"},La=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,r=n,y=p({get:()=>u.visible,set:e=>r("update:visible",e)}),b=p(()=>!!u.agent),j=p(()=>"codex"===u.platform),x=p(()=>"claude"===u.platform),M=p(()=>"omp"===u.platform),P=p(()=>["codex","opencode","omp"].includes(u.platform)),O=p(()=>b.value?"编辑代理":"创建代理"),N=p(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode",omp:"OMP"}[u.platform]||"Claude Code")),L=p(()=>"codex"===u.platform?"~/.codex/config.toml":"opencode"===u.platform?"~/.config/opencode/agents/":"gemini"===u.platform?"~/.gemini/agents/":"omp"===u.platform?"~/.omp/agent/agents/":"~/.claude/agents/"),S=p(()=>"opencode"===u.platform?".opencode/agents/":"gemini"===u.platform?".gemini/agents/":"omp"===u.platform?".omp/agents/":".claude/agents/"),$=p(()=>"project"===Y.value.scope?"项目级":"用户级"),R=p(()=>G.find(e=>e.value===Y.value.configMode)?.label||"配置"),q=k(null),E=k(!1),T={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},H=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],J=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],V=[{label:"Off",value:"off"},{label:"Minimal",value:"minimal"},{label:"Low",value:"low"},{label:"Medium",value:"medium"},{label:"High",value:"high"},{label:"XHigh",value:"xhigh"},{label:"Max",value:"max"}],G=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],Y=k({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",thinkingLevel:"",spawns:"",permissionMode:"",skills:"",systemPrompt:""}),W=p(()=>{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"===Y.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function X(){Y.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",thinkingLevel:"",spawns:"",permissionMode:"",skills:"",systemPrompt:""}}function K(){y.value=!1,X()}async function ae(){try{await(q.value?.validate())}catch{return}E.value=!0;try{const e={...Y.value,projectPath:u.projectPath};j.value?("custom"===Y.value.configMode?e.configFile=Y.value.configFile:delete e.configFile,"managed"===Y.value.configMode||"custom"===Y.value.configMode?e.configContent=Y.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,s="claude"){return(await C.put(`/agents/${a}/${e}`,{...l,platform:s})).data}(Y.value.fileName,Y.value.scope,e,u.platform),re.success("代理更新成功")):(await async function(e,a="claude"){return(await C.post("/agents",{...e,platform:a})).data}(e,u.platform),re.success("代理创建成功")),r("saved"),y.value=!1,X()}catch(e){re.error("操作失败: "+e.message)}finally{E.value=!1}}return c(()=>u.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");Y.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||"",thinkingLevel:e.thinkingLevel||"",spawns:e.spawns||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else X()},{immediate:!0}),c(()=>u.platform,e=>{"codex"===e&&(Y.value.scope="user",Y.value.configMode||(Y.value.configMode="none"))},{immediate:!0}),(l,n)=>(d(),o(h(B),{show:y.value,"onUpdate:show":n[15]||(n[15]=e=>y.value=e),preset:"card",title:O.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":T,"mask-closable":!1,class:"config-edit-modal"},{footer:m(()=>[_("div",Na,[i(h(a),{onClick:K},{default:m(()=>[...n[23]||(n[23]=[t("取消",-1)])]),_:1}),i(h(a),{type:"primary",loading:E.value,onClick:ae},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(I))]),_:1})]),default:m(()=>[t(" "+v(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:m(()=>[_("div",ra,[_("div",ca,[_("span",va,[i(h(e),{size:22},{default:m(()=>[i(h(U))]),_:1})]),_("div",pa,[_("span",ma,v(N.value),1),_("span",ga,v(b.value?Y.value.fileName||"编辑代理":"创建新代理"),1)])]),_("div",fa,[i(h(ve),{size:"small",bordered:!1,type:"info"},{default:m(()=>[t(v($.value),1)]),_:1}),j.value?(d(),o(h(ve),{key:0,size:"small",bordered:!1,type:"success"},{default:m(()=>[...n[16]||(n[16]=[t("Codex 用户级",-1)])]),_:1})):s("",!0),j.value&&"none"!==Y.value.configMode?(d(),o(h(ve),{key:1,size:"small",bordered:!1,type:"warning"},{default:m(()=>[t(v(R.value),1)]),_:1})):s("",!0)])]),i(h(ee),{ref_key:"formRef",ref:q,model:Y.value,rules:W.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:m(()=>[_("div",{class:f(["config-edit-grid",{"is-codex":j.value}])},[_("section",ya,[_("div",ha,[i(h(e),{size:16},{default:m(()=>[i(h(F))]),_:1}),n[17]||(n[17]=_("span",null,"基础信息",-1))]),_("div",ba,[i(h(Q),{label:"文件名",path:"fileName"},{default:m(()=>[i(h(ce),{value:Y.value.fileName,"onUpdate:value":n[0]||(n[0]=e=>Y.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),x.value?(d(),o(h(Q),{key:0,label:"显示名称",path:"name"},{default:m(()=>[i(h(ce),{value:Y.value.name,"onUpdate:value":n[1]||(n[1]=e=>Y.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):s("",!0)]),i(h(Q),{label:"作用域",path:"scope"},{default:m(()=>[i(h(te),{value:Y.value.scope,"onUpdate:value":n[2]||(n[2]=e=>Y.value.scope=e),disabled:b.value,class:f(["scope-picker",{"single-option":j.value}])},{default:m(()=>[i(h(ie),{value:"user"},{default:m(()=>[_("span",ka,[n[18]||(n[18]=_("span",{class:"scope-title"},"用户级",-1)),_("span",wa,v(L.value),1)])]),_:1}),j.value?s("",!0):(d(),o(h(ie),{key:0,value:"project"},{default:m(()=>[_("span",_a,[n[19]||(n[19]=_("span",{class:"scope-title"},"项目级",-1)),_("span",Ca,v(S.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),i(h(Q),{label:"描述",path:"description"},{default:m(()=>[i(h(ce),{value:Y.value.description,"onUpdate:value":n[3]||(n[3]=e=>Y.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),j.value?(d(),w("div",ja,[i(h(e),{size:16},{default:m(()=>[i(h(A))]),_:1}),n[20]||(n[20]=_("span",null,[t("Codex agents 写入用户级配置。描述会进入 "),_("code",null,"~/.codex/config.toml"),t(",TOML 配置可托管到 "),_("code",null,"~/.codex/agents/"),t("。")],-1))])):s("",!0)]),_("section",xa,[_("div",Ma,[i(h(e),{size:16},{default:m(()=>[i(h(D))]),_:1}),_("span",null,v(j.value?"运行配置":"模型与权限"),1)]),j.value?(d(),w(g,{key:0},[i(h(Q),{label:"配置模式",path:"configMode"},{default:m(()=>[i(h(Z),{value:Y.value.configMode,"onUpdate:value":n[4]||(n[4]=e=>Y.value.configMode=e),options:G,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===Y.value.configMode?(d(),o(h(Q),{key:0,label:"配置文件路径",path:"configFile"},{default:m(()=>[i(h(ce),{value:Y.value.configFile,"onUpdate:value":n[5]||(n[5]=e=>Y.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):s("",!0),"none"===Y.value.configMode?(d(),w("div",za,[i(h(e),{size:18},{default:m(()=>[i(h(z))]),_:1}),n[21]||(n[21]=_("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(d(),o(h(Q),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:m(()=>[i(h(ce),{value:Y.value.configContent,"onUpdate:value":n[6]||(n[6]=e=>Y.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(d(),w(g,{key:1},[i(h(Q),{label:"可用工具",path:"tools"},{default:m(()=>[i(h(ce),{value:Y.value.tools,"onUpdate:value":n[7]||(n[7]=e=>Y.value.tools=e),placeholder:M.value?"read, edit, bash(逗号分隔)":"Read, Edit, Bash"},null,8,["value","placeholder"])]),_:1}),i(h(Q),{label:"模型",path:"model"},{default:m(()=>[P.value?(d(),o(h(ce),{key:0,value:Y.value.model,"onUpdate:value":n[8]||(n[8]=e=>Y.value.model=e),placeholder:M.value?"@default、@review 或 provider/model;多个候选用逗号分隔":"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value","placeholder"])):(d(),o(h(Z),{key:1,value:Y.value.model,"onUpdate:value":n[9]||(n[9]=e=>Y.value.model=e),options:H,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),M.value?(d(),w("div",Pa,[i(h(Q),{label:"思考级别",path:"thinkingLevel"},{default:m(()=>[i(h(Z),{value:Y.value.thinkingLevel,"onUpdate:value":n[10]||(n[10]=e=>Y.value.thinkingLevel=e),options:V,placeholder:"使用模型默认级别",clearable:""},null,8,["value"])]),_:1}),i(h(Q),{label:"可调用的子 Agent",path:"spawns"},{default:m(()=>[i(h(ce),{value:Y.value.spawns,"onUpdate:value":n[11]||(n[11]=e=>Y.value.spawns=e),placeholder:"* 或 reviewer, scout"},null,8,["value"])]),_:1})])):s("",!0),_("div",Oa,["opencode"===u.platform||M.value?s("",!0):(d(),o(h(Q),{key:0,label:"权限模式",path:"permissionMode"},{default:m(()=>[i(h(Z),{value:Y.value.permissionMode,"onUpdate:value":n[12]||(n[12]=e=>Y.value.permissionMode=e),options:J,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})),"opencode"===u.platform||M.value?s("",!0):(d(),o(h(Q),{key:1,label:"技能",path:"skills"},{default:m(()=>[i(h(ce),{value:Y.value.skills,"onUpdate:value":n[13]||(n[13]=e=>Y.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1}))])],64))]),j.value?s("",!0):(d(),w("section",Ua,[_("div",Aa,[i(h(e),{size:16},{default:m(()=>[i(h(z))]),_:1}),n[22]||(n[22]=_("span",null,"系统提示词",-1))]),i(h(Q),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:m(()=>[i(me,{modelValue:Y.value.systemPrompt,"onUpdate:modelValue":n[14]||(n[14]=e=>Y.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-ea89272f"]]),Ia={key:0,class:"asset-panel-header"},Sa={class:"asset-title-group"},$a={class:"asset-heading"},Fa={class:"asset-title-row"},Da={class:"asset-platform-pill"},Ra={key:0,class:"asset-action-row"},Ba={key:1,class:"asset-drawer-toolbar"},qa={key:0,class:"asset-action-row"},Ea={key:2,class:"omp-model-roles"},Ta={class:"omp-model-roles-toolbar"},Ha={class:"omp-model-roles-copy"},Ja={key:0,class:"omp-model-roles-stale"},Va={key:1,class:"omp-model-roles-error"},Ga={class:"asset-summary"},Ya={class:"asset-summary-item"},Wa={class:"asset-summary-value"},Xa={class:"asset-summary-item"},Za={class:"asset-summary-value"},Ka={class:"asset-summary-item"},Qa={class:"asset-summary-value"},el={class:"asset-summary-item"},al={class:"asset-summary-value"},ll={class:"asset-filter-bar"},sl={class:"asset-panel-content"},tl={key:0,class:"asset-empty"},nl={key:1,class:"asset-list"},il={class:"asset-footer"},ol=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:r}){const y=l,z=r,L=M(),I=b(),S=k([]),F=k(!1),D=k(""),R=k("all"),B=k(!1),E=k(!1),V=k(null),G=k(!1),Y=k(null),W=k({}),X=k({}),Q=k({}),ee=k([]),le=k(""),te=k([]),ne=k([]),ie=p(()=>new Set(te.value.map(e=>e.value))),oe=k(!1),de=k(!1),ve=k(""),me=p(()=>JSON.stringify(_e())!==le.value);let ge=0;const{byCapability:fe}=K(),ye=p(()=>fe("agents").map(e=>e.key)),he=p(()=>ye.value.includes(xe.value)),ke=["default","smol","slow","plan","commit","vision","designer","task","advisor","tiny"],we=["minimal","low","medium","high","xhigh","max"].map(e=>({label:e,value:e}));function _e(){return Object.fromEntries(ee.value.map(e=>[e.key,{model:e.model||"",thinkingLevel:e.thinkingLevel||""}]))}function Ce(e={}){const a=e.roles&&"object"==typeof e.roles?e.roles:{};ee.value=ke.map(e=>({key:e,model:"string"==typeof a[e]?.model?a[e].model:"",thinkingLevel:"string"==typeof a[e]?.thinkingLevel?a[e].thinkingLevel:""})),le.value=JSON.stringify(_e()),te.value=(Array.isArray(e.modelOptions)?e.modelOptions:[]).filter(e=>"string"==typeof e&&e.trim()).map(e=>({label:e,value:e})),ne.value=e.unavailableRoles&&"object"==typeof e.unavailableRoles?Object.keys(e.unavailableRoles).filter(a=>!0===e.unavailableRoles[a]):[]}function je(e,a){return e?.data?.error||e?.response?.data?.error||e?.message||a}const xe=p(()=>String(y.platform||x(I)||"").trim().toLowerCase()),Me=p(()=>"opencode"===xe.value?"使用 @agent 或 Task 在 OpenCode 中调用":"omp"===xe.value?"OMP Agent 由 task 工具按名称调用;模型可在 Agent 配置中单独指定":"gemini"===xe.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),ze=p(()=>{const e=L.get(xe.value)||j(xe.value);return e.label||e.title||"Claude Code"}),Pe=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],Oe=p(()=>S.value.filter(e=>"user"===e.scope).length),Ue=p(()=>S.value.filter(e=>"project"===e.scope).length),Ae=p(()=>Object.keys(X.value).length);function Ne(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():"",s="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||s}`}function Ie(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(X.value[l])return l;return a[0]||""}const Se=p(()=>{let e=S.value;if("user"===R.value?e=e.filter(e=>"user"===e.scope):"project"===R.value?e=e.filter(e=>"project"===e.scope):"managed"===R.value&&(e=e.filter(e=>X.value[Ie(e)])),D.value.trim()){const a=D.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a)||e.fileName?.toLowerCase().includes(a))}return e}),$e=p(()=>D.value?"没有匹配的代理":"user"===R.value?"暂无用户级代理":"project"===R.value?"暂无项目级代理":"managed"===R.value?"暂无托管的代理":he.value?"暂无自定义代理":`${ze.value} 暂未提供 Agents 能力`);async function Fe(){if(!he.value)return S.value=[],X.value={},void(F.value=!1);F.value=!0;try{const[e,a]=await Promise.all([be(y.projectPath,xe.value),J("agents",{platform:xe.value,projectPath:y.projectPath})]);if(e.success&&(S.value=e.agents||[]),a.success){X.value={};for(const[e,l]of Object.entries(a.items||{}))X.value[e]=l}}catch(e){re.error("加载代理列表失败: "+e.message)}finally{F.value=!1}}async function De(e,a){const l=Ie(e);if(l){Q.value[l]=!0;try{(await q("agents",l,a)).success&&(re.success(a?"已启用":"已禁用"),await Fe())}catch(s){re.error("切换失败: "+s.message)}finally{delete Q.value[l]}}else re.error("未找到代理对应的托管配置键")}async function Re(e,a,l){const s=Ie(e);if(s){Q.value[s]=!0;try{(await H("agents",s,a,l)).success&&(re.success(`${a} ${l?"已启用":"已禁用"}`),await Fe())}catch(t){re.error("切换失败: "+t.message)}finally{delete Q.value[s]}}else re.error("未找到代理对应的托管配置键")}async function Be(){F.value=!0;try{const e=await T("agents");e?.success||re.warning(e?.message||"同步失败,已继续刷新列表")}catch(e){re.warning("同步失败,已继续刷新列表: "+e.message)}await Fe()}async function qe(){if("omp"===xe.value){oe.value=!0,ve.value="";try{const{data:e}=await C.get("/settings/omp-model-roles");Ce(e)}catch(e){ve.value=`加载 OMP 角色配置失败:${je(e,"未知错误")}`}finally{oe.value=!1}}}async function Ee(){if(!(oe.value||de.value||ve.value)){de.value=!0;try{const{data:e}=await C.put("/settings/omp-model-roles",{roles:_e()});Ce(e),re.success("OMP 模型角色配置已保存")}catch(e){re.error(`保存 OMP 角色配置失败:${je(e,"未知错误")}`)}finally{de.value=!1}}}function Te(){Y.value=null,B.value=!0}function He(e){B.value=e,e||(Y.value=null)}function Je(e){Ge(e,!0)}async function Ve(e){const a=Ne(e);W.value[a]=!0;try{(await async function(e,a,l=null,s="claude"){const t={};return s&&(t.platform=s),l&&(t.projectPath=l),(await C.delete(`/agents/${a}/${e}`,{params:t})).data}(e.fileName,e.scope,y.projectPath,xe.value)).success&&(re.success("代理已删除"),await Fe(),z("updated"))}catch(l){re.error("删除失败: "+l.message)}finally{delete W.value[a]}}async function Ge(e,a=!1){if(!e)return;const l=++ge;G.value=!0,a||(V.value=null,E.value=!0);try{const s=await async function(e,a,l=null,s="claude"){const t={};s&&(t.platform=s),l&&(t.projectPath=l);const n=pe(`agent-detail:${e}`,s,a||"",l||"");return se(n,l=>C.get(`/agents/${a}/${e}`,{params:t,signal:l}).then(e=>e.data),"agent-detail",`agent-detail:${s}`)}(e.fileName,e.scope,y.projectPath,xe.value);if(l!==ge)return;const t=s?.agent||e;a?(Y.value=t,B.value=!0):V.value=t}catch(s){if(l!==ge)return;re.error("加载代理详情失败: "+s.message),a?(Y.value=e,B.value=!0):V.value=e}finally{l===ge&&(G.value=!1)}}function Ye(e){Ge(e,!1)}function We(){Y.value=null,Fe(),z("updated")}function Xe(){z("back")}return u(()=>{Fe(),qe()}),c(xe,()=>{ge+=1,G.value=!1,V.value=null,Fe(),qe()}),(u,r)=>(d(),w("div",{class:f(["agents-panel asset-panel",{"in-drawer":y.inDrawer}])},[y.inDrawer?s("",!0):(d(),w("div",Ia,[_("div",Sa,[y.hideBack?s("",!0):(d(),o(h(a),{key:0,text:"",onClick:Xe,class:"back-btn"},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(P))]),_:1})]),_:1})),_("div",$a,[_("div",Fa,[r[3]||(r[3]=_("span",{class:"asset-title"},"代理管理",-1)),_("span",Da,v(ze.value),1)]),r[4]||(r[4]=_("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),he.value?(d(),w("div",Ra,[i(h(a),{text:"",onClick:Te,class:"action-btn"},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(O))]),_:1})]),default:m(()=>[r[5]||(r[5]=t(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:Be,loading:F.value,class:"action-btn"},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(N))]),_:1})]),default:m(()=>[r[6]||(r[6]=t(" 刷新 ",-1))]),_:1},8,["loading"])])):s("",!0)])),y.inDrawer?(d(),w("div",Ba,[he.value?(d(),w("div",qa,[i(h(a),{text:"",onClick:Te,class:"action-btn"},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(O))]),_:1})]),default:m(()=>[r[7]||(r[7]=t(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:Be,loading:F.value,class:"action-btn"},{icon:m(()=>[i(h(e),null,{default:m(()=>[i(h(N))]),_:1})]),default:m(()=>[r[8]||(r[8]=t(" 刷新 ",-1))]),_:1},8,["loading"])])):s("",!0)])):s("",!0),"omp"===xe.value?(d(),w("div",Ea,[_("div",Ta,[_("div",Ha,[r[10]||(r[10]=_("strong",null,"OMP 模型角色",-1)),r[11]||(r[11]=_("span",null,"候选模型只取当前启用渠道。原生 OAuth 渠道读取允许模型列表(未设置时读取已声明模型),并使用 OAuth provider ID 作为前缀;OAuth Auth Gateway 使用该托管渠道的模型配置。思考强度会写入选择器后缀,例如 :high。",-1)),ne.value.length?(d(),w("span",Ja," 以下角色当前指向未启用渠道模型:"+v(ne.value.join("、"))+"。请切换到已启用渠道中的模型,或清空对应角色。 ",1)):s("",!0),ve.value?(d(),w("div",Va,[_("span",null,v(ve.value),1),i(h(a),{text:"",size:"tiny",disabled:oe.value,onClick:qe},{default:m(()=>[...r[9]||(r[9]=[t("重试",-1)])]),_:1},8,["disabled"])])):s("",!0)]),i(h(a),{type:"primary",size:"small",loading:de.value,disabled:oe.value||!!ve.value||de.value||!me.value,onClick:Ee},{default:m(()=>[...r[12]||(r[12]=[t(" 保存角色配置 ",-1)])]),_:1},8,["loading","disabled"])]),r[13]||(r[13]=_("div",{class:"omp-model-roles-header"},[_("span",null,"角色"),_("span",null,"模型"),_("span",null,"思考强度")],-1)),(d(!0),w(g,null,n(ee.value,e=>(d(),w("div",{key:e.key,class:"omp-model-role-row"},[_("strong",null,v(e.key),1),i(h(Z),{value:e.model,"onUpdate:value":a=>e.model=a,options:te.value,placeholder:"请选择已启用渠道模型",filterable:"",clearable:"",size:"small",disabled:oe.value||!!ve.value||de.value},null,8,["value","onUpdate:value","options","disabled"]),i(h(Z),{value:e.thinkingLevel,"onUpdate:value":a=>e.thinkingLevel=a,options:h(we),placeholder:"跟随默认",clearable:"",size:"small",disabled:oe.value||!!ve.value||de.value||!ie.value.has(e.model)},null,8,["value","onUpdate:value","options","disabled"])]))),128))])):s("",!0),_("div",Ga,[_("span",Ya,[r[14]||(r[14]=_("span",{class:"asset-summary-label"},"全部",-1)),_("span",Wa,v(S.value.length),1)]),_("span",Xa,[r[15]||(r[15]=_("span",{class:"asset-summary-label"},"用户级",-1)),_("span",Za,v(Oe.value),1)]),_("span",Ka,[r[16]||(r[16]=_("span",{class:"asset-summary-label"},"项目级",-1)),_("span",Qa,v(Ue.value),1)]),_("span",el,[r[17]||(r[17]=_("span",{class:"asset-summary-label"},"托管",-1)),_("span",al,v(Ae.value),1)])]),_("div",ll,[i(h(ce),{value:D.value,"onUpdate:value":r[0]||(r[0]=e=>D.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:m(()=>[i(h(e),null,{default:m(()=>[i(h($))]),_:1})]),_:1},8,["value"]),i(h(Z),{value:R.value,"onUpdate:value":r[1]||(r[1]=e=>R.value=e),options:Pe,size:"small",class:"asset-filter"},null,8,["value"])]),_("div",sl,[i(h(ae),{show:F.value},{default:m(()=>[0!==Se.value.length||F.value?(d(),w("div",nl,[(d(!0),w(g,null,n(Se.value,e=>(d(),o(Le,{key:Ne(e),agent:e,deleting:!!W.value[Ne(e)],"registry-info":X.value[Ie(e)],toggling:!!Q.value[Ie(e)],onEdit:Je,onDelete:Ve,onClick:Ye,onToggleEnabled:De,onTogglePlatform:Re},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(d(),w("div",tl,[i(h(ue),{description:$e.value},{icon:m(()=>[i(h(e),{size:"48",color:"var(--text-quaternary)"},{default:m(()=>[i(h(U))]),_:1})]),extra:m(()=>[he.value?(d(),o(h(a),{key:0,size:"small",onClick:Te},{default:m(()=>[...r[18]||(r[18]=[t(" 创建第一个代理 ",-1)])]),_:1})):s("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),_("div",il,[i(h(e),{size:"14",class:"asset-info-icon"},{default:m(()=>[i(h(A))]),_:1}),_("span",null,v(Me.value),1)]),i(La,{visible:B.value,"onUpdate:visible":He,agent:Y.value,"project-path":l.projectPath,platform:xe.value,onSaved:We},null,8,["visible","agent","project-path","platform"]),i(da,{visible:E.value,"onUpdate:visible":r[2]||(r[2]=e=>E.value=e),agent:V.value,platform:xe.value,loading:G.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-393fa5d6"]]),ul={class:"preset-panel"},dl={class:"toolbar"},rl={key:0,class:"empty"},cl={key:1,class:"preset-list"},vl=["onClick"],pl={key:1,class:"editor"},ml={class:"editor-title"},gl={class:"field-grid"},fl={class:"wide"},yl={class:"wide"},hl={class:"editor-actions"},bl={key:0,class:"hint"},kl=l({__name:"DshAgentPresetsPanel",setup(e){const l=R(),r=k([]),c=k(""),y=k([]),b=k(null),C=k(""),j=k(!1),x=k(!1),M=k(!1),z=k(""),P=k(!1),O=k(!1),U=k("[]"),A=k({id:"",name:"",description:"",order:0,plugins:[],builtIn:!1}),N=p(()=>r.value.map(e=>({label:e.name,value:e.name})));async function L(){if(c.value){j.value=!0,z.value="";try{const e=await fe(c.value);if(y.value=e.presets||[],b.value=e.revision??null,C.value){const e=y.value.find(e=>e.id===C.value);e?I(e):(P.value=!1,C.value="")}}catch(e){z.value=e.message||"读取 Agent 预设失败"}finally{j.value=!1}}}function I(e){C.value=e.id,A.value={...e,plugins:Array.isArray(e.plugins)?e.plugins:[]},U.value=JSON.stringify(A.value.plugins,null,2),O.value=!1,P.value=!0}function S(){C.value="",A.value={id:"",name:"",description:"",order:0,plugins:[],builtIn:!1},U.value="[]",O.value=!0,P.value=!0}async function $(){let e;try{e=JSON.parse(U.value||"[]")}catch(a){return void l.error("插件声明必须是有效的 JSON 数组")}if(Array.isArray(e)){x.value=!0;try{await ge(c.value,{id:A.value.id,name:A.value.name,description:A.value.description,order:A.value.order,plugins:e},b.value),l.success("Agent 预设已保存"),C.value=A.value.id,await L()}catch(s){l.error(s.message||"保存失败,请刷新后重试")}finally{x.value=!1}}else l.error("插件声明必须是数组")}async function F(){M.value=!0;try{await he(c.value,A.value.id,b.value),l.success("自定义 Agent 预设已删除"),C.value="",P.value=!1,await L()}catch(e){l.error(e.message||"删除失败,请刷新后重试")}finally{M.value=!1}}return u(async()=>{try{r.value=await ye(),c.value=r.value[0]?.name||"",c.value&&await L()}catch(e){z.value=e.message||"读取 DSH Profile 失败"}}),(e,l)=>(d(),w("div",ul,[_("div",dl,[i(h(Z),{value:c.value,"onUpdate:value":[l[0]||(l[0]=e=>c.value=e),L],options:N.value,placeholder:"选择 DSH Profile",size:"small"},null,8,["value","options"]),i(h(a),{size:"small",disabled:!c.value,onClick:S},{default:m(()=>[...l[7]||(l[7]=[t("新建预设",-1)])]),_:1},8,["disabled"]),i(h(a),{size:"small",loading:j.value,onClick:L},{default:m(()=>[...l[8]||(l[8]=[t("刷新",-1)])]),_:1},8,["loading"])]),z.value?(d(),o(h(oe),{key:0,type:"error","show-icon":!1},{default:m(()=>[t(v(z.value),1)]),_:1})):s("",!0),i(h(ae),{show:j.value},{default:m(()=>[j.value||0!==y.value.length?(d(),w("div",cl,[(d(!0),w(g,null,n(y.value,e=>(d(),w("button",{key:e.id,class:f(["preset-item",{selected:C.value===e.id}]),onClick:a=>I(e)},[_("strong",null,v(e.name||e.id),1),_("span",null,v(e.description||e.id),1),_("small",null,v(e.builtIn?"内置预设":"自定义预设"),1)],10,vl))),128))])):(d(),w("div",rl,"该 Profile 尚无 Agent 预设"))]),_:1},8,["show"]),P.value?(d(),w("div",pl,[_("div",ml,v(O.value?"新建 Agent 预设":A.value.name||A.value.id),1),_("div",gl,[_("label",null,[l[9]||(l[9]=t("预设 ID",-1)),i(h(ce),{value:A.value.id,"onUpdate:value":l[1]||(l[1]=e=>A.value.id=e),disabled:!O.value,placeholder:"例如 review"},null,8,["value","disabled"])]),_("label",null,[l[10]||(l[10]=t("显示名称",-1)),i(h(ce),{value:A.value.name,"onUpdate:value":l[2]||(l[2]=e=>A.value.name=e),placeholder:"可选"},null,8,["value"])]),_("label",null,[l[11]||(l[11]=t("排序",-1)),i(h(le),{value:A.value.order,"onUpdate:value":l[3]||(l[3]=e=>A.value.order=e),min:0},null,8,["value"])]),_("label",fl,[l[12]||(l[12]=t("描述",-1)),i(h(ce),{value:A.value.description,"onUpdate:value":l[4]||(l[4]=e=>A.value.description=e),placeholder:"可选"},null,8,["value"])]),_("label",yl,[l[13]||(l[13]=t("插件声明(JSON 格式的 YAML) ",-1)),i(h(ce),{value:U.value,"onUpdate:value":l[5]||(l[5]=e=>U.value=e),type:"textarea",autosize:{minRows:8,maxRows:18},spellcheck:"false"},null,8,["value"])])]),_("div",hl,[i(h(a),{type:"primary",loading:x.value,onClick:$},{default:m(()=>[...l[14]||(l[14]=[t("保存预设",-1)])]),_:1},8,["loading"]),O.value||A.value.builtIn?s("",!0):(d(),o(h(a),{key:0,type:"error",secondary:"",loading:M.value,onClick:F},{default:m(()=>[...l[15]||(l[15]=[t("删除",-1)])]),_:1},8,["loading"])),i(h(a),{onClick:l[6]||(l[6]=e=>P.value=!1)},{default:m(()=>[...l[16]||(l[16]=[t("取消",-1)])]),_:1})]),A.value.builtIn?(d(),w("div",bl,"保存后会在当前 Profile 覆盖内置预设。")):s("",!0)])):s("",!0)]))}},[["__scopeId","data-v-b33b4ced"]]),wl={class:"drawer-header"},_l=l({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,s=a,{drawerWidth:t}=W(720),n=p({get:()=>l.visible,set:e=>s("update:visible",e)}),u={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(d(),o(h(Y),{show:n.value,"onUpdate:show":a[1]||(a[1]=e=>n.value=e),width:h(t),placement:"right","mask-closable":!0},{default:m(()=>[i(h(X),{closable:"","native-scrollbar":!1,"body-content-style":u},{header:m(()=>[_("div",wl,[_("span",null,v("dsh"===l.platform?"Agent 预设管理":"代理管理"),1)])]),default:m(()=>["dsh"===l.platform?(d(),o(kl,{key:0})):(d(),o(ol,{key:1,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-de75708b"]]);export{_l as default};