coding-tool-x 3.3.7 → 3.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +253 -326
  3. package/dist/web/assets/{Analytics-IW6eAy9u.js → Analytics-D6LzK9hk.js} +1 -1
  4. package/dist/web/assets/{ConfigTemplates-BPtkTMSc.js → ConfigTemplates-BUDYuxRi.js} +1 -1
  5. package/dist/web/assets/Home-BQxQ1LhR.css +1 -0
  6. package/dist/web/assets/Home-D7KX7iF8.js +1 -0
  7. package/dist/web/assets/{PluginManager-BGx9MSDV.js → PluginManager-DTgQ--vB.js} +1 -1
  8. package/dist/web/assets/{ProjectList-BCn-mrCx.js → ProjectList-DMCiGmCT.js} +1 -1
  9. package/dist/web/assets/{SessionList-CzLfebJQ.js → SessionList-CRBsdVRe.js} +1 -1
  10. package/dist/web/assets/{SkillManager-CXz2vBQx.js → SkillManager-DMwx2Q4k.js} +1 -1
  11. package/dist/web/assets/{WorkspaceManager-CHtgMfKc.js → WorkspaceManager-DapB4ljL.js} +1 -1
  12. package/dist/web/assets/{icons-B29onFfZ.js → icons-B5Pl4lrD.js} +1 -1
  13. package/dist/web/assets/index-CL-qpoJ_.js +2 -0
  14. package/dist/web/assets/index-D_5dRFOL.css +1 -0
  15. package/dist/web/assets/{markdown-C9MYpaSi.js → markdown-DyTJGI4N.js} +1 -1
  16. package/dist/web/assets/{naive-ui-CxpuzdjU.js → naive-ui-Bdxp09n2.js} +1 -1
  17. package/dist/web/assets/{vendors-DMjSfzlv.js → vendors-CKPV1OAU.js} +2 -2
  18. package/dist/web/assets/{vue-vendor-DET08QYg.js → vue-vendor-3bf-fPGP.js} +1 -1
  19. package/dist/web/index.html +7 -7
  20. package/docs/home.png +0 -0
  21. package/package.json +14 -5
  22. package/src/commands/daemon.js +3 -2
  23. package/src/commands/security.js +1 -2
  24. package/src/commands/toggle-proxy.js +100 -5
  25. package/src/config/paths.js +718 -90
  26. package/src/server/api/agents.js +1 -1
  27. package/src/server/api/channels.js +9 -0
  28. package/src/server/api/claude-hooks.js +13 -8
  29. package/src/server/api/codex-channels.js +9 -0
  30. package/src/server/api/codex-proxy.js +27 -15
  31. package/src/server/api/gemini-proxy.js +22 -11
  32. package/src/server/api/hooks.js +45 -0
  33. package/src/server/api/oauth-credentials.js +163 -0
  34. package/src/server/api/opencode-proxy.js +22 -10
  35. package/src/server/api/plugins.js +2 -1
  36. package/src/server/api/proxy.js +39 -44
  37. package/src/server/api/skills.js +91 -13
  38. package/src/server/api/ui-config.js +5 -0
  39. package/src/server/codex-proxy-server.js +90 -70
  40. package/src/server/gemini-proxy-server.js +107 -88
  41. package/src/server/index.js +2 -0
  42. package/src/server/opencode-proxy-server.js +381 -225
  43. package/src/server/proxy-server.js +86 -60
  44. package/src/server/services/alias.js +3 -3
  45. package/src/server/services/channels.js +21 -24
  46. package/src/server/services/codex-channels.js +158 -255
  47. package/src/server/services/codex-config.js +2 -5
  48. package/src/server/services/codex-env-manager.js +423 -0
  49. package/src/server/services/codex-settings-manager.js +21 -357
  50. package/src/server/services/codex-statistics-service.js +3 -27
  51. package/src/server/services/config-export-service.js +43 -9
  52. package/src/server/services/config-registry-service.js +3 -2
  53. package/src/server/services/config-sync-manager.js +1 -1
  54. package/src/server/services/favorites.js +4 -3
  55. package/src/server/services/gemini-channels.js +14 -12
  56. package/src/server/services/gemini-statistics-service.js +3 -25
  57. package/src/server/services/mcp-service.js +35 -19
  58. package/src/server/services/model-detector.js +4 -3
  59. package/src/server/services/native-keychain.js +243 -0
  60. package/src/server/services/native-oauth-adapters.js +891 -0
  61. package/src/server/services/network-access.js +39 -1
  62. package/src/server/services/notification-hooks.js +951 -0
  63. package/src/server/services/oauth-credentials-service.js +786 -0
  64. package/src/server/services/oauth-utils.js +49 -0
  65. package/src/server/services/opencode-channels.js +19 -15
  66. package/src/server/services/opencode-sessions.js +2 -2
  67. package/src/server/services/opencode-settings-manager.js +169 -16
  68. package/src/server/services/opencode-statistics-service.js +3 -27
  69. package/src/server/services/plugins-service.js +115 -15
  70. package/src/server/services/prompts-service.js +2 -3
  71. package/src/server/services/proxy-log-helper.js +242 -0
  72. package/src/server/services/proxy-runtime.js +6 -4
  73. package/src/server/services/repo-scanner-base.js +12 -4
  74. package/src/server/services/request-logger.js +7 -7
  75. package/src/server/services/security-config.js +4 -4
  76. package/src/server/services/session-cache.js +2 -2
  77. package/src/server/services/sessions.js +2 -2
  78. package/src/server/services/settings-manager.js +13 -0
  79. package/src/server/services/skill-service.js +867 -368
  80. package/src/server/services/statistics-service.js +5 -5
  81. package/src/server/services/ui-config.js +4 -3
  82. package/src/server/services/workspace-service.js +1 -1
  83. package/src/server/websocket-server.js +5 -4
  84. package/dist/web/assets/Home-BsSioaaB.css +0 -1
  85. package/dist/web/assets/Home-obifg_9E.js +0 -1
  86. package/dist/web/assets/index-C7LPdVsN.js +0 -2
  87. package/dist/web/assets/index-eEmjZKWP.css +0 -1
  88. package/docs/bannel.png +0 -0
  89. package/docs/model-redirection.md +0 -251
