ft-scout 8.0.4 → 8.0.5
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/README.md +2 -2
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +6 -0
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/audit.d.ts.map +1 -1
- package/bin/src/commands/audit.js +8 -2
- package/bin/src/commands/audit.js.map +1 -1
- package/bin/src/commands/dashboard.d.ts.map +1 -1
- package/bin/src/commands/dashboard.js +9 -7
- package/bin/src/commands/dashboard.js.map +1 -1
- package/bin/src/commands/plan.d.ts.map +1 -0
- package/bin/src/commands/plan.js +70 -0
- package/bin/src/commands/plan.js.map +1 -0
- package/bin/src/commands/quota.d.ts.map +1 -1
- package/bin/src/commands/quota.js +4 -20
- package/bin/src/commands/quota.js.map +1 -1
- package/bin/src/commands/risky.d.ts.map +1 -1
- package/bin/src/commands/risky.js +8 -2
- package/bin/src/commands/risky.js.map +1 -1
- package/bin/src/index.js +17 -7
- package/bin/src/index.js.map +1 -1
- package/bin/src/server/server.d.ts.map +1 -1
- package/bin/src/server/server.js +57 -0
- package/bin/src/server/server.js.map +1 -1
- package/bin/src/utils/auth.d.ts.map +1 -1
- package/bin/src/utils/auth.js +382 -7
- package/bin/src/utils/auth.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/payment.d.ts.map +1 -0
- package/bin/src/utils/payment.js +251 -0
- package/bin/src/utils/payment.js.map +1 -0
- package/package.json +1 -1
- package/web/app.js +86 -14
- package/web/styles.css +2 -2
package/bin/src/utils/auth.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import os from 'os';
|
|
4
|
+
import crypto from 'crypto';
|
|
4
5
|
const AUTH_DIR = path.join(os.homedir(), '.ft');
|
|
5
6
|
const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');
|
|
6
7
|
const DEFAULT_AUTH_CONFIG = {
|
|
@@ -19,11 +20,149 @@ const DEFAULT_AUTH_CONFIG = {
|
|
|
19
20
|
customApiKey: undefined,
|
|
20
21
|
customBaseUrl: undefined,
|
|
21
22
|
};
|
|
23
|
+
const ACCOUNTS_FILE = path.join(AUTH_DIR, 'accounts.json');
|
|
24
|
+
const SYSTEM_PEPPER = 'ft_scout_ledger_integrity_pepper_v1_9a8b7c';
|
|
25
|
+
export const TIER_CREDIT_LIMITS = {
|
|
26
|
+
free: 100,
|
|
27
|
+
pro: 1000,
|
|
28
|
+
enterprise: 10000,
|
|
29
|
+
};
|
|
22
30
|
function ensureAuthDir() {
|
|
23
31
|
if (!fs.existsSync(AUTH_DIR)) {
|
|
24
32
|
fs.mkdirSync(AUTH_DIR, { recursive: true });
|
|
25
33
|
}
|
|
26
34
|
}
|
|
35
|
+
function getDeviceIntegrityKey() {
|
|
36
|
+
const machineFingerprint = `${os.hostname()}:${os.platform()}:${os.arch()}:${os.homedir()}:${SYSTEM_PEPPER}`;
|
|
37
|
+
return crypto.createHash('sha256').update(machineFingerprint).digest('hex');
|
|
38
|
+
}
|
|
39
|
+
function generateRecordSignature(record) {
|
|
40
|
+
const key = getDeviceIntegrityKey();
|
|
41
|
+
const payload = [
|
|
42
|
+
record.userId || '',
|
|
43
|
+
(record.email || '').toLowerCase().trim(),
|
|
44
|
+
record.currentTier || 'free',
|
|
45
|
+
record.creditsUsed,
|
|
46
|
+
record.creditsTotal,
|
|
47
|
+
record.renewAt,
|
|
48
|
+
record.transactionId || '',
|
|
49
|
+
].join('|');
|
|
50
|
+
return crypto.createHmac('sha256', key).update(payload).digest('hex');
|
|
51
|
+
}
|
|
52
|
+
function verifyRecordIntegrity(record) {
|
|
53
|
+
if (!record._sig || typeof record._sig !== 'string')
|
|
54
|
+
return false;
|
|
55
|
+
const cleanRecord = { ...record };
|
|
56
|
+
delete cleanRecord._sig;
|
|
57
|
+
const expected = generateRecordSignature(cleanRecord);
|
|
58
|
+
try {
|
|
59
|
+
const a = Buffer.from(record._sig, 'hex');
|
|
60
|
+
const b = Buffer.from(expected, 'hex');
|
|
61
|
+
return a.length === b.length && crypto.timingSafeEqual(a, b);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function generateAuthSignature(config) {
|
|
68
|
+
const key = getDeviceIntegrityKey();
|
|
69
|
+
const userId = config.user?.id || '';
|
|
70
|
+
const email = (config.user?.email || '').toLowerCase().trim();
|
|
71
|
+
const payload = [
|
|
72
|
+
userId,
|
|
73
|
+
email,
|
|
74
|
+
config.currentTier || 'free',
|
|
75
|
+
config.creditsUsed ?? 0,
|
|
76
|
+
config.creditsTotal ?? 100,
|
|
77
|
+
config.renewAt || '',
|
|
78
|
+
config.transactionId || '',
|
|
79
|
+
].join('|');
|
|
80
|
+
return crypto.createHmac('sha256', key).update(payload).digest('hex');
|
|
81
|
+
}
|
|
82
|
+
function verifyAuthIntegrity(config) {
|
|
83
|
+
if (!config.user)
|
|
84
|
+
return true; // Unauthenticated default state is safe
|
|
85
|
+
if (!config._sig || typeof config._sig !== 'string')
|
|
86
|
+
return false;
|
|
87
|
+
const cleanConfig = { ...config };
|
|
88
|
+
delete cleanConfig._sig;
|
|
89
|
+
const expected = generateAuthSignature(cleanConfig);
|
|
90
|
+
try {
|
|
91
|
+
const a = Buffer.from(config._sig, 'hex');
|
|
92
|
+
const b = Buffer.from(expected, 'hex');
|
|
93
|
+
return a.length === b.length && crypto.timingSafeEqual(a, b);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function loadAccountsLedger() {
|
|
100
|
+
if (!fs.existsSync(ACCOUNTS_FILE)) {
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const raw = fs.readFileSync(ACCOUNTS_FILE, 'utf-8');
|
|
105
|
+
const ledger = JSON.parse(raw);
|
|
106
|
+
let hasTampered = false;
|
|
107
|
+
for (const key of Object.keys(ledger)) {
|
|
108
|
+
const record = ledger[key];
|
|
109
|
+
if (!verifyRecordIntegrity(record)) {
|
|
110
|
+
hasTampered = true;
|
|
111
|
+
console.warn(`\x1b[33m[Scout Security Guard] Tampering detected in account ledger for ${record.email || key}! Reverting to secure defaults.\x1b[0m`);
|
|
112
|
+
record.currentTier = 'free';
|
|
113
|
+
record.creditsTotal = 100;
|
|
114
|
+
// Clamping usage so they cannot reset usage by tampering
|
|
115
|
+
record.creditsUsed = 100;
|
|
116
|
+
delete record.transactionId;
|
|
117
|
+
delete record._sig;
|
|
118
|
+
record._sig = generateRecordSignature(record);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const allowedMax = TIER_CREDIT_LIMITS[record.currentTier] || 100;
|
|
122
|
+
if (record.creditsTotal > allowedMax) {
|
|
123
|
+
record.creditsTotal = allowedMax;
|
|
124
|
+
delete record._sig;
|
|
125
|
+
record._sig = generateRecordSignature(record);
|
|
126
|
+
hasTampered = true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (hasTampered) {
|
|
131
|
+
fs.writeFileSync(ACCOUNTS_FILE, JSON.stringify(ledger, null, 2), 'utf-8');
|
|
132
|
+
}
|
|
133
|
+
return ledger;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function saveAccountsLedger(ledger) {
|
|
140
|
+
ensureAuthDir();
|
|
141
|
+
for (const key of Object.keys(ledger)) {
|
|
142
|
+
const record = ledger[key];
|
|
143
|
+
const allowedMax = TIER_CREDIT_LIMITS[record.currentTier] || 100;
|
|
144
|
+
record.creditsTotal = Math.min(record.creditsTotal, allowedMax);
|
|
145
|
+
delete record._sig;
|
|
146
|
+
record._sig = generateRecordSignature(record);
|
|
147
|
+
}
|
|
148
|
+
fs.writeFileSync(ACCOUNTS_FILE, JSON.stringify(ledger, null, 2), 'utf-8');
|
|
149
|
+
}
|
|
150
|
+
function getUserAccountKey(user) {
|
|
151
|
+
if (!user)
|
|
152
|
+
return null;
|
|
153
|
+
if (user.email && user.email.trim()) {
|
|
154
|
+
return user.email.trim().toLowerCase();
|
|
155
|
+
}
|
|
156
|
+
if (user.id && user.id.trim()) {
|
|
157
|
+
return user.id.trim().toLowerCase();
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
function computeNextRenewalDate(fromDate) {
|
|
162
|
+
const d = new Date(fromDate || new Date());
|
|
163
|
+
d.setMonth(d.getMonth() + 1);
|
|
164
|
+
return d;
|
|
165
|
+
}
|
|
27
166
|
export function loadAuthConfig() {
|
|
28
167
|
if (!fs.existsSync(AUTH_FILE)) {
|
|
29
168
|
return { ...DEFAULT_AUTH_CONFIG };
|
|
@@ -31,22 +170,76 @@ export function loadAuthConfig() {
|
|
|
31
170
|
try {
|
|
32
171
|
const raw = fs.readFileSync(AUTH_FILE, 'utf-8');
|
|
33
172
|
const parsed = JSON.parse(raw);
|
|
34
|
-
|
|
173
|
+
const user = parsed.user && typeof parsed.user === 'object' ? parsed.user : null;
|
|
174
|
+
const userKey = getUserAccountKey(user);
|
|
175
|
+
const isAuthTampered = user && !verifyAuthIntegrity(parsed);
|
|
176
|
+
let creditsUsed = typeof parsed.creditsUsed === 'number' ? parsed.creditsUsed : 0;
|
|
177
|
+
let creditsTotal = typeof parsed.creditsTotal === 'number' ? parsed.creditsTotal : 100;
|
|
178
|
+
let currentTier = typeof parsed.currentTier === 'string' ? parsed.currentTier : 'free';
|
|
179
|
+
let renewAt = typeof parsed.renewAt === 'string' ? parsed.renewAt : null;
|
|
180
|
+
let transactionId = typeof parsed.transactionId === 'string' ? parsed.transactionId : undefined;
|
|
181
|
+
if (userKey && user) {
|
|
182
|
+
const ledger = loadAccountsLedger();
|
|
183
|
+
const record = ledger[userKey];
|
|
184
|
+
if (isAuthTampered) {
|
|
185
|
+
console.warn(`\x1b[33m[Scout Security Guard] Tampering detected in auth session! Restoring verified ledger state.\x1b[0m`);
|
|
186
|
+
}
|
|
187
|
+
if (record) {
|
|
188
|
+
const now = new Date();
|
|
189
|
+
const renewDate = new Date(record.renewAt);
|
|
190
|
+
if (!Number.isNaN(renewDate.getTime()) && now >= renewDate) {
|
|
191
|
+
// Renewal date has arrived: reset credits for the new month cycle
|
|
192
|
+
const nextRenewal = new Date(renewDate);
|
|
193
|
+
while (nextRenewal <= now) {
|
|
194
|
+
nextRenewal.setMonth(nextRenewal.getMonth() + 1);
|
|
195
|
+
}
|
|
196
|
+
record.creditsUsed = 0;
|
|
197
|
+
record.renewAt = nextRenewal.toISOString();
|
|
198
|
+
record.lastResetAt = now.toISOString();
|
|
199
|
+
ledger[userKey] = record;
|
|
200
|
+
saveAccountsLedger(ledger);
|
|
201
|
+
creditsUsed = 0;
|
|
202
|
+
renewAt = record.renewAt;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Before renewal date: strictly enforce accumulated creditsUsed
|
|
206
|
+
creditsUsed = record.creditsUsed;
|
|
207
|
+
creditsTotal = record.creditsTotal || creditsTotal;
|
|
208
|
+
currentTier = record.currentTier || currentTier;
|
|
209
|
+
renewAt = record.renewAt || renewAt;
|
|
210
|
+
transactionId = record.transactionId;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else if (isAuthTampered) {
|
|
214
|
+
// No ledger record and tampered auth session: revert to free tier with 0 credits
|
|
215
|
+
currentTier = 'free';
|
|
216
|
+
creditsTotal = 100;
|
|
217
|
+
creditsUsed = 100;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const allowedMax = TIER_CREDIT_LIMITS[currentTier] || 100;
|
|
221
|
+
creditsTotal = Math.min(creditsTotal, allowedMax);
|
|
222
|
+
const config = {
|
|
35
223
|
token: typeof parsed.token === 'string' ? parsed.token : null,
|
|
36
224
|
refreshToken: typeof parsed.refreshToken === 'string' ? parsed.refreshToken : null,
|
|
37
225
|
tenantId: typeof parsed.tenantId === 'string' ? parsed.tenantId : null,
|
|
38
226
|
provider: typeof parsed.provider === 'string' ? parsed.provider : 'firebase',
|
|
39
|
-
user
|
|
227
|
+
user,
|
|
40
228
|
loggedInAt: typeof parsed.loggedInAt === 'string' ? parsed.loggedInAt : null,
|
|
41
|
-
creditsUsed
|
|
42
|
-
creditsTotal
|
|
43
|
-
currentTier
|
|
44
|
-
renewAt
|
|
229
|
+
creditsUsed,
|
|
230
|
+
creditsTotal,
|
|
231
|
+
currentTier,
|
|
232
|
+
renewAt,
|
|
233
|
+
transactionId,
|
|
45
234
|
byokEnabled: typeof parsed.byokEnabled === 'boolean' ? parsed.byokEnabled : false,
|
|
46
235
|
customLlmProvider: typeof parsed.customLlmProvider === 'string' ? parsed.customLlmProvider : 'nvidia',
|
|
47
236
|
customApiKey: typeof parsed.customApiKey === 'string' ? parsed.customApiKey : undefined,
|
|
48
237
|
customBaseUrl: typeof parsed.customBaseUrl === 'string' ? parsed.customBaseUrl : undefined,
|
|
49
238
|
};
|
|
239
|
+
if (isAuthTampered && user) {
|
|
240
|
+
saveAuthConfig(config);
|
|
241
|
+
}
|
|
242
|
+
return config;
|
|
50
243
|
}
|
|
51
244
|
catch {
|
|
52
245
|
return { ...DEFAULT_AUTH_CONFIG };
|
|
@@ -54,10 +247,144 @@ export function loadAuthConfig() {
|
|
|
54
247
|
}
|
|
55
248
|
export function saveAuthConfig(config) {
|
|
56
249
|
ensureAuthDir();
|
|
57
|
-
|
|
250
|
+
const ledger = loadAccountsLedger();
|
|
251
|
+
const userKey = getUserAccountKey(config.user);
|
|
252
|
+
let finalConfig = { ...config };
|
|
253
|
+
if (userKey && config.user) {
|
|
254
|
+
const existing = ledger[userKey];
|
|
255
|
+
const now = new Date();
|
|
256
|
+
if (existing) {
|
|
257
|
+
const effectiveRenewAt = config.renewAt || existing.renewAt;
|
|
258
|
+
const renewDate = new Date(effectiveRenewAt);
|
|
259
|
+
const isRenewalDue = !Number.isNaN(renewDate.getTime()) && now >= renewDate;
|
|
260
|
+
if (isRenewalDue) {
|
|
261
|
+
// Monthly cycle reached: Reset credits to 0 and calculate next renewal
|
|
262
|
+
const nextRenewal = new Date(renewDate);
|
|
263
|
+
while (nextRenewal <= now) {
|
|
264
|
+
nextRenewal.setMonth(nextRenewal.getMonth() + 1);
|
|
265
|
+
}
|
|
266
|
+
const updatedRecord = {
|
|
267
|
+
...existing,
|
|
268
|
+
creditsUsed: 0,
|
|
269
|
+
renewAt: nextRenewal.toISOString(),
|
|
270
|
+
lastResetAt: now.toISOString(),
|
|
271
|
+
currentTier: config.currentTier || existing.currentTier || 'free',
|
|
272
|
+
creditsTotal: config.creditsTotal || existing.creditsTotal || 100,
|
|
273
|
+
};
|
|
274
|
+
ledger[userKey] = updatedRecord;
|
|
275
|
+
finalConfig.creditsUsed = 0;
|
|
276
|
+
finalConfig.renewAt = updatedRecord.renewAt;
|
|
277
|
+
finalConfig.currentTier = updatedRecord.currentTier;
|
|
278
|
+
finalConfig.creditsTotal = updatedRecord.creditsTotal;
|
|
279
|
+
}
|
|
280
|
+
else if (config.resetCredits === true) {
|
|
281
|
+
// Explicit verified plan upgrade / subscription purchase
|
|
282
|
+
const resolvedTier = config.currentTier || existing.currentTier || 'free';
|
|
283
|
+
const resolvedTotal = config.creditsTotal || existing.creditsTotal || 100;
|
|
284
|
+
const resolvedRenewAt = config.renewAt || existing.renewAt || computeNextRenewalDate().toISOString();
|
|
285
|
+
const updatedRecord = {
|
|
286
|
+
...existing,
|
|
287
|
+
creditsUsed: 0,
|
|
288
|
+
currentTier: resolvedTier,
|
|
289
|
+
creditsTotal: resolvedTotal,
|
|
290
|
+
renewAt: resolvedRenewAt,
|
|
291
|
+
lastResetAt: now.toISOString(),
|
|
292
|
+
transactionId: config.transactionId || existing.transactionId,
|
|
293
|
+
};
|
|
294
|
+
ledger[userKey] = updatedRecord;
|
|
295
|
+
finalConfig.creditsUsed = 0;
|
|
296
|
+
finalConfig.currentTier = resolvedTier;
|
|
297
|
+
finalConfig.creditsTotal = resolvedTotal;
|
|
298
|
+
finalConfig.renewAt = resolvedRenewAt;
|
|
299
|
+
finalConfig.transactionId = updatedRecord.transactionId;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// Before renewal date: strictly maintain consumed credits
|
|
303
|
+
const candidateUsed = typeof config.creditsUsed === 'number' ? config.creditsUsed : 0;
|
|
304
|
+
const resolvedUsed = Math.max(existing.creditsUsed, candidateUsed);
|
|
305
|
+
const resolvedTier = config.currentTier || existing.currentTier || 'free';
|
|
306
|
+
const resolvedTotal = config.creditsTotal || existing.creditsTotal || 100;
|
|
307
|
+
const resolvedRenewAt = config.renewAt || existing.renewAt || computeNextRenewalDate().toISOString();
|
|
308
|
+
const updatedRecord = {
|
|
309
|
+
...existing,
|
|
310
|
+
userId: config.user.id || existing.userId,
|
|
311
|
+
email: config.user.email || existing.email,
|
|
312
|
+
creditsUsed: resolvedUsed,
|
|
313
|
+
creditsTotal: resolvedTotal,
|
|
314
|
+
currentTier: resolvedTier,
|
|
315
|
+
renewAt: resolvedRenewAt,
|
|
316
|
+
transactionId: config.transactionId || existing.transactionId,
|
|
317
|
+
byokEnabled: config.byokEnabled !== undefined ? config.byokEnabled : existing.byokEnabled,
|
|
318
|
+
customLlmProvider: config.customLlmProvider || existing.customLlmProvider,
|
|
319
|
+
customApiKey: config.customApiKey !== undefined ? config.customApiKey : existing.customApiKey,
|
|
320
|
+
customBaseUrl: config.customBaseUrl !== undefined ? config.customBaseUrl : existing.customBaseUrl,
|
|
321
|
+
};
|
|
322
|
+
ledger[userKey] = updatedRecord;
|
|
323
|
+
finalConfig.creditsUsed = resolvedUsed;
|
|
324
|
+
finalConfig.currentTier = resolvedTier;
|
|
325
|
+
finalConfig.creditsTotal = resolvedTotal;
|
|
326
|
+
finalConfig.renewAt = resolvedRenewAt;
|
|
327
|
+
finalConfig.transactionId = updatedRecord.transactionId;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// First time user registration / first login
|
|
332
|
+
const renewAt = config.renewAt || computeNextRenewalDate().toISOString();
|
|
333
|
+
const initialRecord = {
|
|
334
|
+
userId: config.user.id,
|
|
335
|
+
email: config.user.email,
|
|
336
|
+
currentTier: config.currentTier || 'free',
|
|
337
|
+
creditsUsed: config.creditsUsed ?? 0,
|
|
338
|
+
creditsTotal: config.creditsTotal ?? 100,
|
|
339
|
+
renewAt,
|
|
340
|
+
lastResetAt: now.toISOString(),
|
|
341
|
+
transactionId: config.transactionId,
|
|
342
|
+
byokEnabled: config.byokEnabled ?? false,
|
|
343
|
+
customLlmProvider: config.customLlmProvider,
|
|
344
|
+
customApiKey: config.customApiKey,
|
|
345
|
+
customBaseUrl: config.customBaseUrl,
|
|
346
|
+
};
|
|
347
|
+
ledger[userKey] = initialRecord;
|
|
348
|
+
finalConfig.creditsUsed = initialRecord.creditsUsed;
|
|
349
|
+
finalConfig.creditsTotal = initialRecord.creditsTotal;
|
|
350
|
+
finalConfig.currentTier = initialRecord.currentTier;
|
|
351
|
+
finalConfig.renewAt = initialRecord.renewAt;
|
|
352
|
+
finalConfig.transactionId = initialRecord.transactionId;
|
|
353
|
+
}
|
|
354
|
+
saveAccountsLedger(ledger);
|
|
355
|
+
}
|
|
356
|
+
const cleanConfig = { ...finalConfig };
|
|
357
|
+
delete cleanConfig._sig;
|
|
358
|
+
finalConfig._sig = generateAuthSignature(cleanConfig);
|
|
359
|
+
fs.writeFileSync(AUTH_FILE, JSON.stringify(finalConfig, null, 2), 'utf-8');
|
|
58
360
|
}
|
|
59
361
|
export function clearAuthConfig() {
|
|
60
362
|
ensureAuthDir();
|
|
363
|
+
try {
|
|
364
|
+
if (fs.existsSync(AUTH_FILE)) {
|
|
365
|
+
const current = loadAuthConfig();
|
|
366
|
+
const userKey = getUserAccountKey(current.user);
|
|
367
|
+
if (userKey && current.user) {
|
|
368
|
+
const ledger = loadAccountsLedger();
|
|
369
|
+
const existing = ledger[userKey];
|
|
370
|
+
ledger[userKey] = {
|
|
371
|
+
userId: current.user.id,
|
|
372
|
+
email: current.user.email,
|
|
373
|
+
currentTier: current.currentTier || existing?.currentTier || 'free',
|
|
374
|
+
creditsUsed: current.creditsUsed ?? existing?.creditsUsed ?? 0,
|
|
375
|
+
creditsTotal: current.creditsTotal ?? existing?.creditsTotal ?? 100,
|
|
376
|
+
renewAt: current.renewAt || existing?.renewAt || computeNextRenewalDate().toISOString(),
|
|
377
|
+
lastResetAt: existing?.lastResetAt || new Date().toISOString(),
|
|
378
|
+
byokEnabled: current.byokEnabled,
|
|
379
|
+
customLlmProvider: current.customLlmProvider,
|
|
380
|
+
customApiKey: current.customApiKey,
|
|
381
|
+
customBaseUrl: current.customBaseUrl,
|
|
382
|
+
};
|
|
383
|
+
saveAccountsLedger(ledger);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch { }
|
|
61
388
|
fs.writeFileSync(AUTH_FILE, JSON.stringify(DEFAULT_AUTH_CONFIG, null, 2), 'utf-8');
|
|
62
389
|
}
|
|
63
390
|
export function isLoggedIn() {
|
|
@@ -72,6 +399,46 @@ export function getCurrentUser() {
|
|
|
72
399
|
const config = loadAuthConfig();
|
|
73
400
|
return config.user;
|
|
74
401
|
}
|
|
402
|
+
export function getNextRenewalDate(config) {
|
|
403
|
+
const cfg = config || loadAuthConfig();
|
|
404
|
+
const baseDateStr = cfg.renewAt || cfg.user?.createdAt || cfg.loggedInAt;
|
|
405
|
+
const now = new Date();
|
|
406
|
+
if (baseDateStr) {
|
|
407
|
+
const baseDate = new Date(baseDateStr);
|
|
408
|
+
if (!Number.isNaN(baseDate.getTime())) {
|
|
409
|
+
const renewal = new Date(baseDate);
|
|
410
|
+
const renewalDay = renewal.getDate();
|
|
411
|
+
while (renewal <= now) {
|
|
412
|
+
renewal.setDate(1);
|
|
413
|
+
renewal.setMonth(renewal.getMonth() + 1);
|
|
414
|
+
const lastDayOfMonth = new Date(renewal.getFullYear(), renewal.getMonth() + 1, 0).getDate();
|
|
415
|
+
renewal.setDate(Math.min(renewalDay, lastDayOfMonth));
|
|
416
|
+
}
|
|
417
|
+
return renewal;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Default fallback: 1st of next month
|
|
421
|
+
return new Date(now.getFullYear(), now.getMonth() + 1, 1);
|
|
422
|
+
}
|
|
423
|
+
export function formatRenewalDate(date) {
|
|
424
|
+
const formatted = date.toLocaleDateString('en-US', {
|
|
425
|
+
month: 'short',
|
|
426
|
+
day: 'numeric',
|
|
427
|
+
year: 'numeric',
|
|
428
|
+
});
|
|
429
|
+
const now = new Date();
|
|
430
|
+
const diffMs = date.getTime() - now.getTime();
|
|
431
|
+
const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
|
|
432
|
+
if (diffDays <= 0) {
|
|
433
|
+
return `${formatted} (resets today)`;
|
|
434
|
+
}
|
|
435
|
+
else if (diffDays === 1) {
|
|
436
|
+
return `${formatted} (resets tomorrow)`;
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
return `${formatted} (in ${diffDays} days)`;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
75
442
|
export function consumeCredit(amount = 1) {
|
|
76
443
|
const config = loadAuthConfig();
|
|
77
444
|
if (config.byokEnabled) {
|
|
@@ -87,12 +454,16 @@ export function consumeCredit(amount = 1) {
|
|
|
87
454
|
const total = config.creditsTotal ?? 100;
|
|
88
455
|
const remaining = total - used;
|
|
89
456
|
if (remaining < amount) {
|
|
457
|
+
const renewalDate = getNextRenewalDate(config);
|
|
458
|
+
const renewalFormatted = formatRenewalDate(renewalDate);
|
|
90
459
|
return {
|
|
91
460
|
success: false,
|
|
92
461
|
isByok: false,
|
|
93
462
|
remaining: Math.max(0, remaining),
|
|
94
463
|
isLowCredit: true,
|
|
95
464
|
reason: `Credit limit reached for ${config.currentTier || 'Free'} plan (${used}/${total} credits consumed).`,
|
|
465
|
+
renewalFormatted,
|
|
466
|
+
renewalDate,
|
|
96
467
|
};
|
|
97
468
|
}
|
|
98
469
|
const remainingAfter = total - (used + amount);
|
|
@@ -117,9 +488,13 @@ export function checkTierAccess(feature) {
|
|
|
117
488
|
const used = config.creditsUsed ?? 0;
|
|
118
489
|
const total = config.creditsTotal ?? 100;
|
|
119
490
|
if (used >= total) {
|
|
491
|
+
const renewalDate = getNextRenewalDate(config);
|
|
492
|
+
const renewalFormatted = formatRenewalDate(renewalDate);
|
|
120
493
|
return {
|
|
121
494
|
allowed: false,
|
|
122
495
|
reason: `Credit quota exhausted (${used}/${total} credits used). Upgrade your plan or enable BYOK mode in dashboard.`,
|
|
496
|
+
renewalFormatted,
|
|
497
|
+
renewalDate,
|
|
123
498
|
};
|
|
124
499
|
}
|
|
125
500
|
return { allowed: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
export function renderBranding(version = '8.0.
|
|
2
|
+
export function renderBranding(version = '8.0.5') {
|
|
3
3
|
const logo = chalk.cyan.bold(' ███████╗████████╗') + ' ' + chalk.cyan.bold('███████╗ ██████╗ ██████╗ ██╗ ██╗████████╗') + '\n' +
|
|
4
4
|
chalk.cyan.bold(' ██╔════╝╚══██╔══╝') + ' ' + chalk.cyan.bold('██╔════╝ ██╔════╝██╔═══██╗ ██║ ██║╚══██╔══╝') + '\n' +
|
|
5
5
|
chalk.cyan.bold(' █████╗ ██║ ') + ' ' + chalk.cyan.bold(' ███████╗ ██║ ██║ ██║ ██║ ██║ ██║ ') + '\n' +
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["payment.ts"],"names":[],"mappings":"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"}
|