fogact 1.2.0 → 1.2.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 (51) hide show
  1. package/bin/web-server.js +829 -230
  2. package/frontend/admin/admin-panel-v2.js +8 -5
  3. package/frontend/user/assets/AnnouncementDetail-Dvxmwz0A-fogact-live.js +12 -0
  4. package/frontend/user/assets/Announcements-CS1tF2mx-fogact-live.js +11 -0
  5. package/frontend/user/assets/CardBind-CsCxihhP-fogact-live.js +21 -0
  6. package/frontend/user/assets/CardContent.vue_vue_type_script_setup_true_lang-D2L-uqSl-fogact-live.js +1 -0
  7. package/frontend/user/assets/CardDescription.vue_vue_type_script_setup_true_lang-D-v5Pl7F-fogact-live.js +1 -0
  8. package/frontend/user/assets/CardTitle.vue_vue_type_script_setup_true_lang-a0CCN6D5-fogact-live.js +1 -0
  9. package/frontend/user/assets/Dashboard-rPsmltm5-fogact-live.js +51 -0
  10. package/frontend/user/assets/Dashboard-rPsmltm5.js +1 -1
  11. package/frontend/user/assets/DashboardLayout-DDkxHYFj-fogact-live.js +80 -0
  12. package/frontend/user/assets/DashboardLayout-DDkxHYFj.js +2 -2
  13. package/frontend/user/assets/Input.vue_vue_type_script_setup_true_lang-B0SyPmYb-fogact-live.js +6 -0
  14. package/frontend/user/assets/Label.vue_vue_type_script_setup_true_lang-CxYORSgN-fogact-live.js +1 -0
  15. package/frontend/user/assets/Progress.vue_vue_type_script_setup_true_lang-2_QbPsEQ-fogact-live.js +1 -0
  16. package/frontend/user/assets/QuotaPack-B_tJ7Psm-fogact-live.js +6 -0
  17. package/frontend/user/assets/Renewal-BSDhDmwv-fogact-live.js +6 -0
  18. package/frontend/user/assets/ScrollArea.vue_vue_type_script_setup_true_lang-DMYwcfpz-fogact-live.js +1 -0
  19. package/frontend/user/assets/Separator.vue_vue_type_script_setup_true_lang-Ckg8EXj_-fogact-live.js +1 -0
  20. package/frontend/user/assets/Settings-CBdAa3lw-fogact-live.js +11 -0
  21. package/frontend/user/assets/TooltipTrigger.vue_vue_type_script_setup_true_lang-DtSBjzGo-fogact-live.js +16 -0
  22. package/frontend/user/assets/Welcome-Dtfp6oER-fogact-live.js +1 -0
  23. package/frontend/user/assets/Welcome-Dtfp6oER.js +1 -1
  24. package/frontend/user/assets/_plugin-vue_export-helper-5cjT4u0R-fogact-live.js +16 -0
  25. package/frontend/user/assets/activity-wYWtyqTJ-fogact-live.js +6 -0
  26. package/frontend/user/assets/announcement-35mOnjRL-fogact-live.js +16 -0
  27. package/frontend/user/assets/announcement-35mOnjRL.js +1 -1
  28. package/frontend/user/assets/calendar-BFNuCata-fogact-live.js +6 -0
  29. package/frontend/user/assets/chevron-down-kDbuU1Py-fogact-live.js +6 -0
  30. package/frontend/user/assets/chevron-right-BayASIm0-fogact-live.js +6 -0
  31. package/frontend/user/assets/eye-CY62vip0-fogact-live.js +6 -0
  32. package/frontend/user/assets/gauge-C5NQ-mV8-fogact-live.js +6 -0
  33. package/frontend/user/assets/index-Da98HOxL.js +3 -3
  34. package/frontend/user/assets/index-fogact-live.js +91 -0
  35. package/frontend/user/assets/link-2-DT5R5nGO-fogact-live.js +6 -0
  36. package/frontend/user/assets/package-rUbExUEn-fogact-live.js +6 -0
  37. package/frontend/user/assets/plus-CQc6C8wG-fogact-live.js +11 -0
  38. package/frontend/user/assets/refresh-cw-Y9hCloPL-fogact-live.js +6 -0
  39. package/frontend/user/assets/useUserPageRefresh-BYZvpNR9-fogact-live.js +1 -0
  40. package/frontend/user/assets/zap-l5zbZqrM-fogact-live.js +11 -0
  41. package/frontend/user/index.html +5 -5
  42. package/lib/commands/activate.js +1 -8
  43. package/lib/config/claude.js +1 -0
  44. package/lib/config/codex.js +1 -1
  45. package/lib/config/upstream.js +3 -0
  46. package/lib/index.js +109 -29
  47. package/lib/platforms/opencode.js +1 -1
  48. package/lib/services/activation-orchestrator.js +30 -166
  49. package/lib/services/database.js +47 -0
  50. package/lib/services/fogact-api.js +12 -9
  51. package/package.json +1 -1
@@ -6,6 +6,7 @@ const path = require("path");
6
6
  const DATA_DIR = path.join(__dirname, "..", "..", "data");
