commons-proxy 2.0.0

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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +757 -0
  3. package/bin/cli.js +146 -0
  4. package/package.json +97 -0
  5. package/public/Complaint Details.pdf +0 -0
  6. package/public/Cyber Crime Portal.pdf +0 -0
  7. package/public/app.js +229 -0
  8. package/public/css/src/input.css +523 -0
  9. package/public/css/style.css +1 -0
  10. package/public/favicon.png +0 -0
  11. package/public/index.html +549 -0
  12. package/public/js/components/account-manager.js +356 -0
  13. package/public/js/components/add-account-modal.js +414 -0
  14. package/public/js/components/claude-config.js +420 -0
  15. package/public/js/components/dashboard/charts.js +605 -0
  16. package/public/js/components/dashboard/filters.js +362 -0
  17. package/public/js/components/dashboard/stats.js +110 -0
  18. package/public/js/components/dashboard.js +236 -0
  19. package/public/js/components/logs-viewer.js +100 -0
  20. package/public/js/components/models.js +36 -0
  21. package/public/js/components/server-config.js +349 -0
  22. package/public/js/config/constants.js +102 -0
  23. package/public/js/data-store.js +375 -0
  24. package/public/js/settings-store.js +58 -0
  25. package/public/js/store.js +99 -0
  26. package/public/js/translations/en.js +367 -0
  27. package/public/js/translations/id.js +412 -0
  28. package/public/js/translations/pt.js +308 -0
  29. package/public/js/translations/tr.js +358 -0
  30. package/public/js/translations/zh.js +373 -0
  31. package/public/js/utils/account-actions.js +189 -0
  32. package/public/js/utils/error-handler.js +96 -0
  33. package/public/js/utils/model-config.js +42 -0
  34. package/public/js/utils/ui-logger.js +143 -0
  35. package/public/js/utils/validators.js +77 -0
  36. package/public/js/utils.js +69 -0
  37. package/public/proxy-server-64.png +0 -0
  38. package/public/views/accounts.html +361 -0
  39. package/public/views/dashboard.html +484 -0
  40. package/public/views/logs.html +97 -0
  41. package/public/views/models.html +331 -0
  42. package/public/views/settings.html +1327 -0
  43. package/src/account-manager/credentials.js +378 -0
  44. package/src/account-manager/index.js +462 -0
  45. package/src/account-manager/onboarding.js +112 -0
  46. package/src/account-manager/rate-limits.js +369 -0
  47. package/src/account-manager/storage.js +160 -0
  48. package/src/account-manager/strategies/base-strategy.js +109 -0
  49. package/src/account-manager/strategies/hybrid-strategy.js +339 -0
  50. package/src/account-manager/strategies/index.js +79 -0
  51. package/src/account-manager/strategies/round-robin-strategy.js +76 -0
  52. package/src/account-manager/strategies/sticky-strategy.js +138 -0
  53. package/src/account-manager/strategies/trackers/health-tracker.js +162 -0
  54. package/src/account-manager/strategies/trackers/index.js +9 -0
  55. package/src/account-manager/strategies/trackers/quota-tracker.js +120 -0
  56. package/src/account-manager/strategies/trackers/token-bucket-tracker.js +155 -0
  57. package/src/auth/database.js +169 -0
  58. package/src/auth/oauth.js +548 -0
  59. package/src/auth/token-extractor.js +117 -0
  60. package/src/cli/accounts.js +648 -0
  61. package/src/cloudcode/index.js +29 -0
  62. package/src/cloudcode/message-handler.js +510 -0
  63. package/src/cloudcode/model-api.js +248 -0
  64. package/src/cloudcode/rate-limit-parser.js +235 -0
  65. package/src/cloudcode/request-builder.js +93 -0
  66. package/src/cloudcode/session-manager.js +47 -0
  67. package/src/cloudcode/sse-parser.js +121 -0
  68. package/src/cloudcode/sse-streamer.js +293 -0
  69. package/src/cloudcode/streaming-handler.js +615 -0
  70. package/src/config.js +125 -0
  71. package/src/constants.js +407 -0
  72. package/src/errors.js +242 -0
  73. package/src/fallback-config.js +29 -0
  74. package/src/format/content-converter.js +193 -0
  75. package/src/format/index.js +20 -0
  76. package/src/format/request-converter.js +255 -0
  77. package/src/format/response-converter.js +120 -0
  78. package/src/format/schema-sanitizer.js +673 -0
  79. package/src/format/signature-cache.js +88 -0
  80. package/src/format/thinking-utils.js +648 -0
  81. package/src/index.js +148 -0
  82. package/src/modules/usage-stats.js +205 -0
  83. package/src/providers/anthropic-provider.js +258 -0
  84. package/src/providers/base-provider.js +157 -0
  85. package/src/providers/cloudcode.js +94 -0
  86. package/src/providers/copilot.js +399 -0
  87. package/src/providers/github-provider.js +287 -0
  88. package/src/providers/google-provider.js +192 -0
  89. package/src/providers/index.js +211 -0
  90. package/src/providers/openai-compatible.js +265 -0
  91. package/src/providers/openai-provider.js +271 -0
  92. package/src/providers/openrouter-provider.js +325 -0
  93. package/src/providers/setup.js +83 -0
  94. package/src/server.js +870 -0
  95. package/src/utils/claude-config.js +245 -0
  96. package/src/utils/helpers.js +51 -0
  97. package/src/utils/logger.js +142 -0
  98. package/src/utils/native-module-helper.js +162 -0
  99. package/src/webui/index.js +1134 -0
