@trentapps/manager-protocol 1.3.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/LICENSE +21 -0
- package/README.md +639 -0
- package/dist/analyzers/ArchitectureDetector.d.ts +44 -0
- package/dist/analyzers/ArchitectureDetector.d.ts.map +1 -0
- package/dist/analyzers/ArchitectureDetector.js +218 -0
- package/dist/analyzers/ArchitectureDetector.js.map +1 -0
- package/dist/analyzers/CSSAnalyzer.d.ts +284 -0
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/CSSAnalyzer.js +1180 -0
- package/dist/analyzers/CSSAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +5 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +5 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/design-system/index.d.ts +6 -0
- package/dist/design-system/index.d.ts.map +1 -0
- package/dist/design-system/index.js +6 -0
- package/dist/design-system/index.js.map +1 -0
- package/dist/design-system/tokens.d.ts +106 -0
- package/dist/design-system/tokens.d.ts.map +1 -0
- package/dist/design-system/tokens.js +554 -0
- package/dist/design-system/tokens.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +506 -0
- package/dist/engine/AuditLogger.d.ts.map +1 -0
- package/dist/engine/AuditLogger.js +1491 -0
- package/dist/engine/AuditLogger.js.map +1 -0
- package/dist/engine/GitHubApprovalManager.d.ts +123 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
- package/dist/engine/GitHubApprovalManager.js +347 -0
- package/dist/engine/GitHubApprovalManager.js.map +1 -0
- package/dist/engine/GitHubClient.d.ts +183 -0
- package/dist/engine/GitHubClient.d.ts.map +1 -0
- package/dist/engine/GitHubClient.js +411 -0
- package/dist/engine/GitHubClient.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +81 -0
- package/dist/engine/RateLimiter.d.ts.map +1 -0
- package/dist/engine/RateLimiter.js +215 -0
- package/dist/engine/RateLimiter.js.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.js +475 -0
- package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +176 -0
- package/dist/engine/RulesEngine.d.ts.map +1 -0
- package/dist/engine/RulesEngine.js +705 -0
- package/dist/engine/RulesEngine.js.map +1 -0
- package/dist/engine/TaskManager.d.ts +174 -0
- package/dist/engine/TaskManager.d.ts.map +1 -0
- package/dist/engine/TaskManager.js +663 -0
- package/dist/engine/TaskManager.js.map +1 -0
- package/dist/engine/index.d.ts +11 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +13 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/architecture.d.ts +9 -0
- package/dist/rules/architecture.d.ts.map +1 -0
- package/dist/rules/architecture.js +322 -0
- package/dist/rules/architecture.js.map +1 -0
- package/dist/rules/azure.d.ts +7 -0
- package/dist/rules/azure.d.ts.map +1 -0
- package/dist/rules/azure.js +136 -0
- package/dist/rules/azure.js.map +1 -0
- package/dist/rules/compliance.d.ts +9 -0
- package/dist/rules/compliance.d.ts.map +1 -0
- package/dist/rules/compliance.js +286 -0
- package/dist/rules/compliance.js.map +1 -0
- package/dist/rules/condition-optimizer.d.ts +151 -0
- package/dist/rules/condition-optimizer.d.ts.map +1 -0
- package/dist/rules/condition-optimizer.js +479 -0
- package/dist/rules/condition-optimizer.js.map +1 -0
- package/dist/rules/css.d.ts +10 -0
- package/dist/rules/css.d.ts.map +1 -0
- package/dist/rules/css.js +1777 -0
- package/dist/rules/css.js.map +1 -0
- package/dist/rules/field-standards.d.ts +1172 -0
- package/dist/rules/field-standards.d.ts.map +1 -0
- package/dist/rules/field-standards.js +908 -0
- package/dist/rules/field-standards.js.map +1 -0
- package/dist/rules/flask.d.ts +7 -0
- package/dist/rules/flask.d.ts.map +1 -0
- package/dist/rules/flask.js +142 -0
- package/dist/rules/flask.js.map +1 -0
- package/dist/rules/index.d.ts +827 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +556 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/ml-ai.d.ts +7 -0
- package/dist/rules/ml-ai.d.ts.map +1 -0
- package/dist/rules/ml-ai.js +148 -0
- package/dist/rules/ml-ai.js.map +1 -0
- package/dist/rules/operational.d.ts +9 -0
- package/dist/rules/operational.d.ts.map +1 -0
- package/dist/rules/operational.js +318 -0
- package/dist/rules/operational.js.map +1 -0
- package/dist/rules/patterns.d.ts +568 -0
- package/dist/rules/patterns.d.ts.map +1 -0
- package/dist/rules/patterns.js +1359 -0
- package/dist/rules/patterns.js.map +1 -0
- package/dist/rules/security.d.ts +9 -0
- package/dist/rules/security.d.ts.map +1 -0
- package/dist/rules/security.js +848 -0
- package/dist/rules/security.js.map +1 -0
- package/dist/rules/shared-patterns.d.ts +268 -0
- package/dist/rules/shared-patterns.d.ts.map +1 -0
- package/dist/rules/shared-patterns.js +556 -0
- package/dist/rules/shared-patterns.js.map +1 -0
- package/dist/rules/storage.d.ts +13 -0
- package/dist/rules/storage.d.ts.map +1 -0
- package/dist/rules/storage.js +672 -0
- package/dist/rules/storage.js.map +1 -0
- package/dist/rules/stripe.d.ts +7 -0
- package/dist/rules/stripe.d.ts.map +1 -0
- package/dist/rules/stripe.js +133 -0
- package/dist/rules/stripe.js.map +1 -0
- package/dist/rules/testing.d.ts +7 -0
- package/dist/rules/testing.d.ts.map +1 -0
- package/dist/rules/testing.js +135 -0
- package/dist/rules/testing.js.map +1 -0
- package/dist/rules/ux.d.ts +9 -0
- package/dist/rules/ux.d.ts.map +1 -0
- package/dist/rules/ux.js +280 -0
- package/dist/rules/ux.js.map +1 -0
- package/dist/rules/websocket.d.ts +7 -0
- package/dist/rules/websocket.d.ts.map +1 -0
- package/dist/rules/websocket.js +128 -0
- package/dist/rules/websocket.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1967 -0
- package/dist/server.js.map +1 -0
- package/dist/supervisor/AgentSupervisor.d.ts +195 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
- package/dist/supervisor/AgentSupervisor.js +569 -0
- package/dist/supervisor/AgentSupervisor.js.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts +185 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.js +729 -0
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
- package/dist/supervisor/ProjectTracker.d.ts +210 -0
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
- package/dist/supervisor/ProjectTracker.js +709 -0
- package/dist/supervisor/ProjectTracker.js.map +1 -0
- package/dist/supervisor/index.d.ts +6 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +6 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/rule-tester.d.ts +217 -0
- package/dist/testing/rule-tester.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.d.ts +57 -0
- package/dist/testing/rule-tester.examples.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.js +375 -0
- package/dist/testing/rule-tester.examples.js.map +1 -0
- package/dist/testing/rule-tester.js +381 -0
- package/dist/testing/rule-tester.js.map +1 -0
- package/dist/testing/rule-validator.d.ts +141 -0
- package/dist/testing/rule-validator.d.ts.map +1 -0
- package/dist/testing/rule-validator.js +640 -0
- package/dist/testing/rule-validator.js.map +1 -0
- package/dist/types/index.d.ts +1282 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +386 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +86 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +171 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/rate-limiting.d.ts +268 -0
- package/dist/utils/rate-limiting.d.ts.map +1 -0
- package/dist/utils/rate-limiting.js +403 -0
- package/dist/utils/rate-limiting.js.map +1 -0
- package/dist/utils/shared.d.ts +306 -0
- package/dist/utils/shared.d.ts.map +1 -0
- package/dist/utils/shared.js +464 -0
- package/dist/utils/shared.js.map +1 -0
- package/dist/utils/shell.d.ts +22 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Error Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides custom error types and error handling utilities.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base error class for Agent Supervisor errors
|
|
8
|
+
*/
|
|
9
|
+
export class AgentSupervisorError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
details;
|
|
12
|
+
constructor(message, code, details) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'AgentSupervisorError';
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.details = details;
|
|
17
|
+
// Maintains proper stack trace for where our error was thrown
|
|
18
|
+
if (Error.captureStackTrace) {
|
|
19
|
+
Error.captureStackTrace(this, AgentSupervisorError);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error thrown when a rule validation fails
|
|
25
|
+
*/
|
|
26
|
+
export class RuleValidationError extends AgentSupervisorError {
|
|
27
|
+
constructor(message, details) {
|
|
28
|
+
super(message, 'RULE_VALIDATION_ERROR', details);
|
|
29
|
+
this.name = 'RuleValidationError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Error thrown when a rule is not found
|
|
34
|
+
*/
|
|
35
|
+
export class RuleNotFoundError extends AgentSupervisorError {
|
|
36
|
+
constructor(ruleId) {
|
|
37
|
+
super(`Rule not found: ${ruleId}`, 'RULE_NOT_FOUND', { ruleId });
|
|
38
|
+
this.name = 'RuleNotFoundError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Error thrown when rate limit is exceeded
|
|
43
|
+
*/
|
|
44
|
+
export class RateLimitExceededError extends AgentSupervisorError {
|
|
45
|
+
resetAt;
|
|
46
|
+
remaining;
|
|
47
|
+
constructor(limitId, resetAt, remaining = 0) {
|
|
48
|
+
super(`Rate limit exceeded: ${limitId}`, 'RATE_LIMIT_EXCEEDED', {
|
|
49
|
+
limitId,
|
|
50
|
+
resetAt: resetAt.toISOString(),
|
|
51
|
+
remaining
|
|
52
|
+
});
|
|
53
|
+
this.name = 'RateLimitExceededError';
|
|
54
|
+
this.resetAt = resetAt;
|
|
55
|
+
this.remaining = remaining;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Error thrown when an approval request is not found
|
|
60
|
+
*/
|
|
61
|
+
export class ApprovalNotFoundError extends AgentSupervisorError {
|
|
62
|
+
constructor(requestId) {
|
|
63
|
+
super(`Approval request not found: ${requestId}`, 'APPROVAL_NOT_FOUND', { requestId });
|
|
64
|
+
this.name = 'ApprovalNotFoundError';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Error thrown when an approval request has expired
|
|
69
|
+
*/
|
|
70
|
+
export class ApprovalExpiredError extends AgentSupervisorError {
|
|
71
|
+
constructor(requestId, expiredAt) {
|
|
72
|
+
super(`Approval request expired: ${requestId}`, 'APPROVAL_EXPIRED', { requestId, expiredAt });
|
|
73
|
+
this.name = 'ApprovalExpiredError';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Error thrown for configuration errors
|
|
78
|
+
*/
|
|
79
|
+
export class ConfigurationError extends AgentSupervisorError {
|
|
80
|
+
constructor(message, details) {
|
|
81
|
+
super(message, 'CONFIGURATION_ERROR', details);
|
|
82
|
+
this.name = 'ConfigurationError';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Error thrown when webhook delivery fails
|
|
87
|
+
*/
|
|
88
|
+
export class WebhookDeliveryError extends AgentSupervisorError {
|
|
89
|
+
url;
|
|
90
|
+
statusCode;
|
|
91
|
+
retryCount;
|
|
92
|
+
constructor(url, cause, statusCode, retryCount = 0) {
|
|
93
|
+
const message = typeof cause === 'string' ? cause : cause.message;
|
|
94
|
+
super(`Webhook delivery failed: ${message}`, 'WEBHOOK_DELIVERY_ERROR', {
|
|
95
|
+
url,
|
|
96
|
+
statusCode,
|
|
97
|
+
retryCount
|
|
98
|
+
});
|
|
99
|
+
this.name = 'WebhookDeliveryError';
|
|
100
|
+
this.url = url;
|
|
101
|
+
this.statusCode = statusCode;
|
|
102
|
+
this.retryCount = retryCount;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
106
|
+
maxRetries: 3,
|
|
107
|
+
initialDelayMs: 1000,
|
|
108
|
+
maxDelayMs: 30000,
|
|
109
|
+
backoffMultiplier: 2
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Execute a function with retry logic and exponential backoff
|
|
113
|
+
*/
|
|
114
|
+
export async function withRetry(fn, options = {}) {
|
|
115
|
+
const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
|
|
116
|
+
let lastError;
|
|
117
|
+
let delay = opts.initialDelayMs;
|
|
118
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
119
|
+
try {
|
|
120
|
+
return await fn();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
124
|
+
if (attempt < opts.maxRetries) {
|
|
125
|
+
await sleep(delay);
|
|
126
|
+
delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelayMs);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
throw lastError;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Sleep for a specified number of milliseconds
|
|
134
|
+
*/
|
|
135
|
+
function sleep(ms) {
|
|
136
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Type guard for checking if an error is an AgentSupervisorError
|
|
140
|
+
*/
|
|
141
|
+
export function isAgentSupervisorError(error) {
|
|
142
|
+
return error instanceof AgentSupervisorError;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Format an error for logging
|
|
146
|
+
*/
|
|
147
|
+
export function formatError(error) {
|
|
148
|
+
if (error instanceof AgentSupervisorError) {
|
|
149
|
+
return `[${error.code}] ${error.message}${error.details ? ` - ${JSON.stringify(error.details)}` : ''}`;
|
|
150
|
+
}
|
|
151
|
+
if (error instanceof Error) {
|
|
152
|
+
return error.message;
|
|
153
|
+
}
|
|
154
|
+
return String(error);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Safe JSON stringify that handles circular references
|
|
158
|
+
*/
|
|
159
|
+
export function safeStringify(obj) {
|
|
160
|
+
const seen = new WeakSet();
|
|
161
|
+
return JSON.stringify(obj, (_key, value) => {
|
|
162
|
+
if (typeof value === 'object' && value !== null) {
|
|
163
|
+
if (seen.has(value)) {
|
|
164
|
+
return '[Circular]';
|
|
165
|
+
}
|
|
166
|
+
seen.add(value);
|
|
167
|
+
}
|
|
168
|
+
return value;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rate Limiting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Reusable utilities for rate limiting:
|
|
5
|
+
* - Bucket key building for different scopes
|
|
6
|
+
* - Sliding window time-based tracking
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Scope types for rate limit bucket keys
|
|
10
|
+
*/
|
|
11
|
+
export type BucketScope = 'global' | 'agent' | 'session' | 'user' | 'action_type';
|
|
12
|
+
/**
|
|
13
|
+
* Identifiers used to build bucket keys
|
|
14
|
+
*/
|
|
15
|
+
export interface BucketIdentifiers {
|
|
16
|
+
agentId?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
userId?: string;
|
|
19
|
+
actionType?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Window algorithm types
|
|
23
|
+
*/
|
|
24
|
+
export type WindowAlgorithm = 'fixed' | 'sliding';
|
|
25
|
+
/**
|
|
26
|
+
* Statistics for a time window
|
|
27
|
+
*/
|
|
28
|
+
export interface WindowStats {
|
|
29
|
+
/** Number of requests in the current window */
|
|
30
|
+
count: number;
|
|
31
|
+
/** Number of requests remaining before limit */
|
|
32
|
+
remaining: number;
|
|
33
|
+
/** Timestamp when the window started (ms since epoch) */
|
|
34
|
+
windowStart: number;
|
|
35
|
+
/** Timestamp when the window resets (ms since epoch) */
|
|
36
|
+
resetAt: number;
|
|
37
|
+
/** ISO string of reset time */
|
|
38
|
+
resetAtISO: string;
|
|
39
|
+
/** Whether the limit has been exceeded */
|
|
40
|
+
exceeded: boolean;
|
|
41
|
+
/** Percentage of limit used (0-100) */
|
|
42
|
+
usagePercent: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Configuration for SlidingWindow
|
|
46
|
+
*/
|
|
47
|
+
export interface SlidingWindowConfig {
|
|
48
|
+
/** Window duration in milliseconds */
|
|
49
|
+
windowMs: number;
|
|
50
|
+
/** Maximum requests allowed in the window */
|
|
51
|
+
maxRequests: number;
|
|
52
|
+
/** Optional burst limit for short-term spikes */
|
|
53
|
+
burstLimit?: number;
|
|
54
|
+
/** Window algorithm: 'fixed' resets at boundaries, 'sliding' moves with time */
|
|
55
|
+
algorithm?: WindowAlgorithm;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build a bucket key based on scope and identifiers.
|
|
59
|
+
*
|
|
60
|
+
* Key format: `{prefix}:{scope}:{identifier}`
|
|
61
|
+
*
|
|
62
|
+
* This creates consistent, collision-free keys for rate limit buckets.
|
|
63
|
+
*
|
|
64
|
+
* @param scope - The scope for the bucket (global, agent, session, user, action_type)
|
|
65
|
+
* @param identifiers - Object containing identifier values
|
|
66
|
+
* @param prefix - Optional prefix for namespacing (e.g., config ID)
|
|
67
|
+
* @returns A unique bucket key string
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* // Global scope
|
|
72
|
+
* buildBucketKey('global', {}) // "global"
|
|
73
|
+
* buildBucketKey('global', {}, 'rate-1') // "rate-1:global"
|
|
74
|
+
*
|
|
75
|
+
* // Agent scope
|
|
76
|
+
* buildBucketKey('agent', { agentId: 'agent-123' }) // "agent:agent-123"
|
|
77
|
+
*
|
|
78
|
+
* // Session scope with prefix
|
|
79
|
+
* buildBucketKey('session', { sessionId: 'sess-456' }, 'api-limit')
|
|
80
|
+
* // "api-limit:session:sess-456"
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function buildBucketKey(scope: BucketScope, identifiers: BucketIdentifiers, prefix?: string): string;
|
|
84
|
+
/**
|
|
85
|
+
* Parse a bucket key to extract scope and identifier.
|
|
86
|
+
*
|
|
87
|
+
* @param key - The bucket key to parse
|
|
88
|
+
* @returns Object with scope and identifier, or null if invalid
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* parseBucketKey('rate-1:agent:agent-123')
|
|
93
|
+
* // { prefix: 'rate-1', scope: 'agent', identifier: 'agent-123' }
|
|
94
|
+
*
|
|
95
|
+
* parseBucketKey('global')
|
|
96
|
+
* // { prefix: undefined, scope: 'global', identifier: undefined }
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare function parseBucketKey(key: string): {
|
|
100
|
+
prefix?: string;
|
|
101
|
+
scope: BucketScope | 'unknown';
|
|
102
|
+
identifier?: string;
|
|
103
|
+
} | null;
|
|
104
|
+
/**
|
|
105
|
+
* SlidingWindow class for time-based window tracking.
|
|
106
|
+
*
|
|
107
|
+
* Supports both fixed and sliding window algorithms:
|
|
108
|
+
* - Fixed: Window resets at fixed boundaries (simpler, less memory)
|
|
109
|
+
* - Sliding: Window slides with time (more accurate, tracks individual requests)
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* // Create a window: 100 requests per minute
|
|
114
|
+
* const window = new SlidingWindow({
|
|
115
|
+
* windowMs: 60000,
|
|
116
|
+
* maxRequests: 100,
|
|
117
|
+
* algorithm: 'fixed'
|
|
118
|
+
* });
|
|
119
|
+
*
|
|
120
|
+
* // Check and record a request
|
|
121
|
+
* if (window.canAccept()) {
|
|
122
|
+
* window.record();
|
|
123
|
+
* // Process request
|
|
124
|
+
* } else {
|
|
125
|
+
* // Rate limited
|
|
126
|
+
* const stats = window.getStats();
|
|
127
|
+
* console.log(`Retry after ${stats.resetAt}`);
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export declare class SlidingWindow {
|
|
132
|
+
private config;
|
|
133
|
+
private count;
|
|
134
|
+
private burstCount;
|
|
135
|
+
private windowStart;
|
|
136
|
+
private requestTimestamps;
|
|
137
|
+
constructor(config: SlidingWindowConfig);
|
|
138
|
+
/**
|
|
139
|
+
* Check if the window has expired and needs reset.
|
|
140
|
+
*
|
|
141
|
+
* For fixed windows: Checks if current time is past window boundary.
|
|
142
|
+
* For sliding windows: Always returns false (sliding handles this differently).
|
|
143
|
+
*
|
|
144
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
145
|
+
* @returns Whether the window has expired
|
|
146
|
+
*/
|
|
147
|
+
isExpired(now?: number): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Reset the window to initial state.
|
|
150
|
+
*
|
|
151
|
+
* @param now - Timestamp to use as new window start (defaults to Date.now())
|
|
152
|
+
*/
|
|
153
|
+
reset(now?: number): void;
|
|
154
|
+
/**
|
|
155
|
+
* Check if the window can accept another request.
|
|
156
|
+
* Automatically resets expired windows (for fixed algorithm).
|
|
157
|
+
*
|
|
158
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
159
|
+
* @returns Whether a request can be accepted
|
|
160
|
+
*/
|
|
161
|
+
canAccept(now?: number): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Check if the window can accept based on burst limit only.
|
|
164
|
+
*
|
|
165
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
166
|
+
* @returns Whether burst limit allows acceptance
|
|
167
|
+
*/
|
|
168
|
+
canAcceptBurst(now?: number): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* Record a request in the window.
|
|
171
|
+
*
|
|
172
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
173
|
+
*/
|
|
174
|
+
record(now?: number): void;
|
|
175
|
+
/**
|
|
176
|
+
* Get current window statistics.
|
|
177
|
+
*
|
|
178
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
179
|
+
* @returns WindowStats object with current state
|
|
180
|
+
*/
|
|
181
|
+
getStats(now?: number): WindowStats;
|
|
182
|
+
/**
|
|
183
|
+
* Get the current count of requests in the window.
|
|
184
|
+
*
|
|
185
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
186
|
+
* @returns Current request count
|
|
187
|
+
*/
|
|
188
|
+
getCount(now?: number): number;
|
|
189
|
+
/**
|
|
190
|
+
* Get remaining requests before limit is hit.
|
|
191
|
+
*
|
|
192
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
193
|
+
* @returns Number of remaining requests
|
|
194
|
+
*/
|
|
195
|
+
getRemaining(now?: number): number;
|
|
196
|
+
/**
|
|
197
|
+
* Get timestamp when the window resets.
|
|
198
|
+
*
|
|
199
|
+
* @returns Reset timestamp in milliseconds since epoch
|
|
200
|
+
*/
|
|
201
|
+
getResetTime(): number;
|
|
202
|
+
/**
|
|
203
|
+
* Get the window configuration.
|
|
204
|
+
*
|
|
205
|
+
* @returns The window configuration
|
|
206
|
+
*/
|
|
207
|
+
getConfig(): Required<SlidingWindowConfig>;
|
|
208
|
+
/**
|
|
209
|
+
* Set internal state (useful for persistence/restoration).
|
|
210
|
+
*
|
|
211
|
+
* @param state - State to restore
|
|
212
|
+
*/
|
|
213
|
+
setState(state: {
|
|
214
|
+
count: number;
|
|
215
|
+
windowStart: number;
|
|
216
|
+
burstCount?: number;
|
|
217
|
+
}): void;
|
|
218
|
+
/**
|
|
219
|
+
* Get internal state (useful for persistence).
|
|
220
|
+
*
|
|
221
|
+
* @returns Current internal state
|
|
222
|
+
*/
|
|
223
|
+
getState(): {
|
|
224
|
+
count: number;
|
|
225
|
+
windowStart: number;
|
|
226
|
+
burstCount: number;
|
|
227
|
+
};
|
|
228
|
+
private maybeResetWindow;
|
|
229
|
+
private getSlidingCount;
|
|
230
|
+
private cleanupOldTimestamps;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create a sliding window with common presets.
|
|
234
|
+
*
|
|
235
|
+
* @param preset - Preset name
|
|
236
|
+
* @returns Configured SlidingWindow
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* // 60 requests per minute
|
|
241
|
+
* const perMinute = createWindowPreset('per-minute');
|
|
242
|
+
*
|
|
243
|
+
* // 1000 requests per hour
|
|
244
|
+
* const perHour = createWindowPreset('per-hour');
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export declare function createWindowPreset(preset: 'per-second' | 'per-minute' | 'per-hour' | 'per-day'): SlidingWindow;
|
|
248
|
+
/**
|
|
249
|
+
* Create multiple bucket keys for different scopes from the same identifiers.
|
|
250
|
+
*
|
|
251
|
+
* @param identifiers - Identifiers to use
|
|
252
|
+
* @param prefix - Optional prefix for all keys
|
|
253
|
+
* @returns Object with keys for each scope
|
|
254
|
+
*
|
|
255
|
+
* @example
|
|
256
|
+
* ```typescript
|
|
257
|
+
* const keys = createBucketKeys({ agentId: 'a1', userId: 'u1' }, 'rate');
|
|
258
|
+
* // {
|
|
259
|
+
* // global: 'rate:global',
|
|
260
|
+
* // agent: 'rate:agent:a1',
|
|
261
|
+
* // user: 'rate:user:u1',
|
|
262
|
+
* // session: 'rate:session:unknown',
|
|
263
|
+
* // action_type: 'rate:action:unknown'
|
|
264
|
+
* // }
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export declare function createBucketKeys(identifiers: BucketIdentifiers, prefix?: string): Record<BucketScope, string>;
|
|
268
|
+
//# sourceMappingURL=rate-limiting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiting.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiting.ts"],"names":[],"mappings":"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"}
|