7
7
  const USERS_FILE = path.join(DATA_DIR, "users.json");
8
8
  const CODES_FILE = path.join(DATA_DIR, "codes.json");
9
+ const USAGE_FILE = path.join(DATA_DIR, "usage.json");
9
10
 
10
11
  // 确保数据目录存在
11
12
  function ensureDataDir() {
@@ -257,6 +258,51 @@ const codeDb = {
257
258
  },
258
259
  };
259
260
 
261
+ // 用量日志数据库操作
262
+ const usageDb = {
263
+ getAll() {
264
+ return readJsonFile(USAGE_FILE, []);
265
+ },
266
+
267
+ create(usageData) {
268
+ const items = this.getAll();
269
+ const now = new Date().toISOString();
270
+ const newItem = {
271
+ id: usageData.id || `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
272
+ codeId: usageData.codeId || null,
273
+ code: usageData.code || null,
274
+ service: usageData.service || "claude",
275
+ model: usageData.model || "unknown",
276
+ inputTokens: Number(usageData.inputTokens || 0),
277
+ outputTokens: Number(usageData.outputTokens || 0),
278
+ totalTokens: Number(usageData.totalTokens || 0),
279
+ requests: Number(usageData.requests || 1),
280
+ statusCode: usageData.statusCode || null,
281
+ success: usageData.success !== false,
282
+ cost: Number(usageData.cost || 0),
283
+ path: usageData.path || null,
284
+ createdAt: usageData.createdAt || now,
285
+ };
286
+ items.push(newItem);
287
+ writeJsonFile(USAGE_FILE, items);
288
+ return newItem;
289
+ },
290
+
291
+ getByCode(code) {
292
+ const value = String(code || "").trim();
293
+ if (!value) return [];
294
+ return this.getAll().filter((item) => item.code === value);
295
+ },
296
+
297
+ getSince(code, since) {
298
+ const sinceTime = since ? new Date(since).getTime() : 0;
299
+ return this.getByCode(code).filter((item) => {
300
+ const createdAt = new Date(item.createdAt || 0).getTime();
301
+ return Number.isFinite(createdAt) && createdAt >= sinceTime;
302
+ });
303
+ },
304
+ };
305
+
260
306
  // 初始化示例数据
261
307
  function initializeSampleData() {
262
308
  ensureDataDir();
@@ -457,5 +503,6 @@ function initializeSampleData() {
457
503
  module.exports = {
458
504
  userDb,
459
505
  codeDb,
506
+ usageDb,
460
507
  initializeSampleData,
461
508
  };
@@ -6,7 +6,7 @@ const http = require("http");
6
6
 
7
7
  // 支持环境变量覆盖 API 地址;默认连接公网 FogAct 面板。
8
8
  const DEFAULT_API_BASE = "https://cliproxy.fogidc.com";
9
- const API_BASE = process.env.FOGACT_API_BASE || process.env.CLIPROXY_API_BASE || DEFAULT_API_BASE;
9
+ const API_BASE = process.env.FOGACT_API_BASE || DEFAULT_API_BASE;
10
10
 
11
11
  function makeRequest(path, options = {}) {
12
12
  return new Promise((resolve, reject) => {
@@ -57,7 +57,6 @@ function makeRequest(path, options = {}) {
57
57
 
58
58
  async function verifyActivationCode(code, service) {
59
59
  try {
60
- // 调用本地激活 API
61
60
  const response = await makeRequest("/api/activate", {
62
61
  method: "POST",
63
62
  body: {
@@ -67,17 +66,18 @@ async function verifyActivationCode(code, service) {
67
66
  },
68
67
  });
69
68
 
70
- if (response.status === 200 && response.data.success) {
69
+ const normalized = normalizeActivationResponse(response);
70
+
71
+ if (response.status >= 200 && response.status < 300 && normalized.valid) {
71
72
  return {
72
73
  valid: true,
73
- service: response.data.data.service,
74
- expiresAt: response.data.data.expiresAt,
75
- quota: response.data.data.quota,
76
- nodes: response.data.data.nodes || [],
74
+ ...normalized.data,
75
+ data: normalized.data,
76
+ nodes: normalized.data.nodes || [],
77
77
  };
78
78
  }
79
79
 
80
- return { valid: false, error: response.data.message || "Invalid code" };
80
+ return { valid: false, error: normalized.message || "Invalid code" };
81
81
  } catch (err) {
82
82
  return { valid: false, error: err.message };
83
83
  }
@@ -116,7 +116,10 @@ async function inspectActivationCode(code) {
116
116
  }
117
117
 
118
118
  async function redeemActivationCode(code, service) {
119
- return verifyActivationCode(code, service);
119
+ const result = await inspectActivationCode(code);
120
+ return result.valid
121
+ ? { valid: true, service: result.service, expiresAt: result.expiresAt, quota: result.quota, nodes: result.nodes || [] }
122
+ : result;
120
123
  }
121
124
 
122
125
  async function getNodes(service) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fogact",
3
- "version": "1.2.0",
3
+ "version": "1.2.3",
4
4
  "description": "FogAct activation helper for Claude Code and Codex",
5
5
  "keywords": [
6
6
  "fogact",