@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.
Files changed (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +639 -0
  3. package/dist/analyzers/ArchitectureDetector.d.ts +44 -0
  4. package/dist/analyzers/ArchitectureDetector.d.ts.map +1 -0
  5. package/dist/analyzers/ArchitectureDetector.js +218 -0
  6. package/dist/analyzers/ArchitectureDetector.js.map +1 -0
  7. package/dist/analyzers/CSSAnalyzer.d.ts +284 -0
  8. package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
  9. package/dist/analyzers/CSSAnalyzer.js +1180 -0
  10. package/dist/analyzers/CSSAnalyzer.js.map +1 -0
  11. package/dist/analyzers/index.d.ts +5 -0
  12. package/dist/analyzers/index.d.ts.map +1 -0
  13. package/dist/analyzers/index.js +5 -0
  14. package/dist/analyzers/index.js.map +1 -0
  15. package/dist/cli.d.ts +8 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +174 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/design-system/index.d.ts +6 -0
  20. package/dist/design-system/index.d.ts.map +1 -0
  21. package/dist/design-system/index.js +6 -0
  22. package/dist/design-system/index.js.map +1 -0
  23. package/dist/design-system/tokens.d.ts +106 -0
  24. package/dist/design-system/tokens.d.ts.map +1 -0
  25. package/dist/design-system/tokens.js +554 -0
  26. package/dist/design-system/tokens.js.map +1 -0
  27. package/dist/engine/AuditLogger.d.ts +506 -0
  28. package/dist/engine/AuditLogger.d.ts.map +1 -0
  29. package/dist/engine/AuditLogger.js +1491 -0
  30. package/dist/engine/AuditLogger.js.map +1 -0
  31. package/dist/engine/GitHubApprovalManager.d.ts +123 -0
  32. package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
  33. package/dist/engine/GitHubApprovalManager.js +347 -0
  34. package/dist/engine/GitHubApprovalManager.js.map +1 -0
  35. package/dist/engine/GitHubClient.d.ts +183 -0
  36. package/dist/engine/GitHubClient.d.ts.map +1 -0
  37. package/dist/engine/GitHubClient.js +411 -0
  38. package/dist/engine/GitHubClient.js.map +1 -0
  39. package/dist/engine/RateLimiter.d.ts +81 -0
  40. package/dist/engine/RateLimiter.d.ts.map +1 -0
  41. package/dist/engine/RateLimiter.js +215 -0
  42. package/dist/engine/RateLimiter.js.map +1 -0
  43. package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
  44. package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
  45. package/dist/engine/RuleDependencyAnalyzer.js +475 -0
  46. package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
  47. package/dist/engine/RulesEngine.d.ts +176 -0
  48. package/dist/engine/RulesEngine.d.ts.map +1 -0
  49. package/dist/engine/RulesEngine.js +705 -0
  50. package/dist/engine/RulesEngine.js.map +1 -0
  51. package/dist/engine/TaskManager.d.ts +174 -0
  52. package/dist/engine/TaskManager.d.ts.map +1 -0
  53. package/dist/engine/TaskManager.js +663 -0
  54. package/dist/engine/TaskManager.js.map +1 -0
  55. package/dist/engine/index.d.ts +11 -0
  56. package/dist/engine/index.d.ts.map +1 -0
  57. package/dist/engine/index.js +13 -0
  58. package/dist/engine/index.js.map +1 -0
  59. package/dist/index.d.ts +21 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +29 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/rules/architecture.d.ts +9 -0
  64. package/dist/rules/architecture.d.ts.map +1 -0
  65. package/dist/rules/architecture.js +322 -0
  66. package/dist/rules/architecture.js.map +1 -0
  67. package/dist/rules/azure.d.ts +7 -0
  68. package/dist/rules/azure.d.ts.map +1 -0
  69. package/dist/rules/azure.js +136 -0
  70. package/dist/rules/azure.js.map +1 -0
  71. package/dist/rules/compliance.d.ts +9 -0
  72. package/dist/rules/compliance.d.ts.map +1 -0
  73. package/dist/rules/compliance.js +286 -0
  74. package/dist/rules/compliance.js.map +1 -0
  75. package/dist/rules/condition-optimizer.d.ts +151 -0
  76. package/dist/rules/condition-optimizer.d.ts.map +1 -0
  77. package/dist/rules/condition-optimizer.js +479 -0
  78. package/dist/rules/condition-optimizer.js.map +1 -0
  79. package/dist/rules/css.d.ts +10 -0
  80. package/dist/rules/css.d.ts.map +1 -0
  81. package/dist/rules/css.js +1777 -0
  82. package/dist/rules/css.js.map +1 -0
  83. package/dist/rules/field-standards.d.ts +1172 -0
  84. package/dist/rules/field-standards.d.ts.map +1 -0
  85. package/dist/rules/field-standards.js +908 -0
  86. package/dist/rules/field-standards.js.map +1 -0
  87. package/dist/rules/flask.d.ts +7 -0
  88. package/dist/rules/flask.d.ts.map +1 -0
  89. package/dist/rules/flask.js +142 -0
  90. package/dist/rules/flask.js.map +1 -0
  91. package/dist/rules/index.d.ts +827 -0
  92. package/dist/rules/index.d.ts.map +1 -0
  93. package/dist/rules/index.js +556 -0
  94. package/dist/rules/index.js.map +1 -0
  95. package/dist/rules/ml-ai.d.ts +7 -0
  96. package/dist/rules/ml-ai.d.ts.map +1 -0
  97. package/dist/rules/ml-ai.js +148 -0
  98. package/dist/rules/ml-ai.js.map +1 -0
  99. package/dist/rules/operational.d.ts +9 -0
  100. package/dist/rules/operational.d.ts.map +1 -0
  101. package/dist/rules/operational.js +318 -0
  102. package/dist/rules/operational.js.map +1 -0
  103. package/dist/rules/patterns.d.ts +568 -0
  104. package/dist/rules/patterns.d.ts.map +1 -0
  105. package/dist/rules/patterns.js +1359 -0
  106. package/dist/rules/patterns.js.map +1 -0
  107. package/dist/rules/security.d.ts +9 -0
  108. package/dist/rules/security.d.ts.map +1 -0
  109. package/dist/rules/security.js +848 -0
  110. package/dist/rules/security.js.map +1 -0
  111. package/dist/rules/shared-patterns.d.ts +268 -0
  112. package/dist/rules/shared-patterns.d.ts.map +1 -0
  113. package/dist/rules/shared-patterns.js +556 -0
  114. package/dist/rules/shared-patterns.js.map +1 -0
  115. package/dist/rules/storage.d.ts +13 -0
  116. package/dist/rules/storage.d.ts.map +1 -0
  117. package/dist/rules/storage.js +672 -0
  118. package/dist/rules/storage.js.map +1 -0
  119. package/dist/rules/stripe.d.ts +7 -0
  120. package/dist/rules/stripe.d.ts.map +1 -0
  121. package/dist/rules/stripe.js +133 -0
  122. package/dist/rules/stripe.js.map +1 -0
  123. package/dist/rules/testing.d.ts +7 -0
  124. package/dist/rules/testing.d.ts.map +1 -0
  125. package/dist/rules/testing.js +135 -0
  126. package/dist/rules/testing.js.map +1 -0
  127. package/dist/rules/ux.d.ts +9 -0
  128. package/dist/rules/ux.d.ts.map +1 -0
  129. package/dist/rules/ux.js +280 -0
  130. package/dist/rules/ux.js.map +1 -0
  131. package/dist/rules/websocket.d.ts +7 -0
  132. package/dist/rules/websocket.d.ts.map +1 -0
  133. package/dist/rules/websocket.js +128 -0
  134. package/dist/rules/websocket.js.map +1 -0
  135. package/dist/server.d.ts +43 -0
  136. package/dist/server.d.ts.map +1 -0
  137. package/dist/server.js +1967 -0
  138. package/dist/server.js.map +1 -0
  139. package/dist/supervisor/AgentSupervisor.d.ts +195 -0
  140. package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
  141. package/dist/supervisor/AgentSupervisor.js +569 -0
  142. package/dist/supervisor/AgentSupervisor.js.map +1 -0
  143. package/dist/supervisor/ManagedServerRegistry.d.ts +185 -0
  144. package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
  145. package/dist/supervisor/ManagedServerRegistry.js +729 -0
  146. package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
  147. package/dist/supervisor/ProjectTracker.d.ts +210 -0
  148. package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
  149. package/dist/supervisor/ProjectTracker.js +709 -0
  150. package/dist/supervisor/ProjectTracker.js.map +1 -0
  151. package/dist/supervisor/index.d.ts +6 -0
  152. package/dist/supervisor/index.d.ts.map +1 -0
  153. package/dist/supervisor/index.js +6 -0
  154. package/dist/supervisor/index.js.map +1 -0
  155. package/dist/testing/index.d.ts +11 -0
  156. package/dist/testing/index.d.ts.map +1 -0
  157. package/dist/testing/index.js +12 -0
  158. package/dist/testing/index.js.map +1 -0
  159. package/dist/testing/rule-tester.d.ts +217 -0
  160. package/dist/testing/rule-tester.d.ts.map +1 -0
  161. package/dist/testing/rule-tester.examples.d.ts +57 -0
  162. package/dist/testing/rule-tester.examples.d.ts.map +1 -0
  163. package/dist/testing/rule-tester.examples.js +375 -0
  164. package/dist/testing/rule-tester.examples.js.map +1 -0
  165. package/dist/testing/rule-tester.js +381 -0
  166. package/dist/testing/rule-tester.js.map +1 -0
  167. package/dist/testing/rule-validator.d.ts +141 -0
  168. package/dist/testing/rule-validator.d.ts.map +1 -0
  169. package/dist/testing/rule-validator.js +640 -0
  170. package/dist/testing/rule-validator.js.map +1 -0
  171. package/dist/types/index.d.ts +1282 -0
  172. package/dist/types/index.d.ts.map +1 -0
  173. package/dist/types/index.js +386 -0
  174. package/dist/types/index.js.map +1 -0
  175. package/dist/utils/errors.d.ts +86 -0
  176. package/dist/utils/errors.d.ts.map +1 -0
  177. package/dist/utils/errors.js +171 -0
  178. package/dist/utils/errors.js.map +1 -0
  179. package/dist/utils/index.d.ts +7 -0
  180. package/dist/utils/index.d.ts.map +1 -0
  181. package/dist/utils/index.js +7 -0
  182. package/dist/utils/index.js.map +1 -0
  183. package/dist/utils/rate-limiting.d.ts +268 -0
  184. package/dist/utils/rate-limiting.d.ts.map +1 -0
  185. package/dist/utils/rate-limiting.js +403 -0
  186. package/dist/utils/rate-limiting.js.map +1 -0
  187. package/dist/utils/shared.d.ts +306 -0
  188. package/dist/utils/shared.d.ts.map +1 -0
  189. package/dist/utils/shared.js +464 -0
  190. package/dist/utils/shared.js.map +1 -0
  191. package/dist/utils/shell.d.ts +22 -0
  192. package/dist/utils/shell.d.ts.map +1 -0
  193. package/dist/utils/shell.js +29 -0
  194. package/dist/utils/shell.js.map +1 -0
  195. package/package.json +67 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Enterprise Agent Supervisor - Rate Limiter
3
+ *
4
+ * Token bucket rate limiting with multiple scopes and configurations.
5
+ * Uses extracted utilities from src/utils/rate-limiting.ts for
6
+ * bucket key building and sliding window logic.
7
+ */
8
+ import type { RateLimitConfig, RateLimitState, ActionCategory } from '../types/index.js';
9
+ export declare class RateLimiter {
10
+ private configs;
11
+ private buckets;
12
+ private lastCleanup;
13
+ private cleanupIntervalMs;
14
+ /**
15
+ * Register a rate limit configuration
16
+ */
17
+ registerLimit(config: RateLimitConfig): void;
18
+ /**
19
+ * Register multiple rate limit configurations
20
+ */
21
+ registerLimits(configs: RateLimitConfig[]): void;
22
+ /**
23
+ * Remove a rate limit configuration
24
+ */
25
+ removeLimit(configId: string): boolean;
26
+ /**
27
+ * Check if an action should be rate limited
28
+ */
29
+ checkLimit(params: {
30
+ agentId?: string;
31
+ sessionId?: string;
32
+ userId?: string;
33
+ actionCategory?: ActionCategory;
34
+ actionType?: string;
35
+ }): {
36
+ allowed: boolean;
37
+ limitId?: string;
38
+ state?: RateLimitState;
39
+ };
40
+ /**
41
+ * Record a request (consume from bucket)
42
+ */
43
+ recordRequest(params: {
44
+ agentId?: string;
45
+ sessionId?: string;
46
+ userId?: string;
47
+ actionCategory?: ActionCategory;
48
+ actionType?: string;
49
+ }): void;
50
+ /**
51
+ * Get current state for a specific limit
52
+ */
53
+ getState(configId: string, params: {
54
+ agentId?: string;
55
+ sessionId?: string;
56
+ userId?: string;
57
+ }): RateLimitState | null;
58
+ /**
59
+ * Get all registered configurations
60
+ */
61
+ getConfigs(): RateLimitConfig[];
62
+ /**
63
+ * Clear all buckets (useful for testing)
64
+ */
65
+ clearBuckets(): void;
66
+ /**
67
+ * Convert params to BucketIdentifiers for the utility function
68
+ */
69
+ private toIdentifiers;
70
+ /**
71
+ * Get or create a bucket with SlidingWindow
72
+ */
73
+ private getOrCreateBucket;
74
+ /**
75
+ * Clean up expired buckets to prevent memory leaks
76
+ * Removes buckets that are older than their window duration
77
+ */
78
+ private cleanupExpiredBuckets;
79
+ }
80
+ export declare const rateLimiter: RateLimiter;
81
+ //# sourceMappingURL=RateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/engine/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAWzF,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,iBAAiB,CAAyB;IAElD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAI5C;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI;IAMhD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,cAAc,CAAA;KAAE;IAyDlE;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI;IAqBR;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,cAAc,GAAG,IAAI;IA8BzB;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAI/B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAmC9B;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Enterprise Agent Supervisor - Rate Limiter
3
+ *
4
+ * Token bucket rate limiting with multiple scopes and configurations.
5
+ * Uses extracted utilities from src/utils/rate-limiting.ts for
6
+ * bucket key building and sliding window logic.
7
+ */
8
+ import { buildBucketKey, SlidingWindow } from '../utils/rate-limiting.js';
9
+ export class RateLimiter {
10
+ configs = new Map();
11
+ buckets = new Map();
12
+ lastCleanup = Date.now();
13
+ cleanupIntervalMs = 5 * 60 * 1000; // Cleanup every 5 minutes
14
+ /**
15
+ * Register a rate limit configuration
16
+ */
17
+ registerLimit(config) {
18
+ this.configs.set(config.id, config);
19
+ }
20
+ /**
21
+ * Register multiple rate limit configurations
22
+ */
23
+ registerLimits(configs) {
24
+ for (const config of configs) {
25
+ this.registerLimit(config);
26
+ }
27
+ }
28
+ /**
29
+ * Remove a rate limit configuration
30
+ */
31
+ removeLimit(configId) {
32
+ return this.configs.delete(configId);
33
+ }
34
+ /**
35
+ * Check if an action should be rate limited
36
+ */
37
+ checkLimit(params) {
38
+ const now = Date.now();
39
+ // Periodically clean up expired buckets to prevent memory leaks
40
+ this.cleanupExpiredBuckets(now);
41
+ for (const [configId, config] of this.configs) {
42
+ if (!config.enabled)
43
+ continue;
44
+ // Check if action category matches (if specified)
45
+ if (config.actionCategories && params.actionCategory) {
46
+ if (!config.actionCategories.includes(params.actionCategory)) {
47
+ continue;
48
+ }
49
+ }
50
+ // Build bucket key using extracted utility
51
+ const identifiers = this.toIdentifiers(params);
52
+ const bucketKey = buildBucketKey(config.scope, identifiers, configId);
53
+ const bucket = this.getOrCreateBucket(bucketKey, config);
54
+ // Check if window can accept using SlidingWindow
55
+ if (!bucket.window.canAccept(now)) {
56
+ const stats = bucket.window.getStats(now);
57
+ return {
58
+ allowed: false,
59
+ limitId: configId,
60
+ state: {
61
+ key: bucketKey,
62
+ count: stats.count,
63
+ windowStart: stats.windowStart,
64
+ remaining: 0,
65
+ resetAt: stats.resetAtISO
66
+ }
67
+ };
68
+ }
69
+ // Check burst limit if configured
70
+ if (config.burstLimit && !bucket.window.canAcceptBurst(now)) {
71
+ const stats = bucket.window.getStats(now);
72
+ return {
73
+ allowed: false,
74
+ limitId: configId,
75
+ state: {
76
+ key: bucketKey,
77
+ count: stats.count,
78
+ windowStart: stats.windowStart,
79
+ remaining: 0,
80
+ resetAt: stats.resetAtISO
81
+ }
82
+ };
83
+ }
84
+ }
85
+ return { allowed: true };
86
+ }
87
+ /**
88
+ * Record a request (consume from bucket)
89
+ */
90
+ recordRequest(params) {
91
+ const now = Date.now();
92
+ for (const [configId, config] of this.configs) {
93
+ if (!config.enabled)
94
+ continue;
95
+ if (config.actionCategories && params.actionCategory) {
96
+ if (!config.actionCategories.includes(params.actionCategory)) {
97
+ continue;
98
+ }
99
+ }
100
+ const identifiers = this.toIdentifiers(params);
101
+ const bucketKey = buildBucketKey(config.scope, identifiers, configId);
102
+ const bucket = this.getOrCreateBucket(bucketKey, config);
103
+ // Record the request in the sliding window
104
+ bucket.window.record(now);
105
+ }
106
+ }
107
+ /**
108
+ * Get current state for a specific limit
109
+ */
110
+ getState(configId, params) {
111
+ const config = this.configs.get(configId);
112
+ if (!config)
113
+ return null;
114
+ const now = Date.now();
115
+ const identifiers = this.toIdentifiers(params);
116
+ const bucketKey = buildBucketKey(config.scope, identifiers, configId);
117
+ const bucket = this.buckets.get(bucketKey);
118
+ if (!bucket) {
119
+ return {
120
+ key: bucketKey,
121
+ count: 0,
122
+ windowStart: now,
123
+ remaining: config.maxRequests,
124
+ resetAt: new Date(now + config.windowMs).toISOString()
125
+ };
126
+ }
127
+ const stats = bucket.window.getStats(now);
128
+ return {
129
+ key: bucketKey,
130
+ count: stats.count,
131
+ windowStart: stats.windowStart,
132
+ remaining: stats.remaining,
133
+ resetAt: stats.resetAtISO
134
+ };
135
+ }
136
+ /**
137
+ * Get all registered configurations
138
+ */
139
+ getConfigs() {
140
+ return Array.from(this.configs.values());
141
+ }
142
+ /**
143
+ * Clear all buckets (useful for testing)
144
+ */
145
+ clearBuckets() {
146
+ this.buckets.clear();
147
+ }
148
+ /**
149
+ * Convert params to BucketIdentifiers for the utility function
150
+ */
151
+ toIdentifiers(params) {
152
+ return {
153
+ agentId: params.agentId,
154
+ sessionId: params.sessionId,
155
+ userId: params.userId,
156
+ actionType: params.actionType
157
+ };
158
+ }
159
+ /**
160
+ * Get or create a bucket with SlidingWindow
161
+ */
162
+ getOrCreateBucket(key, config) {
163
+ let bucket = this.buckets.get(key);
164
+ if (!bucket) {
165
+ bucket = {
166
+ key,
167
+ window: new SlidingWindow({
168
+ windowMs: config.windowMs,
169
+ maxRequests: config.maxRequests,
170
+ burstLimit: config.burstLimit,
171
+ algorithm: 'fixed' // Use fixed window for consistent behavior with original implementation
172
+ })
173
+ };
174
+ this.buckets.set(key, bucket);
175
+ }
176
+ return bucket;
177
+ }
178
+ /**
179
+ * Clean up expired buckets to prevent memory leaks
180
+ * Removes buckets that are older than their window duration
181
+ */
182
+ cleanupExpiredBuckets(now) {
183
+ // Only cleanup every cleanupIntervalMs to avoid excessive work
184
+ if (now - this.lastCleanup < this.cleanupIntervalMs) {
185
+ return;
186
+ }
187
+ this.lastCleanup = now;
188
+ // Find the maximum window duration across all configs
189
+ let maxWindowMs = 60000; // Default 1 minute
190
+ for (const config of this.configs.values()) {
191
+ if (config.windowMs > maxWindowMs) {
192
+ maxWindowMs = config.windowMs;
193
+ }
194
+ }
195
+ // Remove buckets that are older than the maximum window
196
+ // This uses >= for consistency with window expiration checks
197
+ // A bucket is expired when: now - windowStart >= 2*maxWindowMs (2x safety margin)
198
+ let removedCount = 0;
199
+ for (const [key, bucket] of this.buckets.entries()) {
200
+ const state = bucket.window.getState();
201
+ // Off-by-one fix: use consistent >= comparison for boundary calculation
202
+ // Window boundary semantics: now - windowStart >= threshold means expired
203
+ if (now - state.windowStart >= maxWindowMs * 2) {
204
+ this.buckets.delete(key);
205
+ removedCount++;
206
+ }
207
+ }
208
+ if (removedCount > 0) {
209
+ console.log(`[RateLimiter] Cleaned up ${removedCount} expired buckets`);
210
+ }
211
+ }
212
+ }
213
+ // Export singleton instance
214
+ export const rateLimiter = new RateLimiter();
215
+ //# sourceMappingURL=RateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/engine/RateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Enterprise Agent Supervisor - Rule Dependency Analyzer (Task #37)
3
+ *
4
+ * Analyzes and validates rule interdependencies, detects circular dependencies,
5
+ * and provides topologically sorted execution order.
6
+ */
7
+ import type { BusinessRule, RuleDependencyGraph, DependencyValidationResult } from '../types/index.js';
8
+ export interface DependencyAnalyzerOptions {
9
+ /**
10
+ * Maximum allowed depth for dependency chains before warning
11
+ */
12
+ maxDepthWarning?: number;
13
+ /**
14
+ * Whether to include disabled rules in analysis
15
+ */
16
+ includeDisabled?: boolean;
17
+ }
18
+ export declare class RuleDependencyAnalyzer {
19
+ private options;
20
+ constructor(options?: DependencyAnalyzerOptions);
21
+ /**
22
+ * Build a complete dependency graph from a set of rules
23
+ */
24
+ analyzeDependencies(rules: BusinessRule[]): RuleDependencyGraph;
25
+ /**
26
+ * Find all circular dependencies in the rule set
27
+ */
28
+ findCircularDependencies(rules: BusinessRule[]): string[][];
29
+ /**
30
+ * Get topologically sorted execution order for rules
31
+ * Rules with dependencies come after their dependencies
32
+ */
33
+ getExecutionOrder(rules: BusinessRule[]): string[];
34
+ /**
35
+ * Validate all dependencies in the rule set
36
+ */
37
+ validateDependencies(rules: BusinessRule[]): DependencyValidationResult;
38
+ /**
39
+ * Get rules that depend on a specific rule (direct dependents)
40
+ */
41
+ getDependents(ruleId: string, rules: BusinessRule[]): BusinessRule[];
42
+ /**
43
+ * Get all rules that a specific rule depends on (direct dependencies)
44
+ */
45
+ getDependencies(ruleId: string, rules: BusinessRule[]): BusinessRule[];
46
+ /**
47
+ * Get all transitive dependencies for a rule
48
+ */
49
+ getTransitiveDependencies(ruleId: string, rules: BusinessRule[]): BusinessRule[];
50
+ /**
51
+ * Get all rules that would be affected if a rule is disabled
52
+ */
53
+ getAffectedByDisabling(ruleId: string, rules: BusinessRule[]): BusinessRule[];
54
+ /**
55
+ * Get rules sorted by execution order respecting dependencies
56
+ * This integrates with the RulesEngine for proper evaluation order
57
+ */
58
+ getSortedRulesForExecution(rules: BusinessRule[]): BusinessRule[];
59
+ /**
60
+ * Calculate depth for each node in the dependency graph
61
+ */
62
+ private calculateDepths;
63
+ /**
64
+ * Detect conflicts between currently active rules
65
+ */
66
+ private detectActiveConflicts;
67
+ /**
68
+ * Find dependencies that reference non-existent rules
69
+ */
70
+ private findOrphanedDependencies;
71
+ }
72
+ export declare const ruleDependencyAnalyzer: RuleDependencyAnalyzer;
73
+ //# sourceMappingURL=RuleDependencyAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleDependencyAnalyzer.d.ts","sourceRoot":"","sources":["../../src/engine/RuleDependencyAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EAEnB,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAOD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,GAAE,yBAA8B;IAInD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,mBAAmB;IAyD/D;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,EAAE;IA+C3D;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE;IAkFlD;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,0BAA0B;IA0GvE;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;IAMpE;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;IAgBtE;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;IAiChF;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;IA+B7E;;;OAGG;IACH,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;IA4BjE;;OAEG;IACH,OAAO,CAAC,eAAe;IA2CvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAqBjC;AAGD,eAAO,MAAM,sBAAsB,wBAA+B,CAAC"}