@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.
- package/README.md +109 -0
- package/dist/agents/spawner.d.ts +36 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +218 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/billing/messages.d.ts +27 -0
- package/dist/billing/messages.d.ts.map +1 -0
- package/dist/billing/messages.js +108 -0
- package/dist/billing/messages.js.map +1 -0
- package/dist/billing/tiers.d.ts +55 -0
- package/dist/billing/tiers.d.ts.map +1 -0
- package/dist/billing/tiers.js +86 -0
- package/dist/billing/tiers.js.map +1 -0
- package/dist/billing/types.d.ts +113 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +19 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/billing/usage.d.ts +95 -0
- package/dist/billing/usage.d.ts.map +1 -0
- package/dist/billing/usage.js +383 -0
- package/dist/billing/usage.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +160 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +261 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -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"}
|