@@ -1,4 +1,4 @@
1
- import{g as e}from"./markdown-C9MYpaSi.js";
1
+ import{g as e}from"./markdown-DyTJGI4N.js";
2
2
  /**
3
3
  * @vue/shared v3.5.26
4
4
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
@@ -5,14 +5,14 @@
5
5
  <link rel="icon" href="/favicon.ico">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <title>CC-TOOL - ClaudeCode增强工作助手</title>
8
- <script type="module" crossorigin src="/assets/index-C7LPdVsN.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/markdown-C9MYpaSi.js">
10
- <link rel="modulepreload" crossorigin href="/assets/vue-vendor-DET08QYg.js">
11
- <link rel="modulepreload" crossorigin href="/assets/vendors-DMjSfzlv.js">
12
- <link rel="modulepreload" crossorigin href="/assets/naive-ui-CxpuzdjU.js">
13
- <link rel="modulepreload" crossorigin href="/assets/icons-B29onFfZ.js">
8
+ <script type="module" crossorigin src="/assets/index-CL-qpoJ_.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/assets/markdown-DyTJGI4N.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/vue-vendor-3bf-fPGP.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/vendors-CKPV1OAU.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/naive-ui-Bdxp09n2.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/icons-B5Pl4lrD.js">
14
14
  <link rel="stylesheet" crossorigin href="/assets/markdown-BfC0goYb.css">
15
- <link rel="stylesheet" crossorigin href="/assets/index-eEmjZKWP.css">
15
+ <link rel="stylesheet" crossorigin href="/assets/index-D_5dRFOL.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="app"></div>
package/docs/home.png CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coding-tool-x",
3
- "version": "3.3.7",
3
+ "version": "3.3.9",
4
4
  "description": "Vibe Coding 增强工作助手 - 智能会话管理、动态渠道切换、全局搜索、实时监控",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -8,10 +8,12 @@
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node bin/ctx.js",
11
- "test": "npm run test:basic && npm run test:api && npm run test:codex-agents",
11
+ "test": "npm run test:basic && npm run test:api && npm run test:codex-agents && npm run test:skills && npm run test:plugins-market",
12
12
  "test:basic": "node scripts/test-basic.js",
13
13
  "test:api": "node scripts/test-api-consistency.js",
14
14
  "test:codex-agents": "node scripts/test-codex-agents.js",
15
+ "test:skills": "node scripts/test-skill-providers.js",
16
+ "test:plugins-market": "node scripts/test-plugin-market-cache.js",
15
17
  "test:windows": "node scripts/test-windows-regression.js",
16
18
  "benchmark:codex": "node scripts/benchmark-codex-loading.js",
17
19
  "build:web": "cd src/web && npm run build",
@@ -53,20 +55,27 @@
53
55
  "dependencies": {
54
56
  "@iarna/toml": "^2.2.5",
55
57
  "adm-zip": "^0.5.16",
56
- "ajv": "^8.12.0",
58
+ "ajv": "^8.17.1",
57
59
  "cc-tool-web": "file:src/web",
58
60
  "chalk": "^4.1.2",
59
- "express": "^4.18.2",
61
+ "express": "^4.21.2",
60
62
  "http-proxy": "^1.18.1",
61
63
  "https-proxy-agent": "^7.0.6",
62
64
  "inquirer": "^8.2.7",
63
65
  "open": "^8.4.2",
64
66
  "ora": "^5.4.1",
65
- "pm2": "^5.4.3",
67
+ "pm2": "^6.0.14",
66
68
  "semver": "^7.6.0",
67
69
  "toml": "^3.0.0",
68
70
  "ws": "^8.18.3"
69
71
  },
72
+ "overrides": {
73
+ "basic-ftp": "^5.2.0",
74
+ "lodash": "^4.17.23",
75
+ "lodash-es": "^4.17.23",
76
+ "qs": "^6.15.0",
77
+ "systeminformation": "^5.31.4"
78
+ },
70
79
  "devDependencies": {
71
80
  "nodemon": "^3.0.2"
72
81
  },
@@ -153,6 +153,7 @@ async function handleStart() {
153
153
  if (enableHost) {
154
154
  pmArgs.push('--host');
155
155
  }
156
+ require('fs').mkdirSync(PATHS.logs, { recursive: true });
156
157
 
157
158
  // 启动 PM2 进程
158
159
  pm2.start({
@@ -166,8 +167,8 @@ async function handleStart() {
166
167
  NODE_ENV: 'production',
167
168
  CC_TOOL_PORT: port
168
169
  },
169
- output: path.join(require('os').homedir(), '.cc-tool/logs/cc-tool-out.log'),
170
- error: path.join(require('os').homedir(), '.cc-tool/logs/cc-tool-error.log'),
170
+ output: path.join(PATHS.logs, 'cc-tool-out.log'),
171
+ error: path.join(PATHS.logs, 'cc-tool-error.log'),
171
172
  merge_logs: true,
172
173
  log_date_format: 'YYYY-MM-DD HH:mm:ss'
173
174
  }, async (err) => {
@@ -1,9 +1,8 @@
1
1
  const chalk = require('chalk');
2
2
  const fs = require('fs');
3
- const path = require('path');
4
3
  const { PATHS, ensureStorageDirMigrated } = require('../config/paths');
5
4
 
6
- const SECURITY_FILE = path.join(PATHS.base, 'security.json');
5
+ const SECURITY_FILE = PATHS.security;
7
6
 
8
7
  function showSecurityHelp() {
9
8
  console.log(chalk.yellow('\n🔐 安全设置命令:'));
@@ -1,7 +1,10 @@
1
1
  // 动态切换开关命令
2
+ const fs = require('fs');
2
3
  const chalk = require('chalk');
3
4
  const inquirer = require('inquirer');
4
5
  const { loadConfig } = require('../config/loader');
6
+ const { PATHS } = require('../config/paths');
7
+ const { clearNativeOAuth } = require('../server/services/native-oauth-adapters');
5
8
  const SETTINGS_MANAGERS = {
6
9
  claude: () => require('../server/services/settings-manager'),
7
10
  codex: () => require('../server/services/codex-settings-manager'),
@@ -49,10 +52,97 @@ function getSettingsManager(cliType) {
49
52
  return {
50
53
  setProxyConfig: manager.setProxyConfig,
51
54
  restoreSettings: manager.restoreSettings,
52
- hasBackup: manager.hasBackup
55
+ hasBackup: manager.hasBackup,
56
+ deleteBackup: manager.deleteBackup
53
57
  };
54
58
  }
55
59
 
60
+ function removeActiveChannelMarker(cliType) {
61
+ const markerPath = PATHS.activeChannel?.[cliType];
62
+ if (!markerPath) {
63
+ return;
64
+ }
65
+
66
+ try {
67
+ if (fs.existsSync(markerPath)) {
68
+ fs.unlinkSync(markerPath);
69
+ }
70
+ } catch {
71
+ // ignore cleanup failures
72
+ }
73
+ }
74
+
75
+ function loadActiveChannelId(cliType) {
76
+ const markerPath = PATHS.activeChannel?.[cliType];
77
+ if (!markerPath) {
78
+ return null;
79
+ }
80
+
81
+ try {
82
+ if (!fs.existsSync(markerPath)) {
83
+ return null;
84
+ }
85
+ const payload = JSON.parse(fs.readFileSync(markerPath, 'utf8'));
86
+ return payload?.activeChannelId || null;
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ function pickLatestEnabledChannel(channels = []) {
93
+ const enabledChannels = Array.isArray(channels)
94
+ ? channels.filter(channel => channel?.enabled !== false)
95
+ : [];
96
+
97
+ if (enabledChannels.length > 0) {
98
+ return enabledChannels[0];
99
+ }
100
+
101
+ return Array.isArray(channels) ? channels[0] || null : null;
102
+ }
103
+
104
+ function pickRestoredChannel(cliType, channels = []) {
105
+ const activeChannelId = loadActiveChannelId(cliType);
106
+ if (activeChannelId) {
107
+ const matchedChannel = Array.isArray(channels)
108
+ ? channels.find(channel => channel?.id === activeChannelId)
109
+ : null;
110
+ if (matchedChannel) {
111
+ return matchedChannel;
112
+ }
113
+ }
114
+
115
+ return pickLatestEnabledChannel(channels);
116
+ }
117
+
118
+ function restoreSingleChannelMode(cliType) {
119
+ if (cliType === 'claude') {
120
+ const { getAllChannels, applyChannelToSettings } = require('../server/services/channels');
121
+ const target = pickRestoredChannel(cliType, getAllChannels());
122
+ return target ? applyChannelToSettings(target.id) : null;
123
+ }
124
+
125
+ if (cliType === 'codex') {
126
+ const { getChannels, applyChannelToSettings } = require('../server/services/codex-channels');
127
+ const target = pickRestoredChannel(cliType, getChannels().channels || []);
128
+ return target ? applyChannelToSettings(target.id, { pruneProviders: true }) : null;
129
+ }
130
+
131
+ if (cliType === 'gemini') {
132
+ const { getChannels, applyChannelToSettings } = require('../server/services/gemini-channels');
133
+ const target = pickRestoredChannel(cliType, getChannels().channels || []);
134
+ return target ? applyChannelToSettings(target.id) : null;
135
+ }
136
+
137
+ if (cliType === 'opencode') {
138
+ const { getChannels, applyChannelToSettings } = require('../server/services/opencode-channels');
139
+ const target = pickRestoredChannel(cliType, getChannels().channels || []);
140
+ return target ? applyChannelToSettings(target.id) : null;
141
+ }
142
+
143
+ return null;
144
+ }
145
+
56
146
  /**
57
147
  * 切换动态切换功能
58
148
  */
