paygate-mcp 10.18.0 → 10.20.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.
Files changed (37) hide show
  1. package/dist/credit-transfer.d.ts +94 -0
  2. package/dist/credit-transfer.d.ts.map +1 -0
  3. package/dist/credit-transfer.js +170 -0
  4. package/dist/credit-transfer.js.map +1 -0
  5. package/dist/error-classifier.d.ts +109 -0
  6. package/dist/error-classifier.d.ts.map +1 -0
  7. package/dist/error-classifier.js +181 -0
  8. package/dist/error-classifier.js.map +1 -0
  9. package/dist/grace-period.d.ts +113 -0
  10. package/dist/grace-period.d.ts.map +1 -0
  11. package/dist/grace-period.js +250 -0
  12. package/dist/grace-period.js.map +1 -0
  13. package/dist/index.d.ts +16 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +20 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/request-buffer.d.ts +92 -0
  18. package/dist/request-buffer.d.ts.map +1 -0
  19. package/dist/request-buffer.js +173 -0
  20. package/dist/request-buffer.js.map +1 -0
  21. package/dist/sliding-window.d.ts +78 -0
  22. package/dist/sliding-window.d.ts.map +1 -0
  23. package/dist/sliding-window.js +194 -0
  24. package/dist/sliding-window.js.map +1 -0
  25. package/dist/usage-anomaly.d.ts +99 -0
  26. package/dist/usage-anomaly.d.ts.map +1 -0
  27. package/dist/usage-anomaly.js +192 -0
  28. package/dist/usage-anomaly.js.map +1 -0
  29. package/dist/webhook-batch.d.ts +93 -0
  30. package/dist/webhook-batch.d.ts.map +1 -0
  31. package/dist/webhook-batch.js +191 -0
  32. package/dist/webhook-batch.js.map +1 -0
  33. package/dist/webhook-filter-expr.d.ts +99 -0
  34. package/dist/webhook-filter-expr.d.ts.map +1 -0
  35. package/dist/webhook-filter-expr.js +199 -0
  36. package/dist/webhook-filter-expr.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * CreditTransferManager — Transfer credits between API keys with audit trail.
