paygate-mcp 10.0.0 → 10.2.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,366 @@
1
+ "use strict";
2
+ /**
3
+ * ConfigProfileManager — Named configuration presets.
4
+ *
5
+ * Store and switch between named configuration profiles for different
6
+ * environments (dev, staging, production) or use cases:
7
+ * - Save current config as a named profile
8
+ * - Switch between profiles at runtime
9
+ * - Compare profiles to see differences
10
+ * - Import/export profiles as JSON
11
+ * - Profile inheritance (extend a base profile)
12
+ * - Rollback to previous profile
13
+ *
14
+ * Zero external dependencies.
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.ConfigProfileManager = void 0;
51
+ const crypto = __importStar(require("crypto"));
52
+ // ─── Defaults ───────────────────────────────────────────────────────────────
53
+ const DEFAULT_CONFIG = {
54
+ enabled: false,
55
+ maxProfiles: 50,
56
+ maxConfigSize: 1_000_000,
57
+ };
58
+ // ─── Helpers ────────────────────────────────────────────────────────────────
59
+ function computeChecksum(config) {
60
+ const json = JSON.stringify(config, Object.keys(config).sort());
61
+ return crypto.createHash('sha256').update(json).digest('hex').slice(0, 16);
62
+ }
63
+ function flattenKeys(obj, prefix = '') {
64
+ const result = new Map();
65
+ for (const [key, value] of Object.entries(obj)) {
66
+ const fullKey = prefix ? `${prefix}.${key}` : key;
67
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
68
+ const nested = flattenKeys(value, fullKey);
69
+ for (const [k, v] of nested) {
70
+ result.set(k, v);
71
+ }
72
+ }
73
+ else {
74
+ result.set(fullKey, value);
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ // ─── ConfigProfileManager Class ─────────────────────────────────────────────
80
+ class ConfigProfileManager {
81
+ config;
82
+ profiles = new Map();
83
+ activeProfileId = null;
84
+ previousProfileId = null;
85
+ // Stats
86
+ _switchCount = 0;
87
+ _lastSwitchAt = null;
88
+ counter = 0;
89
+ constructor(config) {
90
+ this.config = { ...DEFAULT_CONFIG, ...config };
91
+ }
92
+ // ─── Profile CRUD ───────────────────────────────────────────────────────
93
+ /**
94
+ * Save a configuration as a named profile.
95
+ */
96
+ saveProfile(params) {
97
+ if (!params.name || params.name.length > 128) {
98
+ throw new Error('Profile name required (max 128 chars)');
99
+ }
100
+ const configJson = JSON.stringify(params.config);
101
+ if (configJson.length > this.config.maxConfigSize) {
102
+ throw new Error(`Config too large (${configJson.length} bytes, max ${this.config.maxConfigSize})`);
103
+ }
104
+ if (params.extendsProfile && !this.profiles.has(params.extendsProfile)) {
105
+ throw new Error(`Parent profile '${params.extendsProfile}' not found`);
106
+ }
107
+ // Check for existing profile with same name
108
+ let existing;
109
+ for (const p of this.profiles.values()) {
110
+ if (p.name === params.name) {
111
+ existing = p;
112
+ break;
113
+ }
114
+ }
115
+ if (existing) {
116
+ // Update existing
117
+ existing.config = JSON.parse(JSON.stringify(params.config));
118
+ existing.description = params.description ?? existing.description;
119
+ existing.extendsProfile = params.extendsProfile;
120
+ existing.checksum = computeChecksum(params.config);
121
+ existing.updatedAt = Date.now();
122
+ if (params.activate) {
123
+ this.activateProfile(existing.id);
124
+ }
125
+ return { ...existing, config: JSON.parse(JSON.stringify(existing.config)) };
126
+ }
127
+ // Create new
128
+ if (this.profiles.size >= this.config.maxProfiles) {
129
+ throw new Error(`Max profiles reached (${this.config.maxProfiles})`);
130
+ }
131
+ this.counter++;
132
+ const id = `prof_${this.counter}_${Date.now().toString(36)}`;
133
+ const profile = {
134
+ id,
135
+ name: params.name,
136
+ description: params.description,
137
+ config: JSON.parse(JSON.stringify(params.config)),
138
+ extendsProfile: params.extendsProfile,
139
+ checksum: computeChecksum(params.config),
140
+ active: false,
141
+ createdAt: Date.now(),
142
+ updatedAt: Date.now(),
143
+ };
144
+ this.profiles.set(id, profile);
145
+ if (params.activate) {
146
+ this.activateProfile(id);
147
+ }
148
+ return { ...profile, config: JSON.parse(JSON.stringify(profile.config)) };
149
+ }
150
+ /**
151
+ * Get a profile by ID.
152
+ */
153
+ getProfile(id) {
154
+ const p = this.profiles.get(id);
155
+ if (!p)
156
+ return undefined;
157
+ return { ...p, config: JSON.parse(JSON.stringify(p.config)) };
158
+ }
159
+ /**
160
+ * Get a profile by name.
161
+ */
162
+ getProfileByName(name) {
163
+ for (const p of this.profiles.values()) {
164
+ if (p.name === name) {
165
+ return { ...p, config: JSON.parse(JSON.stringify(p.config)) };
166
+ }
167
+ }
168
+ return undefined;
169
+ }
170
+ /**
171
+ * List all profiles.
172
+ */
173
+ listProfiles() {
174
+ const results = [];
175
+ for (const p of this.profiles.values()) {
176
+ results.push({ ...p, config: JSON.parse(JSON.stringify(p.config)) });
177
+ }
178
+ return results;
179
+ }
180
+ /**
181
+ * Delete a profile.
182
+ */
183
+ deleteProfile(id) {
184
+ if (id === this.activeProfileId) {
185
+ this.activeProfileId = null;
186
+ }
187
+ // Remove from other profiles' extends references
188
+ for (const p of this.profiles.values()) {
189
+ if (p.extendsProfile === id) {
190
+ p.extendsProfile = undefined;
191
+ }
192
+ }
193
+ return this.profiles.delete(id);
194
+ }
195
+ // ─── Profile Switching ──────────────────────────────────────────────────
196
+ /**
197
+ * Activate a profile (makes it the current active profile).
198
+ * Returns the resolved configuration (with inheritance applied).
199
+ */
200
+ activateProfile(id) {
201
+ const profile = this.profiles.get(id);
202
+ if (!profile)
203
+ throw new Error(`Profile '${id}' not found`);
204
+ // Deactivate current
205
+ if (this.activeProfileId) {
206
+ const current = this.profiles.get(this.activeProfileId);
207
+ if (current)
208
+ current.active = false;
209
+ this.previousProfileId = this.activeProfileId;
210
+ }
211
+ profile.active = true;
212
+ this.activeProfileId = id;
213
+ this._switchCount++;
214
+ this._lastSwitchAt = Date.now();
215
+ return this.resolveConfig(id);
216
+ }
217
+ /**
218
+ * Rollback to the previously active profile.
219
+ */
220
+ rollback() {
221
+ if (!this.previousProfileId)
222
+ return null;
223
+ if (!this.profiles.has(this.previousProfileId))
224
+ return null;
225
+ return this.activateProfile(this.previousProfileId);
226
+ }
227
+ /**
228
+ * Get the currently active profile.
229
+ */
230
+ getActive() {
231
+ if (!this.activeProfileId)
232
+ return null;
233
+ return this.getProfile(this.activeProfileId) ?? null;
234
+ }
235
+ /**
236
+ * Resolve configuration for a profile, applying inheritance.
237
+ */
238
+ resolveConfig(id) {
239
+ const profile = this.profiles.get(id);
240
+ if (!profile)
241
+ throw new Error(`Profile '${id}' not found`);
242
+ // Build inheritance chain
243
+ const chain = [profile];
244
+ let current = profile;
245
+ const visited = new Set([id]);
246
+ while (current.extendsProfile) {
247
+ if (visited.has(current.extendsProfile)) {
248
+ break; // Circular inheritance, stop
249
+ }
250
+ visited.add(current.extendsProfile);
251
+ const parent = this.profiles.get(current.extendsProfile);
252
+ if (!parent)
253
+ break;
254
+ chain.unshift(parent);
255
+ current = parent;
256
+ }
257
+ // Merge configs from base to child
258
+ const resolved = {};
259
+ for (const p of chain) {
260
+ Object.assign(resolved, JSON.parse(JSON.stringify(p.config)));
261
+ }
262
+ return resolved;
263
+ }
264
+ // ─── Comparison ─────────────────────────────────────────────────────────
265
+ /**
266
+ * Compare two profiles and return the differences.
267
+ */
268
+ compare(idA, idB) {
269
+ const configA = this.resolveConfig(idA);
270
+ const configB = this.resolveConfig(idB);
271
+ const flatA = flattenKeys(configA);
272
+ const flatB = flattenKeys(configB);
273
+ const onlyInA = [];
274
+ const onlyInB = [];
275
+ const changed = [];
276
+ const unchanged = [];
277
+ for (const [key, valueA] of flatA) {
278
+ if (!flatB.has(key)) {
279
+ onlyInA.push(key);
280
+ }
281
+ else {
282
+ const valueB = flatB.get(key);
283
+ if (JSON.stringify(valueA) !== JSON.stringify(valueB)) {
284
+ changed.push({ key, valueA, valueB });
285
+ }
286
+ else {
287
+ unchanged.push(key);
288
+ }
289
+ }
290
+ }
291
+ for (const key of flatB.keys()) {
292
+ if (!flatA.has(key)) {
293
+ onlyInB.push(key);
294
+ }
295
+ }
296
+ return { onlyInA, onlyInB, changed, unchanged };
297
+ }
298
+ // ─── Import/Export ──────────────────────────────────────────────────────
299
+ /**
300
+ * Export all profiles as JSON.
301
+ */
302
+ exportProfiles() {
303
+ const profiles = this.listProfiles();
304
+ return JSON.stringify({
305
+ version: 1,
306
+ exportedAt: Date.now(),
307
+ activeProfileId: this.activeProfileId,
308
+ profiles,
309
+ }, null, 2);
310
+ }
311
+ /**
312
+ * Import profiles from JSON. Returns count imported.
313
+ */
314
+ importProfiles(json, mode = 'merge') {
315
+ const data = JSON.parse(json);
316
+ if (!data.profiles || !Array.isArray(data.profiles)) {
317
+ throw new Error('Invalid import format');
318
+ }
319
+ if (mode === 'replace') {
320
+ this.profiles.clear();
321
+ this.activeProfileId = null;
322
+ }
323
+ let imported = 0;
324
+ for (const p of data.profiles) {
325
+ if (!p.name || !p.config)
326
+ continue;
327
+ this.saveProfile({
328
+ name: p.name,
329
+ config: p.config,
330
+ description: p.description,
331
+ activate: p.active && data.activeProfileId === p.id,
332
+ });
333
+ imported++;
334
+ }
335
+ return imported;
336
+ }
337
+ // ─── Configuration ──────────────────────────────────────────────────────
338
+ configure(updates) {
339
+ if (updates.enabled !== undefined)
340
+ this.config.enabled = updates.enabled;
341
+ if (updates.maxProfiles !== undefined)
342
+ this.config.maxProfiles = Math.max(1, updates.maxProfiles);
343
+ if (updates.maxConfigSize !== undefined)
344
+ this.config.maxConfigSize = Math.max(1000, updates.maxConfigSize);
345
+ return { ...this.config };
346
+ }
347
+ stats() {
348
+ const active = this.activeProfileId ? this.profiles.get(this.activeProfileId) : null;
349
+ return {
350
+ totalProfiles: this.profiles.size,
351
+ activeProfile: active ? active.name : null,
352
+ switchCount: this._switchCount,
353
+ lastSwitchAt: this._lastSwitchAt,
354
+ rollbackAvailable: this.previousProfileId !== null && this.profiles.has(this.previousProfileId),
355
+ };
356
+ }
357
+ clear() {
358
+ this.profiles.clear();
359
+ this.activeProfileId = null;
360
+ this.previousProfileId = null;
361
+ this._switchCount = 0;
362
+ this._lastSwitchAt = null;
363
+ }
364
+ }
365
+ exports.ConfigProfileManager = ConfigProfileManager;
366
+ //# sourceMappingURL=config-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-profiles.js","sourceRoot":"","sources":["../src/config-profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Gateway Hooks — Pre/post request lifecycle hooks for custom logic.
3
+ *
4
+ * Register named hooks that execute at different stages of the
5
+ * request lifecycle: before gate evaluation (pre-gate), after gate
6
+ * but before backend call (pre-backend), and after backend response
7
+ * (post-backend). Hooks can modify requests, add metadata, or
8
+ * short-circuit processing.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const hooks = new GatewayHookManager();
13
+ * hooks.configure({ enabled: true });
14
+ *
15
+ * hooks.registerHook({
16
+ * name: 'log-all-calls',
17
+ * stage: 'pre_gate',
18
+ * type: 'log',
19
+ * config: { message: 'Tool call received' },
20
+ * });
21
+ * ```
22
+ */
23
+ export type HookStage = 'pre_gate' | 'pre_backend' | 'post_backend';
24
+ export type HookType = 'log' | 'header_inject' | 'metadata_tag' | 'reject';
25
+ export type HookAction = 'continue' | 'reject' | 'skip';
26
+ export interface GatewayHook {
27
+ id: string;
28
+ name: string;
29
+ stage: HookStage;
30
+ type: HookType;
31
+ priority: number;
32
+ enabled: boolean;
33
+ config: HookConfig;
34
+ toolFilter?: string;
35
+ keyFilter?: string;
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ executionCount: number;
39
+ }
40
+ export interface HookConfig {
41
+ /** For log type: the message template */
42
+ message?: string;
43
+ /** For header_inject type: headers to add */
44
+ headers?: Record<string, string>;
45
+ /** For metadata_tag type: tags to add */
46
+ tags?: Record<string, string>;
47
+ /** For reject type: error message */
48
+ rejectMessage?: string;
49
+ /** For reject type: JSON-RPC error code */
50
+ rejectCode?: number;
51
+ }
52
+ export interface HookCreateParams {
53
+ name: string;
54
+ stage: HookStage;
55
+ type: HookType;
56
+ priority?: number;
57
+ enabled?: boolean;
58
+ config: HookConfig;
59
+ toolFilter?: string;
60
+ keyFilter?: string;
61
+ }
62
+ export interface HookExecutionContext {
63
+ apiKey: string;
64
+ tool: string;
65
+ requestId?: string;
66
+ creditCost?: number;
67
+ timestamp: string;
68
+ }
69
+ export interface HookExecutionResult {
70
+ hookId: string;
71
+ hookName: string;
72
+ action: HookAction;
73
+ metadata?: Record<string, string>;
74
+ headers?: Record<string, string>;
75
+ rejectMessage?: string;
76
+ rejectCode?: number;
77
+ durationMs: number;
78
+ }
79
+ export interface HookStageResult {
80
+ stage: HookStage;
81
+ hookResults: HookExecutionResult[];
82
+ action: HookAction;
83
+ totalDurationMs: number;
84
+ }
85
+ export interface GatewayHookStats {
86
+ totalHooks: number;
87
+ enabledHooks: number;
88
+ totalExecutions: number;
89
+ byStage: Record<HookStage, number>;
90
+ byType: Record<HookType, number>;
91
+ }
92
+ export interface GatewayHookConfig {
93
+ enabled: boolean;
94
+ maxHooks: number;
95
+ maxExecutionMs: number;
96
+ }
97
+ export declare class GatewayHookManager {
98
+ private hooks;
99
+ private config;
100
+ registerHook(params: HookCreateParams): GatewayHook;
101
+ getHook(id: string): GatewayHook | undefined;
102
+ listHooks(filter?: {
103
+ stage?: HookStage;
104
+ type?: HookType;
105
+ enabled?: boolean;
106
+ }): GatewayHook[];
107
+ updateHook(id: string, updates: Partial<Pick<GatewayHook, 'name' | 'priority' | 'enabled' | 'config' | 'toolFilter' | 'keyFilter'>>): GatewayHook;
108
+ deleteHook(id: string): boolean;
109
+ executeStage(stage: HookStage, ctx: HookExecutionContext): HookStageResult;
110
+ private executeHook;
111
+ configure(updates: Partial<GatewayHookConfig>): GatewayHookConfig;
112
+ stats(): GatewayHookStats;
113
+ clear(): void;
114
+ }
115
+ //# sourceMappingURL=gateway-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-hooks.d.ts","sourceRoot":"","sources":["../src/gateway-hooks.ts"],"names":[],"mappings":"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"}