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.
- package/bin/web-server.js +829 -230
- package/frontend/admin/admin-panel-v2.js +8 -5
- package/frontend/user/assets/AnnouncementDetail-Dvxmwz0A-fogact-live.js +12 -0
- package/frontend/user/assets/Announcements-CS1tF2mx-fogact-live.js +11 -0
- package/frontend/user/assets/CardBind-CsCxihhP-fogact-live.js +21 -0
- package/frontend/user/assets/CardContent.vue_vue_type_script_setup_true_lang-D2L-uqSl-fogact-live.js +1 -0
- package/frontend/user/assets/CardDescription.vue_vue_type_script_setup_true_lang-D-v5Pl7F-fogact-live.js +1 -0
- package/frontend/user/assets/CardTitle.vue_vue_type_script_setup_true_lang-a0CCN6D5-fogact-live.js +1 -0
- package/frontend/user/assets/Dashboard-rPsmltm5-fogact-live.js +51 -0
- package/frontend/user/assets/Dashboard-rPsmltm5.js +1 -1
- package/frontend/user/assets/DashboardLayout-DDkxHYFj-fogact-live.js +80 -0
- package/frontend/user/assets/DashboardLayout-DDkxHYFj.js +2 -2
- package/frontend/user/assets/Input.vue_vue_type_script_setup_true_lang-B0SyPmYb-fogact-live.js +6 -0
- package/frontend/user/assets/Label.vue_vue_type_script_setup_true_lang-CxYORSgN-fogact-live.js +1 -0
- package/frontend/user/assets/Progress.vue_vue_type_script_setup_true_lang-2_QbPsEQ-fogact-live.js +1 -0
- package/frontend/user/assets/QuotaPack-B_tJ7Psm-fogact-live.js +6 -0
- package/frontend/user/assets/Renewal-BSDhDmwv-fogact-live.js +6 -0
- package/frontend/user/assets/ScrollArea.vue_vue_type_script_setup_true_lang-DMYwcfpz-fogact-live.js +1 -0
- package/frontend/user/assets/Separator.vue_vue_type_script_setup_true_lang-Ckg8EXj_-fogact-live.js +1 -0
- package/frontend/user/assets/Settings-CBdAa3lw-fogact-live.js +11 -0
- package/frontend/user/assets/TooltipTrigger.vue_vue_type_script_setup_true_lang-DtSBjzGo-fogact-live.js +16 -0
- package/frontend/user/assets/Welcome-Dtfp6oER-fogact-live.js +1 -0
- package/frontend/user/assets/Welcome-Dtfp6oER.js +1 -1
- package/frontend/user/assets/_plugin-vue_export-helper-5cjT4u0R-fogact-live.js +16 -0
- package/frontend/user/assets/activity-wYWtyqTJ-fogact-live.js +6 -0
- package/frontend/user/assets/announcement-35mOnjRL-fogact-live.js +16 -0
- package/frontend/user/assets/announcement-35mOnjRL.js +1 -1
- package/frontend/user/assets/calendar-BFNuCata-fogact-live.js +6 -0
- package/frontend/user/assets/chevron-down-kDbuU1Py-fogact-live.js +6 -0
- package/frontend/user/assets/chevron-right-BayASIm0-fogact-live.js +6 -0
- package/frontend/user/assets/eye-CY62vip0-fogact-live.js +6 -0
- package/frontend/user/assets/gauge-C5NQ-mV8-fogact-live.js +6 -0
- package/frontend/user/assets/index-Da98HOxL.js +3 -3
- package/frontend/user/assets/index-fogact-live.js +91 -0
- package/frontend/user/assets/link-2-DT5R5nGO-fogact-live.js +6 -0
- package/frontend/user/assets/package-rUbExUEn-fogact-live.js +6 -0
- package/frontend/user/assets/plus-CQc6C8wG-fogact-live.js +11 -0
- package/frontend/user/assets/refresh-cw-Y9hCloPL-fogact-live.js +6 -0
- package/frontend/user/assets/useUserPageRefresh-BYZvpNR9-fogact-live.js +1 -0
- package/frontend/user/assets/zap-l5zbZqrM-fogact-live.js +11 -0
- package/frontend/user/index.html +5 -5
- package/lib/commands/activate.js +1 -8
- package/lib/config/claude.js +1 -0
- package/lib/config/codex.js +1 -1
- package/lib/config/upstream.js +3 -0
- package/lib/index.js +109 -29
- package/lib/platforms/opencode.js +1 -1
- package/lib/services/activation-orchestrator.js +30 -166
- package/lib/services/database.js +47 -0
- package/lib/services/fogact-api.js +12 -9
- package/package.json +1 -1
package/lib/services/database.js
CHANGED
|
@@ -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 ||
|
|
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
|
-
|
|
69
|
+
const normalized = normalizeActivationResponse(response);
|
|
70
|
+
|
|
71
|
+
if (response.status >= 200 && response.status < 300 && normalized.valid) {
|
|
71
72
|
return {
|
|
72
73
|
valid: true,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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:
|
|
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
|
-
|
|
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) {
|