@adversity/coding-tool-x 3.1.0 → 3.1.2

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 (142) hide show
  1. package/CHANGELOG.md +39 -18
  2. package/README.md +8 -8
  3. package/dist/web/assets/ConfigTemplates-Bidwfdf2.css +1 -0
  4. package/dist/web/assets/ConfigTemplates-DvcbKKdS.js +1 -0
  5. package/dist/web/assets/Home-BJKPCBuk.css +1 -0
  6. package/dist/web/assets/Home-Cw-F_Wnu.js +1 -0
  7. package/dist/web/assets/PluginManager-ROyoZ-6m.css +1 -0
  8. package/dist/web/assets/PluginManager-jy_4GVxI.js +1 -0
  9. package/dist/web/assets/ProjectList-C1fQb9OW.css +1 -0
  10. package/dist/web/assets/ProjectList-Df1-NcNr.js +1 -0
  11. package/dist/web/assets/SessionList-BGJWyneI.css +1 -0
  12. package/dist/web/assets/SessionList-UWcZtC2r.js +1 -0
  13. package/dist/web/assets/SkillManager-D7pd-d_P.css +1 -0
  14. package/dist/web/assets/SkillManager-IRdseMKB.js +1 -0
  15. package/dist/web/assets/Terminal-BasTyDut.js +1 -0
  16. package/dist/web/assets/Terminal-DGNJeVtc.css +1 -0
  17. package/dist/web/assets/WorkspaceManager-CrwgQgmP.css +1 -0
  18. package/dist/web/assets/WorkspaceManager-D-D2kK1V.js +1 -0
  19. package/dist/web/assets/icons-kcfLIMBB.js +1 -0
  20. package/dist/web/assets/index-CoB3zF0K.css +1 -0
  21. package/dist/web/assets/index-CryrSLv8.js +2 -0
  22. package/dist/web/assets/markdown-BfC0goYb.css +10 -0
  23. package/dist/web/assets/markdown-C9MYpaSi.js +1 -0
  24. package/dist/web/assets/naive-ui-CSrLusZZ.js +1 -0
  25. package/dist/web/assets/{vendors-D2HHw_aW.js → vendors-CO3Upi1d.js} +2 -2
  26. package/dist/web/assets/vue-vendor-DqyWIXEb.js +45 -0
  27. package/dist/web/assets/xterm-6GBZ9nXN.css +32 -0
  28. package/dist/web/assets/xterm-BJzAjXCH.js +13 -0
  29. package/dist/web/index.html +8 -6
  30. package/package.json +4 -2
  31. package/src/commands/channels.js +48 -1
  32. package/src/commands/cli-type.js +4 -2
  33. package/src/commands/daemon.js +81 -12
  34. package/src/commands/doctor.js +10 -9
  35. package/src/commands/list.js +1 -1
  36. package/src/commands/logs.js +6 -4
  37. package/src/commands/port-config.js +24 -4
  38. package/src/commands/proxy-control.js +12 -6
  39. package/src/commands/search.js +1 -1
  40. package/src/commands/security.js +3 -2
  41. package/src/commands/stats.js +226 -52
  42. package/src/commands/switch.js +1 -1
  43. package/src/commands/toggle-proxy.js +31 -6
  44. package/src/commands/update.js +97 -0
  45. package/src/commands/workspace.js +1 -1
  46. package/src/config/default.js +41 -2
  47. package/src/config/loader.js +74 -8
  48. package/src/config/model-metadata.js +415 -0
  49. package/src/config/model-pricing.js +23 -93
  50. package/src/config/paths.js +105 -33
  51. package/src/index.js +64 -3
  52. package/src/plugins/constants.js +3 -2
  53. package/src/plugins/plugin-api.js +1 -1
  54. package/src/reset-config.js +4 -2
  55. package/src/server/api/agents.js +57 -14
  56. package/src/server/api/channels.js +112 -33
  57. package/src/server/api/codex-channels.js +111 -18
  58. package/src/server/api/codex-proxy.js +14 -8
  59. package/src/server/api/commands.js +71 -18
  60. package/src/server/api/config-export.js +0 -6
  61. package/src/server/api/config-registry.js +11 -3
  62. package/src/server/api/config.js +376 -5
  63. package/src/server/api/convert.js +133 -0
  64. package/src/server/api/dashboard.js +22 -6
  65. package/src/server/api/gemini-channels.js +107 -18
  66. package/src/server/api/gemini-proxy.js +14 -8
  67. package/src/server/api/gemini-sessions.js +1 -1
  68. package/src/server/api/health-check.js +4 -3
  69. package/src/server/api/mcp.js +3 -3
  70. package/src/server/api/opencode-channels.js +497 -0
  71. package/src/server/api/opencode-projects.js +99 -0
  72. package/src/server/api/opencode-proxy.js +207 -0
  73. package/src/server/api/opencode-sessions.js +345 -0
  74. package/src/server/api/opencode-statistics.js +57 -0
  75. package/src/server/api/plugins.js +66 -19
  76. package/src/server/api/prompts.js +2 -2
  77. package/src/server/api/proxy.js +7 -4
  78. package/src/server/api/sessions.js +3 -0
  79. package/src/server/api/settings.js +111 -0
  80. package/src/server/api/skills.js +69 -18
  81. package/src/server/api/workspaces.js +78 -6
  82. package/src/server/codex-proxy-server.js +36 -22
  83. package/src/server/dev-server.js +1 -1
  84. package/src/server/gemini-proxy-server.js +21 -7
  85. package/src/server/index.js +174 -58
  86. package/src/server/opencode-proxy-server.js +5486 -0
  87. package/src/server/proxy-server.js +33 -22
  88. package/src/server/services/agents-service.js +61 -24
  89. package/src/server/services/channel-scheduler.js +9 -5
  90. package/src/server/services/channels.js +64 -37
  91. package/src/server/services/codex-channels.js +56 -43
  92. package/src/server/services/codex-sessions.js +105 -6
  93. package/src/server/services/codex-settings-manager.js +271 -49
  94. package/src/server/services/codex-statistics-service.js +2 -2
  95. package/src/server/services/commands-service.js +84 -25
  96. package/src/server/services/config-export-service.js +7 -45
  97. package/src/server/services/config-registry-service.js +63 -17
  98. package/src/server/services/config-sync-manager.js +160 -7
  99. package/src/server/services/config-templates-service.js +204 -51
  100. package/src/server/services/env-checker.js +50 -13
  101. package/src/server/services/env-manager.js +155 -19
  102. package/src/server/services/favorites.js +5 -3
  103. package/src/server/services/gemini-channels.js +33 -44
  104. package/src/server/services/gemini-statistics-service.js +2 -2
  105. package/src/server/services/mcp-service.js +350 -9
  106. package/src/server/services/model-detector.js +707 -221
  107. package/src/server/services/network-access.js +80 -0
  108. package/src/server/services/opencode-channels.js +208 -0
  109. package/src/server/services/opencode-gateway-converter.js +639 -0
  110. package/src/server/services/opencode-sessions.js +931 -0
  111. package/src/server/services/opencode-settings-manager.js +478 -0
  112. package/src/server/services/opencode-statistics-service.js +255 -0
  113. package/src/server/services/plugins-service.js +479 -22
  114. package/src/server/services/prompts-service.js +53 -11
  115. package/src/server/services/proxy-runtime.js +1 -1
  116. package/src/server/services/repo-scanner-base.js +1 -1
  117. package/src/server/services/response-decoder.js +21 -0
  118. package/src/server/services/security-config.js +1 -1
  119. package/src/server/services/session-cache.js +1 -1
  120. package/src/server/services/skill-service.js +300 -46
  121. package/src/server/services/speed-test.js +464 -186
  122. package/src/server/services/statistics-service.js +2 -2
  123. package/src/server/services/terminal-commands.js +10 -3
  124. package/src/server/services/terminal-config.js +1 -1
  125. package/src/server/services/ui-config.js +1 -1
  126. package/src/server/services/workspace-service.js +57 -100
  127. package/src/server/websocket-server.js +156 -8
  128. package/src/ui/menu.js +49 -40
  129. package/src/utils/port-helper.js +22 -8
  130. package/src/utils/session.js +5 -4
  131. package/dist/web/assets/icons-CO_2OFES.js +0 -1
  132. package/dist/web/assets/index-DI8QOi-E.js +0 -14
  133. package/dist/web/assets/index-uLHGdeZh.css +0 -41
  134. package/dist/web/assets/naive-ui-B1re3c-e.js +0 -1
  135. package/dist/web/assets/vue-vendor-6JaYHOiI.js +0 -44
  136. package/src/server/api/oauth.js +0 -294
  137. package/src/server/api/permissions.js +0 -385
  138. package/src/server/config/oauth-providers.js +0 -68
  139. package/src/server/services/oauth-callback-server.js +0 -284
  140. package/src/server/services/oauth-service.js +0 -378
  141. package/src/server/services/oauth-token-storage.js +0 -135
  142. package/src/server/services/permission-templates-service.js +0 -308
