paygate-mcp 10.10.0 → 10.12.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,122 @@
1
+ /**
2
+ * ApiVersionRouter — Route tool calls to versioned backends.
3
+ *
4
+ * Manage multiple versions of tools, route requests to the correct
5
+ * version based on key configuration, and enable safe migrations
6
+ * with deprecation warnings and sunset dates.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const router = new ApiVersionRouter();
11
+ *
12
+ * router.registerVersion({
13
+ * tool: 'search',
14
+ * version: 'v1',
15
+ * status: 'deprecated',
16
+ * sunsetDate: '2026-04-01',
17
+ * });
18
+ *
19
+ * router.registerVersion({
20
+ * tool: 'search',
21
+ * version: 'v2',
22
+ * status: 'current',
23
+ * });
24
+ *
25
+ * router.setKeyVersion('key_abc', 'search', 'v2');
26
+ *
27
+ * const resolved = router.resolve('key_abc', 'search');
28
+ * // { version: 'v2', status: 'current', deprecated: false }
29
+ * ```
30
+ */
31
+ export type VersionStatus = 'preview' | 'current' | 'deprecated' | 'sunset';
32
+ export interface ToolVersion {
33
+ tool: string;
34
+ version: string;
35
+ status: VersionStatus;
36
+ /** ISO date string when this version will be sunset. */
37
+ sunsetDate?: string;
38
+ /** Description of changes in this version. */
39
+ changelog?: string;
40
+ /** When this version was registered. */
41
+ registeredAt: number;
42
+ }
43
+ export interface VersionRegistration {
44
+ tool: string;
45
+ version: string;
46
+ status?: VersionStatus;
47
+ sunsetDate?: string;
48
+ changelog?: string;
49
+ }
50
+ export interface VersionResolveResult {
51
+ tool: string;
52
+ version: string;
53
+ status: VersionStatus;
54
+ deprecated: boolean;
55
+ sunsetDate?: string;
56
+ warning?: string;
57
+ }
58
+ export interface MigrationPlan {
59
+ tool: string;
60
+ fromVersion: string;
61
+ toVersion: string;
62
+ affectedKeys: string[];
63
+ fromStatus: VersionStatus;
64
+ toStatus: VersionStatus;
65
+ }
66
+ export interface ApiVersionConfig {
67
+ /** Default version to use when no key-specific version is set. */
68
+ defaultVersionStrategy?: 'latest' | 'current';
69
+ /** Auto-sunset versions past their sunset date. */
70
+ autoSunset?: boolean;
71
+ }
72
+ export interface ApiVersionStats {
73
+ totalTools: number;
74
+ totalVersions: number;
75
+ currentVersions: number;
76
+ deprecatedVersions: number;
77
+ sunsetVersions: number;
78
+ previewVersions: number;
79
+ keyOverrides: number;
80
+ totalResolutions: number;
81
+ }
82
+ export declare class ApiVersionRouter {
83
+ private versions;
84
+ private keyVersions;
85
+ private defaultStrategy;
86
+ private autoSunset;
87
+ private totalResolutions;
88
+ constructor(config?: ApiVersionConfig);
89
+ /** Register a tool version. */
90
+ registerVersion(reg: VersionRegistration): ToolVersion;
91
+ /** Remove a tool version. */
92
+ removeVersion(tool: string, version: string): boolean;
93
+ /** Get a specific tool version. */
94
+ getVersion(tool: string, version: string): ToolVersion | null;
95
+ /** List all versions for a tool. */
96
+ getToolVersions(tool: string): ToolVersion[];
97
+ /** List all tools that have versions. */
98
+ getVersionedTools(): string[];
99
+ /** Update the status of a version. */
100
+ setVersionStatus(tool: string, version: string, status: VersionStatus): boolean;
101
+ /** Set a specific version for a key+tool combination. */
102
+ setKeyVersion(key: string, tool: string, version: string): boolean;
103
+ /** Remove key-specific version override. */
104
+ removeKeyVersion(key: string, tool: string): boolean;
105
+ /** Get key-specific version override. */
106
+ getKeyVersion(key: string, tool: string): string | null;
107
+ /** Resolve which version to use for a key+tool request. */
108
+ resolve(key: string, tool: string): VersionResolveResult | null;
109
+ /** Generate a migration plan for moving keys from one version to another. */
110
+ planMigration(tool: string, fromVersion: string, toVersion: string): MigrationPlan | null;
111
+ /** Execute a migration: move all keys from one version to another. */
112
+ executeMigration(tool: string, fromVersion: string, toVersion: string): number;
113
+ /** Get all deprecated versions across all tools. */
114
+ getDeprecatedVersions(): ToolVersion[];
115
+ /** Get versions approaching sunset (within days). */
116
+ getApproachingSunset(withinDays?: number): ToolVersion[];
117
+ getStats(): ApiVersionStats;
118
+ /** Clear all data. */
119
+ destroy(): void;
120
+ private checkSunsets;
121
+ }
122
+ //# sourceMappingURL=api-versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-versioning.d.ts","sourceRoot":"","sources":["../src/api-versioning.ts"],"names":[],"mappings":"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"}