paygate-mcp 10.14.0 → 10.16.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/ab-testing.d.ts +129 -0
  2. package/dist/ab-testing.d.ts.map +1 -0
  3. package/dist/ab-testing.js +290 -0
  4. package/dist/ab-testing.js.map +1 -0
  5. package/dist/capacity-planner.d.ts +126 -0
  6. package/dist/capacity-planner.d.ts.map +1 -0
  7. package/dist/capacity-planner.js +302 -0
  8. package/dist/capacity-planner.js.map +1 -0
  9. package/dist/data-retention.d.ts +132 -0
  10. package/dist/data-retention.d.ts.map +1 -0
  11. package/dist/data-retention.js +236 -0
  12. package/dist/data-retention.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 +19 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/notification-manager.d.ts +146 -0
  18. package/dist/notification-manager.d.ts.map +1 -0
  19. package/dist/notification-manager.js +281 -0
  20. package/dist/notification-manager.js.map +1 -0
  21. package/dist/policy-engine.d.ts +126 -0
  22. package/dist/policy-engine.d.ts.map +1 -0
  23. package/dist/policy-engine.js +208 -0
  24. package/dist/policy-engine.js.map +1 -0
  25. package/dist/rate-limit-profile.d.ts +115 -0
  26. package/dist/rate-limit-profile.d.ts.map +1 -0
  27. package/dist/rate-limit-profile.js +268 -0
  28. package/dist/rate-limit-profile.js.map +1 -0
  29. package/dist/service-discovery.d.ts +105 -0
  30. package/dist/service-discovery.d.ts.map +1 -0
  31. package/dist/service-discovery.js +209 -0
  32. package/dist/service-discovery.js.map +1 -0
  33. package/dist/session-manager.d.ts +115 -0
  34. package/dist/session-manager.d.ts.map +1 -0
  35. package/dist/session-manager.js +236 -0
  36. package/dist/session-manager.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,129 @@
