@adversity/coding-tool-x 3.1.0 → 3.1.1

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 (137) hide show
  1. package/CHANGELOG.md +15 -18
  2. package/README.md +8 -8
  3. package/dist/web/assets/ConfigTemplates-Bidwfdf2.css +1 -0
  4. package/dist/web/assets/ConfigTemplates-ZrK_s7ma.js +1 -0
  5. package/dist/web/assets/Home-B8YfhZ3c.js +1 -0
  6. package/dist/web/assets/Home-Di2qsylF.css +1 -0
  7. package/dist/web/assets/PluginManager-BD7QUZbU.js +1 -0
  8. package/dist/web/assets/PluginManager-ROyoZ-6m.css +1 -0
  9. package/dist/web/assets/ProjectList-C1fQb9OW.css +1 -0
  10. package/dist/web/assets/ProjectList-DRb1DuHV.js +1 -0
  11. package/dist/web/assets/SessionList-BGJWyneI.css +1 -0
  12. package/dist/web/assets/SessionList-lZ0LKzfT.js +1 -0
  13. package/dist/web/assets/SkillManager-C1xG5B4Q.js +1 -0
  14. package/dist/web/assets/SkillManager-D7pd-d_P.css +1 -0
  15. package/dist/web/assets/Terminal-DGNJeVtc.css +1 -0
  16. package/dist/web/assets/Terminal-DksBo_lM.js +1 -0
  17. package/dist/web/assets/WorkspaceManager-Burx7XOo.js +1 -0
  18. package/dist/web/assets/WorkspaceManager-CrwgQgmP.css +1 -0
  19. package/dist/web/assets/icons-kcfLIMBB.js +1 -0
  20. package/dist/web/assets/index-Ufv5rCa5.css +1 -0
  21. package/dist/web/assets/index-lAkrRC3h.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 +39 -2
  47. package/src/config/loader.js +74 -8
  48. package/src/config/paths.js +105 -33
  49. package/src/index.js +64 -3
  50. package/src/plugins/constants.js +3 -2
  51. package/src/plugins/plugin-api.js +1 -1
  52. package/src/reset-config.js +4 -2
  53. package/src/server/api/agents.js +57 -14
  54. package/src/server/api/channels.js +112 -33
  55. package/src/server/api/codex-channels.js +111 -18
  56. package/src/server/api/codex-proxy.js +14 -8
  57. package/src/server/api/commands.js +71 -18
  58. package/src/server/api/config-export.js +0 -6
  59. package/src/server/api/config-registry.js +11 -3
  60. package/src/server/api/config.js +376 -5
  61. package/src/server/api/convert.js +133 -0
  62. package/src/server/api/dashboard.js +22 -6
  63. package/src/server/api/gemini-channels.js +107 -18
  64. package/src/server/api/gemini-proxy.js +14 -8
  65. package/src/server/api/gemini-sessions.js +1 -1
  66. package/src/server/api/health-check.js +4 -3
  67. package/src/server/api/mcp.js +3 -3
  68. package/src/server/api/opencode-channels.js +419 -0
  69. package/src/server/api/opencode-projects.js +99 -0
  70. package/src/server/api/opencode-proxy.js +198 -0
  71. package/src/server/api/opencode-sessions.js +403 -0
  72. package/src/server/api/opencode-statistics.js +57 -0
  73. package/src/server/api/plugins.js +66 -19
  74. package/src/server/api/prompts.js +2 -2
  75. package/src/server/api/proxy.js +7 -4
  76. package/src/server/api/sessions.js +3 -0
  77. package/src/server/api/skills.js +69 -18
  78. package/src/server/api/workspaces.js +78 -6
  79. package/src/server/codex-proxy-server.js +30 -18
  80. package/src/server/dev-server.js +1 -1
  81. package/src/server/gemini-proxy-server.js +15 -3
  82. package/src/server/index.js +165 -58
  83. package/src/server/opencode-proxy-server.js +4375 -0
  84. package/src/server/proxy-server.js +27 -18
  85. package/src/server/services/agents-service.js +61 -24
  86. package/src/server/services/channel-scheduler.js +9 -5
  87. package/src/server/services/channels.js +64 -37
  88. package/src/server/services/codex-channels.js +56 -43
  89. package/src/server/services/codex-settings-manager.js +271 -49
  90. package/src/server/services/codex-statistics-service.js +2 -2
  91. package/src/server/services/commands-service.js +84 -25
  92. package/src/server/services/config-export-service.js +7 -45
  93. package/src/server/services/config-registry-service.js +63 -17
  94. package/src/server/services/config-sync-manager.js +160 -7
  95. package/src/server/services/config-templates-service.js +204 -51
  96. package/src/server/services/env-checker.js +26 -12
  97. package/src/server/services/env-manager.js +126 -18
  98. package/src/server/services/favorites.js +5 -3
  99. package/src/server/services/gemini-channels.js +33 -44
  100. package/src/server/services/gemini-statistics-service.js +2 -2
  101. package/src/server/services/mcp-service.js +350 -9
  102. package/src/server/services/model-detector.js +707 -221
  103. package/src/server/services/network-access.js +80 -0
  104. package/src/server/services/opencode-channels.js +206 -0
  105. package/src/server/services/opencode-gateway-converter.js +639 -0
  106. package/src/server/services/opencode-sessions.js +663 -0
  107. package/src/server/services/opencode-settings-manager.js +342 -0
  108. package/src/server/services/opencode-statistics-service.js +255 -0
  109. package/src/server/services/plugins-service.js +479 -22
  110. package/src/server/services/prompts-service.js +53 -11
  111. package/src/server/services/proxy-runtime.js +1 -1
  112. package/src/server/services/repo-scanner-base.js +1 -1
  113. package/src/server/services/security-config.js +1 -1
  114. package/src/server/services/session-cache.js +1 -1
  115. package/src/server/services/skill-service.js +300 -46
  116. package/src/server/services/speed-test.js +464 -186
  117. package/src/server/services/statistics-service.js +2 -2
  118. package/src/server/services/terminal-commands.js +10 -3
  119. package/src/server/services/terminal-config.js +1 -1
  120. package/src/server/services/ui-config.js +1 -1
  121. package/src/server/services/workspace-service.js +57 -100
  122. package/src/server/websocket-server.js +132 -3
  123. package/src/ui/menu.js +49 -40
  124. package/src/utils/port-helper.js +22 -8
  125. package/src/utils/session.js +5 -4
  126. package/dist/web/assets/icons-CO_2OFES.js +0 -1
  127. package/dist/web/assets/index-DI8QOi-E.js +0 -14
  128. package/dist/web/assets/index-uLHGdeZh.css +0 -41
  129. package/dist/web/assets/naive-ui-B1re3c-e.js +0 -1
  130. package/dist/web/assets/vue-vendor-6JaYHOiI.js +0 -44
  131. package/src/server/api/oauth.js +0 -294
  132. package/src/server/api/permissions.js +0 -385
  133. package/src/server/config/oauth-providers.js +0 -68
  134. package/src/server/services/oauth-callback-server.js +0 -284
  135. package/src/server/services/oauth-service.js +0 -378
  136. package/src/server/services/oauth-token-storage.js +0 -135
  137. package/src/server/services/permission-templates-service.js +0 -308
