@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
@@ -0,0 +1,255 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const os = require('os');
4
+
5
+ /**
6
+ * OpenCode 统计服务 - 数据采集和存储
7
+ *
8
+ * 文件结构:
9
+ * ~/.cc-tool/
10
+ * ├── opencode-statistics.json # OpenCode 总体统计
11
+ * └── opencode-daily-stats/
12
+ * ├── 2025-12-05.json # 每日汇总统计
13
+ * └── ...
14
+ */
15
+
16
+ // 获取基础目录
17
+ function getBaseDir() {
18
+ const dir = path.join(os.homedir(), '.cc-tool');
19
+ if (!fs.existsSync(dir)) {
20
+ fs.mkdirSync(dir, { recursive: true });
21
+ }
22
+ return dir;
23
+ }
24
+
25
+ // 获取每日统计目录
26
+ function getDailyStatsDir() {
27
+ const dir = path.join(getBaseDir(), 'opencode-daily-stats');
28
+ if (!fs.existsSync(dir)) {
29
+ fs.mkdirSync(dir, { recursive: true });
30
+ }
31
+ return dir;
32
+ }
33
+
34
+ // 获取统计文件路径
35
+ function getStatisticsFilePath() {
36
+ return path.join(getBaseDir(), 'opencode-statistics.json');
37
+ }
38
+
39
+ // 获取每日统计文件路径
40
+ function getDailyStatsFilePath(date) {
41
+ return path.join(getDailyStatsDir(), `${date}.json`);
42
+ }
43
+
44
+ // 初始化统计对象
45
+ function initStatsObject() {
46
+ return {
47
+ requests: 0,
48
+ tokens: {
49
+ input: 0,
50
+ output: 0,
51
+ reasoning: 0,
52
+ cached: 0,
53
+ total: 0
54
+ },
55
+ cost: 0
56
+ };
57
+ }
58
+
59
+ // 加载总体统计
60
+ function loadStatistics() {
61
+ const filePath = getStatisticsFilePath();
62
+ try {
63
+ if (fs.existsSync(filePath)) {
64
+ const data = fs.readFileSync(filePath, 'utf8');
65
+ return JSON.parse(data);
66
+ }
67
+ } catch (err) {
68
+ console.error('[OpenCode Statistics] Failed to load statistics:', err);
69
+ }
70
+
71
+ return {
72
+ version: '1.0',
73
+ lastUpdated: new Date().toISOString(),
74
+ global: {
75
+ totalRequests: 0,
76
+ totalTokens: 0,
77
+ totalCost: 0
78
+ },
79
+ byChannel: {},
80
+ byModel: {}
81
+ };
82
+ }
83
+
84
+ // 保存总体统计
85
+ function saveStatistics(stats) {
86
+ const filePath = getStatisticsFilePath();
87
+ stats.lastUpdated = new Date().toISOString();
88
+
89
+ try {
90
+ fs.writeFileSync(filePath, JSON.stringify(stats, null, 2), 'utf8');
91
+ } catch (err) {
92
+ console.error('[OpenCode Statistics] Failed to save statistics:', err);
93
+ }
94
+ }
95
+
96
+ // 加载每日统计
97
+ function loadDailyStats(date) {
98
+ const filePath = getDailyStatsFilePath(date);
99
+ try {
100
+ if (fs.existsSync(filePath)) {
101
+ const data = fs.readFileSync(filePath, 'utf8');
102
+ return JSON.parse(data);
103
+ }
104
+ } catch (err) {
105
+ console.error('[OpenCode Statistics] Failed to load daily stats:', err);
106
+ }
107
+
108
+ return {
109
+ date: date,
110
+ summary: {
111
+ requests: 0,
112
+ tokens: 0,
113
+ cost: 0
114
+ },
115
+ byChannel: {},
116
+ byModel: {}
117
+ };
118
+ }
119
+
120
+ // 保存每日统计
121
+ function saveDailyStats(date, stats) {
122
+ const filePath = getDailyStatsFilePath(date);
123
+
124
+ try {
125
+ fs.writeFileSync(filePath, JSON.stringify(stats, null, 2), 'utf8');
126
+ } catch (err) {
127
+ console.error('[OpenCode Statistics] Failed to save daily stats:', err);
128
+ }
129
+ }
130
+
131
+ // 更新统计数据
132
+ function updateStats(stats, tokens, cost) {
133
+ stats.requests += 1;
134
+ if (stats.tokens) {
135
+ stats.tokens.input += tokens.input || 0;
136
+ stats.tokens.output += tokens.output || 0;
137
+ stats.tokens.reasoning += tokens.reasoning || 0;
138
+ stats.tokens.cached += tokens.cached || 0;
139
+ stats.tokens.total += tokens.total || 0;
140
+ }
141
+ stats.cost += cost || 0;
142
+ }
143
+
144
+ /**
145
+ * 记录一次请求
146
+ * @param {Object} requestData - 请求数据
147
+ */
148
+ function recordRequest(requestData) {
149
+ try {
150
+ const {
151
+ timestamp = new Date().toISOString(),
152
+ channel,
153
+ channelId,
154
+ model,
155
+ tokens = {},
156
+ cost = 0
157
+ } = requestData;
158
+
159
+ // 计算 total tokens
160
+ const totalTokens = (tokens.input || 0) + (tokens.output || 0) + (tokens.reasoning || 0);
161
+ tokens.total = totalTokens;
162
+
163
+ // 1. 更新总体统计
164
+ const globalStats = loadStatistics();
165
+
166
+ globalStats.global.totalRequests += 1;
167
+ globalStats.global.totalTokens += totalTokens;
168
+ globalStats.global.totalCost += cost || 0;
169
+
170
+ // 按渠道统计
171
+ if (channelId) {
172
+ if (!globalStats.byChannel[channelId]) {
173
+ globalStats.byChannel[channelId] = {
174
+ name: channel || channelId,
175
+ ...initStatsObject(),
176
+ firstUsed: timestamp,
177
+ lastUsed: timestamp
178
+ };
179
+ }
180
+ updateStats(globalStats.byChannel[channelId], tokens, cost);
181
+ globalStats.byChannel[channelId].lastUsed = timestamp;
182
+ }
183
+
184
+ // 按模型统计
185
+ if (model) {
186
+ if (!globalStats.byModel[model]) {
187
+ globalStats.byModel[model] = initStatsObject();
188
+ }
189
+ updateStats(globalStats.byModel[model], tokens, cost);
190
+ }
191
+
192
+ saveStatistics(globalStats);
193
+
194
+ // 2. 更新每日统计
195
+ const date = new Date(timestamp).toISOString().split('T')[0];
196
+ const dailyStats = loadDailyStats(date);
197
+
198
+ dailyStats.summary.requests += 1;
199
+ dailyStats.summary.tokens += totalTokens;
200
+ dailyStats.summary.cost += cost || 0;
201
+
202
+ // 每日 - 按渠道统计
203
+ if (channelId) {
204
+ if (!dailyStats.byChannel[channelId]) {
205
+ dailyStats.byChannel[channelId] = {
206
+ name: channel || channelId,
207
+ ...initStatsObject()
208
+ };
209
+ }
210
+ updateStats(dailyStats.byChannel[channelId], tokens, cost);
211
+ }
212
+
213
+ // 每日 - 按模型统计
214
+ if (model) {
215
+ if (!dailyStats.byModel[model]) {
216
+ dailyStats.byModel[model] = initStatsObject();
217
+ }
218
+ updateStats(dailyStats.byModel[model], tokens, cost);
219
+ }
220
+
221
+ saveDailyStats(date, dailyStats);
222
+
223
+ } catch (err) {
224
+ console.error('[OpenCode Statistics] Failed to record request:', err);
225
+ }
226
+ }
227
+
228
+ /**
229
+ * 获取总体统计
230
+ */
231
+ function getStatistics() {
232
+ return loadStatistics();
233
+ }
234
+
235
+ /**
236
+ * 获取每日统计
237
+ */
238
+ function getDailyStatistics(date) {
239
+ return loadDailyStats(date);
240
+ }
241
+
242
+ /**
243
+ * 获取今日统计
244
+ */
245
+ function getTodayStatistics() {
246
+ const today = new Date().toISOString().split('T')[0];
247
+ return loadDailyStats(today);
248
+ }
249
+
250
+ module.exports = {
251
+ recordRequest,
252
+ getStatistics,
253
+ getDailyStatistics,
254
+ getTodayStatistics
255
+ };