coding-tool-x 3.3.7 → 3.3.8

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 (48) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/web/assets/{Analytics-IW6eAy9u.js → Analytics-DLpoDZ2M.js} +1 -1
  3. package/dist/web/assets/{ConfigTemplates-BPtkTMSc.js → ConfigTemplates-D_hRb55W.js} +1 -1
  4. package/dist/web/assets/Home-BMoFdAwy.css +1 -0
  5. package/dist/web/assets/Home-DNwp-0J-.js +1 -0
  6. package/dist/web/assets/{PluginManager-BGx9MSDV.js → PluginManager-JXsyym1s.js} +1 -1
  7. package/dist/web/assets/{ProjectList-BCn-mrCx.js → ProjectList-DZWSeb-q.js} +1 -1
  8. package/dist/web/assets/{SessionList-CzLfebJQ.js → SessionList-Cs624DR3.js} +1 -1
  9. package/dist/web/assets/{SkillManager-CXz2vBQx.js → SkillManager-bEliz7qz.js} +1 -1
  10. package/dist/web/assets/{WorkspaceManager-CHtgMfKc.js → WorkspaceManager-J3RecFGn.js} +1 -1
  11. package/dist/web/assets/{icons-B29onFfZ.js → icons-Cuc23WS7.js} +1 -1
  12. package/dist/web/assets/index-BXeSvAwU.js +2 -0
  13. package/dist/web/assets/index-DWAC3Tdv.css +1 -0
  14. package/dist/web/index.html +3 -3
  15. package/package.json +3 -2
  16. package/src/commands/toggle-proxy.js +100 -5
  17. package/src/config/paths.js +102 -19
  18. package/src/server/api/channels.js +9 -0
  19. package/src/server/api/codex-channels.js +9 -0
  20. package/src/server/api/codex-proxy.js +22 -11
  21. package/src/server/api/gemini-proxy.js +22 -11
  22. package/src/server/api/oauth-credentials.js +163 -0
  23. package/src/server/api/opencode-proxy.js +22 -10
  24. package/src/server/api/plugins.js +3 -1
  25. package/src/server/api/proxy.js +39 -44
  26. package/src/server/api/skills.js +91 -13
  27. package/src/server/codex-proxy-server.js +1 -11
  28. package/src/server/index.js +1 -0
  29. package/src/server/services/channels.js +18 -22
  30. package/src/server/services/codex-channels.js +124 -175
  31. package/src/server/services/codex-config.js +2 -5
  32. package/src/server/services/codex-settings-manager.js +12 -348
  33. package/src/server/services/config-export-service.js +23 -2
  34. package/src/server/services/gemini-channels.js +11 -9
  35. package/src/server/services/mcp-service.js +33 -16
  36. package/src/server/services/native-keychain.js +243 -0
  37. package/src/server/services/native-oauth-adapters.js +890 -0
  38. package/src/server/services/oauth-credentials-service.js +786 -0
  39. package/src/server/services/oauth-utils.js +49 -0
  40. package/src/server/services/opencode-channels.js +13 -9
  41. package/src/server/services/opencode-settings-manager.js +169 -16
  42. package/src/server/services/plugins-service.js +22 -1
  43. package/src/server/services/settings-manager.js +13 -0
  44. package/src/server/services/skill-service.js +712 -332
  45. package/dist/web/assets/Home-BsSioaaB.css +0 -1
  46. package/dist/web/assets/Home-obifg_9E.js +0 -1
  47. package/dist/web/assets/index-C7LPdVsN.js +0 -2
  48. package/dist/web/assets/index-eEmjZKWP.css +0 -1