@@ -133,6 +223,7 @@ async function handleStartProxy(cliType, services) {
133
223
 
134
224
  // 修改配置文件
135
225
  const settingsManager = getSettingsManager(cliType);
226
+ clearNativeOAuth(cliType);
136
227
  settingsManager.setProxyConfig(proxyResult.port);
137
228
  console.log(chalk.green('✅ 配置文件已更新'));
138
229
 
@@ -188,7 +279,7 @@ async function handleStopProxy(cliType, services) {
188
279
 
189
280
  console.log(chalk.yellow('关闭后:'));
190
281
  console.log(chalk.gray('• 代理服务将被停止'));
191
- console.log(chalk.gray('• 配置将恢复到关闭前的状态'));
282
+ console.log(chalk.gray('• 配置将恢复为当前激活渠道的单渠道模式'));
192
283
  console.log(chalk.gray(`• 之后管理渠道将需要重启 ${toolName}\n`));
193
284
 
194
285
  const { confirm } = await inquirer.prompt([
@@ -214,9 +305,13 @@ async function handleStopProxy(cliType, services) {
214
305
 
215
306
  // 恢复配置文件
216
307
  const settingsManager = getSettingsManager(cliType);
217
- if (settingsManager.hasBackup()) {
218
- settingsManager.restoreSettings();
219
- console.log(chalk.green('✅ 配置文件已恢复'));
308
+ settingsManager.deleteBackup?.();
309
+ const restoredChannel = restoreSingleChannelMode(cliType);
310
+ removeActiveChannelMarker(cliType);
311
+ if (restoredChannel?.name) {
312
+ console.log(chalk.green(`✅ 已恢复到渠道: ${restoredChannel.name}`));
313
+ } else {
314
+ console.log(chalk.green('✅ 已清理代理接管状态'));
220
315
  }
221
316
 
222
317
  console.log(chalk.cyan('\n💡 动态切换已关闭'));