paygate-mcp 10.12.0 → 10.14.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.
- package/dist/audit-trail.d.ts +115 -0
- package/dist/audit-trail.d.ts.map +1 -0
- package/dist/audit-trail.js +198 -0
- package/dist/audit-trail.js.map +1 -0
- package/dist/dynamic-pricing.d.ts +144 -0
- package/dist/dynamic-pricing.d.ts.map +1 -0
- package/dist/dynamic-pricing.js +250 -0
- package/dist/dynamic-pricing.js.map +1 -0
- package/dist/event-ledger.d.ts +116 -0
- package/dist/event-ledger.d.ts.map +1 -0
- package/dist/event-ledger.js +203 -0
- package/dist/event-ledger.js.map +1 -0
- package/dist/feature-flags.d.ts +111 -0
- package/dist/feature-flags.d.ts.map +1 -0
- package/dist/feature-flags.js +228 -0
- package/dist/feature-flags.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/key-scoping.d.ts +124 -0
- package/dist/key-scoping.d.ts.map +1 -0
- package/dist/key-scoping.js +287 -0
- package/dist/key-scoping.js.map +1 -0
- package/dist/quota-rollover.d.ts +128 -0
- package/dist/quota-rollover.d.ts.map +1 -0
- package/dist/quota-rollover.js +231 -0
- package/dist/quota-rollover.js.map +1 -0
- package/dist/request-pipeline.d.ts +143 -0
- package/dist/request-pipeline.d.ts.map +1 -0
- package/dist/request-pipeline.js +197 -0
- package/dist/request-pipeline.js.map +1 -0
- package/dist/usage-trends.d.ts +114 -0
- package/dist/usage-trends.d.ts.map +1 -0
- package/dist/usage-trends.js +261 -0
- package/dist/usage-trends.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuditTrailManager — Compliance-ready audit trail with tamper detection.
|
|
3
|
+
*
|
|
4
|
+
* Records every significant action with actor, target, and metadata.
|
|
5
|
+
* Uses hash chains for tamper detection — each entry's hash includes
|
|
6
|
+
* the previous entry's hash, creating a verifiable chain of custody.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const audit = new AuditTrailManager();
|
|
11
|
+
*
|
|
12
|
+
* audit.record({
|
|
13
|
+
* action: 'key.created',
|
|
14
|
+
* actor: 'admin_1',
|
|
15
|
+
* target: 'key_abc',
|
|
16
|
+
* details: { credits: 1000 },
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const entries = audit.query({ actor: 'admin_1' });
|
|
20
|
+
* const valid = audit.verifyChain(); // true if no tampering
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export interface AuditEntry {
|
|
24
|
+
id: string;
|
|
25
|
+
sequence: number;
|
|
26
|
+
action: string;
|
|
27
|
+
actor: string;
|
|
28
|
+
actorType?: string;
|
|
29
|
+
target: string;
|
|
30
|
+
targetType?: string;
|
|
31
|
+
details: Record<string, unknown>;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
/** IP address or origin. */
|
|
34
|
+
source?: string;
|
|
35
|
+
/** Hash of this entry (includes previous hash for chain). */
|
|
36
|
+
hash: string;
|
|
37
|
+
/** Hash of the previous entry. */
|
|
38
|
+
previousHash: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AuditRecordParams {
|
|
41
|
+
action: string;
|
|
42
|
+
actor: string;
|
|
43
|
+
actorType?: string;
|
|
44
|
+
target: string;
|
|
45
|
+
targetType?: string;
|
|
46
|
+
details?: Record<string, unknown>;
|
|
47
|
+
source?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AuditQuery {
|
|
50
|
+
action?: string;
|
|
51
|
+
actions?: string[];
|
|
52
|
+
actor?: string;
|
|
53
|
+
actorType?: string;
|
|
54
|
+
target?: string;
|
|
55
|
+
targetType?: string;
|
|
56
|
+
startTime?: number;
|
|
57
|
+
endTime?: number;
|
|
58
|
+
limit?: number;
|
|
59
|
+
offset?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface AuditQueryResult {
|
|
62
|
+
entries: AuditEntry[];
|
|
63
|
+
total: number;
|
|
64
|
+
hasMore: boolean;
|
|
65
|
+
}
|
|
66
|
+
export interface ChainVerification {
|
|
67
|
+
valid: boolean;
|
|
68
|
+
totalEntries: number;
|
|
69
|
+
firstBrokenAt?: number;
|
|
70
|
+
brokenEntry?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface AuditTrailConfig {
|
|
73
|
+
maxEntries?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface AuditTrailStats {
|
|
76
|
+
totalEntries: number;
|
|
77
|
+
totalActors: number;
|
|
78
|
+
totalActions: number;
|
|
79
|
+
chainValid: boolean;
|
|
80
|
+
oldestEntry: number | null;
|
|
81
|
+
newestEntry: number | null;
|
|
82
|
+
}
|
|
83
|
+
export declare class AuditTrailManager {
|
|
84
|
+
private entries;
|
|
85
|
+
private sequence;
|
|
86
|
+
private maxEntries;
|
|
87
|
+
private lastHash;
|
|
88
|
+
constructor(config?: AuditTrailConfig);
|
|
89
|
+
/** Record an audit entry. Returns the entry ID. */
|
|
90
|
+
record(params: AuditRecordParams): string;
|
|
91
|
+
/** Record multiple entries. */
|
|
92
|
+
recordBatch(params: AuditRecordParams[]): string[];
|
|
93
|
+
/** Query audit entries with filters. */
|
|
94
|
+
query(q?: AuditQuery): AuditQueryResult;
|
|
95
|
+
/** Get a single entry by ID. */
|
|
96
|
+
getEntry(id: string): AuditEntry | null;
|
|
97
|
+
/** Get all entries for a specific target. */
|
|
98
|
+
getTargetHistory(target: string): AuditEntry[];
|
|
99
|
+
/** Get all entries by a specific actor. */
|
|
100
|
+
getActorHistory(actor: string): AuditEntry[];
|
|
101
|
+
/** Verify the integrity of the audit chain. */
|
|
102
|
+
verifyChain(): ChainVerification;
|
|
103
|
+
/** Get action frequency counts. */
|
|
104
|
+
getActionCounts(): Map<string, number>;
|
|
105
|
+
/** Get unique actors. */
|
|
106
|
+
getActors(): string[];
|
|
107
|
+
/** Get unique targets. */
|
|
108
|
+
getTargets(): string[];
|
|
109
|
+
getStats(): AuditTrailStats;
|
|
110
|
+
/** Clear all data. */
|
|
111
|
+
destroy(): void;
|
|
112
|
+
/** Simple hash function for chain integrity. Production should use crypto. */
|
|
113
|
+
private simpleHash;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=audit-trail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../src/audit-trail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAO;gBAEX,MAAM,GAAE,gBAAqB;IAMzC,mDAAmD;IACnD,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAuCzC,+BAA+B;IAC/B,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE;IAMlD,wCAAwC;IACxC,KAAK,CAAC,CAAC,GAAE,UAAe,GAAG,gBAAgB;IAwB3C,gCAAgC;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIvC,6CAA6C;IAC7C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAI9C,2CAA2C;IAC3C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IAM5C,+CAA+C;IAC/C,WAAW,IAAI,iBAAiB;IAqChC,mCAAmC;IACnC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAQtC,yBAAyB;IACzB,SAAS,IAAI,MAAM,EAAE;IAIrB,0BAA0B;IAC1B,UAAU,IAAI,MAAM,EAAE;IAMtB,QAAQ,IAAI,eAAe;IAc3B,sBAAsB;IACtB,OAAO,IAAI,IAAI;IAQf,8EAA8E;IAC9E,OAAO,CAAC,UAAU;CASnB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AuditTrailManager — Compliance-ready audit trail with tamper detection.
|
|
4
|
+
*
|
|
5
|
+
* Records every significant action with actor, target, and metadata.
|
|
6
|
+
* Uses hash chains for tamper detection — each entry's hash includes
|
|
7
|
+
* the previous entry's hash, creating a verifiable chain of custody.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const audit = new AuditTrailManager();
|
|
12
|
+
*
|
|
13
|
+
* audit.record({
|
|
14
|
+
* action: 'key.created',
|
|
15
|
+
* actor: 'admin_1',
|
|
16
|
+
* target: 'key_abc',
|
|
17
|
+
* details: { credits: 1000 },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const entries = audit.query({ actor: 'admin_1' });
|
|
21
|
+
* const valid = audit.verifyChain(); // true if no tampering
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.AuditTrailManager = void 0;
|
|
26
|
+
// ── Implementation ───────────────────────────────────────────────────
|
|
27
|
+
class AuditTrailManager {
|
|
28
|
+
entries = [];
|
|
29
|
+
sequence = 0;
|
|
30
|
+
maxEntries;
|
|
31
|
+
lastHash = '0'; // Genesis hash
|
|
32
|
+
constructor(config = {}) {
|
|
33
|
+
this.maxEntries = config.maxEntries ?? 100_000;
|
|
34
|
+
}
|
|
35
|
+
// ── Recording ─────────────────────────────────────────────────────
|
|
36
|
+
/** Record an audit entry. Returns the entry ID. */
|
|
37
|
+
record(params) {
|
|
38
|
+
if (!params.action)
|
|
39
|
+
throw new Error('Action is required');
|
|
40
|
+
if (!params.actor)
|
|
41
|
+
throw new Error('Actor is required');
|
|
42
|
+
if (!params.target)
|
|
43
|
+
throw new Error('Target is required');
|
|
44
|
+
const id = `audit_${++this.sequence}`;
|
|
45
|
+
const timestamp = Date.now();
|
|
46
|
+
const previousHash = this.lastHash;
|
|
47
|
+
// Compute hash of this entry (simplified — production would use crypto)
|
|
48
|
+
const hashInput = `${id}|${params.action}|${params.actor}|${params.target}|${timestamp}|${previousHash}`;
|
|
49
|
+
const hash = this.simpleHash(hashInput);
|
|
50
|
+
const entry = {
|
|
51
|
+
id,
|
|
52
|
+
sequence: this.sequence,
|
|
53
|
+
action: params.action,
|
|
54
|
+
actor: params.actor,
|
|
55
|
+
actorType: params.actorType,
|
|
56
|
+
target: params.target,
|
|
57
|
+
targetType: params.targetType,
|
|
58
|
+
details: { ...(params.details ?? {}) },
|
|
59
|
+
timestamp,
|
|
60
|
+
source: params.source,
|
|
61
|
+
hash,
|
|
62
|
+
previousHash,
|
|
63
|
+
};
|
|
64
|
+
this.entries.push(entry);
|
|
65
|
+
this.lastHash = hash;
|
|
66
|
+
// Evict oldest if over limit
|
|
67
|
+
if (this.entries.length > this.maxEntries) {
|
|
68
|
+
this.entries.splice(0, this.entries.length - this.maxEntries);
|
|
69
|
+
}
|
|
70
|
+
return id;
|
|
71
|
+
}
|
|
72
|
+
/** Record multiple entries. */
|
|
73
|
+
recordBatch(params) {
|
|
74
|
+
return params.map(p => this.record(p));
|
|
75
|
+
}
|
|
76
|
+
// ── Query ─────────────────────────────────────────────────────────
|
|
77
|
+
/** Query audit entries with filters. */
|
|
78
|
+
query(q = {}) {
|
|
79
|
+
let filtered = this.entries;
|
|
80
|
+
if (q.action)
|
|
81
|
+
filtered = filtered.filter(e => e.action === q.action);
|
|
82
|
+
if (q.actions && q.actions.length > 0)
|
|
83
|
+
filtered = filtered.filter(e => q.actions.includes(e.action));
|
|
84
|
+
if (q.actor)
|
|
85
|
+
filtered = filtered.filter(e => e.actor === q.actor);
|
|
86
|
+
if (q.actorType)
|
|
87
|
+
filtered = filtered.filter(e => e.actorType === q.actorType);
|
|
88
|
+
if (q.target)
|
|
89
|
+
filtered = filtered.filter(e => e.target === q.target);
|
|
90
|
+
if (q.targetType)
|
|
91
|
+
filtered = filtered.filter(e => e.targetType === q.targetType);
|
|
92
|
+
if (q.startTime)
|
|
93
|
+
filtered = filtered.filter(e => e.timestamp >= q.startTime);
|
|
94
|
+
if (q.endTime)
|
|
95
|
+
filtered = filtered.filter(e => e.timestamp <= q.endTime);
|
|
96
|
+
const total = filtered.length;
|
|
97
|
+
const limit = q.limit ?? 100;
|
|
98
|
+
const offset = q.offset ?? 0;
|
|
99
|
+
filtered = filtered.slice(offset, offset + limit);
|
|
100
|
+
return {
|
|
101
|
+
entries: filtered,
|
|
102
|
+
total,
|
|
103
|
+
hasMore: offset + limit < total,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** Get a single entry by ID. */
|
|
107
|
+
getEntry(id) {
|
|
108
|
+
return this.entries.find(e => e.id === id) ?? null;
|
|
109
|
+
}
|
|
110
|
+
/** Get all entries for a specific target. */
|
|
111
|
+
getTargetHistory(target) {
|
|
112
|
+
return this.entries.filter(e => e.target === target);
|
|
113
|
+
}
|
|
114
|
+
/** Get all entries by a specific actor. */
|
|
115
|
+
getActorHistory(actor) {
|
|
116
|
+
return this.entries.filter(e => e.actor === actor);
|
|
117
|
+
}
|
|
118
|
+
// ── Chain Verification ────────────────────────────────────────────
|
|
119
|
+
/** Verify the integrity of the audit chain. */
|
|
120
|
+
verifyChain() {
|
|
121
|
+
if (this.entries.length === 0) {
|
|
122
|
+
return { valid: true, totalEntries: 0 };
|
|
123
|
+
}
|
|
124
|
+
for (let i = 0; i < this.entries.length; i++) {
|
|
125
|
+
const entry = this.entries[i];
|
|
126
|
+
// Verify hash
|
|
127
|
+
const hashInput = `${entry.id}|${entry.action}|${entry.actor}|${entry.target}|${entry.timestamp}|${entry.previousHash}`;
|
|
128
|
+
const expectedHash = this.simpleHash(hashInput);
|
|
129
|
+
if (entry.hash !== expectedHash) {
|
|
130
|
+
return {
|
|
131
|
+
valid: false,
|
|
132
|
+
totalEntries: this.entries.length,
|
|
133
|
+
firstBrokenAt: i,
|
|
134
|
+
brokenEntry: entry.id,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// Verify chain link (except first entry in current window — may have been evicted)
|
|
138
|
+
if (i > 0 && entry.previousHash !== this.entries[i - 1].hash) {
|
|
139
|
+
return {
|
|
140
|
+
valid: false,
|
|
141
|
+
totalEntries: this.entries.length,
|
|
142
|
+
firstBrokenAt: i,
|
|
143
|
+
brokenEntry: entry.id,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { valid: true, totalEntries: this.entries.length };
|
|
148
|
+
}
|
|
149
|
+
// ── Analytics ─────────────────────────────────────────────────────
|
|
150
|
+
/** Get action frequency counts. */
|
|
151
|
+
getActionCounts() {
|
|
152
|
+
const counts = new Map();
|
|
153
|
+
for (const e of this.entries) {
|
|
154
|
+
counts.set(e.action, (counts.get(e.action) ?? 0) + 1);
|
|
155
|
+
}
|
|
156
|
+
return counts;
|
|
157
|
+
}
|
|
158
|
+
/** Get unique actors. */
|
|
159
|
+
getActors() {
|
|
160
|
+
return [...new Set(this.entries.map(e => e.actor))];
|
|
161
|
+
}
|
|
162
|
+
/** Get unique targets. */
|
|
163
|
+
getTargets() {
|
|
164
|
+
return [...new Set(this.entries.map(e => e.target))];
|
|
165
|
+
}
|
|
166
|
+
// ── Stats ─────────────────────────────────────────────────────────
|
|
167
|
+
getStats() {
|
|
168
|
+
const actors = new Set(this.entries.map(e => e.actor));
|
|
169
|
+
const actions = new Set(this.entries.map(e => e.action));
|
|
170
|
+
return {
|
|
171
|
+
totalEntries: this.entries.length,
|
|
172
|
+
totalActors: actors.size,
|
|
173
|
+
totalActions: actions.size,
|
|
174
|
+
chainValid: this.verifyChain().valid,
|
|
175
|
+
oldestEntry: this.entries.length > 0 ? this.entries[0].timestamp : null,
|
|
176
|
+
newestEntry: this.entries.length > 0 ? this.entries[this.entries.length - 1].timestamp : null,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** Clear all data. */
|
|
180
|
+
destroy() {
|
|
181
|
+
this.entries = [];
|
|
182
|
+
this.sequence = 0;
|
|
183
|
+
this.lastHash = '0';
|
|
184
|
+
}
|
|
185
|
+
// ── Private ───────────────────────────────────────────────────────
|
|
186
|
+
/** Simple hash function for chain integrity. Production should use crypto. */
|
|
187
|
+
simpleHash(input) {
|
|
188
|
+
let hash = 0;
|
|
189
|
+
for (let i = 0; i < input.length; i++) {
|
|
190
|
+
const char = input.charCodeAt(i);
|
|
191
|
+
hash = ((hash << 5) - hash) + char;
|
|
192
|
+
hash = hash & hash;
|
|
193
|
+
}
|
|
194
|
+
return `h_${Math.abs(hash).toString(36)}`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.AuditTrailManager = AuditTrailManager;
|
|
198
|
+
//# sourceMappingURL=audit-trail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../src/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DynamicPricingEngine — Adjust tool pricing based on demand, time, and usage.
|
|
3
|
+
*
|
|
4
|
+
* Supports time-of-day multipliers, demand-based surge pricing,
|
|
5
|
+
* volume discounts, and per-key custom pricing. All pricing rules
|
|
6
|
+
* are composable and evaluated in priority order.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const engine = new DynamicPricingEngine();
|
|
11
|
+
*
|
|
12
|
+
* engine.setBasePrice('search', 10);
|
|
13
|
+
*
|
|
14
|
+
* engine.addRule({
|
|
15
|
+
* tool: 'search',
|
|
16
|
+
* type: 'time_of_day',
|
|
17
|
+
* config: { peakHours: [9,10,11,12,13,14,15,16,17], multiplier: 1.5 },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const price = engine.getPrice('search');
|
|
21
|
+
* // 15 during peak hours, 10 otherwise
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export type PricingRuleType = 'time_of_day' | 'demand' | 'volume_discount' | 'key_override' | 'custom';
|
|
25
|
+
export interface TimeOfDayConfig {
|
|
26
|
+
/** Hours (0-23) considered peak. */
|
|
27
|
+
peakHours: number[];
|
|
28
|
+
/** Multiplier during peak hours. */
|
|
29
|
+
multiplier: number;
|
|
30
|
+
}
|
|
31
|
+
export interface DemandConfig {
|
|
32
|
+
/** Calls in the window that trigger surge. */
|
|
33
|
+
threshold: number;
|
|
34
|
+
/** Time window in seconds. */
|
|
35
|
+
windowSeconds: number;
|
|
36
|
+
/** Max multiplier at full surge. */
|
|
37
|
+
maxMultiplier: number;
|
|
38
|
+
}
|
|
39
|
+
export interface VolumeDiscountConfig {
|
|
40
|
+
/** Tiers: [{ minCalls, discount }] — discount is 0-1 (e.g., 0.2 = 20% off). */
|
|
41
|
+
tiers: {
|
|
42
|
+
minCalls: number;
|
|
43
|
+
discount: number;
|
|
44
|
+
}[];
|
|
45
|
+
}
|
|
46
|
+
export interface KeyOverrideConfig {
|
|
47
|
+
/** Key → fixed price. */
|
|
48
|
+
keyPrices: Map<string, number>;
|
|
49
|
+
}
|
|
50
|
+
export interface CustomRuleConfig {
|
|
51
|
+
/** Custom function: (basePrice, context) => adjustedPrice. */
|
|
52
|
+
fn: (basePrice: number, context: PricingContext) => number;
|
|
53
|
+
}
|
|
54
|
+
export type PricingRuleConfig = TimeOfDayConfig | DemandConfig | VolumeDiscountConfig | KeyOverrideConfig | CustomRuleConfig;
|
|
55
|
+
export interface PricingRule {
|
|
56
|
+
id: string;
|
|
57
|
+
tool: string;
|
|
58
|
+
type: PricingRuleType;
|
|
59
|
+
config: PricingRuleConfig;
|
|
60
|
+
/** Higher priority rules evaluated first. Default 0. */
|
|
61
|
+
priority: number;
|
|
62
|
+
enabled: boolean;
|
|
63
|
+
createdAt: number;
|
|
64
|
+
}
|
|
65
|
+
export interface PricingRuleRegistration {
|
|
66
|
+
tool: string;
|
|
67
|
+
type: PricingRuleType;
|
|
68
|
+
config: PricingRuleConfig;
|
|
69
|
+
priority?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface PricingContext {
|
|
72
|
+
tool: string;
|
|
73
|
+
key?: string;
|
|
74
|
+
timestamp: number;
|
|
75
|
+
recentCalls: number;
|
|
76
|
+
totalCalls: number;
|
|
77
|
+
}
|
|
78
|
+
export interface PriceResult {
|
|
79
|
+
tool: string;
|
|
80
|
+
basePrice: number;
|
|
81
|
+
finalPrice: number;
|
|
82
|
+
appliedRules: string[];
|
|
83
|
+
multiplier: number;
|
|
84
|
+
}
|
|
85
|
+
export interface DynamicPricingConfig {
|
|
86
|
+
/** Default base price for tools without explicit pricing. */
|
|
87
|
+
defaultBasePrice?: number;
|
|
88
|
+
/** Window for demand tracking in seconds. Default 300 (5 min). */
|
|
89
|
+
demandWindowSeconds?: number;
|
|
90
|
+
}
|
|
91
|
+
export interface DynamicPricingStats {
|
|
92
|
+
totalTools: number;
|
|
93
|
+
totalRules: number;
|
|
94
|
+
enabledRules: number;
|
|
95
|
+
totalPriceCalculations: number;
|
|
96
|
+
totalCallsTracked: number;
|
|
97
|
+
}
|
|
98
|
+
export declare class DynamicPricingEngine {
|
|
99
|
+
private basePrices;
|
|
100
|
+
private rules;
|
|
101
|
+
private ruleCounter;
|
|
102
|
+
private defaultBasePrice;
|
|
103
|
+
private demandWindowSeconds;
|
|
104
|
+
private callTimestamps;
|
|
105
|
+
private volumeTracker;
|
|
106
|
+
private totalCalculations;
|
|
107
|
+
private totalCallsTracked;
|
|
108
|
+
constructor(config?: DynamicPricingConfig);
|
|
109
|
+
/** Set the base credit price for a tool. */
|
|
110
|
+
setBasePrice(tool: string, price: number): void;
|
|
111
|
+
/** Get the base price for a tool. */
|
|
112
|
+
getBasePrice(tool: string): number;
|
|
113
|
+
/** Remove base price (falls back to default). */
|
|
114
|
+
removeBasePrice(tool: string): boolean;
|
|
115
|
+
/** Add a pricing rule. Returns the rule ID. */
|
|
116
|
+
addRule(reg: PricingRuleRegistration): string;
|
|
117
|
+
/** Remove a pricing rule. */
|
|
118
|
+
removeRule(id: string): boolean;
|
|
119
|
+
/** Enable or disable a rule. */
|
|
120
|
+
setRuleEnabled(id: string, enabled: boolean): boolean;
|
|
121
|
+
/** Get a specific rule. */
|
|
122
|
+
getRule(id: string): PricingRule | null;
|
|
123
|
+
/** List all rules for a tool. */
|
|
124
|
+
getToolRules(tool: string): PricingRule[];
|
|
125
|
+
/** Record a tool call for demand tracking. */
|
|
126
|
+
recordCall(tool: string, key?: string): void;
|
|
127
|
+
/** Get recent call count for a tool. */
|
|
128
|
+
getRecentCallCount(tool: string): number;
|
|
129
|
+
/** Get total calls for a key+tool combo. */
|
|
130
|
+
getKeyToolVolume(key: string, tool: string): number;
|
|
131
|
+
/** Calculate the current price for a tool call. */
|
|
132
|
+
getPrice(tool: string, key?: string): PriceResult;
|
|
133
|
+
getStats(): DynamicPricingStats;
|
|
134
|
+
/** Clear all data. */
|
|
135
|
+
destroy(): void;
|
|
136
|
+
private applyRule;
|
|
137
|
+
private applyTimeOfDay;
|
|
138
|
+
private applyDemand;
|
|
139
|
+
private applyVolumeDiscount;
|
|
140
|
+
private applyKeyOverride;
|
|
141
|
+
private applyCustom;
|
|
142
|
+
private pruneTimestamps;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=dynamic-pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-pricing.d.ts","sourceRoot":"","sources":["../src/dynamic-pricing.ts"],"names":[],"mappings":"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"}
|