1
+ /**
2
+ * ABTestingManager — Experiment management with traffic splitting and metric tracking.
3
+ *
4
+ * Create experiments with variant groups, deterministically assign keys to variants,
5
+ * record metrics per variant, and compute basic statistical results.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const mgr = new ABTestingManager();
10
+ *
11
+ * mgr.createExperiment({
12
+ * name: 'pricing_test',
13
+ * variants: [
14
+ * { name: 'control', weight: 50, config: { priceMultiplier: 1.0 } },
15
+ * { name: 'higher_price', weight: 50, config: { priceMultiplier: 1.5 } },
16
+ * ],
17
+ * });
18
+ *
19
+ * const variant = mgr.assignVariant('pricing_test', 'key_abc');
20
+ * mgr.recordMetric('pricing_test', 'key_abc', 'revenue', 10);
21
+ * ```
22
+ */
23
+ export interface Variant {
24
+ name: string;
25
+ weight: number;
26
+ config: Record<string, unknown>;
27
+ }
28
+ export interface Experiment {
29
+ id: string;
30
+ name: string;
31
+ description: string;
32
+ variants: Variant[];
33
+ status: 'draft' | 'running' | 'paused' | 'completed';
34
+ startedAt: number | null;
35
+ completedAt: number | null;
36
+ createdAt: number;
37
+ }
38
+ export interface ExperimentCreateParams {
39
+ name: string;
40
+ description?: string;
41
+ variants: Variant[];
42
+ autoStart?: boolean;
43
+ }
44
+ export interface VariantAssignment {
45
+ experimentName: string;
46
+ key: string;
47
+ variant: string;
48
+ assignedAt: number;
49
+ }
50
+ export interface MetricRecord {
51
+ experimentName: string;
52
+ key: string;
53
+ variant: string;
54
+ metric: string;
55
+ value: number;
56
+ timestamp: number;
57
+ }
58
+ export interface VariantMetrics {
59
+ variant: string;
60
+ sampleSize: number;
61
+ metrics: Map<string, {
62
+ count: number;
63
+ sum: number;
64
+ avg: number;
65
+ min: number;
66
+ max: number;
67
+ }>;
68
+ }
69
+ export interface ExperimentResults {
70
+ name: string;
71
+ status: string;
72
+ totalAssignments: number;
73
+ variants: VariantMetrics[];
74
+ }
75
+ export interface ABTestingConfig {
76
+ /** Max experiments. Default 100. */
77
+ maxExperiments?: number;
78
+ /** Max assignments per experiment. Default 100000. */
79
+ maxAssignments?: number;
80
+ }
81
+ export interface ABTestingStats {
82
+ totalExperiments: number;
83
+ runningExperiments: number;
84
+ completedExperiments: number;
85
+ totalAssignments: number;
86
+ totalMetrics: number;
87
+ }
88
+ export declare class ABTestingManager {
89
+ private experiments;
90
+ private assignments;
91
+ private metrics;
92
+ private nextId;
93
+ private maxExperiments;
94
+ private maxAssignments;
95
+ constructor(config?: ABTestingConfig);
96
+ /** Create an experiment. */
97
+ createExperiment(params: ExperimentCreateParams): Experiment;
98
+ /** Get experiment by name. */
99
+ getExperimentByName(name: string): Experiment | null;
100
+ /** Get experiment by ID. */
101
+ getExperiment(id: string): Experiment | null;
102
+ /** List all experiments. */
103
+ listExperiments(): Experiment[];
104
+ /** Start an experiment. */
105
+ startExperiment(name: string): void;
106
+ /** Pause an experiment. */
107
+ pauseExperiment(name: string): void;
108
+ /** Complete an experiment. */
109
+ completeExperiment(name: string): void;
110
+ /** Remove an experiment. */
111
+ removeExperiment(name: string): boolean;
112
+ /** Assign a key to a variant (deterministic). */
113
+ assignVariant(experimentName: string, key: string): VariantAssignment;
114
+ /** Get the variant assignment for a key. */
115
+ getAssignment(experimentName: string, key: string): VariantAssignment | null;
116
+ /** Get variant config for an assigned key. */
117
+ getVariantConfig(experimentName: string, key: string): Record<string, unknown> | null;
118
+ /** Get all assignments for an experiment. */
119
+ getAssignments(experimentName: string): VariantAssignment[];
120
+ /** Record a metric for a key in an experiment. */
121
+ recordMetric(experimentName: string, key: string, metric: string, value: number): MetricRecord;
122
+ /** Get experiment results with per-variant metrics. */
123
+ getResults(experimentName: string): ExperimentResults;
124
+ getStats(): ABTestingStats;
125
+ /** Clear all data. */
126
+ destroy(): void;
127
+ private hashKey;
128
+ }
129
+ //# sourceMappingURL=ab-testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ab-testing.d.ts","sourceRoot":"","sources":["../src/ab-testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7F;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,eAAoB;IAOxC,4BAA4B;IAC5B,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU;IA+B5D,8BAA8B;IAC9B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAOpD,4BAA4B;IAC5B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI5C,4BAA4B;IAC5B,eAAe,IAAI,UAAU,EAAE;IAI/B,2BAA2B;IAC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASnC,2BAA2B;IAC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnC,8BAA8B;IAC9B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOtC,4BAA4B;IAC5B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWvC,iDAAiD;IACjD,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB;IAyCrE,4CAA4C;IAC5C,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAI5E,8CAA8C;IAC9C,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IASrF,6CAA6C;IAC7C,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAO3D,kDAAkD;IAClD,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IAiB9F,uDAAuD;IACvD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,iBAAiB;IAyDrD,QAAQ,IAAI,cAAc;IAsB1B,sBAAsB;IACtB,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,OAAO;CAShB"}
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * ABTestingManager — Experiment management with traffic splitting and metric tracking.
4
+ *
5
+ * Create experiments with variant groups, deterministically assign keys to variants,
6
+ * record metrics per variant, and compute basic statistical results.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const mgr = new ABTestingManager();
11
+ *
12
+ * mgr.createExperiment({
13
+ * name: 'pricing_test',
14
+ * variants: [
15
+ * { name: 'control', weight: 50, config: { priceMultiplier: 1.0 } },
16
+ * { name: 'higher_price', weight: 50, config: { priceMultiplier: 1.5 } },
17
+ * ],
18
+ * });
19
+ *
20
+ * const variant = mgr.assignVariant('pricing_test', 'key_abc');
21
+ * mgr.recordMetric('pricing_test', 'key_abc', 'revenue', 10);
22
+ * ```
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.ABTestingManager = void 0;
26
+ // ── Implementation ───────────────────────────────────────────────────
27
+ class ABTestingManager {
28
+ experiments = new Map();
29
+ assignments = new Map(); // expName → key → assignment
30
+ metrics = [];
31
+ nextId = 1;
32
+ maxExperiments;
33
+ maxAssignments;
34
+ constructor(config = {}) {
35
+ this.maxExperiments = config.maxExperiments ?? 100;
36
+ this.maxAssignments = config.maxAssignments ?? 100_000;
37
+ }
38
+ // ── Experiment Management ──────────────────────────────────────
39
+ /** Create an experiment. */
40
+ createExperiment(params) {
41
+ if (!params.name)
42
+ throw new Error('Experiment name is required');
43
+ if (this.getExperimentByName(params.name)) {
44
+ throw new Error(`Experiment '${params.name}' already exists`);
45
+ }
46
+ if (!params.variants || params.variants.length < 2) {
47
+ throw new Error('At least 2 variants are required');
48
+ }
49
+ if (this.experiments.size >= this.maxExperiments) {
50
+ throw new Error(`Maximum ${this.maxExperiments} experiments reached`);
51
+ }
52
+ const totalWeight = params.variants.reduce((s, v) => s + v.weight, 0);
53
+ if (totalWeight <= 0)
54
+ throw new Error('Total variant weight must be positive');
55
+ const experiment = {
56
+ id: `exp_${this.nextId++}`,
57
+ name: params.name,
58
+ description: params.description ?? '',
59
+ variants: params.variants.map(v => ({ ...v })),
60
+ status: params.autoStart ? 'running' : 'draft',
61
+ startedAt: params.autoStart ? Date.now() : null,
62
+ completedAt: null,
63
+ createdAt: Date.now(),
64
+ };
65
+ this.experiments.set(experiment.id, experiment);
66
+ this.assignments.set(experiment.name, new Map());
67
+ return experiment;
68
+ }
69
+ /** Get experiment by name. */
70
+ getExperimentByName(name) {
71
+ for (const exp of this.experiments.values()) {
72
+ if (exp.name === name)
73
+ return exp;
74
+ }
75
+ return null;
76
+ }
77
+ /** Get experiment by ID. */
78
+ getExperiment(id) {
79
+ return this.experiments.get(id) ?? null;
80
+ }
81
+ /** List all experiments. */
82
+ listExperiments() {
83
+ return [...this.experiments.values()];
84
+ }
85
+ /** Start an experiment. */
86
+ startExperiment(name) {
87
+ const exp = this.getExperimentByName(name);
88
+ if (!exp)
89
+ throw new Error(`Experiment '${name}' not found`);
90
+ if (exp.status === 'running')
91
+ return;
92
+ if (exp.status === 'completed')
93
+ throw new Error('Cannot restart completed experiment');
94
+ exp.status = 'running';
95
+ exp.startedAt = exp.startedAt ?? Date.now();
96
+ }
97
+ /** Pause an experiment. */
98
+ pauseExperiment(name) {
99
+ const exp = this.getExperimentByName(name);
100
+ if (!exp)
101
+ throw new Error(`Experiment '${name}' not found`);
102
+ exp.status = 'paused';
103
+ }
104
+ /** Complete an experiment. */
105
+ completeExperiment(name) {
106
+ const exp = this.getExperimentByName(name);
107
+ if (!exp)
108
+ throw new Error(`Experiment '${name}' not found`);
109
+ exp.status = 'completed';
110
+ exp.completedAt = Date.now();
111
+ }
112
+ /** Remove an experiment. */
113
+ removeExperiment(name) {
114
+ const exp = this.getExperimentByName(name);
115
+ if (!exp)
116
+ return false;
117
+ this.experiments.delete(exp.id);
118
+ this.assignments.delete(name);
119
+ this.metrics = this.metrics.filter(m => m.experimentName !== name);
120
+ return true;
121
+ }
122
+ // ── Variant Assignment ─────────────────────────────────────────
123
+ /** Assign a key to a variant (deterministic). */
124
+ assignVariant(experimentName, key) {
125
+ const exp = this.getExperimentByName(experimentName);
126
+ if (!exp)
127
+ throw new Error(`Experiment '${experimentName}' not found`);
128
+ if (exp.status !== 'running')
129
+ throw new Error(`Experiment '${experimentName}' is not running`);
130
+ const expAssignments = this.assignments.get(experimentName);
131
+ // Return existing assignment if already assigned
132
+ const existing = expAssignments.get(key);
133
+ if (existing)
134
+ return existing;
135
+ // Deterministic bucket assignment
136
+ const hash = this.hashKey(`${experimentName}:${key}`);
137
+ const totalWeight = exp.variants.reduce((s, v) => s + v.weight, 0);
138
+ const bucket = hash % totalWeight;
139
+ let cumulative = 0;
140
+ let assignedVariant = exp.variants[0].name;
141
+ for (const variant of exp.variants) {
142
+ cumulative += variant.weight;
143
+ if (bucket < cumulative) {
144
+ assignedVariant = variant.name;
145
+ break;
146
+ }
147
+ }
148
+ const assignment = {
149
+ experimentName,
150
+ key,
151
+ variant: assignedVariant,
152
+ assignedAt: Date.now(),
153
+ };
154
+ if (expAssignments.size >= this.maxAssignments) {
155
+ throw new Error(`Maximum ${this.maxAssignments} assignments reached for experiment`);
156
+ }
157
+ expAssignments.set(key, assignment);
158
+ return assignment;
159
+ }
160
+ /** Get the variant assignment for a key. */
161
+ getAssignment(experimentName, key) {
162
+ return this.assignments.get(experimentName)?.get(key) ?? null;
163
+ }
164
+ /** Get variant config for an assigned key. */
165
+ getVariantConfig(experimentName, key) {
166
+ const assignment = this.getAssignment(experimentName, key);
167
+ if (!assignment)
168
+ return null;
169
+ const exp = this.getExperimentByName(experimentName);
170
+ if (!exp)
171
+ return null;
172
+ const variant = exp.variants.find(v => v.name === assignment.variant);
173
+ return variant?.config ?? null;
174
+ }
175
+ /** Get all assignments for an experiment. */
176
+ getAssignments(experimentName) {
177
+ const m = this.assignments.get(experimentName);
178
+ return m ? [...m.values()] : [];
179
+ }
180
+ // ── Metrics ────────────────────────────────────────────────────
181
+ /** Record a metric for a key in an experiment. */
182
+ recordMetric(experimentName, key, metric, value) {
183
+ const assignment = this.getAssignment(experimentName, key);
184
+ if (!assignment)
185
+ throw new Error(`Key '${key}' not assigned to experiment '${experimentName}'`);
186
+ const record = {
187
+ experimentName,
188
+ key,
189
+ variant: assignment.variant,
190
+ metric,
191
+ value,
192
+ timestamp: Date.now(),
193
+ };
194
+ this.metrics.push(record);
195
+ return record;
196
+ }
197
+ /** Get experiment results with per-variant metrics. */
198
+ getResults(experimentName) {
199
+ const exp = this.getExperimentByName(experimentName);
200
+ if (!exp)
201
+ throw new Error(`Experiment '${experimentName}' not found`);
202
+ const expAssignments = this.assignments.get(experimentName);
203
+ const expMetrics = this.metrics.filter(m => m.experimentName === experimentName);
204
+ // Group metrics by variant
205
+ const variantData = new Map();
206
+ for (const v of exp.variants) {
207
+ variantData.set(v.name, { keys: new Set(), metrics: new Map() });
208
+ }
209
+ // Count assignments per variant
210
+ for (const a of expAssignments.values()) {
211
+ const vd = variantData.get(a.variant);
212
+ if (vd)
213
+ vd.keys.add(a.key);
214
+ }
215
+ // Aggregate metrics
216
+ for (const m of expMetrics) {
217
+ const vd = variantData.get(m.variant);
218
+ if (!vd)
219
+ continue;
220
+ if (!vd.metrics.has(m.metric))
221
+ vd.metrics.set(m.metric, []);
222
+ vd.metrics.get(m.metric).push(m.value);
223
+ }
224
+ const variants = [];
225
+ for (const [variantName, data] of variantData) {
226
+ const metricsMap = new Map();
227
+ for (const [metricName, values] of data.metrics) {
228
+ const sum = values.reduce((s, v) => s + v, 0);
229
+ metricsMap.set(metricName, {
230
+ count: values.length,
231
+ sum,
232
+ avg: values.length > 0 ? sum / values.length : 0,
233
+ min: values.length > 0 ? Math.min(...values) : 0,
234
+ max: values.length > 0 ? Math.max(...values) : 0,
235
+ });
236
+ }
237
+ variants.push({
238
+ variant: variantName,
239
+ sampleSize: data.keys.size,
240
+ metrics: metricsMap,
241
+ });
242
+ }
243
+ return {
244
+ name: experimentName,
245
+ status: exp.status,
246
+ totalAssignments: expAssignments.size,
247
+ variants,
248
+ };
249
+ }
250
+ // ── Stats ───────────────────────────────────────────────────────
251
+ getStats() {
252
+ let running = 0;
253
+ let completed = 0;
254
+ let totalAssignments = 0;
255
+ for (const exp of this.experiments.values()) {
256
+ if (exp.status === 'running')
257
+ running++;
258
+ if (exp.status === 'completed')
259
+ completed++;
260
+ }
261
+ for (const m of this.assignments.values()) {
262
+ totalAssignments += m.size;
263
+ }
264
+ return {
265
+ totalExperiments: this.experiments.size,
266
+ runningExperiments: running,
267
+ completedExperiments: completed,
268
+ totalAssignments,
269
+ totalMetrics: this.metrics.length,
270
+ };
271
+ }
272
+ /** Clear all data. */
273
+ destroy() {
274
+ this.experiments.clear();
275
+ this.assignments.clear();
276
+ this.metrics = [];
277
+ }
278
+ // ── Private ─────────────────────────────────────────────────────
279
+ hashKey(input) {
280
+ let hash = 0;
281
+ for (let i = 0; i < input.length; i++) {
282
+ const chr = input.charCodeAt(i);
283
+ hash = ((hash << 5) - hash) + chr;
284
+ hash |= 0;
285
+ }
286
+ return Math.abs(hash);
287
+ }
288
+ }
289
+ exports.ABTestingManager = ABTestingManager;
290
+ //# sourceMappingURL=ab-testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ab-testing.js","sourceRoot":"","sources":["../src/ab-testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * CapacityPlanner — Resource forecasting based on historical usage patterns.
3
+ *
4
+ * Track resource utilization samples, compute trends, forecast future capacity needs,
5
+ * and generate capacity alerts when thresholds are projected to be reached.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const planner = new CapacityPlanner();
10
+ *
11
+ * planner.addResource({ name: 'api_calls', capacity: 10000, unit: 'calls/day' });
12
+ *
13
+ * planner.recordSample('api_calls', 5000);
14
+ * planner.recordSample('api_calls', 5500);
15
+ * planner.recordSample('api_calls', 6200);
16
+ *
17
+ * const forecast = planner.forecast('api_calls', 30); // 30 periods ahead
18
+ * const alerts = planner.getAlerts();
19
+ * ```
20
+ */
21
+ export interface Resource {
22
+ id: string;
23
+ name: string;
24
+ capacity: number;
25
+ unit: string;
26
+ warningThreshold: number;
27
+ criticalThreshold: number;
28
+ createdAt: number;
29
+ }
30
+ export interface ResourceCreateParams {
31
+ name: string;
32
+ capacity: number;
33
+ unit?: string;
34
+ warningThreshold?: number;
35
+ criticalThreshold?: number;
36
+ }
37
+ export interface CapacitySample {
38
+ resourceName: string;
39
+ value: number;
40
+ timestamp: number;
41
+ }
42
+ export interface ForecastPoint {
43
+ period: number;
44
+ predictedValue: number;
45
+ utilizationPercent: number;
46
+ confidence: number;
47
+ }
48
+ export interface ForecastResult {
49
+ resourceName: string;
50
+ currentValue: number;
51
+ currentUtilization: number;
52
+ trend: 'growing' | 'declining' | 'stable';
53
+ growthRate: number;
54
+ forecast: ForecastPoint[];
55
+ periodsUntilWarning: number | null;
56
+ periodsUntilCritical: number | null;
57
+ periodsUntilCapacity: number | null;
58
+ }
59
+ export type AlertSeverity = 'warning' | 'critical' | 'capacity_reached';
60
+ export interface CapacityAlert {
61
+ id: string;
62
+ resourceName: string;
63
+ severity: AlertSeverity;
64
+ currentValue: number;
65
+ capacity: number;
66
+ utilization: number;
67
+ message: string;
68
+ timestamp: number;
69
+ }
70
+ export interface CapacityPlannerConfig {
71
+ /** Min samples for forecasting. Default 3. */
72
+ minSamples?: number;
73
+ /** Max samples per resource. Default 10000. */
74
+ maxSamples?: number;
75
+ /** Max resources. Default 100. */
76
+ maxResources?: number;
77
+ }
78
+ export interface CapacityPlannerStats {
79
+ totalResources: number;
80
+ totalSamples: number;
81
+ totalAlerts: number;
82
+ resourcesAtWarning: number;
83
+ resourcesAtCritical: number;
84
+ }
85
+ export declare class CapacityPlanner {
86
+ private resources;
87
+ private samples;
88
+ private alerts;
89
+ private nextResourceId;
90
+ private nextAlertId;
91
+ private minSamples;
92
+ private maxSamples;
93
+ private maxResources;
94
+ constructor(config?: CapacityPlannerConfig);
95
+ /** Add a resource to track. */
96
+ addResource(params: ResourceCreateParams): Resource;
97
+ /** Get resource by name. */
98
+ getResourceByName(name: string): Resource | null;
99
+ /** Get resource by ID. */
100
+ getResource(id: string): Resource | null;
101
+ /** List all resources. */
102
+ listResources(): Resource[];
103
+ /** Remove a resource. */
104
+ removeResource(name: string): boolean;
105
+ /** Update resource capacity. */
106
+ setCapacity(name: string, capacity: number): void;
107
+ /** Record a utilization sample. */
108
+ recordSample(resourceName: string, value: number): CapacitySample;
109
+ /** Get samples for a resource. */
110
+ getSamples(resourceName: string): CapacitySample[];
111
+ /** Forecast future capacity needs. */
112
+ forecast(resourceName: string, periods?: number): ForecastResult;
113
+ /** Get all active alerts. */
114
+ getAlerts(): CapacityAlert[];
115
+ /** Get alerts for a specific resource. */
116
+ getResourceAlerts(resourceName: string): CapacityAlert[];
117
+ /** Clear alerts. */
118
+ clearAlerts(): void;
119
+ getStats(): CapacityPlannerStats;
120
+ /** Clear all data. */
121
+ destroy(): void;
122
+ private linearRegression;
123
+ private periodsUntil;
124
+ private checkAlerts;
125
+ }
126
+ //# sourceMappingURL=capacity-planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacity-planner.d.ts","sourceRoot":"","sources":["../src/capacity-planner.ts"],"names":[],"mappings":"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"}