@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.
Files changed (59) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/web/assets/Analytics-Blo8_rhE.css +1 -0
  3. package/dist/web/assets/Analytics-DEIGaSFz.js +39 -0
  4. package/dist/web/assets/{ConfigTemplates-DvcbKKdS.js → ConfigTemplates-BZaehll1.js} +1 -1
  5. package/dist/web/assets/{Home-BJKPCBuk.css → Home-CyCIx4BA.css} +1 -1
  6. package/dist/web/assets/{Home-Cw-F_Wnu.js → Home-DIIH5bAk.js} +1 -1
  7. package/dist/web/assets/{PluginManager-jy_4GVxI.js → PluginManager-b4IlavFA.js} +1 -1
  8. package/dist/web/assets/{ProjectList-Df1-NcNr.js → ProjectList-QaqzjEea.js} +1 -1
  9. package/dist/web/assets/SessionList-CXUr6S7w.css +1 -0
  10. package/dist/web/assets/SessionList-Cz_hrGmL.js +1 -0
  11. package/dist/web/assets/{SkillManager-IRdseMKB.js → SkillManager-B-Rcb9xY.js} +1 -1
  12. package/dist/web/assets/{Terminal-BasTyDut.js → Terminal-C8CFJEkx.js} +1 -1
  13. package/dist/web/assets/{WorkspaceManager-D-D2kK1V.js → WorkspaceManager-XaQj8BRE.js} +1 -1
  14. package/dist/web/assets/icons-BxcwoY5F.js +1 -0
  15. package/dist/web/assets/index-B_kPXCbH.js +2 -0
  16. package/dist/web/assets/index-DUNAVDGb.css +1 -0
  17. package/dist/web/assets/naive-ui-BIXcURHZ.js +1 -0
  18. package/dist/web/assets/{vendors-CO3Upi1d.js → vendors-i5CBGnlm.js} +1 -1
  19. package/dist/web/assets/{vue-vendor-DqyWIXEb.js → vue-vendor-PKd8utv_.js} +1 -1
  20. package/dist/web/index.html +6 -6
  21. package/package.json +1 -1
  22. package/src/config/default.js +7 -29
  23. package/src/config/loader.js +6 -3
  24. package/src/config/model-metadata.js +102 -350
  25. package/src/config/model-metadata.json +125 -0
  26. package/src/server/api/channels.js +16 -39
  27. package/src/server/api/codex-channels.js +15 -43
  28. package/src/server/api/commands.js +0 -77
  29. package/src/server/api/config.js +4 -1
  30. package/src/server/api/gemini-channels.js +16 -40
  31. package/src/server/api/opencode-channels.js +25 -51
  32. package/src/server/api/opencode-proxy.js +1 -1
  33. package/src/server/api/opencode-sessions.js +0 -7
  34. package/src/server/api/sessions.js +11 -68
  35. package/src/server/api/settings.js +66 -39
  36. package/src/server/api/skills.js +0 -44
  37. package/src/server/api/statistics.js +115 -1
  38. package/src/server/codex-proxy-server.js +26 -55
  39. package/src/server/gemini-proxy-server.js +15 -14
  40. package/src/server/index.js +0 -3
  41. package/src/server/opencode-proxy-server.js +45 -121
  42. package/src/server/proxy-server.js +2 -4
  43. package/src/server/services/commands-service.js +0 -29
  44. package/src/server/services/config-templates-service.js +38 -28
  45. package/src/server/services/env-checker.js +73 -8
  46. package/src/server/services/plugins-service.js +37 -28
  47. package/src/server/services/pty-manager.js +22 -18
  48. package/src/server/services/skill-service.js +1 -49
  49. package/src/server/services/speed-test.js +40 -3
  50. package/src/server/services/statistics-service.js +238 -1
  51. package/src/server/utils/pricing.js +51 -60
  52. package/dist/web/assets/SessionList-BGJWyneI.css +0 -1
  53. package/dist/web/assets/SessionList-UWcZtC2r.js +0 -1
  54. package/dist/web/assets/icons-kcfLIMBB.js +0 -1
  55. package/dist/web/assets/index-CoB3zF0K.css +0 -1
  56. package/dist/web/assets/index-CryrSLv8.js +0 -2
  57. package/dist/web/assets/naive-ui-CSrLusZZ.js +0 -1
  58. package/src/server/api/convert.js +0 -260
  59. 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;