paygate-mcp 10.10.0 → 10.11.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,137 @@
1
+ /**
2
+ * AccessLogEngine — Structured request/access logging with search.
3
+ *
4
+ * Records every API request with key, tool, status, response time,
5
+ * IP, and user agent. Supports search, filter, and pagination.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const log = new AccessLogEngine();
10
+ *
11
+ * log.record({
12
+ * key: 'key_abc',
13
+ * tool: 'search',
14
+ * method: 'tools/call',
15
+ * status: 'allowed',
16
+ * responseTimeMs: 45,
17
+ * ip: '10.0.0.1',
18
+ * credits: 5,
19
+ * });
20
+ *
21
+ * const results = log.search({ key: 'key_abc', status: 'denied' });
22
+ * ```
23
+ */
24
+ export type AccessStatus = 'allowed' | 'denied' | 'error' | 'rate_limited';
25
+ export interface AccessEntry {
26
+ id: string;
27
+ timestamp: number;
28
+ key: string;
29
+ tool: string;
30
+ method: string;
31
+ status: AccessStatus;
32
+ responseTimeMs: number;
33
+ ip?: string;
34
+ userAgent?: string;
35
+ credits?: number;
36
+ error?: string;
37
+ requestId?: string;
38
+ metadata?: Record<string, string>;
39
+ }
40
+ export interface AccessRecordParams {
41
+ key: string;
42
+ tool: string;
43
+ method?: string;
44
+ status: AccessStatus;
45
+ responseTimeMs: number;
46
+ ip?: string;
47
+ userAgent?: string;
48
+ credits?: number;
49
+ error?: string;
50
+ requestId?: string;
51
+ metadata?: Record<string, string>;
52
+ }
53
+ export interface AccessQuery {
54
+ key?: string;
55
+ keys?: string[];
56
+ tool?: string;
57
+ tools?: string[];
58
+ status?: AccessStatus;
59
+ ip?: string;
60
+ startTime?: number;
61
+ endTime?: number;
62
+ minResponseTimeMs?: number;
63
+ maxResponseTimeMs?: number;
64
+ search?: string;
65
+ limit?: number;
66
+ offset?: number;
67
+ }
68
+ export interface AccessQueryResult {
69
+ entries: AccessEntry[];
70
+ total: number;
71
+ limit: number;
72
+ offset: number;
73
+ hasMore: boolean;
74
+ }
75
+ export interface AccessSummary {
76
+ totalRequests: number;
77
+ totalAllowed: number;
78
+ totalDenied: number;
79
+ totalErrors: number;
80
+ totalRateLimited: number;
81
+ avgResponseTimeMs: number;
82
+ p95ResponseTimeMs: number;
83
+ p99ResponseTimeMs: number;
84
+ uniqueKeys: number;
85
+ uniqueTools: number;
86
+ uniqueIps: number;
87
+ topKeys: Array<{
88
+ key: string;
89
+ count: number;
90
+ }>;
91
+ topTools: Array<{
92
+ tool: string;
93
+ count: number;
94
+ }>;
95
+ }
96
+ export interface AccessLogConfig {
97
+ maxEntries?: number;
98
+ retentionMs?: number;
99
+ }
100
+ export interface AccessLogStats {
101
+ totalEntries: number;
102
+ totalRecorded: number;
103
+ totalEvicted: number;
104
+ oldestEntry: number | null;
105
+ newestEntry: number | null;
106
+ }
107
+ export declare class AccessLogEngine {
108
+ private entries;
109
+ private maxEntries;
110
+ private retentionMs;
111
+ private idCounter;
112
+ private totalRecorded;
113
+ private totalEvicted;
114
+ constructor(config?: AccessLogConfig);
115
+ /** Record an access log entry. */
116
+ record(params: AccessRecordParams): string;
117
+ /** Bulk import entries. */
118
+ importEntries(entries: AccessRecordParams[]): number;
119
+ /** Search access logs with filters. */
120
+ search(query?: AccessQuery): AccessQueryResult;
121
+ /** Get a single entry by ID. */
122
+ getEntry(id: string): AccessEntry | null;
123
+ /** Count entries matching a query. */
124
+ count(query?: AccessQuery): number;
125
+ /** Generate a summary of access logs within a time range. */
126
+ summarize(startTime?: number, endTime?: number): AccessSummary;
127
+ /** Purge entries older than retention period. Returns count purged. */
128
+ purge(): number;
129
+ /** Clear all entries. */
130
+ clear(): void;
131
+ getStats(): AccessLogStats;
132
+ /** Clear all data and stats. */
133
+ destroy(): void;
134
+ private applyFilters;
135
+ private evict;
136
+ }
137
+ //# sourceMappingURL=access-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /**
3
+ * AccessLogEngine — Structured request/access logging with search.
4
+ *
5
+ * Records every API request with key, tool, status, response time,
6
+ * IP, and user agent. Supports search, filter, and pagination.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const log = new AccessLogEngine();
11
+ *
12
+ * log.record({
13
+ * key: 'key_abc',
14
+ * tool: 'search',
15
+ * method: 'tools/call',
16
+ * status: 'allowed',
17
+ * responseTimeMs: 45,
18
+ * ip: '10.0.0.1',
19
+ * credits: 5,
20
+ * });
21
+ *
22
+ * const results = log.search({ key: 'key_abc', status: 'denied' });
23
+ * ```
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.AccessLogEngine = void 0;
27
+ // ── Implementation ───────────────────────────────────────────────────
28
+ class AccessLogEngine {
29
+ entries = [];
30
+ maxEntries;
31
+ retentionMs;
32
+ idCounter = 0;
33
+ // Stats
34
+ totalRecorded = 0;
35
+ totalEvicted = 0;
36
+ constructor(config = {}) {
37
+ this.maxEntries = config.maxEntries ?? 50_000;
38
+ this.retentionMs = config.retentionMs ?? 7 * 24 * 3600_000; // 7 days
39
+ }
40
+ // ── Recording ──────────────────────────────────────────────────────
41
+ /** Record an access log entry. */
42
+ record(params) {
43
+ const id = `log_${++this.idCounter}`;
44
+ const entry = {
45
+ id,
46
+ timestamp: Date.now(),
47
+ key: params.key,
48
+ tool: params.tool,
49
+ method: params.method ?? 'tools/call',
50
+ status: params.status,
51
+ responseTimeMs: params.responseTimeMs,
52
+ ip: params.ip,
53
+ userAgent: params.userAgent,
54
+ credits: params.credits,
55
+ error: params.error,
56
+ requestId: params.requestId,
57
+ metadata: params.metadata,
58
+ };
59
+ this.entries.push(entry);
60
+ this.totalRecorded++;
61
+ // Evict if over limit
62
+ this.evict();
63
+ return id;
64
+ }
65
+ /** Bulk import entries. */
66
+ importEntries(entries) {
67
+ let count = 0;
68
+ for (const e of entries) {
69
+ this.record(e);
70
+ count++;
71
+ }
72
+ return count;
73
+ }
74
+ // ── Search & Query ─────────────────────────────────────────────────
75
+ /** Search access logs with filters. */
76
+ search(query = {}) {
77
+ let filtered = this.applyFilters(this.entries, query);
78
+ const total = filtered.length;
79
+ const limit = query.limit ?? 100;
80
+ const offset = query.offset ?? 0;
81
+ // Sort newest first
82
+ filtered.sort((a, b) => b.timestamp - a.timestamp);
83
+ // Paginate
84
+ const paginated = filtered.slice(offset, offset + limit);
85
+ return {
86
+ entries: paginated,
87
+ total,
88
+ limit,
89
+ offset,
90
+ hasMore: offset + limit < total,
91
+ };
92
+ }
93
+ /** Get a single entry by ID. */
94
+ getEntry(id) {
95
+ return this.entries.find(e => e.id === id) ?? null;
96
+ }
97
+ /** Count entries matching a query. */
98
+ count(query = {}) {
99
+ return this.applyFilters(this.entries, query).length;
100
+ }
101
+ // ── Summary / Analytics ────────────────────────────────────────────
102
+ /** Generate a summary of access logs within a time range. */
103
+ summarize(startTime, endTime) {
104
+ let entries = this.entries;
105
+ if (startTime)
106
+ entries = entries.filter(e => e.timestamp >= startTime);
107
+ if (endTime)
108
+ entries = entries.filter(e => e.timestamp <= endTime);
109
+ if (entries.length === 0) {
110
+ return {
111
+ totalRequests: 0,
112
+ totalAllowed: 0,
113
+ totalDenied: 0,
114
+ totalErrors: 0,
115
+ totalRateLimited: 0,
116
+ avgResponseTimeMs: 0,
117
+ p95ResponseTimeMs: 0,
118
+ p99ResponseTimeMs: 0,
119
+ uniqueKeys: 0,
120
+ uniqueTools: 0,
121
+ uniqueIps: 0,
122
+ topKeys: [],
123
+ topTools: [],
124
+ };
125
+ }
126
+ const keyCounts = new Map();
127
+ const toolCounts = new Map();
128
+ const ips = new Set();
129
+ let allowed = 0, denied = 0, errors = 0, rateLimited = 0;
130
+ const responseTimes = [];
131
+ for (const e of entries) {
132
+ keyCounts.set(e.key, (keyCounts.get(e.key) ?? 0) + 1);
133
+ toolCounts.set(e.tool, (toolCounts.get(e.tool) ?? 0) + 1);
134
+ if (e.ip)
135
+ ips.add(e.ip);
136
+ responseTimes.push(e.responseTimeMs);
137
+ switch (e.status) {
138
+ case 'allowed':
139
+ allowed++;
140
+ break;
141
+ case 'denied':
142
+ denied++;
143
+ break;
144
+ case 'error':
145
+ errors++;
146
+ break;
147
+ case 'rate_limited':
148
+ rateLimited++;
149
+ break;
150
+ }
151
+ }
152
+ responseTimes.sort((a, b) => a - b);
153
+ const avg = responseTimes.reduce((s, v) => s + v, 0) / responseTimes.length;
154
+ const p95 = responseTimes[Math.floor(responseTimes.length * 0.95)] ?? 0;
155
+ const p99 = responseTimes[Math.floor(responseTimes.length * 0.99)] ?? 0;
156
+ const topKeys = [...keyCounts.entries()]
157
+ .sort((a, b) => b[1] - a[1])
158
+ .slice(0, 10)
159
+ .map(([key, count]) => ({ key, count }));
160
+ const topTools = [...toolCounts.entries()]
161
+ .sort((a, b) => b[1] - a[1])
162
+ .slice(0, 10)
163
+ .map(([tool, count]) => ({ tool, count }));
164
+ return {
165
+ totalRequests: entries.length,
166
+ totalAllowed: allowed,
167
+ totalDenied: denied,
168
+ totalErrors: errors,
169
+ totalRateLimited: rateLimited,
170
+ avgResponseTimeMs: Math.round(avg * 100) / 100,
171
+ p95ResponseTimeMs: p95,
172
+ p99ResponseTimeMs: p99,
173
+ uniqueKeys: keyCounts.size,
174
+ uniqueTools: toolCounts.size,
175
+ uniqueIps: ips.size,
176
+ topKeys,
177
+ topTools,
178
+ };
179
+ }
180
+ // ── Maintenance ────────────────────────────────────────────────────
181
+ /** Purge entries older than retention period. Returns count purged. */
182
+ purge() {
183
+ const cutoff = Date.now() - this.retentionMs;
184
+ const before = this.entries.length;
185
+ this.entries = this.entries.filter(e => e.timestamp >= cutoff);
186
+ const purged = before - this.entries.length;
187
+ this.totalEvicted += purged;
188
+ return purged;
189
+ }
190
+ /** Clear all entries. */
191
+ clear() {
192
+ this.entries = [];
193
+ }
194
+ // ── Stats ──────────────────────────────────────────────────────────
195
+ getStats() {
196
+ return {
197
+ totalEntries: this.entries.length,
198
+ totalRecorded: this.totalRecorded,
199
+ totalEvicted: this.totalEvicted,
200
+ oldestEntry: this.entries.length > 0 ? this.entries[0].timestamp : null,
201
+ newestEntry: this.entries.length > 0 ? this.entries[this.entries.length - 1].timestamp : null,
202
+ };
203
+ }
204
+ /** Clear all data and stats. */
205
+ destroy() {
206
+ this.entries = [];
207
+ this.totalRecorded = 0;
208
+ this.totalEvicted = 0;
209
+ this.idCounter = 0;
210
+ }
211
+ // ── Private ─────────────────────────────────────────────────────────
212
+ applyFilters(entries, query) {
213
+ let result = entries;
214
+ if (query.key)
215
+ result = result.filter(e => e.key === query.key);
216
+ if (query.keys && query.keys.length > 0)
217
+ result = result.filter(e => query.keys.includes(e.key));
218
+ if (query.tool)
219
+ result = result.filter(e => e.tool === query.tool);
220
+ if (query.tools && query.tools.length > 0)
221
+ result = result.filter(e => query.tools.includes(e.tool));
222
+ if (query.status)
223
+ result = result.filter(e => e.status === query.status);
224
+ if (query.ip)
225
+ result = result.filter(e => e.ip === query.ip);
226
+ if (query.startTime)
227
+ result = result.filter(e => e.timestamp >= query.startTime);
228
+ if (query.endTime)
229
+ result = result.filter(e => e.timestamp <= query.endTime);
230
+ if (query.minResponseTimeMs !== undefined)
231
+ result = result.filter(e => e.responseTimeMs >= query.minResponseTimeMs);
232
+ if (query.maxResponseTimeMs !== undefined)
233
+ result = result.filter(e => e.responseTimeMs <= query.maxResponseTimeMs);
234
+ if (query.search) {
235
+ const s = query.search.toLowerCase();
236
+ result = result.filter(e => e.tool.toLowerCase().includes(s) ||
237
+ (e.error && e.error.toLowerCase().includes(s)) ||
238
+ (e.requestId && e.requestId.toLowerCase().includes(s)) ||
239
+ e.key.toLowerCase().includes(s));
240
+ }
241
+ return result;
242
+ }
243
+ evict() {
244
+ // Remove oldest entries if over limit
245
+ if (this.entries.length > this.maxEntries) {
246
+ const excess = this.entries.length - this.maxEntries;
247
+ this.entries.splice(0, excess);
248
+ this.totalEvicted += excess;
249
+ }
250
+ // Retention-based eviction
251
+ const cutoff = Date.now() - this.retentionMs;
252
+ const beforeLen = this.entries.length;
253
+ this.entries = this.entries.filter(e => e.timestamp >= cutoff);
254
+ const evicted = beforeLen - this.entries.length;
255
+ if (evicted > 0)
256
+ this.totalEvicted += evicted;
257
+ }
258
+ }
259
+ exports.AccessLogEngine = AccessLogEngine;
260
+ //# sourceMappingURL=access-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * BatchCreditManager — Bulk credit operations.
3
+ *
4
+ * Supports batch top-ups, transfers, refunds, and adjustments
5
+ * with atomic semantics (all-or-nothing per batch).
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const batch = new BatchCreditManager();
10
+ *
11
+ * // Bulk top-up
12
+ * const result = batch.execute([
13
+ * { type: 'topup', key: 'key_a', amount: 1000, note: 'Monthly refill' },
14
+ * { type: 'topup', key: 'key_b', amount: 500 },
15
+ * ]);
16
+ *
17
+ * // Transfer between keys
18
+ * batch.execute([
19
+ * { type: 'transfer', fromKey: 'key_a', toKey: 'key_b', amount: 200, note: 'Team rebalance' },
20
+ * ]);
21
+ * ```
22
+ */
23
+ export type BatchOpType = 'topup' | 'deduct' | 'transfer' | 'refund' | 'adjust';
24
+ export interface BatchTopup {
25
+ type: 'topup';
26
+ key: string;
27
+ amount: number;
28
+ note?: string;
29
+ }
30
+ export interface BatchDeduct {
31
+ type: 'deduct';
32
+ key: string;
33
+ amount: number;
34
+ note?: string;
35
+ }
36
+ export interface BatchTransfer {
37
+ type: 'transfer';
38
+ fromKey: string;
39
+ toKey: string;
40
+ amount: number;
41
+ note?: string;
42
+ }
43
+ export interface BatchRefund {
44
+ type: 'refund';
45
+ key: string;
46
+ amount: number;
47
+ originalTxId?: string;
48
+ note?: string;
49
+ }
50
+ export interface BatchAdjust {
51
+ type: 'adjust';
52
+ key: string;
53
+ amount: number;
54
+ reason: string;
55
+ }
56
+ export type BatchOp = BatchTopup | BatchDeduct | BatchTransfer | BatchRefund | BatchAdjust;
57
+ export interface BatchOpResult {
58
+ index: number;
59
+ op: BatchOp;
60
+ success: boolean;
61
+ error?: string;
62
+ balanceBefore?: number;
63
+ balanceAfter?: number;
64
+ }
65
+ export interface BatchExecutionResult {
66
+ id: string;
67
+ executedAt: string;
68
+ totalOps: number;
69
+ succeeded: number;
70
+ failed: number;
71
+ results: BatchOpResult[];
72
+ rolledBack: boolean;
73
+ }
74
+ export interface BatchConfig {
75
+ maxOpsPerBatch?: number;
76
+ maxTransferAmount?: number;
77
+ allowNegativeBalance?: boolean;
78
+ }
79
+ export interface BatchStats {
80
+ totalBatches: number;
81
+ totalOps: number;
82
+ totalTopups: number;
83
+ totalDeductions: number;
84
+ totalTransfers: number;
85
+ totalRefunds: number;
86
+ totalAdjustments: number;
87
+ totalFailed: number;
88
+ totalRolledBack: number;
89
+ trackedKeys: number;
90
+ }
91
+ export declare class BatchCreditManager {
92
+ private balances;
93
+ private history;
94
+ private maxOpsPerBatch;
95
+ private maxTransferAmount;
96
+ private allowNegativeBalance;
97
+ private totalBatches;
98
+ private totalOps;
99
+ private opCounts;
100
+ private totalFailed;
101
+ private totalRolledBack;
102
+ constructor(config?: BatchConfig);
103
+ /** Set balance for a key (seed / initialize). */
104
+ setBalance(key: string, amount: number): void;
105
+ /** Get balance for a key. */
106
+ getBalance(key: string): number;
107
+ /** Get all balances. */
108
+ getAllBalances(): Map<string, number>;
109
+ /**
110
+ * Execute a batch of credit operations atomically.
111
+ * If any op fails and `atomic` is true (default), all changes are rolled back.
112
+ */
113
+ execute(ops: BatchOp[], atomic?: boolean): BatchExecutionResult;
114
+ /**
115
+ * Dry-run: validate a batch without executing.
116
+ * Returns validation errors (empty array = all valid).
117
+ */
118
+ validate(ops: BatchOp[]): string[];
119
+ /** Get batch execution history. */
120
+ getHistory(limit?: number): BatchExecutionResult[];
121
+ /** Get a specific batch by ID. */
122
+ getBatch(id: string): BatchExecutionResult | null;
123
+ getStats(): BatchStats;
124
+ /** Clear all data. */
125
+ destroy(): void;
126
+ private validateOps;
127
+ private validateSingle;
128
+ private executeOp;
129
+ }
130
+ //# sourceMappingURL=batch-credits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-credits.d.ts","sourceRoot":"","sources":["../src/batch-credits.ts"],"names":[],"mappings":"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"}