@@ -1,68 +0,0 @@
1
- 'use strict';
2
-
3
- const OAUTH_PROVIDERS = {
4
- claude: {
5
- name: 'Claude Pro',
6
- authUrl: 'https://claude.ai/oauth/authorize',
7
- tokenUrl: 'https://console.anthropic.com/v1/oauth/token',
8
- clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
9
- redirectUri: 'http://localhost:54545/callback',
10
- scopes: ['org:create_api_key', 'user:profile', 'user:inference'],
11
- authType: 'pkce',
12
- callbackPort: 54545,
13
- callbackPath: '/callback'
14
- },
15
-
16
- codex: {
17
- name: 'OpenAI Codex',
18
- authUrl: 'https://auth.openai.com/oauth/authorize',
19
- tokenUrl: 'https://auth.openai.com/oauth/token',
20
- clientId: 'app_EMoamEEZ73f0CkXaXp7hrann',
21
- redirectUri: 'http://localhost:1455/auth/callback',
22
- scopes: ['openid', 'profile', 'email', 'offline_access'],
23
- authType: 'pkce',
24
- extraParams: {
25
- codex_cli_simplified_flow: 'true',
26
- originator: 'ctx'
27
- },
28
- tokenContentType: 'application/x-www-form-urlencoded',
29
- callbackPort: 1455,
30
- callbackPath: '/auth/callback'
31
- },
32
-
33
- gemini: {
34
- name: 'Google Gemini',
35
- authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
36
- tokenUrl: 'https://oauth2.googleapis.com/token',
37
- clientId: '681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com',
38
- clientSecret: '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',
39
- redirectUri: 'http://localhost:51121/callback',
40
- scopes: [
41
- 'https://www.googleapis.com/auth/cloud-platform',
42
- 'https://www.googleapis.com/auth/userinfo.email',
43
- 'https://www.googleapis.com/auth/userinfo.profile',
44
- 'https://www.googleapis.com/auth/cclog',
45
- 'https://www.googleapis.com/auth/experimentsandconfigs'
46
- ],
47
- authType: 'standard',
48
- extraParams: {
49
- access_type: 'offline',
50
- prompt: 'consent'
51
- },
52
- callbackPort: 51121,
53
- callbackPath: '/callback'
54
- }
55
- };
56
-
57
- function getProviderConfig(provider) {
58
- const config = OAUTH_PROVIDERS[provider];
59
- if (!config) {
60
- throw new Error(`Unknown OAuth provider: ${provider}`);
61
- }
62
- return { ...config };
63
- }
64
-
65
- module.exports = {
66
- OAUTH_PROVIDERS,
67
- getProviderConfig
68
- };
@@ -1,284 +0,0 @@
1
- 'use strict';
2
-
3
- const http = require('http');
4
- const url = require('url');
5
-
6
- // Store active servers by port
7
- const activeServers = new Map();
8
-
9
- // Default timeout for auto-close (30 seconds)
10
- const DEFAULT_TIMEOUT_MS = 30000;
11
-
12
- // Delay before closing server after callback (1 second)
13
- const CLOSE_DELAY_MS = 1000;
14
-
15
- /**
16
- * Generate HTML response page
17
- * @param {boolean} success - Whether authorization was successful
18
- * @param {string} [errorMessage] - Error message if failed
19
- * @returns {string} HTML content
20
- */
21
- function generateHtmlResponse(success, errorMessage) {
22
- const title = success ? 'Authorization Successful' : 'Authorization Failed';
23
- const titleCn = success ? '授权成功' : '授权失败';
24
- const message = success
25
- ? 'You can close this window now.'
26
- : `Error: ${errorMessage || 'Unknown error'}`;
27
- const messageCn = success
28
- ? '您现在可以关闭此窗口。'
29
- : `错误: ${errorMessage || '未知错误'}`;
30
- const icon = success ? '✔' : '✖';
31
- const color = success ? '#4CAF50' : '#f44336';
32
-
33
- return `<!DOCTYPE html>
34
- <html lang="en">
35
- <head>
36
- <meta charset="UTF-8">
37
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
38
- <title>${title}</title>
39
- <style>
40
- * {
41
- margin: 0;
42
- padding: 0;
43
- box-sizing: border-box;
44
- }
45
- body {
46
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
47
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
48
- min-height: 100vh;
49
- display: flex;
50
- justify-content: center;
51
- align-items: center;
52
- padding: 20px;
53
- }
54
- .container {
55
- background: white;
56
- border-radius: 16px;
57
- padding: 48px;
58
- text-align: center;
59
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
60
- max-width: 400px;
61
- width: 100%;
62
- }
63
- .icon {
64
- width: 80px;
65
- height: 80px;
66
- border-radius: 50%;
67
- background: ${color};
68
- color: white;
69
- font-size: 40px;
70
- line-height: 80px;
71
- margin: 0 auto 24px;
72
- }
73
- h1 {
74
- color: #333;
75
- font-size: 24px;
76
- margin-bottom: 8px;
77
- }
78
- .subtitle {
79
- color: #666;
80
- font-size: 14px;
81
- margin-bottom: 16px;
82
- }
83
- p {
84
- color: #555;
85
- font-size: 16px;
86
- line-height: 1.5;
87
- }
88
- .error-detail {
89
- background: #fff3f3;
90
- border: 1px solid #ffcdd2;
91
- border-radius: 8px;
92
- padding: 12px;
93
- margin-top: 16px;
94
- color: #c62828;
95
- font-size: 14px;
96
- word-break: break-word;
97
- }
98
- .auto-close {
99
- margin-top: 24px;
100
- color: #999;
101
- font-size: 12px;
102
- }
103
- </style>
104
- </head>
105
- <body>
106
- <div class="container">
107
- <div class="icon">${icon}</div>
108
- <h1>${title}</h1>
109
- <p class="subtitle">${titleCn}</p>
110
- <p>${message}</p>
111
- <p style="color: #888; font-size: 14px; margin-top: 8px;">${messageCn}</p>
112
- ${!success && errorMessage ? `<div class="error-detail">${errorMessage}</div>` : ''}
113
- <p class="auto-close">This window will close automatically...</p>
114
- </div>
115
- <script>
116
- setTimeout(function() { window.close(); }, 3000);
117
- </script>
118
- </body>
119
- </html>`;
120
- }
121
-
122
- /**
123
- * Start OAuth callback server
124
- * @param {number} port - Port to listen on
125
- * @param {string} callbackPath - Path to handle callbacks (e.g., '/callback')
126
- * @param {Function} onCallback - Callback function with { code, state, error, errorDescription }
127
- * @returns {Promise<http.Server>} The HTTP server instance
128
- */
129
- async function startCallbackServer(port, callbackPath, onCallback) {
130
- // Check if server is already running on this port
131
- if (activeServers.has(port)) {
132
- throw new Error(`OAuth callback server already running on port ${port}`);
133
- }
134
-
135
- // Normalize callback path
136
- const normalizedPath = callbackPath.startsWith('/') ? callbackPath : `/${callbackPath}`;
137
-
138
- return new Promise((resolve, reject) => {
139
- const server = http.createServer((req, res) => {
140
- const parsedUrl = url.parse(req.url, true);
141
- const pathname = parsedUrl.pathname;
142
-
143
- // Only handle the callback path
144
- if (pathname !== normalizedPath) {
145
- res.writeHead(404, { 'Content-Type': 'text/plain' });
146
- res.end('Not Found');
147
- return;
148
- }
149
-
150
- // Parse query parameters
151
- const query = parsedUrl.query;
152
- const code = query.code || null;
153
- const state = query.state || null;
154
- const error = query.error || null;
155
- const errorDescription = query.error_description || null;
156
-
157
- // Determine success/failure
158
- const success = !error && code;
159
- const errorMessage = error
160
- ? `${error}${errorDescription ? `: ${errorDescription}` : ''}`
161
- : null;
162
-
163
- // Send HTML response
164
- res.writeHead(success ? 200 : 400, { 'Content-Type': 'text/html; charset=utf-8' });
165
- res.end(generateHtmlResponse(success, errorMessage));
166
-
167
- // Call the callback
168
- try {
169
- onCallback({
170
- code,
171
- state,
172
- error,
173
- errorDescription
174
- });
175
- } catch (err) {
176
- console.error('Error in OAuth callback handler:', err);
177
- }
178
-
179
- // Auto-close server after delay
180
- setTimeout(() => {
181
- stopCallbackServer(port);
182
- }, CLOSE_DELAY_MS);
183
- });
184
-
185
- // Set up timeout for auto-close
186
- const timeoutId = setTimeout(() => {
187
- if (activeServers.has(port)) {
188
- console.log(`OAuth callback server on port ${port} timed out, closing...`);
189
- stopCallbackServer(port);
190
- }
191
- }, DEFAULT_TIMEOUT_MS);
192
-
193
- // Handle server errors
194
- server.on('error', (err) => {
195
- clearTimeout(timeoutId);
196
- activeServers.delete(port);
197
-
198
- if (err.code === 'EADDRINUSE') {
199
- reject(new Error(`Port ${port} is already in use. Please try a different port or close the application using it.`));
200
- } else if (err.code === 'EACCES') {
201
- reject(new Error(`Permission denied to bind to port ${port}. Try a port number above 1024.`));
202
- } else {
203
- reject(new Error(`Failed to start OAuth callback server: ${err.message}`));
204
- }
205
- });
206
-
207
- // Start listening
208
- server.listen(port, '127.0.0.1', () => {
209
- // Store server info
210
- activeServers.set(port, {
211
- server,
212
- timeoutId,
213
- callbackPath: normalizedPath
214
- });
215
-
216
- console.log(`OAuth callback server started on http://127.0.0.1:${port}${normalizedPath}`);
217
- resolve(server);
218
- });
219
- });
220
- }
221
-
222
- /**
223
- * Stop OAuth callback server
224
- * @param {number} port - Port of the server to stop
225
- * @returns {boolean} True if server was stopped, false if not found
226
- */
227
- function stopCallbackServer(port) {
228
- const serverInfo = activeServers.get(port);
229
-
230
- if (!serverInfo) {
231
- return false;
232
- }
233
-
234
- // Clear timeout
235
- if (serverInfo.timeoutId) {
236
- clearTimeout(serverInfo.timeoutId);
237
- }
238
-
239
- // Close server
240
- try {
241
- serverInfo.server.close();
242
- console.log(`OAuth callback server on port ${port} stopped`);
243
- } catch (err) {
244
- console.error(`Error stopping OAuth callback server on port ${port}:`, err.message);
245
- }
246
-
247
- activeServers.delete(port);
248
- return true;
249
- }
250
-
251
- /**
252
- * Check if server is running on port
253
- * @param {number} port - Port to check
254
- * @returns {boolean} True if server is running
255
- */
256
- function isServerRunning(port) {
257
- return activeServers.has(port);
258
- }
259
-
260
- /**
261
- * Get all active server ports
262
- * @returns {number[]} Array of active ports
263
- */
264
- function getActiveServers() {
265
- return Array.from(activeServers.keys());
266
- }
267
-
268
- /**
269
- * Stop all active servers
270
- * @returns {number} Number of servers stopped
271
- */
272
- function stopAllServers() {
273
- const ports = getActiveServers();
274
- ports.forEach(port => stopCallbackServer(port));
275
- return ports.length;
276
- }
277
-
278
- module.exports = {
279
- startCallbackServer,
280
- stopCallbackServer,
281
- isServerRunning,
282
- getActiveServers,
283
- stopAllServers
284
- };