@@ -0,0 +1,243 @@
1
+ const { spawnSync } = require('child_process');
2
+
3
+ function runCommand(command, args, options = {}) {
4
+ const result = spawnSync(command, args, {
5
+ encoding: 'utf8',
6
+ maxBuffer: 10 * 1024 * 1024,
7
+ ...options
8
+ });
9
+
10
+ if (result.error) {
11
+ throw result.error;
12
+ }
13
+
14
+ return result;
15
+ }
16
+
17
+ function getWindowsPowerShellCommand() {
18
+ return process.env.ComSpec && process.env.ComSpec.toLowerCase().includes('powershell')
19
+ ? process.env.ComSpec
20
+ : 'powershell.exe';
21
+ }
22
+
23
+ function runPowerShell(script, env = {}) {
24
+ return runCommand(getWindowsPowerShellCommand(), [
25
+ '-NoProfile',
26
+ '-NonInteractive',
27
+ '-Command',
28
+ script
29
+ ], {
30
+ env: {
31
+ ...process.env,
32
+ ...env
33
+ }
34
+ });
35
+ }
36
+
37
+ function isSupported() {
38
+ if (process.platform === 'darwin') return true;
39
+ if (process.platform === 'win32') return true;
40
+
41
+ if (process.platform === 'linux') {
42
+ try {
43
+ const result = runCommand('secret-tool', ['--help']);
44
+ return result.status === 0 || result.status === 1;
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+
50
+ return false;
51
+ }
52
+
53
+ function getPassword(service, account) {
54
+ if (!service || !account) {
55
+ return null;
56
+ }
57
+
58
+ try {
59
+ if (process.platform === 'darwin') {
60
+ const result = runCommand('security', [
61
+ 'find-generic-password',
62
+ '-a',
63
+ String(account),
64
+ '-w',
65
+ '-s',
66
+ String(service)
67
+ ]);
68
+
69
+ if (result.status !== 0) {
70
+ return null;
71
+ }
72
+
73
+ return String(result.stdout || '').trim() || null;
74
+ }
75
+
76
+ if (process.platform === 'linux') {
77
+ const result = runCommand('secret-tool', [
78
+ 'lookup',
79
+ 'service',
80
+ String(service),
81
+ 'account',
82
+ String(account)
83
+ ]);
84
+
85
+ if (result.status !== 0) {
86
+ return null;
87
+ }
88
+
89
+ return String(result.stdout || '').trim() || null;
90
+ }
91
+
92
+ if (process.platform === 'win32') {
93
+ const script = `
94
+ Add-Type -AssemblyName System.Runtime.WindowsRuntime
95
+ $vault = New-Object Windows.Security.Credentials.PasswordVault
96
+ try {
97
+ $cred = $vault.Retrieve($env:CC_TOOL_SERVICE, $env:CC_TOOL_ACCOUNT)
98
+ $cred.RetrievePassword()
99
+ [Console]::Out.Write($cred.Password)
100
+ exit 0
101
+ } catch {
102
+ exit 2
103
+ }
104
+ `;
105
+ const result = runPowerShell(script, {
106
+ CC_TOOL_SERVICE: String(service),
107
+ CC_TOOL_ACCOUNT: String(account)
108
+ });
109
+
110
+ if (result.status !== 0) {
111
+ return null;
112
+ }
113
+
114
+ return String(result.stdout || '').trim() || null;
115
+ }
116
+ } catch {
117
+ return null;
118
+ }
119
+
120
+ return null;
121
+ }
122
+
123
+ function setPassword(service, account, password) {
124
+ if (!service || !account) {
125
+ return false;
126
+ }
127
+
128
+ try {
129
+ if (process.platform === 'darwin') {
130
+ const result = runCommand('security', [
131
+ 'add-generic-password',
132
+ '-U',
133
+ '-a',
134
+ String(account),
135
+ '-s',
136
+ String(service),
137
+ '-w',
138
+ String(password ?? '')
139
+ ]);
140
+ return result.status === 0;
141
+ }
142
+
143
+ if (process.platform === 'linux') {
144
+ deletePassword(service, account);
145
+ const result = runCommand('secret-tool', [
146
+ 'store',
147
+ '--label',
148
+ String(service),
149
+ 'service',
150
+ String(service),
151
+ 'account',
152
+ String(account)
153
+ ], {
154
+ input: String(password ?? '')
155
+ });
156
+ return result.status === 0;
157
+ }
158
+
159
+ if (process.platform === 'win32') {
160
+ const script = `
161
+ Add-Type -AssemblyName System.Runtime.WindowsRuntime
162
+ $vault = New-Object Windows.Security.Credentials.PasswordVault
163
+ try {
164
+ $existing = $vault.Retrieve($env:CC_TOOL_SERVICE, $env:CC_TOOL_ACCOUNT)
165
+ $vault.Remove($existing)
166
+ } catch {}
167
+ $credential = New-Object Windows.Security.Credentials.PasswordCredential($env:CC_TOOL_SERVICE, $env:CC_TOOL_ACCOUNT, $env:CC_TOOL_PASSWORD)
168
+ $vault.Add($credential)
169
+ exit 0
170
+ `;
171
+ const result = runPowerShell(script, {
172
+ CC_TOOL_SERVICE: String(service),
173
+ CC_TOOL_ACCOUNT: String(account),
174
+ CC_TOOL_PASSWORD: String(password ?? '')
175
+ });
176
+ return result.status === 0;
177
+ }
178
+ } catch {
179
+ return false;
180
+ }
181
+
182
+ return false;
183
+ }
184
+
185
+ function deletePassword(service, account) {
186
+ if (!service || !account) {
187
+ return false;
188
+ }
189
+
190
+ try {
191
+ if (process.platform === 'darwin') {
192
+ const result = runCommand('security', [
193
+ 'delete-generic-password',
194
+ '-a',
195
+ String(account),
196
+ '-s',
197
+ String(service)
198
+ ]);
199
+ return result.status === 0;
200
+ }
201
+
202
+ if (process.platform === 'linux') {
203
+ const result = runCommand('secret-tool', [
204
+ 'clear',
205
+ 'service',
206
+ String(service),
207
+ 'account',
208
+ String(account)
209
+ ]);
210
+ return result.status === 0;
211
+ }
212
+
213
+ if (process.platform === 'win32') {
214
+ const script = `
215
+ Add-Type -AssemblyName System.Runtime.WindowsRuntime
216
+ $vault = New-Object Windows.Security.Credentials.PasswordVault
217
+ try {
218
+ $credential = $vault.Retrieve($env:CC_TOOL_SERVICE, $env:CC_TOOL_ACCOUNT)
219
+ $vault.Remove($credential)
220
+ exit 0
221
+ } catch {
222
+ exit 2
223
+ }
224
+ `;
225
+ const result = runPowerShell(script, {
226
+ CC_TOOL_SERVICE: String(service),
227
+ CC_TOOL_ACCOUNT: String(account)
228
+ });
229
+ return result.status === 0;
230
+ }
231
+ } catch {
232
+ return false;
233
+ }
234
+
235
+ return false;
236
+ }
237
+
238
+ module.exports = {
239
+ isSupported,
240
+ getPassword,
241
+ setPassword,
242
+ deletePassword
243
+ };