@cervellaswarm/mcp-server 0.1.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.
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Billing Types for CervellaSwarm
3
+ *
4
+ * Type definitions for usage tracking and tier management.
5
+ * Schema designed for local JSON storage with future-proofing.
6
+ *
7
+ * Copyright 2026 Rafa & Cervella
8
+ * Licensed under the Apache License, Version 2.0
9
+ */
10
+ /**
11
+ * Available subscription tiers
12
+ */
13
+ export type Tier = "free" | "pro" | "team" | "enterprise";
14
+ /**
15
+ * Quota check status levels
16
+ */
17
+ export declare enum QuotaStatus {
18
+ OK = "ok",// Under 80%
19
+ WARNING = "warning",// 80-99%
20
+ EXCEEDED = "exceeded"
21
+ }
22
+ /**
23
+ * Current billing period data
24
+ */
25
+ export interface BillingPeriod {
26
+ /** Period identifier (YYYY-MM format) */
27
+ month: string;
28
+ /** Number of successful API calls this period */
29
+ calls: number;
30
+ /** Tier snapshot for this period */
31
+ tier: Tier;
32
+ /** ISO8601 timestamp of first call */
33
+ firstCallAt: string | null;
34
+ /** ISO8601 timestamp of last call */
35
+ lastCallAt: string | null;
36
+ }
37
+ /**
38
+ * Historical period record (for analytics)
39
+ */
40
+ export interface HistoryRecord {
41
+ /** Period identifier (YYYY-MM format) */
42
+ month: string;
43
+ /** Total calls made */
44
+ calls: number;
45
+ /** Tier during this period */
46
+ tier: Tier;
47
+ /** Limit that was active */
48
+ limit: number;
49
+ /** ISO8601 start date */
50
+ startDate: string;
51
+ /** ISO8601 end date */
52
+ endDate: string;
53
+ }
54
+ /**
55
+ * Complete usage data schema (stored in usage.json)
56
+ */
57
+ export interface UsageData {
58
+ /** Schema version for migrations */
59
+ version: string;
60
+ /** Current billing period */
61
+ currentPeriod: BillingPeriod;
62
+ /** Historical records (last 12 months max) */
63
+ history: HistoryRecord[];
64
+ /** Whether warning was shown this period */
65
+ warningShown: boolean;
66
+ /** Last sync timestamp (for clock skew detection) */
67
+ lastSyncTime: number;
68
+ /** Integrity checksum */
69
+ _checksum: string;
70
+ }
71
+ /**
72
+ * Result of quota check
73
+ */
74
+ export interface QuotaResult {
75
+ /** Whether the call is allowed */
76
+ allowed: boolean;
77
+ /** Current quota status */
78
+ status: QuotaStatus;
79
+ /** Calls made this period */
80
+ used: number;
81
+ /** Limit for current tier */
82
+ limit: number;
83
+ /** Remaining calls */
84
+ remaining: number;
85
+ /** Warning message (if status is WARNING) */
86
+ warning?: string;
87
+ /** Error message (if status is EXCEEDED) */
88
+ error?: string;
89
+ /** When the period resets (ISO8601) */
90
+ resetsAt: string;
91
+ }
92
+ /**
93
+ * Usage statistics for check_usage tool
94
+ */
95
+ export interface UsageStats {
96
+ /** Current tier */
97
+ tier: Tier;
98
+ /** Calls this period */
99
+ calls: number;
100
+ /** Period limit */
101
+ limit: number;
102
+ /** Remaining calls */
103
+ remaining: number;
104
+ /** Usage percentage (0-100) */
105
+ percentage: number;
106
+ /** Current period month */
107
+ period: string;
108
+ /** When period resets */
109
+ resetsAt: string;
110
+ /** Quota status */
111
+ status: QuotaStatus;
112
+ }
113
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;AAE1D;;GAEG;AACH,oBAAY,WAAW;IACrB,EAAE,OAAO,CAAE,YAAY;IACvB,OAAO,YAAY,CAAE,SAAS;IAC9B,QAAQ,aAAa;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,EAAE,IAAI,CAAC;IACX,sCAAsC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qCAAqC;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mBAAmB;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Billing Types for CervellaSwarm
3
+ *
4
+ * Type definitions for usage tracking and tier management.
5
+ * Schema designed for local JSON storage with future-proofing.
6
+ *
7
+ * Copyright 2026 Rafa & Cervella
8
+ * Licensed under the Apache License, Version 2.0
9
+ */
10
+ /**
11
+ * Quota check status levels
12
+ */
13
+ export var QuotaStatus;
14
+ (function (QuotaStatus) {
15
+ QuotaStatus["OK"] = "ok";
16
+ QuotaStatus["WARNING"] = "warning";
17
+ QuotaStatus["EXCEEDED"] = "exceeded";
18
+ })(QuotaStatus || (QuotaStatus = {}));
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH;;GAEG;AACH,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,wBAAS,CAAA;IACT,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Usage Tracker for CervellaSwarm
3
+ *
4
+ * Tracks API call usage per billing period.
5
+ * Features:
6
+ * - Atomic file writes with backup
7
+ * - Checksum integrity verification
8
+ * - Serialized writes (race condition safe)
9
+ * - Lazy monthly reset
10
+ *
11
+ * Copyright 2026 Rafa & Cervella
12
+ * Licensed under the Apache License, Version 2.0
13
+ */
14
+ import { type Tier, type QuotaResult, QuotaStatus, type UsageStats } from "./types.js";
15
+ export { QuotaStatus };
16
+ /**
17
+ * Usage Tracker class
18
+ * Singleton pattern for consistent state
19
+ */
20
+ declare class UsageTracker {
21
+ private usagePath;
22
+ private backupPath;
23
+ private writeQueue;
24
+ private tierGetter;
25
+ constructor(configDir: string, tierGetter: () => Tier);
26
+ /**
27
+ * Check quota before making an API call
28
+ */
29
+ checkQuota(): Promise<QuotaResult>;
30
+ /**
31
+ * Track a successful API call
32
+ */
33
+ trackCall(): Promise<void>;
34
+ /**
35
+ * Get usage statistics
36
+ */
37
+ getStats(): Promise<UsageStats>;
38
+ /**
39
+ * Get formatted usage message (for check_usage tool)
40
+ */
41
+ getUsageMessage(): Promise<string>;
42
+ /**
43
+ * Serialize write operations to prevent race conditions
44
+ */
45
+ private enqueueWrite;
46
+ /**
47
+ * Load usage data with auto-reset if new period
48
+ */
49
+ private loadUsage;
50
+ /**
51
+ * Load raw usage data from file
52
+ */
53
+ private loadUsageRaw;
54
+ /**
55
+ * Save usage data atomically with backup
56
+ */
57
+ private saveUsage;
58
+ /**
59
+ * Reset to new billing period
60
+ */
61
+ private resetPeriod;
62
+ /**
63
+ * Create initial usage data
64
+ */
65
+ private createInitialUsage;
66
+ /**
67
+ * Compute checksum for integrity verification
68
+ */
69
+ private computeChecksum;
70
+ /**
71
+ * Verify checksum integrity
72
+ */
73
+ private verifyChecksum;
74
+ /**
75
+ * Get current month in YYYY-MM format
76
+ */
77
+ private getCurrentMonth;
78
+ /**
79
+ * Get start of month ISO string
80
+ */
81
+ private getStartOfMonth;
82
+ /**
83
+ * Get end of month ISO string
84
+ */
85
+ private getEndOfMonth;
86
+ }
87
+ /**
88
+ * Get or create the usage tracker instance
89
+ */
90
+ export declare function getUsageTracker(configDir: string, tierGetter: () => Tier): UsageTracker;
91
+ /**
92
+ * Reset tracker instance (for testing)
93
+ */
94
+ export declare function resetUsageTracker(): void;
95
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/billing/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAepB,OAAO,EAAE,WAAW,EAAE,CAAC;AAiCvB;;;GAGG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,UAAU,CAAa;gBAEnB,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI;IAWrD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAoExC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBhC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IA8BrC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAcxC;;OAEG;YACW,YAAY;IAQ1B;;OAEG;YACW,SAAS;IAYvB;;OAEG;YACW,YAAY;IA2C1B;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,WAAW;IA2CzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB;AAQD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,IAAI,GACrB,YAAY,CAKd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Usage Tracker for CervellaSwarm
3
+ *
4
+ * Tracks API call usage per billing period.
5
+ * Features:
6
+ * - Atomic file writes with backup
7
+ * - Checksum integrity verification
8
+ * - Serialized writes (race condition safe)
9
+ * - Lazy monthly reset
10
+ *
11
+ * Copyright 2026 Rafa & Cervella
12
+ * Licensed under the Apache License, Version 2.0
13
+ */
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ import * as crypto from "crypto";
17
+ import { z } from "zod";
18
+ import { QuotaStatus, } from "./types.js";
19
+ import { SCHEMA_VERSION, MAX_HISTORY_RECORDS, WARNING_THRESHOLD, getLimitForTier, isUnlimited, } from "./tiers.js";
20
+ import { getWarningMessage, getLimitExceededMessage, getUsageStatusMessage, } from "./messages.js";
21
+ // Re-export QuotaStatus for convenience
22
+ export { QuotaStatus };
23
+ // Checksum secret (machine-specific)
24
+ const CHECKSUM_SECRET = process.env.CERVELLASWARM_SECRET || `cs-${process.env.USER || "user"}-local`;
25
+ // Zod schema for validation
26
+ const BillingPeriodSchema = z.object({
27
+ month: z.string().regex(/^\d{4}-\d{2}$/),
28
+ calls: z.number().int().min(0),
29
+ tier: z.enum(["free", "pro", "team", "enterprise"]),
30
+ firstCallAt: z.string().nullable(),
31
+ lastCallAt: z.string().nullable(),
32
+ });
33
+ const HistoryRecordSchema = z.object({
34
+ month: z.string(),
35
+ calls: z.number().int().min(0),
36
+ tier: z.enum(["free", "pro", "team", "enterprise"]),
37
+ limit: z.number().int().min(0),
38
+ startDate: z.string(),
39
+ endDate: z.string(),
40
+ });
41
+ const UsageDataSchema = z.object({
42
+ version: z.string(),
43
+ currentPeriod: BillingPeriodSchema,
44
+ history: z.array(HistoryRecordSchema).max(MAX_HISTORY_RECORDS),
45
+ warningShown: z.boolean(),
46
+ lastSyncTime: z.number(),
47
+ _checksum: z.string(),
48
+ });
49
+ /**
50
+ * Usage Tracker class
51
+ * Singleton pattern for consistent state
52
+ */
53
+ class UsageTracker {
54
+ usagePath;
55
+ backupPath;
56
+ writeQueue = Promise.resolve();
57
+ tierGetter;
58
+ constructor(configDir, tierGetter) {
59
+ this.usagePath = path.join(configDir, "usage.json");
60
+ this.backupPath = path.join(configDir, "usage.json.backup");
61
+ this.tierGetter = tierGetter;
62
+ // Ensure config directory exists
63
+ if (!fs.existsSync(configDir)) {
64
+ fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
65
+ }
66
+ }
67
+ /**
68
+ * Check quota before making an API call
69
+ */
70
+ async checkQuota() {
71
+ const data = await this.loadUsage();
72
+ const tier = this.tierGetter();
73
+ const limit = getLimitForTier(tier);
74
+ // Calculate reset date (end of current month)
75
+ const resetsAt = this.getEndOfMonth(data.currentPeriod.month);
76
+ // Unlimited tier
77
+ if (isUnlimited(tier)) {
78
+ return {
79
+ allowed: true,
80
+ status: QuotaStatus.OK,
81
+ used: data.currentPeriod.calls,
82
+ limit,
83
+ remaining: Infinity,
84
+ resetsAt,
85
+ };
86
+ }
87
+ const used = data.currentPeriod.calls;
88
+ const remaining = Math.max(0, limit - used);
89
+ const percentage = used / limit;
90
+ // Exceeded
91
+ if (used >= limit) {
92
+ return {
93
+ allowed: false,
94
+ status: QuotaStatus.EXCEEDED,
95
+ used,
96
+ limit,
97
+ remaining: 0,
98
+ error: getLimitExceededMessage(tier, limit, resetsAt),
99
+ resetsAt,
100
+ };
101
+ }
102
+ // Warning (80%+)
103
+ if (percentage >= WARNING_THRESHOLD && !data.warningShown) {
104
+ // Mark warning as shown
105
+ await this.enqueueWrite(async () => {
106
+ const d = await this.loadUsageRaw();
107
+ d.warningShown = true;
108
+ await this.saveUsage(d);
109
+ });
110
+ return {
111
+ allowed: true,
112
+ status: QuotaStatus.WARNING,
113
+ used,
114
+ limit,
115
+ remaining,
116
+ warning: getWarningMessage(tier, used, limit),
117
+ resetsAt,
118
+ };
119
+ }
120
+ // OK
121
+ return {
122
+ allowed: true,
123
+ status: QuotaStatus.OK,
124
+ used,
125
+ limit,
126
+ remaining,
127
+ resetsAt,
128
+ };
129
+ }
130
+ /**
131
+ * Track a successful API call
132
+ */
133
+ async trackCall() {
134
+ await this.enqueueWrite(async () => {
135
+ const data = await this.loadUsageRaw();
136
+ const now = new Date().toISOString();
137
+ data.currentPeriod.calls++;
138
+ data.currentPeriod.lastCallAt = now;
139
+ if (!data.currentPeriod.firstCallAt) {
140
+ data.currentPeriod.firstCallAt = now;
141
+ }
142
+ data.lastSyncTime = Date.now();
143
+ await this.saveUsage(data);
144
+ });
145
+ }
146
+ /**
147
+ * Get usage statistics
148
+ */
149
+ async getStats() {
150
+ const data = await this.loadUsage();
151
+ const tier = this.tierGetter();
152
+ const limit = getLimitForTier(tier);
153
+ const used = data.currentPeriod.calls;
154
+ const remaining = Math.max(0, limit - used);
155
+ const percentage = isUnlimited(tier) ? 0 : Math.round((used / limit) * 100);
156
+ const resetsAt = this.getEndOfMonth(data.currentPeriod.month);
157
+ let status;
158
+ if (percentage >= 100) {
159
+ status = QuotaStatus.EXCEEDED;
160
+ }
161
+ else if (percentage >= WARNING_THRESHOLD * 100) {
162
+ status = QuotaStatus.WARNING;
163
+ }
164
+ else {
165
+ status = QuotaStatus.OK;
166
+ }
167
+ return {
168
+ tier,
169
+ calls: used,
170
+ limit,
171
+ remaining,
172
+ percentage,
173
+ period: data.currentPeriod.month,
174
+ resetsAt,
175
+ status,
176
+ };
177
+ }
178
+ /**
179
+ * Get formatted usage message (for check_usage tool)
180
+ */
181
+ async getUsageMessage() {
182
+ const stats = await this.getStats();
183
+ return getUsageStatusMessage(stats.tier, stats.calls, stats.limit, stats.resetsAt);
184
+ }
185
+ // ============================================
186
+ // PRIVATE METHODS
187
+ // ============================================
188
+ /**
189
+ * Serialize write operations to prevent race conditions
190
+ */
191
+ async enqueueWrite(operation) {
192
+ this.writeQueue = this.writeQueue.then(operation).catch((error) => {
193
+ console.error("UsageTracker write error:", error);
194
+ throw error;
195
+ });
196
+ return this.writeQueue;
197
+ }
198
+ /**
199
+ * Load usage data with auto-reset if new period
200
+ */
201
+ async loadUsage() {
202
+ let data = await this.loadUsageRaw();
203
+ // Check if period needs reset
204
+ const currentMonth = this.getCurrentMonth();
205
+ if (data.currentPeriod.month !== currentMonth) {
206
+ data = await this.resetPeriod(data, currentMonth);
207
+ }
208
+ return data;
209
+ }
210
+ /**
211
+ * Load raw usage data from file
212
+ */
213
+ async loadUsageRaw() {
214
+ // File doesn't exist - initialize
215
+ if (!fs.existsSync(this.usagePath)) {
216
+ const initial = this.createInitialUsage();
217
+ await this.saveUsage(initial);
218
+ return initial;
219
+ }
220
+ try {
221
+ const content = fs.readFileSync(this.usagePath, "utf8");
222
+ const parsed = JSON.parse(content);
223
+ const validated = UsageDataSchema.parse(parsed);
224
+ // Verify checksum integrity
225
+ if (!this.verifyChecksum(validated)) {
226
+ console.warn("UsageTracker: Checksum mismatch - file may have been tampered");
227
+ // Continue anyway for MVP, but log warning
228
+ }
229
+ return validated;
230
+ }
231
+ catch (error) {
232
+ // Try backup
233
+ if (fs.existsSync(this.backupPath)) {
234
+ console.warn("UsageTracker: Primary file corrupted, trying backup");
235
+ try {
236
+ const backup = fs.readFileSync(this.backupPath, "utf8");
237
+ const parsed = JSON.parse(backup);
238
+ return UsageDataSchema.parse(parsed);
239
+ }
240
+ catch {
241
+ // Backup also corrupted
242
+ }
243
+ }
244
+ // All corrupted - reinitialize
245
+ console.error("UsageTracker: All files corrupted, reinitializing");
246
+ const initial = this.createInitialUsage();
247
+ await this.saveUsage(initial);
248
+ return initial;
249
+ }
250
+ }
251
+ /**
252
+ * Save usage data atomically with backup
253
+ */
254
+ async saveUsage(data) {
255
+ // Update checksum
256
+ data._checksum = this.computeChecksum(data);
257
+ // Validate before saving
258
+ UsageDataSchema.parse(data);
259
+ // Backup existing file
260
+ if (fs.existsSync(this.usagePath)) {
261
+ fs.copyFileSync(this.usagePath, this.backupPath);
262
+ }
263
+ // Atomic write (write to temp, then rename)
264
+ const tempPath = `${this.usagePath}.tmp`;
265
+ fs.writeFileSync(tempPath, JSON.stringify(data, null, 2), {
266
+ mode: 0o600,
267
+ });
268
+ fs.renameSync(tempPath, this.usagePath);
269
+ }
270
+ /**
271
+ * Reset to new billing period
272
+ */
273
+ async resetPeriod(data, newMonth) {
274
+ const tier = this.tierGetter();
275
+ const limit = getLimitForTier(tier);
276
+ // Archive current period if had calls
277
+ if (data.currentPeriod.calls > 0) {
278
+ const historyRecord = {
279
+ month: data.currentPeriod.month,
280
+ calls: data.currentPeriod.calls,
281
+ tier: data.currentPeriod.tier,
282
+ limit: getLimitForTier(data.currentPeriod.tier),
283
+ startDate: this.getStartOfMonth(data.currentPeriod.month),
284
+ endDate: this.getEndOfMonth(data.currentPeriod.month),
285
+ };
286
+ data.history.unshift(historyRecord);
287
+ // Keep only last 12 months
288
+ if (data.history.length > MAX_HISTORY_RECORDS) {
289
+ data.history = data.history.slice(0, MAX_HISTORY_RECORDS);
290
+ }
291
+ }
292
+ // Reset current period
293
+ data.currentPeriod = {
294
+ month: newMonth,
295
+ calls: 0,
296
+ tier,
297
+ firstCallAt: null,
298
+ lastCallAt: null,
299
+ };
300
+ data.warningShown = false;
301
+ data.lastSyncTime = Date.now();
302
+ // Save
303
+ await this.saveUsage(data);
304
+ return data;
305
+ }
306
+ /**
307
+ * Create initial usage data
308
+ */
309
+ createInitialUsage() {
310
+ const tier = this.tierGetter();
311
+ const month = this.getCurrentMonth();
312
+ const data = {
313
+ version: SCHEMA_VERSION,
314
+ currentPeriod: {
315
+ month,
316
+ calls: 0,
317
+ tier,
318
+ firstCallAt: null,
319
+ lastCallAt: null,
320
+ },
321
+ history: [],
322
+ warningShown: false,
323
+ lastSyncTime: Date.now(),
324
+ _checksum: "",
325
+ };
326
+ data._checksum = this.computeChecksum(data);
327
+ return data;
328
+ }
329
+ /**
330
+ * Compute checksum for integrity verification
331
+ */
332
+ computeChecksum(data) {
333
+ const payload = `${data.version}|${data.currentPeriod.month}|${data.currentPeriod.calls}|${data.currentPeriod.tier}|${CHECKSUM_SECRET}`;
334
+ return crypto.createHash("sha256").update(payload).digest("hex");
335
+ }
336
+ /**
337
+ * Verify checksum integrity
338
+ */
339
+ verifyChecksum(data) {
340
+ const expected = this.computeChecksum(data);
341
+ return data._checksum === expected;
342
+ }
343
+ /**
344
+ * Get current month in YYYY-MM format
345
+ */
346
+ getCurrentMonth() {
347
+ return new Date().toISOString().substring(0, 7);
348
+ }
349
+ /**
350
+ * Get start of month ISO string
351
+ */
352
+ getStartOfMonth(month) {
353
+ return `${month}-01T00:00:00.000Z`;
354
+ }
355
+ /**
356
+ * Get end of month ISO string
357
+ */
358
+ getEndOfMonth(month) {
359
+ const [year, monthNum] = month.split("-").map(Number);
360
+ const lastDay = new Date(year, monthNum, 0).getDate();
361
+ return `${month}-${String(lastDay).padStart(2, "0")}T23:59:59.999Z`;
362
+ }
363
+ }
364
+ // ============================================
365
+ // SINGLETON INSTANCE
366
+ // ============================================
367
+ let trackerInstance = null;
368
+ /**
369
+ * Get or create the usage tracker instance
370
+ */
371
+ export function getUsageTracker(configDir, tierGetter) {
372
+ if (!trackerInstance) {
373
+ trackerInstance = new UsageTracker(configDir, tierGetter);
374
+ }
375
+ return trackerInstance;
376
+ }
377
+ /**
378
+ * Reset tracker instance (for testing)
379
+ */
380
+ export function resetUsageTracker() {
381
+ trackerInstance = null;
382
+ }
383
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/billing/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Config Manager for MCP Server
3
+ *
4
+ * Shares configuration with CLI through `conf` package.
5
+ * Same config file = CLI and MCP see same settings.
6
+ *
7
+ * Copyright 2026 Rafa & Cervella
8
+ * Licensed under the Apache License, Version 2.0
9
+ */
10
+ export declare function getApiKey(): string | null;
11
+ export declare function hasApiKey(): boolean;
12
+ export declare function getApiKeySource(): "environment" | "config" | "none";
13
+ export declare function getDefaultModel(): string;
14
+ export declare function getTimeout(): number;
15
+ export declare function getMaxRetries(): number;
16
+ export declare function isVerbose(): boolean;
17
+ export declare function getTier(): "free" | "pro" | "team" | "enterprise";
18
+ export declare function setTier(tier: "free" | "pro" | "team" | "enterprise"): void;
19
+ export declare function getConfigPath(): string;
20
+ export declare function getConfigDir(): string;
21
+ export interface ValidationResult {
22
+ valid: boolean;
23
+ error?: string;
24
+ warning?: string;
25
+ }
26
+ /**
27
+ * Validate API key by making a minimal test call
28
+ * Returns { valid: boolean, error?: string, warning?: string }
29
+ */
30
+ export declare function validateApiKey(key?: string | null): Promise<ValidationResult>;
31
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsEH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAUzC;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,eAAe,IAAI,aAAa,GAAG,QAAQ,GAAG,MAAM,CAQnE;AAMD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,OAAO,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAE1E;AAMD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,GAAE,MAAM,GAAG,IAAW,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA6C3B"}