3
+ *
4
+ * Enable credit transfers between keys, enforce balance checks,
5
+ * and maintain a complete audit trail of all transfers.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const mgr = new CreditTransferManager();
10
+ *
11
+ * mgr.setBalance('key_alice', 1000);
12
+ * mgr.setBalance('key_bob', 200);
13
+ *
14
+ * const result = mgr.transfer({
15
+ * fromKey: 'key_alice',
16
+ * toKey: 'key_bob',
17
+ * amount: 100,
18
+ * reason: 'Team rebalance',
19
+ * });
20
+ * // Alice: 900, Bob: 300
21
+ * ```
22
+ */
23
+ export interface TransferRecord {
24
+ id: string;
25
+ fromKey: string;
26
+ toKey: string;
27
+ amount: number;
28
+ reason: string;
29
+ fromBalanceBefore: number;
30
+ fromBalanceAfter: number;
31
+ toBalanceBefore: number;
32
+ toBalanceAfter: number;
33
+ createdAt: number;
34
+ reversedAt: number | null;
35
+ reversalId: string | null;
36
+ }
37
+ export interface TransferParams {
38
+ fromKey: string;
39
+ toKey: string;
40
+ amount: number;
41
+ reason?: string;
42
+ }
43
+ export interface CreditTransferConfig {
44
+ /** Max transfer history. Default 10000. */
45
+ maxHistory?: number;
46
+ /** Minimum transfer amount. Default 1. */
47
+ minAmount?: number;
48
+ /** Maximum single transfer amount. Default Infinity. */
49
+ maxAmount?: number;
50
+ /** Allow overdraft (negative balance). Default false. */
51
+ allowOverdraft?: boolean;
52
+ }
53
+ export interface CreditTransferStats {
54
+ trackedKeys: number;
55
+ totalTransfers: number;
56
+ totalReversals: number;
57
+ totalAmountTransferred: number;
58
+ totalBalance: number;
59
+ }
60
+ export declare class CreditTransferManager {
61
+ private balances;
62
+ private history;
63
+ private nextId;
64
+ private maxHistory;
65
+ private minAmount;
66
+ private maxAmount;
67
+ private allowOverdraft;
68
+ constructor(config?: CreditTransferConfig);
69
+ /** Set a key's balance. */
70
+ setBalance(key: string, balance: number): void;
71
+ /** Get a key's balance. */
72
+ getBalance(key: string): number | null;
73
+ /** Add credits to a key. */
74
+ addCredits(key: string, amount: number): number;
75
+ /** Transfer credits from one key to another. */
76
+ transfer(params: TransferParams): TransferRecord;
77
+ /** Reverse a transfer. */
78
+ reverse(transferId: string, reason?: string): TransferRecord;
79
+ /** Get transfer history for a key. */
80
+ getKeyHistory(key: string, limit?: number): TransferRecord[];
81
+ /** Get all transfer history. */
82
+ getHistory(limit?: number): TransferRecord[];
83
+ /** Get a transfer by ID. */
84
+ getTransfer(id: string): TransferRecord | null;
85
+ /** List all tracked keys with balances. */
86
+ listBalances(): {
87
+ key: string;
88
+ balance: number;
89
+ }[];
90
+ getStats(): CreditTransferStats;
91
+ /** Clear all data. */
92
+ destroy(): void;
93
+ }
94
+ //# sourceMappingURL=credit-transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit-transfer.d.ts","sourceRoot":"","sources":["../src/credit-transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAU;gBAEpB,MAAM,GAAE,oBAAyB;IAS7C,2BAA2B;IAC3B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9C,2BAA2B;IAC3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItC,4BAA4B;IAC5B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAU/C,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc;IA6ChD,0BAA0B;IAC1B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IAmB5D,sCAAsC;IACtC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,cAAc,EAAE;IAMxD,gCAAgC;IAChC,UAAU,CAAC,KAAK,SAAK,GAAG,cAAc,EAAE;IAIxC,4BAA4B;IAC5B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI9C,2CAA2C;IAC3C,YAAY,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAQlD,QAAQ,IAAI,mBAAmB;IAoB/B,sBAAsB;IACtB,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * CreditTransferManager — Transfer credits between API keys with audit trail.
4
+ *
5
+ * Enable credit transfers between keys, enforce balance checks,
6
+ * and maintain a complete audit trail of all transfers.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const mgr = new CreditTransferManager();
11
+ *
12
+ * mgr.setBalance('key_alice', 1000);
13
+ * mgr.setBalance('key_bob', 200);
14
+ *
15
+ * const result = mgr.transfer({
16
+ * fromKey: 'key_alice',
17
+ * toKey: 'key_bob',
18
+ * amount: 100,
19
+ * reason: 'Team rebalance',
20
+ * });
21
+ * // Alice: 900, Bob: 300
22
+ * ```
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.CreditTransferManager = void 0;
26
+ // ── Implementation ───────────────────────────────────────────────────
27
+ class CreditTransferManager {
28
+ balances = new Map();
29
+ history = [];
30
+ nextId = 1;
31
+ maxHistory;
32
+ minAmount;
33
+ maxAmount;
34
+ allowOverdraft;
35
+ constructor(config = {}) {
36
+ this.maxHistory = config.maxHistory ?? 10_000;
37
+ this.minAmount = config.minAmount ?? 1;
38
+ this.maxAmount = config.maxAmount ?? Infinity;
39
+ this.allowOverdraft = config.allowOverdraft ?? false;
40
+ }
41
+ // ── Balance Management ─────────────────────────────────────────
42
+ /** Set a key's balance. */
43
+ setBalance(key, balance) {
44
+ this.balances.set(key, balance);
45
+ }
46
+ /** Get a key's balance. */
47
+ getBalance(key) {
48
+ return this.balances.get(key) ?? null;
49
+ }
50
+ /** Add credits to a key. */
51
+ addCredits(key, amount) {
52
+ if (amount <= 0)
53
+ throw new Error('Amount must be positive');
54
+ const current = this.balances.get(key) ?? 0;
55
+ const newBalance = current + amount;
56
+ this.balances.set(key, newBalance);
57
+ return newBalance;
58
+ }
59
+ // ── Transfer ───────────────────────────────────────────────────
60
+ /** Transfer credits from one key to another. */
61
+ transfer(params) {
62
+ if (!params.fromKey)
63
+ throw new Error('fromKey is required');
64
+ if (!params.toKey)
65
+ throw new Error('toKey is required');
66
+ if (params.fromKey === params.toKey)
67
+ throw new Error('Cannot transfer to same key');
68
+ if (params.amount < this.minAmount)
69
+ throw new Error(`Amount must be at least ${this.minAmount}`);
70
+ if (params.amount > this.maxAmount)
71
+ throw new Error(`Amount cannot exceed ${this.maxAmount}`);
72
+ const fromBalance = this.balances.get(params.fromKey);
73
+ if (fromBalance === undefined)
74
+ throw new Error(`Key '${params.fromKey}' not found`);
75
+ const toBalance = this.balances.get(params.toKey);
76
+ if (toBalance === undefined)
77
+ throw new Error(`Key '${params.toKey}' not found`);
78
+ if (!this.allowOverdraft && fromBalance < params.amount) {
79
+ throw new Error(`Insufficient balance: ${fromBalance} < ${params.amount}`);
80
+ }
81
+ const newFromBalance = fromBalance - params.amount;
82
+ const newToBalance = toBalance + params.amount;
83
+ this.balances.set(params.fromKey, newFromBalance);
84
+ this.balances.set(params.toKey, newToBalance);
85
+ const record = {
86
+ id: `xfer_${this.nextId++}`,
87
+ fromKey: params.fromKey,
88
+ toKey: params.toKey,
89
+ amount: params.amount,
90
+ reason: params.reason ?? '',
91
+ fromBalanceBefore: fromBalance,
92
+ fromBalanceAfter: newFromBalance,
93
+ toBalanceBefore: toBalance,
94
+ toBalanceAfter: newToBalance,
95
+ createdAt: Date.now(),
96
+ reversedAt: null,
97
+ reversalId: null,
98
+ };
99
+ this.history.push(record);
100
+ if (this.history.length > this.maxHistory) {
101
+ this.history.splice(0, this.history.length - this.maxHistory);
102
+ }
103
+ return record;
104
+ }
105
+ /** Reverse a transfer. */
106
+ reverse(transferId, reason) {
107
+ const original = this.history.find(r => r.id === transferId);
108
+ if (!original)
109
+ throw new Error(`Transfer '${transferId}' not found`);
110
+ if (original.reversedAt)
111
+ throw new Error(`Transfer '${transferId}' already reversed`);
112
+ const reversal = this.transfer({
113
+ fromKey: original.toKey,
114
+ toKey: original.fromKey,
115
+ amount: original.amount,
116
+ reason: reason ?? `Reversal of ${transferId}`,
117
+ });
118
+ original.reversedAt = Date.now();
119
+ original.reversalId = reversal.id;
120
+ return reversal;
121
+ }
122
+ // ── Query ──────────────────────────────────────────────────────
123
+ /** Get transfer history for a key. */
124
+ getKeyHistory(key, limit = 50) {
125
+ return this.history
126
+ .filter(r => r.fromKey === key || r.toKey === key)
127
+ .slice(-limit);
128
+ }
129
+ /** Get all transfer history. */
130
+ getHistory(limit = 50) {
131
+ return this.history.slice(-limit);
132
+ }
133
+ /** Get a transfer by ID. */
134
+ getTransfer(id) {
135
+ return this.history.find(r => r.id === id) ?? null;
136
+ }
137
+ /** List all tracked keys with balances. */
138
+ listBalances() {
139
+ return [...this.balances.entries()]
140
+ .map(([key, balance]) => ({ key, balance }))
141
+ .sort((a, b) => b.balance - a.balance);
142
+ }
143
+ // ── Stats ──────────────────────────────────────────────────────
144
+ getStats() {
145
+ let totalAmount = 0;
146
+ let totalBalance = 0;
147
+ let reversals = 0;
148
+ for (const r of this.history) {
149
+ totalAmount += r.amount;
150
+ if (r.reversedAt)
151
+ reversals++;
152
+ }
153
+ for (const b of this.balances.values())
154
+ totalBalance += b;
155
+ return {
156
+ trackedKeys: this.balances.size,
157
+ totalTransfers: this.history.length,
158
+ totalReversals: reversals,
159
+ totalAmountTransferred: totalAmount,
160
+ totalBalance,
161
+ };
162
+ }
163
+ /** Clear all data. */
164
+ destroy() {
165
+ this.balances.clear();
166
+ this.history = [];
167
+ }
168
+ }
169
+ exports.CreditTransferManager = CreditTransferManager;
170
+ //# sourceMappingURL=credit-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit-transfer.js","sourceRoot":"","sources":["../src/credit-transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * ErrorClassifier — Classify and categorize errors for analytics and routing.
3
+ *
4
+ * Register error patterns, classify incoming errors by matching,
5
+ * and track error frequency for prioritization.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const classifier = new ErrorClassifier();
10
+ *
11
+ * classifier.registerPattern({
12
+ * category: 'rate_limit',
13
+ * pattern: /rate limit|too many requests|429/i,
14
+ * severity: 'warning',
15
+ * retryable: true,
16
+ * });
17
+ *
18
+ * const result = classifier.classify(new Error('Rate limit exceeded'));
19
+ * // { category: 'rate_limit', severity: 'warning', retryable: true, ... }
20
+ * ```
21
+ */
22
+ export type ErrorSeverity = 'info' | 'warning' | 'error' | 'critical';
23
+ export interface ErrorPattern {
24
+ id: string;
25
+ category: string;
26
+ pattern: RegExp;
27
+ severity: ErrorSeverity;
28
+ retryable: boolean;
29
+ description: string;
30
+ }
31
+ export interface PatternRegistration {
32
+ category: string;
33
+ pattern: RegExp;
34
+ severity?: ErrorSeverity;
35
+ retryable?: boolean;
36
+ description?: string;
37
+ }
38
+ export interface ClassifyResult {
39
+ classified: boolean;
40
+ category: string;
41
+ severity: ErrorSeverity;
42
+ retryable: boolean;
43
+ patternId: string | null;
44
+ description: string;
45
+ message: string;
46
+ timestamp: number;
47
+ }
48
+ export interface ErrorFrequency {
49
+ category: string;
50
+ count: number;
51
+ lastSeen: number;
52
+ firstSeen: number;
53
+ }
54
+ export interface ErrorClassifierConfig {
55
+ /** Max classification history. Default 10000. */
56
+ maxHistory?: number;
57
+ /** Max registered patterns. Default 500. */
58
+ maxPatterns?: number;
59
+ /** Default severity for unclassified errors. Default 'error'. */
60
+ defaultSeverity?: ErrorSeverity;
61
+ }
62
+ export interface ErrorClassifierStats {
63
+ totalPatterns: number;
64
+ totalClassified: number;
65
+ totalUnclassified: number;
66
+ categories: number;
67
+ topCategories: ErrorFrequency[];
68
+ }
69
+ export declare class ErrorClassifier {
70
+ private patterns;
71
+ private history;
72
+ private frequency;
73
+ private nextId;
74
+ private maxHistory;
75
+ private maxPatterns;
76
+ private defaultSeverity;
77
+ private totalClassified;
78
+ private totalUnclassified;
79
+ constructor(config?: ErrorClassifierConfig);
80
+ /** Register an error pattern. */
81
+ registerPattern(reg: PatternRegistration): ErrorPattern;
82
+ /** Remove a pattern by ID. */
83
+ removePattern(id: string): boolean;
84
+ /** Get a pattern by ID. */
85
+ getPattern(id: string): ErrorPattern | null;
86
+ /** List all patterns. */
87
+ listPatterns(): ErrorPattern[];
88
+ /** Classify an error. */
89
+ classify(error: Error | string): ClassifyResult;
90
+ /** Classify and return just the category name. */
91
+ categorize(error: Error | string): string;
92
+ /** Check if an error is retryable. */
93
+ isRetryable(error: Error | string): boolean;
94
+ /** Get classification history. */
95
+ getHistory(options?: {
96
+ category?: string;
97
+ severity?: ErrorSeverity;
98
+ limit?: number;
99
+ }): ClassifyResult[];
100
+ /** Get error frequency by category. */
101
+ getFrequency(): ErrorFrequency[];
102
+ /** Get frequency for a specific category. */
103
+ getCategoryFrequency(category: string): ErrorFrequency | null;
104
+ getStats(): ErrorClassifierStats;
105
+ /** Clear all data. */
106
+ destroy(): void;
107
+ private recordResult;
108
+ }
109
+ //# sourceMappingURL=error-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-classifier.d.ts","sourceRoot":"","sources":["../src/error-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * ErrorClassifier — Classify and categorize errors for analytics and routing.
4
+ *
5
+ * Register error patterns, classify incoming errors by matching,
6
+ * and track error frequency for prioritization.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const classifier = new ErrorClassifier();
11
+ *
12
+ * classifier.registerPattern({
13
+ * category: 'rate_limit',
14
+ * pattern: /rate limit|too many requests|429/i,
15
+ * severity: 'warning',
16
+ * retryable: true,
17
+ * });
18
+ *
19
+ * const result = classifier.classify(new Error('Rate limit exceeded'));
20
+ * // { category: 'rate_limit', severity: 'warning', retryable: true, ... }
21
+ * ```
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.ErrorClassifier = void 0;
25
+ // ── Implementation ───────────────────────────────────────────────────
26
+ class ErrorClassifier {
27
+ patterns = new Map();
28
+ history = [];
29
+ frequency = new Map();
30
+ nextId = 1;
31
+ maxHistory;
32
+ maxPatterns;
33
+ defaultSeverity;
34
+ // Stats
35
+ totalClassified = 0;
36
+ totalUnclassified = 0;
37
+ constructor(config = {}) {
38
+ this.maxHistory = config.maxHistory ?? 10_000;
39
+ this.maxPatterns = config.maxPatterns ?? 500;
40
+ this.defaultSeverity = config.defaultSeverity ?? 'error';
41
+ }
42
+ // ── Pattern Management ────────────────────────────────────────
43
+ /** Register an error pattern. */
44
+ registerPattern(reg) {
45
+ if (!reg.category)
46
+ throw new Error('Category is required');
47
+ if (!reg.pattern)
48
+ throw new Error('Pattern is required');
49
+ if (this.patterns.size >= this.maxPatterns) {
50
+ throw new Error(`Maximum ${this.maxPatterns} patterns reached`);
51
+ }
52
+ const pattern = {
53
+ id: `ep_${this.nextId++}`,
54
+ category: reg.category,
55
+ pattern: reg.pattern,
56
+ severity: reg.severity ?? this.defaultSeverity,
57
+ retryable: reg.retryable ?? false,
58
+ description: reg.description ?? '',
59
+ };
60
+ this.patterns.set(pattern.id, pattern);
61
+ return pattern;
62
+ }
63
+ /** Remove a pattern by ID. */
64
+ removePattern(id) {
65
+ return this.patterns.delete(id);
66
+ }
67
+ /** Get a pattern by ID. */
68
+ getPattern(id) {
69
+ return this.patterns.get(id) ?? null;
70
+ }
71
+ /** List all patterns. */
72
+ listPatterns() {
73
+ return [...this.patterns.values()];
74
+ }
75
+ // ── Classification ─────────────────────────────────────────────
76
+ /** Classify an error. */
77
+ classify(error) {
78
+ const message = typeof error === 'string' ? error : error.message;
79
+ const now = Date.now();
80
+ // Try to match against registered patterns
81
+ for (const pattern of this.patterns.values()) {
82
+ if (pattern.pattern.test(message)) {
83
+ const result = {
84
+ classified: true,
85
+ category: pattern.category,
86
+ severity: pattern.severity,
87
+ retryable: pattern.retryable,
88
+ patternId: pattern.id,
89
+ description: pattern.description,
90
+ message,
91
+ timestamp: now,
92
+ };
93
+ this.recordResult(result);
94
+ this.totalClassified++;
95
+ return result;
96
+ }
97
+ }
98
+ // Unclassified
99
+ const result = {
100
+ classified: false,
101
+ category: 'unknown',
102
+ severity: this.defaultSeverity,
103
+ retryable: false,
104
+ patternId: null,
105
+ description: 'No matching pattern found',
106
+ message,
107
+ timestamp: now,
108
+ };
109
+ this.recordResult(result);
110
+ this.totalUnclassified++;
111
+ return result;
112
+ }
113
+ /** Classify and return just the category name. */
114
+ categorize(error) {
115
+ return this.classify(error).category;
116
+ }
117
+ /** Check if an error is retryable. */
118
+ isRetryable(error) {
119
+ return this.classify(error).retryable;
120
+ }
121
+ // ── Query ──────────────────────────────────────────────────────
122
+ /** Get classification history. */
123
+ getHistory(options) {
124
+ let results = [...this.history];
125
+ if (options?.category)
126
+ results = results.filter(r => r.category === options.category);
127
+ if (options?.severity)
128
+ results = results.filter(r => r.severity === options.severity);
129
+ const limit = options?.limit ?? 50;
130
+ return results.slice(-limit);
131
+ }
132
+ /** Get error frequency by category. */
133
+ getFrequency() {
134
+ return [...this.frequency.values()].sort((a, b) => b.count - a.count);
135
+ }
136
+ /** Get frequency for a specific category. */
137
+ getCategoryFrequency(category) {
138
+ return this.frequency.get(category) ?? null;
139
+ }
140
+ // ── Stats ──────────────────────────────────────────────────────
141
+ getStats() {
142
+ const topCategories = this.getFrequency().slice(0, 5);
143
+ return {
144
+ totalPatterns: this.patterns.size,
145
+ totalClassified: this.totalClassified,
146
+ totalUnclassified: this.totalUnclassified,
147
+ categories: this.frequency.size,
148
+ topCategories,
149
+ };
150
+ }
151
+ /** Clear all data. */
152
+ destroy() {
153
+ this.patterns.clear();
154
+ this.history = [];
155
+ this.frequency.clear();
156
+ this.totalClassified = 0;
157
+ this.totalUnclassified = 0;
158
+ }
159
+ // ── Private ───────────────────────────────────────────────────
160
+ recordResult(result) {
161
+ this.history.push(result);
162
+ if (this.history.length > this.maxHistory) {
163
+ this.history.splice(0, this.history.length - this.maxHistory);
164
+ }
165
+ const existing = this.frequency.get(result.category);
166
+ if (existing) {
167
+ existing.count++;
168
+ existing.lastSeen = result.timestamp;
169
+ }
170
+ else {
171
+ this.frequency.set(result.category, {
172
+ category: result.category,
173
+ count: 1,
174
+ lastSeen: result.timestamp,
175
+ firstSeen: result.timestamp,
176
+ });
177
+ }
178
+ }
179
+ }
180
+ exports.ErrorClassifier = ErrorClassifier;
181
+ //# sourceMappingURL=error-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-classifier.js","sourceRoot":"","sources":["../src/error-classifier.ts"],"names":[],"mappings":"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"}