@@ -7,15 +7,26 @@
7
7
  const fs = require('fs');
8
8
  const path = require('path');
9
9
  const os = require('os');
10
+ const { NATIVE_PATHS } = require('../../config/paths');
10
11
 
11
12
  // Prompts 配置文件路径
12
- const CC_TOOL_DIR = path.join(os.homedir(), '.claude', 'cc-tool');
13
+ const CC_TOOL_DIR = path.join(os.homedir(), '.cc-tool');
13
14
  const PROMPTS_FILE = path.join(CC_TOOL_DIR, 'prompts.json');
14
15
 
15
16
  // 各平台提示词文件路径
16
17
  const CLAUDE_PROMPT_PATH = path.join(os.homedir(), '.claude', 'CLAUDE.md');
17
18
  const CODEX_PROMPT_PATH = path.join(os.homedir(), '.codex', 'AGENTS.md');
18
19
  const GEMINI_PROMPT_PATH = path.join(os.homedir(), '.gemini', 'GEMINI.md');
20
+ const OPENCODE_PROMPT_PATH = path.join(NATIVE_PATHS.opencode.config, 'AGENTS.md');
21
+
22
+ function normalizeApps(apps = {}, defaults = { claude: true, codex: true, gemini: true, opencode: false }) {
23
+ return {
24
+ claude: apps.claude !== undefined ? !!apps.claude : defaults.claude,
25
+ codex: apps.codex !== undefined ? !!apps.codex : defaults.codex,
26
+ gemini: apps.gemini !== undefined ? !!apps.gemini : defaults.gemini,
27
+ opencode: apps.opencode !== undefined ? !!apps.opencode : defaults.opencode
28
+ };
29
+ }
19
30
 
