fogact 1.1.3

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -0
  3. package/README.zh-CN.md +244 -0
  4. package/bin/cli.js +9 -0
  5. package/bin/web-server.js +1434 -0
  6. package/config/upstream.example.json +14 -0
  7. package/frontend/activate.html +249 -0
  8. package/frontend/admin/admin-panel-v2.js +1899 -0
  9. package/frontend/admin/index.html +705 -0
  10. package/frontend/assets/market-ui.css +1876 -0
  11. package/frontend/color-test.html +136 -0
  12. package/frontend/index.html +191 -0
  13. package/frontend/user/assets/AnnouncementDetail-Dvxmwz0A.js +12 -0
  14. package/frontend/user/assets/Announcements-CS1tF2mx.js +11 -0
  15. package/frontend/user/assets/CardBind-CsCxihhP.js +21 -0
  16. package/frontend/user/assets/CardContent.vue_vue_type_script_setup_true_lang-D2L-uqSl.js +1 -0
  17. package/frontend/user/assets/CardDescription.vue_vue_type_script_setup_true_lang-D-v5Pl7F.js +1 -0
  18. package/frontend/user/assets/CardTitle.vue_vue_type_script_setup_true_lang-a0CCN6D5.js +1 -0
  19. package/frontend/user/assets/Dashboard-rPsmltm5.js +51 -0
  20. package/frontend/user/assets/DashboardLayout-BUCWGlXC.css +1 -0
  21. package/frontend/user/assets/DashboardLayout-DDkxHYFj.js +80 -0
  22. package/frontend/user/assets/Input.vue_vue_type_script_setup_true_lang-B0SyPmYb.js +6 -0
  23. package/frontend/user/assets/Label.vue_vue_type_script_setup_true_lang-CxYORSgN.js +1 -0
  24. package/frontend/user/assets/Progress.vue_vue_type_script_setup_true_lang-2_QbPsEQ.js +1 -0
  25. package/frontend/user/assets/QuotaPack-B_tJ7Psm.js +6 -0
  26. package/frontend/user/assets/Renewal-BSDhDmwv.js +6 -0
  27. package/frontend/user/assets/ScrollArea.vue_vue_type_script_setup_true_lang-DMYwcfpz.js +1 -0
  28. package/frontend/user/assets/Separator.vue_vue_type_script_setup_true_lang-Ckg8EXj_.js +1 -0
  29. package/frontend/user/assets/Settings-CBdAa3lw.js +11 -0
  30. package/frontend/user/assets/TooltipTrigger.vue_vue_type_script_setup_true_lang-DtSBjzGo.js +16 -0
  31. package/frontend/user/assets/Welcome-7IfzEli4.css +1 -0
  32. package/frontend/user/assets/Welcome-Dtfp6oER.js +1 -0
  33. package/frontend/user/assets/_plugin-vue_export-helper-5cjT4u0R.js +16 -0
  34. package/frontend/user/assets/activity-wYWtyqTJ.js +6 -0
  35. package/frontend/user/assets/announcement-35mOnjRL.js +16 -0
  36. package/frontend/user/assets/calendar-BFNuCata.js +6 -0
  37. package/frontend/user/assets/chart-vendor-CULJE59K.js +37 -0
  38. package/frontend/user/assets/chevron-down-kDbuU1Py.js +6 -0
  39. package/frontend/user/assets/chevron-right-BayASIm0.js +6 -0
  40. package/frontend/user/assets/eye-CY62vip0.js +6 -0
  41. package/frontend/user/assets/gauge-C5NQ-mV8.js +6 -0
  42. package/frontend/user/assets/index-B8QSyYhS.css +1 -0
  43. package/frontend/user/assets/index-Da98HOxL.js +91 -0
  44. package/frontend/user/assets/link-2-DT5R5nGO.js +6 -0
  45. package/frontend/user/assets/package-rUbExUEn.js +6 -0
  46. package/frontend/user/assets/plus-CQc6C8wG.js +11 -0
  47. package/frontend/user/assets/refresh-cw-Y9hCloPL.js +6 -0
  48. package/frontend/user/assets/useUserPageRefresh-BYZvpNR9.js +1 -0
  49. package/frontend/user/assets/zap-l5zbZqrM.js +11 -0
  50. package/frontend/user/index.html +67 -0
  51. package/install.sh +402 -0
  52. package/lib/commands/activate.js +144 -0
  53. package/lib/commands/restore.js +102 -0
  54. package/lib/commands/test.js +40 -0
  55. package/lib/config/claude.js +81 -0
  56. package/lib/config/codex.js +164 -0
  57. package/lib/config/upstream.js +79 -0
  58. package/lib/index.js +164 -0
  59. package/lib/platforms/claude-code.js +35 -0
  60. package/lib/platforms/codex-cli.js +35 -0
  61. package/lib/platforms/editor-codex.js +138 -0
  62. package/lib/platforms/index.js +32 -0
  63. package/lib/platforms/openclaw.js +118 -0
  64. package/lib/platforms/opencode.js +89 -0
  65. package/lib/services/activation-orchestrator.js +666 -0
  66. package/lib/services/backup-service.js +162 -0
  67. package/lib/services/cliproxy-api.js +174 -0
  68. package/lib/services/database.js +461 -0
  69. package/lib/services/newapi.js +97 -0
  70. package/lib/services/node-service.js +49 -0
  71. package/lib/utils/json-file.js +33 -0
  72. package/package.json +53 -0