@@ -0,0 +1,523 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ :root {
6
+ /* === Background Layers === */
7
+ --color-space-950: #09090b;
8
+ --color-space-900: #0f0f11;
9
+ --color-space-850: #121214;
10
+ --color-space-800: #18181b;
11
+ --color-space-border: #27272a;
12
+
13
+ /* === Neon Accents (Full Saturation) === */
14
+ --color-neon-purple: #a855f7;
15
+ --color-neon-green: #22c55e;
16
+ --color-neon-cyan: #06b6d4;
17
+ --color-neon-yellow: #eab308;
18
+ --color-neon-red: #ef4444;
19
+
20
+ /* === Soft Neon (Reduced Saturation for Fills) === */
21
+ --color-neon-purple-soft: #9333ea;
22
+ --color-neon-green-soft: #16a34a;
23
+ --color-neon-cyan-soft: #0891b2;
24
+
25
+ /* === Text Hierarchy (WCAG AA Compliant) === */
26
+ --color-text-primary: #ffffff; /* Emphasis: Titles, Key Numbers */
27
+ --color-text-secondary: #d4d4d8; /* Content: Body Text (zinc-300) */
28
+ --color-text-tertiary: #a1a1aa; /* Metadata: Timestamps, Labels (zinc-400) */
29
+ --color-text-quaternary: #71717a; /* Subtle: Decorative (zinc-500) */
30
+
31
+ /* === Legacy Aliases (Backward Compatibility) === */
32
+ --color-text-main: var(--color-text-secondary);
33
+ --color-text-dim: var(--color-text-tertiary);
34
+ --color-text-muted: var(--color-text-tertiary);
35
+ --color-text-bright: var(--color-text-primary);
36
+
37
+ /* Gradient Accents */
38
+ --color-green-400: #4ade80;
39
+ --color-yellow-400: #facc15;
40
+ --color-red-400: #f87171;
41
+
42
+ /* Chart Colors */
43
+ --color-chart-1: #a855f7;
44
+ --color-chart-2: #c084fc;
45
+ --color-chart-3: #e879f9;
46
+ --color-chart-4: #d946ef;
47
+ --color-chart-5: #22c55e;
48
+ --color-chart-6: #4ade80;
49
+ --color-chart-7: #86efac;
50
+ --color-chart-8: #10b981;
51
+ --color-chart-9: #06b6d4;
52
+ --color-chart-10: #f59e0b;
53
+ --color-chart-11: #ef4444;
54
+ --color-chart-12: #ec4899;
55
+ --color-chart-13: #8b5cf6;
56
+ --color-chart-14: #14b8a6;
57
+ --color-chart-15: #f97316;
58
+ --color-chart-16: #6366f1;
59
+ }
60
+
61
+ [x-cloak] {
62
+ display: none !important;
63
+ }
64
+
65
+ /* Custom Scrollbar */
66
+ .custom-scrollbar {
67
+ scrollbar-gutter: stable;
68
+ }
69
+
70
+ ::-webkit-scrollbar {
71
+ width: 8px;
72
+ height: 8px;
73
+ }
74
+
75
+ ::-webkit-scrollbar-track {
76
+ background: rgba(9, 9, 11, 0.3);
77
+ border-radius: 4px;
78
+ }
79
+
80
+ ::-webkit-scrollbar-thumb {
81
+ background: linear-gradient(180deg, #27272a 0%, #18181b 100%);
82
+ border-radius: 4px;
83
+ border: 1px solid rgba(255, 255, 255, 0.05);
84
+ transition: background 0.2s ease;
85
+ }
86
+
87
+ ::-webkit-scrollbar-thumb:hover {
88
+ background: linear-gradient(180deg, #3f3f46 0%, #27272a 100%);
89
+ border-color: rgba(168, 85, 247, 0.3);
90
+ }
91
+
92
+ /* Animations */
93
+ .fade-enter-active,
94
+ .fade-leave-active {
95
+ transition: opacity 0.2s ease;
96
+ }
97
+
98
+ .fade-enter-from,
99
+ .fade-leave-to {
100
+ opacity: 0;
101
+ }
102
+
103
+ @keyframes fadeIn {
104
+ from {
105
+ opacity: 0;
106
+ transform: translateY(5px);
107
+ }
108
+ to {
109
+ opacity: 1;
110
+ transform: translateY(0);
111
+ }
112
+ }
113
+
114
+ .animate-fade-in {
115
+ animation: fadeIn 0.4s ease-out forwards;
116
+ }
117
+
118
+ .nav-item.active {
119
+ background: linear-gradient(
120
+ 90deg,
121
+ theme("colors.neon.purple / 15%") 0%,
122
+ transparent 100%
123
+ );
124
+ @apply border-l-4 border-neon-purple text-white;
125
+ }
126
+
127
+ .nav-item {
128
+ @apply border-l-4 border-transparent transition-all duration-200;
129
+ }
130
+
131
+ .progress-gradient-success::-webkit-progress-value {
132
+ background-image: linear-gradient(
133
+ to right,
134
+ var(--color-neon-green),
135
+ var(--color-green-400)
136
+ );
137
+ }
138
+
139
+ .progress-gradient-warning::-webkit-progress-value {
140
+ background-image: linear-gradient(
141
+ to right,
142
+ var(--color-neon-yellow),
143
+ var(--color-yellow-400)
144
+ );
145
+ }
146
+
147
+ .progress-gradient-error::-webkit-progress-value {
148
+ background-image: linear-gradient(
149
+ to right,
150
+ var(--color-neon-red),
151
+ var(--color-red-400)
152
+ );
153
+ }
154
+
155
+ /* Dashboard Grid */
156
+ .stats-grid {
157
+ display: grid;
158
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
159
+ gap: 1.5rem;
160
+ }
161
+
162
+ /* Tooltip Customization */
163
+ .tooltip:before {
164
+ @apply bg-space-800 border border-space-border text-gray-200 font-mono text-xs;
165
+ }
166
+
167
+ .tooltip-left:before {
168
+ margin-right: 0.5rem;
169
+ }
170
+
171
+ /* -------------------------------------------------------------------------- */
172
+ /* Refactored Global Utilities */
173
+ /* -------------------------------------------------------------------------- */
174
+
175
+ /* Standard Layout Constants */
176
+ :root {
177
+ --view-padding: 2rem; /* 32px - Standard Padding */
178
+ --view-gap: 2rem; /* 32px - Standard component gap */
179
+ --card-radius: 0.75rem; /* 12px */
180
+ }
181
+
182
+ @media (max-width: 768px) {
183
+ :root {
184
+ --view-padding: 1rem;
185
+ --view-gap: 1.25rem;
186
+ }
187
+ }
188
+
189
+ /* Base View Container */
190
+ .view-container {
191
+ display: flex;
192
+ flex-direction: column;
193
+ margin-left: auto;
194
+ margin-right: auto;
195
+ width: 100%;
196
+ padding: var(--view-padding);
197
+ gap: var(--view-gap);
198
+ min-height: calc(100vh - 56px); /* Align with navbar height */
199
+ max-width: 1400px;
200
+ scrollbar-gutter: stable;
201
+ }
202
+
203
+ /* Specialized container for data-heavy pages (Logs) */
204
+ .view-container-full {
205
+ @apply w-full animate-fade-in flex flex-col;
206
+ padding: var(--view-padding);
207
+ gap: var(--view-gap);
208
+ min-height: calc(100vh - 56px);
209
+ max-width: 100%;
210
+ }
211
+
212
+ /* Centered container for form-heavy pages (Settings/Accounts) */
213
+ .view-container-centered {
214
+ @apply mx-auto w-full animate-fade-in flex flex-col;
215
+ padding: var(--view-padding);
216
+ gap: var(--view-gap);
217
+ min-height: calc(100vh - 56px);
218
+ max-width: 900px; /* Comfortable reading width for forms */
219
+ }
220
+
221
+ /* Standard Section Header */
222
+ .view-header {
223
+ display: flex;
224
+ flex-direction: column;
225
+ justify-content: space-between;
226
+ margin-bottom: 0.5rem;
227
+ gap: 1rem;
228
+ }
229
+
230
+ @media (min-width: 768px) {
231
+ .view-header {
232
+ flex-direction: row;
233
+ align-items: flex-end;
234
+ }
235
+ }
236
+
237
+ .view-header-title {
238
+ @apply flex flex-col;
239
+ }
240
+
241
+ .view-header-title h2 {
242
+ @apply text-2xl font-bold text-white tracking-tight;
243
+ }
244
+
245
+ .view-header-title p {
246
+ @apply text-sm text-gray-500 mt-1;
247
+ }
248
+
249
+ .view-header-actions {
250
+ @apply flex items-center gap-3;
251
+ }
252
+
253
+ /* Standard Card Panel */
254
+ .view-card {
255
+ position: relative;
256
+ overflow: hidden;
257
+ border-radius: var(--card-radius);
258
+ padding: 1.5rem;
259
+ border: 1px solid rgba(255, 255, 255, 0.08);
260
+ background: linear-gradient(135deg,
261
+ rgba(15, 15, 17, 0.75) 0%,
262
+ rgba(18, 18, 20, 0.70) 100%
263
+ );
264
+ -webkit-backdrop-filter: blur(12px);
265
+ backdrop-filter: blur(12px);
266
+ box-shadow:
267
+ 0 0 0 1px rgba(255, 255, 255, 0.02) inset,
268
+ 0 4px 24px rgba(0, 0, 0, 0.4);
269
+ transition: border-color 0.3s ease, box-shadow 0.3s ease;
270
+ }
271
+
272
+ .view-card:hover {
273
+ border-color: rgba(255, 255, 255, 0.12);
274
+ box-shadow:
275
+ 0 0 0 1px rgba(255, 255, 255, 0.04) inset,
276
+ 0 8px 32px rgba(0, 0, 0, 0.5);
277
+ }
278
+
279
+ .view-card-header {
280
+ @apply flex items-center justify-between mb-4 pb-4 border-b border-[rgba(39,39,42,0.3)];
281
+ }
282
+
283
+ /* Component Unification */
284
+ .standard-table {
285
+ @apply table w-full border-separate border-spacing-0;
286
+ }
287
+ .standard-table thead {
288
+ @apply bg-space-900/50 text-gray-500 font-mono text-xs uppercase border-b border-space-border;
289
+ }
290
+ .standard-table tbody tr {
291
+ @apply transition-all duration-200 border-b border-[rgba(39,39,42,0.3)] last:border-0;
292
+ }
293
+
294
+ .standard-table tbody tr:hover {
295
+ background: linear-gradient(
296
+ 90deg,
297
+ rgba(255, 255, 255, 0.03) 0%,
298
+ rgba(255, 255, 255, 0.05) 50%,
299
+ rgba(255, 255, 255, 0.03) 100%
300
+ );
301
+ border-color: rgba(255, 255, 255, 0.08);
302
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
303
+ }
304
+
305
+ /* Custom Range Slider - Simplified */
306
+ .custom-range {
307
+ -webkit-appearance: none;
308
+ appearance: none;
309
+ width: 100%;
310
+ height: 4px;
311
+ background: var(--color-space-800);
312
+ border-radius: 999px;
313
+ outline: none;
314
+ cursor: pointer;
315
+ }
316
+
317
+ .custom-range::-webkit-slider-thumb {
318
+ -webkit-appearance: none;
319
+ appearance: none;
320
+ width: 14px;
321
+ height: 14px;
322
+ border-radius: 50%;
323
+ background: var(--range-color, var(--color-neon-purple));
324
+ cursor: pointer;
325
+ transition: transform 0.1s ease;
326
+ }
327
+
328
+ .custom-range::-webkit-slider-thumb:hover {
329
+ transform: scale(1.15);
330
+ }
331
+
332
+ .custom-range::-moz-range-thumb {
333
+ width: 14px;
334
+ height: 14px;
335
+ border: none;
336
+ border-radius: 50%;
337
+ background: var(--range-color, var(--color-neon-purple));
338
+ cursor: pointer;
339
+ transition: transform 0.1s ease;
340
+ }
341
+
342
+ .custom-range::-moz-range-thumb:hover {
343
+ transform: scale(1.15);
344
+ }
345
+
346
+ /* Color Variants */
347
+ .custom-range-purple {
348
+ --range-color: var(--color-neon-purple);
349
+ }
350
+ .custom-range-green {
351
+ --range-color: var(--color-neon-green);
352
+ }
353
+ .custom-range-cyan {
354
+ --range-color: var(--color-neon-cyan);
355
+ }
356
+ .custom-range-yellow {
357
+ --range-color: var(--color-neon-yellow);
358
+ }
359
+ .custom-range-accent {
360
+ --range-color: var(--color-neon-cyan);
361
+ }
362
+
363
+ /* -------------------------------------------------------------------------- */
364
+ /* Refactored UI Components (Phase 1.2) */
365
+ /* -------------------------------------------------------------------------- */
366
+
367
+ /* Phase 1.2 additions ... */
368
+
369
+ /* Filter Controls */
370
+ .filter-control {
371
+ @apply flex items-center justify-center gap-2 px-3 py-1.5 lg:px-4 lg:py-2
372
+ text-[10px] lg:text-xs font-mono font-medium text-gray-400
373
+ bg-space-800 lg:bg-transparent border border-space-border/50 lg:border-transparent
374
+ rounded lg:rounded-md hover:text-white lg:hover:bg-space-800
375
+ transition-all duration-200 whitespace-nowrap w-full sm:w-auto;
376
+ }
377
+
378
+ .filter-control:hover {
379
+ @apply border-neon-cyan/50 lg:border-neon-cyan/30 lg:shadow-lg lg:shadow-neon-cyan/10;
380
+ }
381
+
382
+ .filter-control-item {
383
+ @apply block w-full px-3 py-1.5 text-left text-[10px] font-mono hover:bg-white/5 transition-colors;
384
+ }
385
+
386
+ /* Action Buttons */
387
+ .btn-action-ghost {
388
+ @apply btn btn-xs btn-ghost text-gray-400 hover:text-white transition-colors;
389
+ }
390
+
391
+ .btn-action-ghost-square {
392
+ @apply btn btn-xs btn-ghost btn-square text-gray-400 hover:text-white transition-colors;
393
+ }
394
+
395
+ .btn-action-primary {
396
+ @apply btn bg-gradient-to-r from-neon-purple to-indigo-600
397
+ border-none text-white shadow-lg shadow-neon-purple/20
398
+ hover:shadow-neon-purple/40 transition-all;
399
+ }
400
+
401
+ .btn-action-success {
402
+ @apply btn btn-xs btn-ghost btn-square text-green-500 hover:bg-green-500/20;
403
+ }
404
+
405
+ .btn-action-danger {
406
+ @apply btn btn-xs btn-ghost btn-square text-red-400 hover:bg-red-500/20;
407
+ }
408
+
409
+ .btn-action-neutral {
410
+ @apply btn btn-xs btn-ghost btn-square text-gray-500 hover:bg-gray-500/20;
411
+ }
412
+
413
+ /* Status Pills/Badges */
414
+ .status-pill {
415
+ @apply px-2 py-1 text-[10px] font-mono font-bold uppercase rounded border;
416
+ }
417
+
418
+ .status-pill-purple {
419
+ @apply status-pill bg-neon-purple/10 text-neon-purple border-neon-purple/30;
420
+ }
421
+
422
+ .status-pill-ultra {
423
+ @apply status-pill bg-yellow-500/10 text-yellow-400 border-yellow-500/30;
424
+ }
425
+
426
+ .status-pill-pro {
427
+ @apply status-pill bg-blue-500/10 text-blue-400 border-blue-500/30;
428
+ }
429
+
430
+ .status-pill-free {
431
+ @apply status-pill bg-gray-500/10 text-gray-400 border-gray-500/30;
432
+ }
433
+
434
+ .status-pill-success {
435
+ @apply status-pill bg-neon-green/10 text-neon-green border-neon-green/30;
436
+ }
437
+
438
+ .status-pill-warning {
439
+ @apply status-pill bg-yellow-500/10 text-yellow-400 border-yellow-500/30;
440
+ }
441
+
442
+ .status-pill-error {
443
+ @apply status-pill bg-red-500/10 text-red-400 border-red-500/30;
444
+ }
445
+
446
+ /* Input Components */
447
+ .input-search {
448
+ @apply w-full bg-space-900/50 border border-[rgba(39,39,42,0.5)] text-gray-300
449
+ rounded-lg pl-10 pr-4 py-2
450
+ focus:outline-none focus:bg-space-800 focus:border-neon-purple/50
451
+ hover:border-space-border hover:bg-space-800/80
452
+ transition-all placeholder-gray-600/80;
453
+ }
454
+
455
+ .input-search-sm {
456
+ @apply input-search h-8 text-xs font-normal;
457
+ }
458
+
459
+ /* -------------------------------------------------------------------------- */
460
+ /* Skeleton Loading (Phase 4.1) */
461
+ /* -------------------------------------------------------------------------- */
462
+
463
+ /* Skeleton animation */
464
+ @keyframes skeleton-pulse {
465
+ 0%, 100% {
466
+ opacity: 1;
467
+ }
468
+ 50% {
469
+ opacity: 0.4;
470
+ }
471
+ }
472
+
473
+ /* Base skeleton element */
474
+ .skeleton {
475
+ @apply bg-gradient-to-r from-space-900/60 via-space-800/40 to-space-900/60;
476
+ background-size: 200% 100%;
477
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
478
+ border-radius: 0.375rem;
479
+ }
480
+
481
+ /* Skeleton variants */
482
+ .skeleton-text {
483
+ @apply skeleton h-4 w-full;
484
+ }
485
+
486
+ .skeleton-text-sm {
487
+ @apply skeleton h-3 w-3/4;
488
+ }
489
+
490
+ .skeleton-title {
491
+ @apply skeleton h-6 w-1/2;
492
+ }
493
+
494
+ .skeleton-circle {
495
+ @apply skeleton rounded-full;
496
+ }
497
+
498
+ .skeleton-stat-card {
499
+ @apply skeleton h-32 w-full rounded-xl;
500
+ }
501
+
502
+ .skeleton-chart {
503
+ @apply skeleton h-64 w-full rounded-xl;
504
+ }
505
+
506
+ .skeleton-table-row {
507
+ @apply skeleton h-12 w-full mb-2;
508
+ }
509
+
510
+ /* Fix DaisyUI toggle hover background override */
511
+ .toggle-success:checked,
512
+ .toggle-success[aria-checked="true"] {
513
+ background-color: oklch(var(--su)) !important;
514
+ }
515
+
516
+ /* Desktop Sidebar Collapsed State */
517
+ @media (min-width: 1024px) {
518
+ body .sidebar-collapsed {
519
+ width: 0;
520
+ padding: 0;
521
+ border: none;
522
+ }
523
+ }