20
31
  // 内置模板(不是"默认",只是可选模板)
21
32
  const BUILTIN_TEMPLATES = [
@@ -38,7 +49,7 @@ const BUILTIN_TEMPLATES = [
38
49
  2. 具体问题列表(按严重程度排序)
39
50
  3. 改进建议和示例代码
40
51
  `,
41
- apps: { claude: true, codex: true, gemini: true },
52
+ apps: { claude: true, codex: true, gemini: true, opencode: true },
42
53
  isBuiltin: true
43
54
  },
44
55
  {
@@ -62,7 +73,7 @@ const BUILTIN_TEMPLATES = [
62
73
  - 建议的解决方案
63
74
  - 预防措施
64
75
  `,
65
- apps: { claude: true, codex: true, gemini: true },
76
+ apps: { claude: true, codex: true, gemini: true, opencode: true },
66
77
  isBuiltin: true
67
78
  },
68
79
  {
@@ -85,7 +96,7 @@ const BUILTIN_TEMPLATES = [
85
96
  - 简化条件表达式
86
97
  - 消除重复代码
87
98
  `,
88
- apps: { claude: true, codex: true, gemini: true },
99
+ apps: { claude: true, codex: true, gemini: true, opencode: true },
89
100
  isBuiltin: true
90
101
  }
91
102
  ];
@@ -198,7 +209,7 @@ function initPromptsData() {
198
209
  name: '当前使用',
199
210
  description: '从现有配置导入',
200
211
  content: existingContent,
201
- apps: { claude: true, codex: false, gemini: false },
212
+ apps: normalizeApps({ claude: true, codex: false, gemini: false, opencode: false }),
202
213
  isBuiltin: false,
203
214
  isImported: true,
204
215
  createdAt: Date.now(),
@@ -212,6 +223,25 @@ function initPromptsData() {
212
223
  return initialData;
213
224
  }
214
225
 
226
+ let updated = false;
227
+ for (const preset of Object.values(data.presets || {})) {
228
+ const normalizedApps = normalizeApps(preset.apps);
229
+ if (
230
+ !preset.apps ||
231
+ preset.apps.claude !== normalizedApps.claude ||
232
+ preset.apps.codex !== normalizedApps.codex ||
233
+ preset.apps.gemini !== normalizedApps.gemini ||
234
+ preset.apps.opencode !== normalizedApps.opencode
235
+ ) {
236
+ preset.apps = normalizedApps;
237
+ updated = true;
238
+ }
239
+ }
240
+
241
+ if (updated) {
242
+ writeJsonFile(PROMPTS_FILE, data);
243
+ }
244
+
215
245
  return data;
216
246
  }
217
247
 
@@ -288,9 +318,7 @@ function savePreset(preset) {
288
318
  preset.updatedAt = Date.now();
289
319
 
290
320
  // 确保 apps 字段存在
291
- if (!preset.apps) {
292
- preset.apps = { claude: true, codex: true, gemini: true };
293
- }
321
+ preset.apps = normalizeApps(preset.apps);
294
322
 
295
323
  data.presets[preset.id] = preset;
296
324
  writeJsonFile(PROMPTS_FILE, data);
@@ -359,7 +387,8 @@ async function deactivatePrompt() {
359
387
  const results = {
360
388
  claude: deleteFile(CLAUDE_PROMPT_PATH),
361
389
  codex: deleteFile(CODEX_PROMPT_PATH),
362
- gemini: deleteFile(GEMINI_PROMPT_PATH)
390
+ gemini: deleteFile(GEMINI_PROMPT_PATH),
391
+ opencode: deleteFile(OPENCODE_PROMPT_PATH)
363
392
  };
364
393
 
365
394
  console.log('[Prompts] Deactivated and removed prompt files:', results);
@@ -375,7 +404,8 @@ async function deactivatePrompt() {
375
404
  * 同步预设到所有已启用的平台
376
405
  */
377
406
  async function syncPresetToAllPlatforms(preset) {
378
- const { apps, content } = preset;
407
+ const apps = normalizeApps(preset.apps);
408
+ const { content } = preset;
379
409
 
380
410
  if (apps.claude) {
381
411
  writeTextFile(CLAUDE_PROMPT_PATH, content);
@@ -391,6 +421,11 @@ async function syncPresetToAllPlatforms(preset) {
391
421
  writeTextFile(GEMINI_PROMPT_PATH, content);
392
422
  console.log('[Prompts] Synced to Gemini:', GEMINI_PROMPT_PATH);
393
423
  }
424
+
425
+ if (apps.opencode) {
426
+ writeTextFile(OPENCODE_PROMPT_PATH, content);
427
+ console.log('[Prompts] Synced to OpenCode:', OPENCODE_PROMPT_PATH);
428
+ }
394
429
  }
395
430
 
396
431
  /**
@@ -404,6 +439,8 @@ function readPlatformPrompt(platform) {
404
439
  return readTextFile(CODEX_PROMPT_PATH, '');
405
440
  case 'gemini':
406
441
  return readTextFile(GEMINI_PROMPT_PATH, '');
442
+ case 'opencode':
443
+ return readTextFile(OPENCODE_PROMPT_PATH, '');
407
444
  default:
408
445
  throw new Error(`无效的平台: ${platform}`);
409
446
  }
@@ -428,6 +465,11 @@ function getPlatformStatus() {
428
465
  path: GEMINI_PROMPT_PATH,
429
466
  exists: fs.existsSync(GEMINI_PROMPT_PATH),
430
467
  content: readTextFile(GEMINI_PROMPT_PATH, '')
468
+ },
469
+ opencode: {
470
+ path: OPENCODE_PROMPT_PATH,
471
+ exists: fs.existsSync(OPENCODE_PROMPT_PATH),
472
+ content: readTextFile(OPENCODE_PROMPT_PATH, '')
431
473
  }
432
474
  };
433
475
  }
@@ -450,7 +492,7 @@ function importFromPlatform(platform, presetName) {
450
492
  name: presetName || `从 ${platform} 导入`,
451
493
  description: `从 ${platform} 导入的提示词`,
452
494
  content,
453
- apps: { claude: false, codex: false, gemini: false },
495
+ apps: normalizeApps({ claude: false, codex: false, gemini: false, opencode: false }),
454
496
  isBuiltin: false,
455
497
  createdAt: Date.now(),
456
498
  updatedAt: Date.now()
@@ -3,7 +3,7 @@ const path = require('path');
3
3
  const os = require('os');
4
4
 
5
5
  function getRuntimeFilePath(proxyType) {
6
- const ccToolDir = path.join(os.homedir(), '.claude', 'cc-tool');
6
+ const ccToolDir = path.join(os.homedir(), '.cc-tool');
7
7
  if (!fs.existsSync(ccToolDir)) {
8
8
  fs.mkdirSync(ccToolDir, { recursive: true });
9
9
  }
@@ -42,7 +42,7 @@ class RepoScannerBase {
42
42
  this.fileExtension = options.fileExtension || '.md';
43
43
  this.defaultRepos = options.defaultRepos || [];
44
44
 
45
- this.configDir = path.join(os.homedir(), '.claude', 'cc-tool');
45
+ this.configDir = path.join(os.homedir(), '.cc-tool');
46
46
  this.reposConfigPath = path.join(this.configDir, `${this.type}-repos.json`);
47
47
  this.cachePath = path.join(this.configDir, `${this.type}-cache.json`);
48
48
 
@@ -0,0 +1,21 @@
1
+ const zlib = require('zlib');
2
+
3
+ function createDecodedStream(res) {
4
+ const encoding = String(res.headers['content-encoding'] || '').toLowerCase();
5
+
6
+ if (encoding.includes('gzip')) {
7
+ return res.pipe(zlib.createGunzip());
8
+ }
9
+ if (encoding.includes('deflate')) {
10
+ return res.pipe(zlib.createInflate());
11
+ }
12
+ if (encoding.includes('br') && typeof zlib.createBrotliDecompress === 'function') {
13
+ return res.pipe(zlib.createBrotliDecompress());
14
+ }
15
+
16
+ return res;
17
+ }
18
+
19
+ module.exports = {
20
+ createDecodedStream
21
+ };
@@ -3,7 +3,7 @@ const path = require('path');
3
3
  const os = require('os');
4
4
  const crypto = require('crypto');
5
5
 
6
- const SECURITY_DIR = path.join(os.homedir(), '.claude', 'cc-tool');
6
+ const SECURITY_DIR = path.join(os.homedir(), '.cc-tool');
7
7
  const SECURITY_FILE = path.join(SECURITY_DIR, 'security.json');
8
8
 
9
9
  const DEFAULT_SECURITY_CONFIG = {
@@ -11,7 +11,7 @@ let hasMessagesPersisted = {};
11
11
  let hasMessagesPersistTimer = null;
12
12
 
13
13
  function getCcToolDir() {
14
- return path.join(os.homedir(), '.claude', 'cc-tool');
14
+ return path.join(os.homedir(), '.cc-tool');
15
15
  }
16
16
 
17
17
  function ensureDirExists(dir) {