@@ -0,0 +1,14 @@
1
+ {
2
+ "provider": "newapi",
3
+ "baseUrl": "https://newapi.example.com",
4
+ "apiKey": "sk-your-upstream-newapi-key",
5
+ "services": {
6
+ "claude": {
7
+ "baseUrl": "https://newapi.example.com"
8
+ },
9
+ "codex": {
10
+ "baseUrl": "https://newapi.example.com/v1"
11
+ }
12
+ },
13
+ "timeoutMs": 10000
14
+ }
@@ -0,0 +1,249 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>激活 CDK | FogIDC Activator</title>
7
+ <meta name="description" content="输入 FogIDC Activator 激活码,绑定用户并开通服务。" />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
11
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet" />
12
+ <link rel="stylesheet" href="/assets/market-ui.css?v=20260616-upstream2" />
13
+ </head>
14
+ <body class="market-page">
15
+ <span class="market-mouse-light" aria-hidden="true"></span>
16
+
17
+ <div class="market-shell">
18
+ <header class="market-topbar">
19
+ <a class="market-brand" href="/">
20
+ <span class="market-logo">F</span>
21
+ <span>
22
+ <span class="market-brand-title">FogIDC Activator</span>
23
+ <span class="market-brand-subtitle">Redeem center</span>
24
+ </span>
25
+ </a>
26
+
27
+ <nav class="market-nav" aria-label="主导航">
28
+ <a href="/user/">用户中心</a>
29
+ <a href="/admin/">管理后台</a>
30
+ <a href="/">首页</a>
31
+ </nav>
32
+ </header>
33
+
34
+ <main class="market-activation">
35
+ <section class="market-activation-copy" aria-labelledby="activation-title">
36
+ <div class="market-kicker"><span class="market-kicker-dot"></span> fast activation flow</div>
37
+ <h1 id="activation-title" class="market-title">输入 CDK,立即开通 <span>CLI 服务</span></h1>
38
+ <p class="market-copy">
39
+ 保留原有激活接口,升级为更清晰的产品化表单。输入激活码后会自动校验额度、服务类型和有效期。
40
+ </p>
41
+
42
+ <div class="market-flow" aria-label="激活流程">
43
+ <div class="market-flow-step">
44
+ <span class="market-flow-index">1</span>
45
+ <span><strong>输入 CDK</strong><span>校验格式和可用状态</span></span>
46
+ </div>
47
+ <div class="market-flow-step">
48
+ <span class="market-flow-index">2</span>
49
+ <span><strong>绑定身份</strong><span>用户名和邮箱用于后台追踪</span></span>
50
+ </div>
51
+ <div class="market-flow-step">
52
+ <span class="market-flow-index">3</span>
53
+ <span><strong>点火开通</strong><span>写入服务、额度和有效期</span></span>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="market-preview-stack" style="margin-top: 28px; max-width: 640px;">
58
+ <div class="market-mini-card">
59
+ <span class="market-icon material-symbols-outlined">encrypted</span>
60
+ <div>
61
+ <p class="market-mini-title">安全校验</p>
62
+ <p class="market-mini-copy">激活过程通过本地 API 完成,失败会返回明确提示。</p>
63
+ </div>
64
+ <span class="market-status-pill">Secure</span>
65
+ </div>
66
+ <div class="market-mini-card">
67
+ <span class="market-icon material-symbols-outlined">rocket_launch</span>
68
+ <div>
69
+ <p class="market-mini-title">多服务支持</p>
70
+ <p class="market-mini-copy">适配 Codex、Claude Code、OpenCode 与 OpenClaw 场景。</p>
71
+ </div>
72
+ <span class="market-status-pill">Multi</span>
73
+ </div>
74
+ </div>
75
+ </section>
76
+
77
+ <section aria-label="激活表单">
78
+ <div id="activation-form" class="market-auth-card motion-once">
79
+ <div class="market-card-canvas" style="min-height: 128px; border-radius: 24px; margin-bottom: 22px; --accent: var(--market-primary);">
80
+ <span class="market-widget market-widget-key"></span>
81
+ <span class="market-widget market-widget-toggle"></span>
82
+ <span class="market-widget market-widget-badge material-symbols-outlined">rocket_launch</span>
83
+ </div>
84
+ <div class="market-form-header">
85
+ <span class="market-icon material-symbols-outlined">vpn_key</span>
86
+ <h1>激活 CDK</h1>
87
+ <p>填写激活码,用户名和邮箱可选。成功后会展示服务类型、额度和过期时间。</p>
88
+ </div>
89
+
90
+ <form id="activate-form" class="market-form">
91
+ <div class="market-field">
92
+ <label for="activation-code">激活码 <span>Required</span></label>
93
+ <input type="text" id="activation-code" placeholder="例如 XXXX-XXXX-XXXX-XXXX" required />
94
+ </div>
95
+
96
+ <div class="market-field">
97
+ <label for="username">用户名 <span>Optional</span></label>
98
+ <input type="text" id="username" placeholder="用于后台识别的用户名" />
99
+ </div>
100
+
101
+ <div class="market-field">
102
+ <label for="email">邮箱 <span>Optional</span></label>
103
+ <input type="email" id="email" placeholder="name@example.com" />
104
+ </div>
105
+
106
+ <div id="error-message" class="market-alert hidden"></div>
107
+
108
+ <button type="submit" id="submit-btn" class="market-button market-button-primary" style="width: 100%; min-height: 50px;">
109
+ <span class="material-symbols-outlined">bolt</span>
110
+ 激活服务
111
+ </button>
112
+ </form>
113
+
114
+ <div class="market-link-row">
115
+ <a href="/admin/">返回管理后台</a>
116
+ <a href="/user/">前往用户中心</a>
117
+ </div>
118
+ </div>
119
+
120
+ <div id="success-result" class="market-auth-card hidden">
121
+ <div class="market-result-inner" style="text-align: center;">
122
+ <div class="success-checkmark">
123
+ <div class="check-icon">
124
+ <span class="icon-line line-tip"></span>
125
+ <span class="icon-line line-long"></span>
126
+ </div>
127
+ </div>
128
+
129
+ <h2>激活成功</h2>
130
+ <p>您的激活码已绑定,下面是本次开通详情。</p>
131
+
132
+ <div class="market-result-list">
133
+ <div class="market-result-row"><span>激活码</span><span id="result-code"></span></div>
134
+ <div class="market-result-row"><span>服务类型</span><span id="result-service"></span></div>
135
+ <div class="market-result-row"><span>总额度</span><span id="result-quota"></span></div>
136
+ <div class="market-result-row"><span>过期时间</span><span id="result-expires"></span></div>
137
+ </div>
138
+
139
+ <button onclick="location.reload()" class="market-button market-button-primary" style="width: 100%; min-height: 50px;">
140
+ 激活另一个激活码
141
+ </button>
142
+
143
+ <div class="market-link-row">
144
+ <a href="/user/">前往用户中心</a>
145
+ <a href="/">返回首页</a>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </section>
150
+ </main>
151
+ </div>
152
+
153
+ <script>
154
+ const body = document.body;
155
+ const params = new URLSearchParams(window.location.search);
156
+ const requestedService = params.get('service') || params.get('platform') || '';
157
+ const form = document.getElementById('activate-form');
158
+ const submitBtn = document.getElementById('submit-btn');
159
+ const errorMessage = document.getElementById('error-message');
160
+ const activationForm = document.getElementById('activation-form');
161
+ const successResult = document.getElementById('success-result');
162
+ let raf = 0;
163
+
164
+ window.addEventListener('load', () => {
165
+ requestAnimationFrame(() => document.body.classList.add('motion-ready'));
166
+ }, { once: true });
167
+
168
+ window.addEventListener('pointermove', (event) => {
169
+ if (raf) return;
170
+ raf = requestAnimationFrame(() => {
171
+ body.classList.add('is-pointer-active');
172
+ body.style.setProperty('--cursor-x', `${event.clientX}px`);
173
+ body.style.setProperty('--cursor-y', `${event.clientY}px`);
174
+ raf = 0;
175
+ });
176
+ });
177
+
178
+ form.addEventListener('submit', async (event) => {
179
+ event.preventDefault();
180
+
181
+ const code = document.getElementById('activation-code').value.trim();
182
+ const username = document.getElementById('username').value.trim();
183
+ const email = document.getElementById('email').value.trim();
184
+
185
+ if (!code) {
186
+ showError('请输入激活码');
187
+ return;
188
+ }
189
+
190
+ submitBtn.disabled = true;
191
+ submitBtn.innerHTML = '<span class="material-symbols-outlined">progress_activity</span> 激活中...';
192
+ errorMessage.classList.add('hidden');
193
+
194
+ try {
195
+ const response = await fetch('/api/activate', {
196
+ method: 'POST',
197
+ headers: { 'Content-Type': 'application/json' },
198
+ body: JSON.stringify({ code, username, email, service: requestedService })
199
+ });
200
+
201
+ const result = await response.json();
202
+
203
+ if (result.success) {
204
+ showSuccess(result.data);
205
+ } else {
206
+ showError(result.message || '激活失败');
207
+ }
208
+ } catch (error) {
209
+ console.error('Activation error:', error);
210
+ showError('网络错误,请稍后重试');
211
+ } finally {
212
+ submitBtn.disabled = false;
213
+ submitBtn.innerHTML = '<span class="material-symbols-outlined">bolt</span> 激活服务';
214
+ }
215
+ });
216
+
217
+ function showError(message) {
218
+ errorMessage.textContent = message;
219
+ errorMessage.classList.remove('hidden');
220
+ errorMessage.classList.add('animate-slide-in-up');
221
+ }
222
+
223
+ function showSuccess(data) {
224
+ document.getElementById('result-code').textContent = data.code || '-';
225
+ document.getElementById('result-service').textContent = data.service || '-';
226
+ document.getElementById('result-quota').textContent = formatNumber(data.quota?.total || 0);
227
+ document.getElementById('result-expires').textContent = formatDate(data.expiresAt);
228
+
229
+ activationForm.classList.add('hidden');
230
+ successResult.classList.remove('hidden');
231
+ successResult.classList.add('animate-slide-in-up');
232
+ }
233
+
234
+ function formatNumber(num) {
235
+ return new Intl.NumberFormat('zh-CN').format(num);
236
+ }
237
+
238
+ function formatDate(dateString) {
239
+ if (!dateString) return '永久';
240
+ const date = new Date(dateString);
241
+ return date.toLocaleDateString('zh-CN', {
242
+ year: 'numeric',
243
+ month: '2-digit',
244
+ day: '2-digit'
245
+ });
246
+ }
247
+ </script>
248
+ </body>
249
+ </html>