@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.
- package/CHANGELOG.md +39 -18
- package/README.md +8 -8
- package/dist/web/assets/ConfigTemplates-Bidwfdf2.css +1 -0
- package/dist/web/assets/ConfigTemplates-DvcbKKdS.js +1 -0
- package/dist/web/assets/Home-BJKPCBuk.css +1 -0
- package/dist/web/assets/Home-Cw-F_Wnu.js +1 -0
- package/dist/web/assets/PluginManager-ROyoZ-6m.css +1 -0
- package/dist/web/assets/PluginManager-jy_4GVxI.js +1 -0
- package/dist/web/assets/ProjectList-C1fQb9OW.css +1 -0
- package/dist/web/assets/ProjectList-Df1-NcNr.js +1 -0
- package/dist/web/assets/SessionList-BGJWyneI.css +1 -0
- package/dist/web/assets/SessionList-UWcZtC2r.js +1 -0
- package/dist/web/assets/SkillManager-D7pd-d_P.css +1 -0
- package/dist/web/assets/SkillManager-IRdseMKB.js +1 -0
- package/dist/web/assets/Terminal-BasTyDut.js +1 -0
- package/dist/web/assets/Terminal-DGNJeVtc.css +1 -0
- package/dist/web/assets/WorkspaceManager-CrwgQgmP.css +1 -0
- package/dist/web/assets/WorkspaceManager-D-D2kK1V.js +1 -0
- package/dist/web/assets/icons-kcfLIMBB.js +1 -0
- package/dist/web/assets/index-CoB3zF0K.css +1 -0
- package/dist/web/assets/index-CryrSLv8.js +2 -0
- package/dist/web/assets/markdown-BfC0goYb.css +10 -0
- package/dist/web/assets/markdown-C9MYpaSi.js +1 -0
- package/dist/web/assets/naive-ui-CSrLusZZ.js +1 -0
- package/dist/web/assets/{vendors-D2HHw_aW.js → vendors-CO3Upi1d.js} +2 -2
- package/dist/web/assets/vue-vendor-DqyWIXEb.js +45 -0
- package/dist/web/assets/xterm-6GBZ9nXN.css +32 -0
- package/dist/web/assets/xterm-BJzAjXCH.js +13 -0
- package/dist/web/index.html +8 -6
- package/package.json +4 -2
- package/src/commands/channels.js +48 -1
- package/src/commands/cli-type.js +4 -2
- package/src/commands/daemon.js +81 -12
- package/src/commands/doctor.js +10 -9
- package/src/commands/list.js +1 -1
- package/src/commands/logs.js +6 -4
- package/src/commands/port-config.js +24 -4
- package/src/commands/proxy-control.js +12 -6
- package/src/commands/search.js +1 -1
- package/src/commands/security.js +3 -2
- package/src/commands/stats.js +226 -52
- package/src/commands/switch.js +1 -1
- package/src/commands/toggle-proxy.js +31 -6
- package/src/commands/update.js +97 -0
- package/src/commands/workspace.js +1 -1
- package/src/config/default.js +41 -2
- package/src/config/loader.js +74 -8
- package/src/config/model-metadata.js +415 -0
- package/src/config/model-pricing.js +23 -93
- package/src/config/paths.js +105 -33
- package/src/index.js +64 -3
- package/src/plugins/constants.js +3 -2
- package/src/plugins/plugin-api.js +1 -1
- package/src/reset-config.js +4 -2
- package/src/server/api/agents.js +57 -14
- package/src/server/api/channels.js +112 -33
- package/src/server/api/codex-channels.js +111 -18
- package/src/server/api/codex-proxy.js +14 -8
- package/src/server/api/commands.js +71 -18
- package/src/server/api/config-export.js +0 -6
- package/src/server/api/config-registry.js +11 -3
- package/src/server/api/config.js +376 -5
- package/src/server/api/convert.js +133 -0
- package/src/server/api/dashboard.js +22 -6
- package/src/server/api/gemini-channels.js +107 -18
- package/src/server/api/gemini-proxy.js +14 -8
- package/src/server/api/gemini-sessions.js +1 -1
- package/src/server/api/health-check.js +4 -3
- package/src/server/api/mcp.js +3 -3
- package/src/server/api/opencode-channels.js +497 -0
- package/src/server/api/opencode-projects.js +99 -0
- package/src/server/api/opencode-proxy.js +207 -0
- package/src/server/api/opencode-sessions.js +345 -0
- package/src/server/api/opencode-statistics.js +57 -0
- package/src/server/api/plugins.js +66 -19
- package/src/server/api/prompts.js +2 -2
- package/src/server/api/proxy.js +7 -4
- package/src/server/api/sessions.js +3 -0
- package/src/server/api/settings.js +111 -0
- package/src/server/api/skills.js +69 -18
- package/src/server/api/workspaces.js +78 -6
- package/src/server/codex-proxy-server.js +36 -22
- package/src/server/dev-server.js +1 -1
- package/src/server/gemini-proxy-server.js +21 -7
- package/src/server/index.js +174 -58
- package/src/server/opencode-proxy-server.js +5486 -0
- package/src/server/proxy-server.js +33 -22
- package/src/server/services/agents-service.js +61 -24
- package/src/server/services/channel-scheduler.js +9 -5
- package/src/server/services/channels.js +64 -37
- package/src/server/services/codex-channels.js +56 -43
- package/src/server/services/codex-sessions.js +105 -6
- package/src/server/services/codex-settings-manager.js +271 -49
- package/src/server/services/codex-statistics-service.js +2 -2
- package/src/server/services/commands-service.js +84 -25
- package/src/server/services/config-export-service.js +7 -45
- package/src/server/services/config-registry-service.js +63 -17
- package/src/server/services/config-sync-manager.js +160 -7
- package/src/server/services/config-templates-service.js +204 -51
- package/src/server/services/env-checker.js +50 -13
- package/src/server/services/env-manager.js +155 -19
- package/src/server/services/favorites.js +5 -3
- package/src/server/services/gemini-channels.js +33 -44
- package/src/server/services/gemini-statistics-service.js +2 -2
- package/src/server/services/mcp-service.js +350 -9
- package/src/server/services/model-detector.js +707 -221
- package/src/server/services/network-access.js +80 -0
- package/src/server/services/opencode-channels.js +208 -0
- package/src/server/services/opencode-gateway-converter.js +639 -0
- package/src/server/services/opencode-sessions.js +931 -0
- package/src/server/services/opencode-settings-manager.js +478 -0
- package/src/server/services/opencode-statistics-service.js +255 -0
- package/src/server/services/plugins-service.js +479 -22
- package/src/server/services/prompts-service.js +53 -11
- package/src/server/services/proxy-runtime.js +1 -1
- package/src/server/services/repo-scanner-base.js +1 -1
- package/src/server/services/response-decoder.js +21 -0
- package/src/server/services/security-config.js +1 -1
- package/src/server/services/session-cache.js +1 -1
- package/src/server/services/skill-service.js +300 -46
- package/src/server/services/speed-test.js +464 -186
- package/src/server/services/statistics-service.js +2 -2
- package/src/server/services/terminal-commands.js +10 -3
- package/src/server/services/terminal-config.js +1 -1
- package/src/server/services/ui-config.js +1 -1
- package/src/server/services/workspace-service.js +57 -100
- package/src/server/websocket-server.js +156 -8
- package/src/ui/menu.js +49 -40
- package/src/utils/port-helper.js +22 -8
- package/src/utils/session.js +5 -4
- package/dist/web/assets/icons-CO_2OFES.js +0 -1
- package/dist/web/assets/index-DI8QOi-E.js +0 -14
- package/dist/web/assets/index-uLHGdeZh.css +0 -41
- package/dist/web/assets/naive-ui-B1re3c-e.js +0 -1
- package/dist/web/assets/vue-vendor-6JaYHOiI.js +0 -44
- package/src/server/api/oauth.js +0 -294
- package/src/server/api/permissions.js +0 -385
- package/src/server/config/oauth-providers.js +0 -68
- package/src/server/services/oauth-callback-server.js +0 -284
- package/src/server/services/oauth-service.js +0 -378
- package/src/server/services/oauth-token-storage.js +0 -135
- 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(), '.
|
|
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
|
-
|
|
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
|
|
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(), '.
|
|
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(), '.
|
|
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(), '.
|
|
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 = {
|