@adversity/coding-tool-x 3.1.2 → 3.1.4
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 +23 -0
- package/dist/web/assets/Analytics-Blo8_rhE.css +1 -0
- package/dist/web/assets/Analytics-DEIGaSFz.js +39 -0
- package/dist/web/assets/{ConfigTemplates-DvcbKKdS.js → ConfigTemplates-BZaehll1.js} +1 -1
- package/dist/web/assets/{Home-BJKPCBuk.css → Home-CyCIx4BA.css} +1 -1
- package/dist/web/assets/{Home-Cw-F_Wnu.js → Home-DIIH5bAk.js} +1 -1
- package/dist/web/assets/{PluginManager-jy_4GVxI.js → PluginManager-b4IlavFA.js} +1 -1
- package/dist/web/assets/{ProjectList-Df1-NcNr.js → ProjectList-QaqzjEea.js} +1 -1
- package/dist/web/assets/SessionList-CXUr6S7w.css +1 -0
- package/dist/web/assets/SessionList-Cz_hrGmL.js +1 -0
- package/dist/web/assets/{SkillManager-IRdseMKB.js → SkillManager-B-Rcb9xY.js} +1 -1
- package/dist/web/assets/{Terminal-BasTyDut.js → Terminal-C8CFJEkx.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-D-D2kK1V.js → WorkspaceManager-XaQj8BRE.js} +1 -1
- package/dist/web/assets/icons-BxcwoY5F.js +1 -0
- package/dist/web/assets/index-B_kPXCbH.js +2 -0
- package/dist/web/assets/index-DUNAVDGb.css +1 -0
- package/dist/web/assets/naive-ui-BIXcURHZ.js +1 -0
- package/dist/web/assets/{vendors-CO3Upi1d.js → vendors-i5CBGnlm.js} +1 -1
- package/dist/web/assets/{vue-vendor-DqyWIXEb.js → vue-vendor-PKd8utv_.js} +1 -1
- package/dist/web/index.html +6 -6
- package/package.json +1 -1
- package/src/config/default.js +7 -29
- package/src/config/loader.js +6 -3
- package/src/config/model-metadata.js +102 -350
- package/src/config/model-metadata.json +125 -0
- package/src/server/api/channels.js +16 -39
- package/src/server/api/codex-channels.js +15 -43
- package/src/server/api/commands.js +0 -77
- package/src/server/api/config.js +4 -1
- package/src/server/api/gemini-channels.js +16 -40
- package/src/server/api/opencode-channels.js +25 -51
- package/src/server/api/opencode-proxy.js +1 -1
- package/src/server/api/opencode-sessions.js +0 -7
- package/src/server/api/sessions.js +11 -68
- package/src/server/api/settings.js +66 -39
- package/src/server/api/skills.js +0 -44
- package/src/server/api/statistics.js +115 -1
- package/src/server/codex-proxy-server.js +26 -55
- package/src/server/gemini-proxy-server.js +15 -14
- package/src/server/index.js +0 -3
- package/src/server/opencode-proxy-server.js +45 -121
- package/src/server/proxy-server.js +2 -4
- package/src/server/services/commands-service.js +0 -29
- package/src/server/services/config-templates-service.js +38 -28
- package/src/server/services/env-checker.js +73 -8
- package/src/server/services/plugins-service.js +37 -28
- package/src/server/services/pty-manager.js +22 -18
- package/src/server/services/skill-service.js +1 -49
- package/src/server/services/speed-test.js +40 -3
- package/src/server/services/statistics-service.js +238 -1
- package/src/server/utils/pricing.js +51 -60
- package/dist/web/assets/SessionList-BGJWyneI.css +0 -1
- package/dist/web/assets/SessionList-UWcZtC2r.js +0 -1
- package/dist/web/assets/icons-kcfLIMBB.js +0 -1
- package/dist/web/assets/index-CoB3zF0K.css +0 -1
- package/dist/web/assets/index-CryrSLv8.js +0 -2
- package/dist/web/assets/naive-ui-CSrLusZZ.js +0 -1
- package/src/server/api/convert.js +0 -260
- package/src/server/services/session-converter.js +0 -577
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
const express = require('express');
|
|
2
|
-
const router = express.Router();
|
|
3
|
-
const { convertSession, previewConversion } = require('../services/session-converter');
|
|
4
|
-
const {
|
|
5
|
-
SUPPORTED_SOURCE_TYPES,
|
|
6
|
-
SUPPORTED_TARGET_APIS,
|
|
7
|
-
convertToOpenCodePayload,
|
|
8
|
-
convertClaudeToOpenCodePayload,
|
|
9
|
-
convertCodexToOpenCodePayload,
|
|
10
|
-
convertGeminiToOpenCodePayload,
|
|
11
|
-
normalizeSourceType
|
|
12
|
-
} = require('../services/opencode-gateway-converter');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* 获取支持的格式列表
|
|
16
|
-
* GET /api/convert/formats
|
|
17
|
-
*/
|
|
18
|
-
router.get('/formats', (req, res) => {
|
|
19
|
-
res.json({
|
|
20
|
-
formats: [
|
|
21
|
-
{
|
|
22
|
-
id: 'claude',
|
|
23
|
-
name: 'Claude Code',
|
|
24
|
-
description: 'Anthropic Claude Code CLI session format',
|
|
25
|
-
extension: '.jsonl',
|
|
26
|
-
icon: 'claude'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
id: 'codex',
|
|
30
|
-
name: 'OpenAI Codex',
|
|
31
|
-
description: 'OpenAI Codex CLI session format',
|
|
32
|
-
extension: '.jsonl',
|
|
33
|
-
icon: 'codex'
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
id: 'gemini',
|
|
37
|
-
name: 'Google Gemini',
|
|
38
|
-
description: 'Google Gemini CLI session format',
|
|
39
|
-
extension: '.json',
|
|
40
|
-
icon: 'gemini'
|
|
41
|
-
}
|
|
42
|
-
],
|
|
43
|
-
conversions: [
|
|
44
|
-
{ from: 'claude', to: 'codex' },
|
|
45
|
-
{ from: 'claude', to: 'gemini' },
|
|
46
|
-
{ from: 'codex', to: 'claude' },
|
|
47
|
-
{ from: 'codex', to: 'gemini' },
|
|
48
|
-
{ from: 'gemini', to: 'claude' },
|
|
49
|
-
{ from: 'gemini', to: 'codex' }
|
|
50
|
-
]
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* 获取 OpenCode 网关支持格式
|
|
56
|
-
* GET /api/convert/opencode/formats
|
|
57
|
-
*/
|
|
58
|
-
router.get('/opencode/formats', (req, res) => {
|
|
59
|
-
res.json({
|
|
60
|
-
sourceTypes: SUPPORTED_SOURCE_TYPES.map(type => ({
|
|
61
|
-
id: type,
|
|
62
|
-
name: type === 'claude'
|
|
63
|
-
? 'Claude Code'
|
|
64
|
-
: type === 'codex'
|
|
65
|
-
? 'Codex'
|
|
66
|
-
: 'Gemini'
|
|
67
|
-
})),
|
|
68
|
-
target: 'opencode',
|
|
69
|
-
targetApis: SUPPORTED_TARGET_APIS,
|
|
70
|
-
defaultTargetApi: 'responses',
|
|
71
|
-
endpoints: {
|
|
72
|
-
responses: '/v1/responses',
|
|
73
|
-
'chat.completions': '/v1/chat/completions'
|
|
74
|
-
},
|
|
75
|
-
sourceEndpoints: {
|
|
76
|
-
claude: '/api/convert/opencode/claude',
|
|
77
|
-
codex: '/api/convert/opencode/codex',
|
|
78
|
-
gemini: '/api/convert/opencode/gemini'
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
function handleOpenCodeConvert(req, res, sourceType, converter) {
|
|
84
|
-
try {
|
|
85
|
-
const { payload, options = {} } = req.body || {};
|
|
86
|
-
|
|
87
|
-
if (!payload) {
|
|
88
|
-
return res.status(400).json({
|
|
89
|
-
success: false,
|
|
90
|
-
error: 'Missing required parameters: payload'
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const result = converter({ payload, options });
|
|
95
|
-
return res.json({
|
|
96
|
-
success: true,
|
|
97
|
-
...result
|
|
98
|
-
});
|
|
99
|
-
} catch (error) {
|
|
100
|
-
console.error(`[Convert API] OpenCode ${sourceType} convert error:`, error);
|
|
101
|
-
return res.status(500).json({
|
|
102
|
-
success: false,
|
|
103
|
-
error: error.message
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Claude Code -> OpenCode
|
|
110
|
-
* POST /api/convert/opencode/claude
|
|
111
|
-
* Body: { payload, options? }
|
|
112
|
-
*/
|
|
113
|
-
router.post('/opencode/claude', (req, res) => {
|
|
114
|
-
return handleOpenCodeConvert(req, res, 'claude', convertClaudeToOpenCodePayload);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Codex -> OpenCode
|
|
119
|
-
* POST /api/convert/opencode/codex
|
|
120
|
-
* Body: { payload, options? }
|
|
121
|
-
*/
|
|
122
|
-
router.post('/opencode/codex', (req, res) => {
|
|
123
|
-
return handleOpenCodeConvert(req, res, 'codex', convertCodexToOpenCodePayload);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Gemini -> OpenCode
|
|
128
|
-
* POST /api/convert/opencode/gemini
|
|
129
|
-
* Body: { payload, options? }
|
|
130
|
-
*/
|
|
131
|
-
router.post('/opencode/gemini', (req, res) => {
|
|
132
|
-
return handleOpenCodeConvert(req, res, 'gemini', convertGeminiToOpenCodePayload);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* 在线转换为 OpenCode 可处理格式
|
|
137
|
-
* POST /api/convert/opencode
|
|
138
|
-
* Body: { sourceType, payload, options? }
|
|
139
|
-
*/
|
|
140
|
-
router.post('/opencode', (req, res) => {
|
|
141
|
-
try {
|
|
142
|
-
const { sourceType, payload, options = {} } = req.body || {};
|
|
143
|
-
|
|
144
|
-
if (!sourceType || !payload) {
|
|
145
|
-
return res.status(400).json({
|
|
146
|
-
success: false,
|
|
147
|
-
error: 'Missing required parameters: sourceType, payload'
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const normalized = normalizeSourceType(sourceType);
|
|
152
|
-
if (!SUPPORTED_SOURCE_TYPES.includes(normalized)) {
|
|
153
|
-
return res.status(400).json({
|
|
154
|
-
success: false,
|
|
155
|
-
error: `Invalid sourceType: ${sourceType}. Must be one of: ${SUPPORTED_SOURCE_TYPES.join(', ')}`
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const result = convertToOpenCodePayload({
|
|
160
|
-
sourceType: normalized,
|
|
161
|
-
payload,
|
|
162
|
-
options
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
return res.json({
|
|
166
|
-
success: true,
|
|
167
|
-
...result
|
|
168
|
-
});
|
|
169
|
-
} catch (error) {
|
|
170
|
-
console.error('[Convert API] OpenCode gateway convert error:', error);
|
|
171
|
-
return res.status(500).json({
|
|
172
|
-
success: false,
|
|
173
|
-
error: error.message
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* 预览转换结果
|
|
180
|
-
* POST /api/convert/preview
|
|
181
|
-
* Body: { sourceType, sessionId }
|
|
182
|
-
*/
|
|
183
|
-
router.post('/preview', async (req, res) => {
|
|
184
|
-
try {
|
|
185
|
-
const { sourceType, sessionId } = req.body;
|
|
186
|
-
|
|
187
|
-
if (!sourceType || !sessionId) {
|
|
188
|
-
return res.status(400).json({
|
|
189
|
-
success: false,
|
|
190
|
-
error: 'Missing required parameters: sourceType, sessionId'
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const preview = await previewConversion(sourceType, sessionId);
|
|
195
|
-
|
|
196
|
-
res.json({
|
|
197
|
-
success: true,
|
|
198
|
-
preview
|
|
199
|
-
});
|
|
200
|
-
} catch (error) {
|
|
201
|
-
console.error('[Convert API] Preview error:', error);
|
|
202
|
-
res.status(500).json({
|
|
203
|
-
success: false,
|
|
204
|
-
error: error.message
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* 执行会话转换
|
|
211
|
-
* POST /api/convert
|
|
212
|
-
* Body: { sourceType, targetType, sessionId, options }
|
|
213
|
-
*/
|
|
214
|
-
router.post('/', async (req, res) => {
|
|
215
|
-
try {
|
|
216
|
-
const { sourceType, targetType, sessionId, options = {} } = req.body;
|
|
217
|
-
|
|
218
|
-
// 验证必需参数
|
|
219
|
-
if (!sourceType || !targetType || !sessionId) {
|
|
220
|
-
return res.status(400).json({
|
|
221
|
-
success: false,
|
|
222
|
-
error: 'Missing required parameters: sourceType, targetType, sessionId'
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// 验证格式
|
|
227
|
-
const validTypes = ['claude', 'codex', 'gemini'];
|
|
228
|
-
if (!validTypes.includes(sourceType)) {
|
|
229
|
-
return res.status(400).json({
|
|
230
|
-
success: false,
|
|
231
|
-
error: `Invalid sourceType: ${sourceType}. Must be one of: ${validTypes.join(', ')}`
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
if (!validTypes.includes(targetType)) {
|
|
235
|
-
return res.status(400).json({
|
|
236
|
-
success: false,
|
|
237
|
-
error: `Invalid targetType: ${targetType}. Must be one of: ${validTypes.join(', ')}`
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
if (sourceType === targetType) {
|
|
241
|
-
return res.status(400).json({
|
|
242
|
-
success: false,
|
|
243
|
-
error: 'Source and target types must be different'
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// 执行转换
|
|
248
|
-
const result = await convertSession(sourceType, targetType, sessionId, options);
|
|
249
|
-
|
|
250
|
-
res.json(result);
|
|
251
|
-
} catch (error) {
|
|
252
|
-
console.error('[Convert API] Conversion error:', error);
|
|
253
|
-
res.status(500).json({
|
|
254
|
-
success: false,
|
|
255
|
-
error: error.message
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
module.exports = router;
|