@trentapps/manager-protocol 1.1.3 → 1.2.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 (142) hide show
  1. package/README.md +28 -0
  2. package/dist/analyzers/CSSAnalyzer.d.ts +180 -8
  3. package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
  4. package/dist/analyzers/CSSAnalyzer.js +561 -105
  5. package/dist/analyzers/CSSAnalyzer.js.map +1 -1
  6. package/dist/config/dashboard.d.ts +55 -0
  7. package/dist/config/dashboard.d.ts.map +1 -0
  8. package/dist/config/dashboard.js +103 -0
  9. package/dist/config/dashboard.js.map +1 -0
  10. package/dist/config/index.d.ts +7 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +7 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/dashboard/httpDashboard.d.ts +100 -0
  15. package/dist/dashboard/httpDashboard.d.ts.map +1 -0
  16. package/dist/dashboard/httpDashboard.js +1276 -0
  17. package/dist/dashboard/httpDashboard.js.map +1 -0
  18. package/dist/dashboard/index.d.ts +6 -0
  19. package/dist/dashboard/index.d.ts.map +1 -0
  20. package/dist/dashboard/index.js +7 -0
  21. package/dist/dashboard/index.js.map +1 -0
  22. package/dist/engine/AuditLogger.d.ts +370 -2
  23. package/dist/engine/AuditLogger.d.ts.map +1 -1
  24. package/dist/engine/AuditLogger.js +1064 -24
  25. package/dist/engine/AuditLogger.js.map +1 -1
  26. package/dist/engine/GitHubClient.d.ts +183 -0
  27. package/dist/engine/GitHubClient.d.ts.map +1 -0
  28. package/dist/engine/GitHubClient.js +411 -0
  29. package/dist/engine/GitHubClient.js.map +1 -0
  30. package/dist/engine/RateLimiter.d.ts +5 -3
  31. package/dist/engine/RateLimiter.d.ts.map +1 -1
  32. package/dist/engine/RateLimiter.js +49 -72
  33. package/dist/engine/RateLimiter.js.map +1 -1
  34. package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
  35. package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
  36. package/dist/engine/RuleDependencyAnalyzer.js +475 -0
  37. package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
  38. package/dist/engine/RulesEngine.d.ts +102 -3
  39. package/dist/engine/RulesEngine.d.ts.map +1 -1
  40. package/dist/engine/RulesEngine.js +326 -21
  41. package/dist/engine/RulesEngine.js.map +1 -1
  42. package/dist/engine/TaskManager.d.ts +10 -14
  43. package/dist/engine/TaskManager.d.ts.map +1 -1
  44. package/dist/engine/TaskManager.js +169 -197
  45. package/dist/engine/TaskManager.js.map +1 -1
  46. package/dist/engine/index.d.ts +3 -0
  47. package/dist/engine/index.d.ts.map +1 -1
  48. package/dist/engine/index.js +5 -0
  49. package/dist/engine/index.js.map +1 -1
  50. package/dist/rules/azure.d.ts.map +1 -1
  51. package/dist/rules/azure.js +12 -14
  52. package/dist/rules/azure.js.map +1 -1
  53. package/dist/rules/compliance.d.ts.map +1 -1
  54. package/dist/rules/compliance.js +23 -41
  55. package/dist/rules/compliance.js.map +1 -1
  56. package/dist/rules/condition-optimizer.d.ts +151 -0
  57. package/dist/rules/condition-optimizer.d.ts.map +1 -0
  58. package/dist/rules/condition-optimizer.js +479 -0
  59. package/dist/rules/condition-optimizer.js.map +1 -0
  60. package/dist/rules/css.d.ts.map +1 -1
  61. package/dist/rules/css.js +538 -0
  62. package/dist/rules/css.js.map +1 -1
  63. package/dist/rules/field-standards.d.ts +1172 -0
  64. package/dist/rules/field-standards.d.ts.map +1 -0
  65. package/dist/rules/field-standards.js +908 -0
  66. package/dist/rules/field-standards.js.map +1 -0
  67. package/dist/rules/flask.d.ts.map +1 -1
  68. package/dist/rules/flask.js +18 -31
  69. package/dist/rules/flask.js.map +1 -1
  70. package/dist/rules/index.d.ts +220 -0
  71. package/dist/rules/index.d.ts.map +1 -1
  72. package/dist/rules/index.js +155 -0
  73. package/dist/rules/index.js.map +1 -1
  74. package/dist/rules/ml-ai.d.ts.map +1 -1
  75. package/dist/rules/ml-ai.js +11 -13
  76. package/dist/rules/ml-ai.js.map +1 -1
  77. package/dist/rules/patterns.d.ts +568 -0
  78. package/dist/rules/patterns.d.ts.map +1 -0
  79. package/dist/rules/patterns.js +1359 -0
  80. package/dist/rules/patterns.js.map +1 -0
  81. package/dist/rules/security.d.ts.map +1 -1
  82. package/dist/rules/security.js +580 -19
  83. package/dist/rules/security.js.map +1 -1
  84. package/dist/rules/shared-patterns.d.ts +268 -0
  85. package/dist/rules/shared-patterns.d.ts.map +1 -0
  86. package/dist/rules/shared-patterns.js +556 -0
  87. package/dist/rules/shared-patterns.js.map +1 -0
  88. package/dist/rules/storage.d.ts +8 -2
  89. package/dist/rules/storage.d.ts.map +1 -1
  90. package/dist/rules/storage.js +541 -3
  91. package/dist/rules/storage.js.map +1 -1
  92. package/dist/rules/stripe.d.ts.map +1 -1
  93. package/dist/rules/stripe.js +19 -26
  94. package/dist/rules/stripe.js.map +1 -1
  95. package/dist/rules/websocket.d.ts.map +1 -1
  96. package/dist/rules/websocket.js +32 -40
  97. package/dist/rules/websocket.js.map +1 -1
  98. package/dist/supervisor/AgentSupervisor.d.ts +52 -0
  99. package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
  100. package/dist/supervisor/AgentSupervisor.js +120 -1
  101. package/dist/supervisor/AgentSupervisor.js.map +1 -1
  102. package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
  103. package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
  104. package/dist/supervisor/ManagedServerRegistry.js +590 -6
  105. package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
  106. package/dist/supervisor/ProjectTracker.d.ts +2 -1
  107. package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
  108. package/dist/supervisor/ProjectTracker.js +5 -9
  109. package/dist/supervisor/ProjectTracker.js.map +1 -1
  110. package/dist/testing/index.d.ts +11 -0
  111. package/dist/testing/index.d.ts.map +1 -0
  112. package/dist/testing/index.js +12 -0
  113. package/dist/testing/index.js.map +1 -0
  114. package/dist/testing/rule-tester.d.ts +217 -0
  115. package/dist/testing/rule-tester.d.ts.map +1 -0
  116. package/dist/testing/rule-tester.examples.d.ts +57 -0
  117. package/dist/testing/rule-tester.examples.d.ts.map +1 -0
  118. package/dist/testing/rule-tester.examples.js +375 -0
  119. package/dist/testing/rule-tester.examples.js.map +1 -0
  120. package/dist/testing/rule-tester.js +381 -0
  121. package/dist/testing/rule-tester.js.map +1 -0
  122. package/dist/testing/rule-validator.d.ts +141 -0
  123. package/dist/testing/rule-validator.d.ts.map +1 -0
  124. package/dist/testing/rule-validator.js +640 -0
  125. package/dist/testing/rule-validator.js.map +1 -0
  126. package/dist/types/index.d.ts +265 -4
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +57 -2
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/utils/index.d.ts +2 -0
  131. package/dist/utils/index.d.ts.map +1 -1
  132. package/dist/utils/index.js +2 -0
  133. package/dist/utils/index.js.map +1 -1
  134. package/dist/utils/rate-limiting.d.ts +268 -0
  135. package/dist/utils/rate-limiting.d.ts.map +1 -0
  136. package/dist/utils/rate-limiting.js +403 -0
  137. package/dist/utils/rate-limiting.js.map +1 -0
  138. package/dist/utils/shared.d.ts +306 -0
  139. package/dist/utils/shared.d.ts.map +1 -0
  140. package/dist/utils/shared.js +464 -0
  141. package/dist/utils/shared.js.map +1 -0
  142. package/package.json +2 -1
@@ -0,0 +1,464 @@
1
+ /**
2
+ * Enterprise Agent Supervisor - Shared Utilities
3
+ *
4
+ * Common utility functions used across the codebase.
5
+ * Extracted from various modules to reduce duplication and ensure consistency.
6
+ *
7
+ * Tasks: #40, #41, #42, #48
8
+ */
9
+ // ============================================================================
10
+ // HASH UTILITIES (#42)
11
+ // ============================================================================
12
+ /**
13
+ * Simple string hash function for generating IDs.
14
+ * Uses a fast, non-cryptographic hash algorithm (djb2 variant).
15
+ *
16
+ * @param str - The string to hash
17
+ * @param options - Optional configuration
18
+ * @returns Hexadecimal hash string (default) or base36 string
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * hashString('hello world'); // Returns: 'a3e45bc1'
23
+ * hashString('hello world', { base: 36 }); // Returns: 'x7k2m'
24
+ * hashString('hello world', { length: 16 }); // Returns: '00000000a3e45bc1'
25
+ * ```
26
+ */
27
+ export function hashString(str, options = {}) {
28
+ const { base = 16, length = 8 } = options;
29
+ let hash = 0;
30
+ for (let i = 0; i < str.length; i++) {
31
+ const char = str.charCodeAt(i);
32
+ hash = ((hash << 5) - hash) + char;
33
+ hash = hash & hash; // Convert to 32bit integer
34
+ }
35
+ const result = Math.abs(hash).toString(base);
36
+ return result.substring(0, length);
37
+ }
38
+ /**
39
+ * Common time window durations
40
+ */
41
+ export const TimeWindows = {
42
+ /** 1 hour in milliseconds */
43
+ HOUR: 60 * 60 * 1000,
44
+ /** 24 hours in milliseconds */
45
+ DAY: 24 * 60 * 60 * 1000,
46
+ /** 7 days in milliseconds */
47
+ WEEK: 7 * 24 * 60 * 60 * 1000,
48
+ /** 30 days in milliseconds */
49
+ MONTH: 30 * 24 * 60 * 60 * 1000,
50
+ };
51
+ /**
52
+ * Create a time window for filtering data.
53
+ *
54
+ * @param options - Time window options
55
+ * @returns TimeWindowResult with start/end times and contains() function
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * // Last 24 hours
60
+ * const window = createTimeWindow();
61
+ *
62
+ * // Last hour
63
+ * const hourWindow = createTimeWindow({ durationMs: TimeWindows.HOUR });
64
+ *
65
+ * // Check if a timestamp is in the window
66
+ * if (window.contains(event.timestamp)) {
67
+ * // Event is within the time window
68
+ * }
69
+ * ```
70
+ */
71
+ export function createTimeWindow(options = {}) {
72
+ const { durationMs = TimeWindows.DAY, referenceTime = Date.now() } = options;
73
+ const endMs = referenceTime;
74
+ const startMs = endMs - durationMs;
75
+ return {
76
+ start: new Date(startMs).toISOString(),
77
+ end: new Date(endMs).toISOString(),
78
+ startMs,
79
+ endMs,
80
+ contains: (timestamp) => {
81
+ const ts = typeof timestamp === 'string'
82
+ ? new Date(timestamp).getTime()
83
+ : timestamp instanceof Date
84
+ ? timestamp.getTime()
85
+ : timestamp;
86
+ return ts >= startMs && ts <= endMs;
87
+ }
88
+ };
89
+ }
90
+ /**
91
+ * Check if a window has expired based on start time and duration.
92
+ * Uses >= comparison for consistency (window expires AT the boundary).
93
+ *
94
+ * @param windowStart - Window start timestamp in milliseconds
95
+ * @param windowMs - Window duration in milliseconds
96
+ * @param now - Current time (defaults to Date.now())
97
+ * @returns true if the window has expired
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * if (isWindowExpired(bucket.windowStart, config.windowMs)) {
102
+ * // Reset the window
103
+ * bucket.count = 0;
104
+ * bucket.windowStart = Date.now();
105
+ * }
106
+ * ```
107
+ */
108
+ export function isWindowExpired(windowStart, windowMs, now = Date.now()) {
109
+ return now - windowStart >= windowMs;
110
+ }
111
+ /**
112
+ * Calculate the reset time for a window.
113
+ *
114
+ * @param windowStart - Window start timestamp in milliseconds
115
+ * @param windowMs - Window duration in milliseconds
116
+ * @returns Date object for when the window resets
117
+ */
118
+ export function getWindowResetTime(windowStart, windowMs) {
119
+ return new Date(windowStart + windowMs);
120
+ }
121
+ /**
122
+ * Calculate aggregate metrics from an array of data items.
123
+ *
124
+ * @param items - Array of items to analyze
125
+ * @param valueExtractor - Function to extract numeric value from each item
126
+ * @param options - Configuration options
127
+ * @returns Aggregated metrics
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const activities = [
132
+ * { tokensUsed: 100, timestamp: '2024-01-01T00:00:00Z', outcome: 'success' },
133
+ * { tokensUsed: 200, timestamp: '2024-01-01T01:00:00Z', outcome: 'failure' },
134
+ * ];
135
+ *
136
+ * const metrics = calculateMetrics(
137
+ * activities,
138
+ * item => item.tokensUsed,
139
+ * {
140
+ * timestampField: 'timestamp',
141
+ * outcomeField: 'outcome',
142
+ * failureValue: 'failure'
143
+ * }
144
+ * );
145
+ * // Returns: { total: 300, count: 2, average: 150, min: 100, max: 200, ... }
146
+ * ```
147
+ */
148
+ export function calculateMetrics(items, valueExtractor, options = {}) {
149
+ const { timestampField = 'timestamp', outcomeField = 'outcome', failureValue = 'failure', include24h = true } = options;
150
+ const now = Date.now();
151
+ const last24h = now - TimeWindows.DAY;
152
+ let total = 0;
153
+ let count = 0;
154
+ let min = Infinity;
155
+ let max = -Infinity;
156
+ let errorCount = 0;
157
+ let total24h = 0;
158
+ let count24h = 0;
159
+ let errors24h = 0;
160
+ for (const item of items) {
161
+ const value = valueExtractor(item);
162
+ const timestamp = item[timestampField];
163
+ const outcome = item[outcomeField];
164
+ const isRecent = include24h && timestamp
165
+ ? new Date(timestamp).getTime() > last24h
166
+ : false;
167
+ // Count all items for error rate calculation
168
+ count++;
169
+ if (isRecent)
170
+ count24h++;
171
+ // Track failures
172
+ if (outcome === failureValue) {
173
+ errorCount++;
174
+ if (isRecent)
175
+ errors24h++;
176
+ }
177
+ // Aggregate numeric values (skip undefined)
178
+ if (value !== undefined && value !== null) {
179
+ total += value;
180
+ if (value < min)
181
+ min = value;
182
+ if (value > max)
183
+ max = value;
184
+ if (isRecent)
185
+ total24h += value;
186
+ }
187
+ }
188
+ // Handle edge cases
189
+ if (min === Infinity)
190
+ min = 0;
191
+ if (max === -Infinity)
192
+ max = 0;
193
+ const result = {
194
+ total,
195
+ count,
196
+ average: count > 0 ? total / count : 0,
197
+ min,
198
+ max,
199
+ errorCount,
200
+ errorRate: count > 0 ? errorCount / count : 0
201
+ };
202
+ if (include24h) {
203
+ result.last24h = {
204
+ total: total24h,
205
+ count: count24h,
206
+ errors: errors24h
207
+ };
208
+ }
209
+ return result;
210
+ }
211
+ /**
212
+ * Calculate grouped metrics (e.g., by category, by type).
213
+ *
214
+ * @param items - Array of items to analyze
215
+ * @param groupExtractor - Function to extract group key from each item
216
+ * @returns Map of group key to count
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * const events = [
221
+ * { eventType: 'action_evaluated' },
222
+ * { eventType: 'action_approved' },
223
+ * { eventType: 'action_evaluated' },
224
+ * ];
225
+ *
226
+ * const byType = calculateGroupedCounts(events, e => e.eventType);
227
+ * // Returns: { 'action_evaluated': 2, 'action_approved': 1 }
228
+ * ```
229
+ */
230
+ export function calculateGroupedCounts(items, groupExtractor) {
231
+ const groups = {};
232
+ for (const item of items) {
233
+ const group = groupExtractor(item);
234
+ if (group !== undefined) {
235
+ groups[group] = (groups[group] || 0) + 1;
236
+ }
237
+ }
238
+ return groups;
239
+ }
240
+ /**
241
+ * Get top N items from a count record.
242
+ *
243
+ * @param counts - Record of key to count
244
+ * @param limit - Maximum number of items to return
245
+ * @returns Array of { key, count } sorted by count descending
246
+ */
247
+ export function getTopCounts(counts, limit = 5) {
248
+ return Object.entries(counts)
249
+ .map(([key, count]) => ({ key, count }))
250
+ .sort((a, b) => b.count - a.count)
251
+ .slice(0, limit);
252
+ }
253
+ /**
254
+ * Collection of common input validators.
255
+ *
256
+ * Each validator returns { valid: true } or { valid: false, error: 'message' }
257
+ */
258
+ export const validators = {
259
+ /**
260
+ * Validate email format
261
+ *
262
+ * @example
263
+ * ```typescript
264
+ * validators.email('user@example.com'); // { valid: true }
265
+ * validators.email('invalid'); // { valid: false, error: '...' }
266
+ * ```
267
+ */
268
+ email(value) {
269
+ if (!value || typeof value !== 'string') {
270
+ return { valid: false, error: 'Email is required' };
271
+ }
272
+ // RFC 5322 simplified regex
273
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
274
+ if (!emailRegex.test(value)) {
275
+ return { valid: false, error: 'Invalid email format' };
276
+ }
277
+ return { valid: true };
278
+ },
279
+ /**
280
+ * Validate URL format
281
+ *
282
+ * @example
283
+ * ```typescript
284
+ * validators.url('https://example.com'); // { valid: true }
285
+ * validators.url('not-a-url'); // { valid: false, error: '...' }
286
+ * ```
287
+ */
288
+ url(value, options = {}) {
289
+ if (!value || typeof value !== 'string') {
290
+ return { valid: false, error: 'URL is required' };
291
+ }
292
+ try {
293
+ const url = new URL(value);
294
+ if (options.requireHttps && url.protocol !== 'https:') {
295
+ return { valid: false, error: 'URL must use HTTPS' };
296
+ }
297
+ return { valid: true };
298
+ }
299
+ catch {
300
+ return { valid: false, error: 'Invalid URL format' };
301
+ }
302
+ },
303
+ /**
304
+ * Validate file path (basic validation, no traversal attacks)
305
+ *
306
+ * @example
307
+ * ```typescript
308
+ * validators.path('/valid/path'); // { valid: true }
309
+ * validators.path('../traversal'); // { valid: false, error: '...' }
310
+ * ```
311
+ */
312
+ path(value, options = {}) {
313
+ if (!value || typeof value !== 'string') {
314
+ return { valid: false, error: 'Path is required' };
315
+ }
316
+ // Check for path traversal attempts
317
+ if (value.includes('..')) {
318
+ return { valid: false, error: 'Path traversal not allowed' };
319
+ }
320
+ // Check for null bytes
321
+ if (value.includes('\0')) {
322
+ return { valid: false, error: 'Invalid characters in path' };
323
+ }
324
+ // Check if absolute path is required
325
+ if (!options.allowRelative && !value.startsWith('/')) {
326
+ return { valid: false, error: 'Path must be absolute' };
327
+ }
328
+ return { valid: true };
329
+ },
330
+ /**
331
+ * Validate that a string is non-empty
332
+ */
333
+ nonEmpty(value, fieldName = 'Value') {
334
+ if (!value || typeof value !== 'string' || value.trim().length === 0) {
335
+ return { valid: false, error: `${fieldName} cannot be empty` };
336
+ }
337
+ return { valid: true };
338
+ },
339
+ /**
340
+ * Validate string length
341
+ */
342
+ length(value, options = {}) {
343
+ const { min = 0, max = Infinity, fieldName = 'Value' } = options;
344
+ if (!value || typeof value !== 'string') {
345
+ return { valid: false, error: `${fieldName} is required` };
346
+ }
347
+ if (value.length < min) {
348
+ return { valid: false, error: `${fieldName} must be at least ${min} characters` };
349
+ }
350
+ if (value.length > max) {
351
+ return { valid: false, error: `${fieldName} must be at most ${max} characters` };
352
+ }
353
+ return { valid: true };
354
+ },
355
+ /**
356
+ * Validate number within range
357
+ */
358
+ numberRange(value, options = {}) {
359
+ const { min = -Infinity, max = Infinity, fieldName = 'Value' } = options;
360
+ if (value === undefined || value === null || typeof value !== 'number' || isNaN(value)) {
361
+ return { valid: false, error: `${fieldName} must be a number` };
362
+ }
363
+ if (value < min) {
364
+ return { valid: false, error: `${fieldName} must be at least ${min}` };
365
+ }
366
+ if (value > max) {
367
+ return { valid: false, error: `${fieldName} must be at most ${max}` };
368
+ }
369
+ return { valid: true };
370
+ },
371
+ /**
372
+ * Validate port number
373
+ */
374
+ port(value) {
375
+ return validators.numberRange(value, {
376
+ min: 1,
377
+ max: 65535,
378
+ fieldName: 'Port'
379
+ });
380
+ },
381
+ /**
382
+ * Validate identifier (alphanumeric with dashes/underscores)
383
+ */
384
+ identifier(value, fieldName = 'Identifier') {
385
+ if (!value || typeof value !== 'string') {
386
+ return { valid: false, error: `${fieldName} is required` };
387
+ }
388
+ const idRegex = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
389
+ if (!idRegex.test(value)) {
390
+ return {
391
+ valid: false,
392
+ error: `${fieldName} must start with a letter and contain only letters, numbers, dashes, and underscores`
393
+ };
394
+ }
395
+ return { valid: true };
396
+ },
397
+ /**
398
+ * Validate enum value
399
+ */
400
+ enum(value, allowedValues, fieldName = 'Value') {
401
+ if (!allowedValues.includes(value)) {
402
+ return {
403
+ valid: false,
404
+ error: `${fieldName} must be one of: ${allowedValues.join(', ')}`
405
+ };
406
+ }
407
+ return { valid: true };
408
+ },
409
+ /**
410
+ * Validate ISO date string
411
+ */
412
+ isoDate(value) {
413
+ if (!value || typeof value !== 'string') {
414
+ return { valid: false, error: 'Date is required' };
415
+ }
416
+ const date = new Date(value);
417
+ if (isNaN(date.getTime())) {
418
+ return { valid: false, error: 'Invalid date format' };
419
+ }
420
+ return { valid: true };
421
+ },
422
+ /**
423
+ * Validate GitHub repository format (owner/repo)
424
+ */
425
+ githubRepo(value) {
426
+ if (!value || typeof value !== 'string') {
427
+ return { valid: false, error: 'Repository is required' };
428
+ }
429
+ const repoRegex = /^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/;
430
+ if (!repoRegex.test(value)) {
431
+ return { valid: false, error: 'Repository must be in format: owner/repo' };
432
+ }
433
+ return { valid: true };
434
+ },
435
+ /**
436
+ * Compose multiple validators (all must pass)
437
+ */
438
+ all(...validations) {
439
+ for (const validation of validations) {
440
+ if (!validation.valid) {
441
+ return validation;
442
+ }
443
+ }
444
+ return { valid: true };
445
+ }
446
+ };
447
+ /**
448
+ * Helper to run validation and throw on failure
449
+ *
450
+ * @example
451
+ * ```typescript
452
+ * assertValid(validators.email(userEmail), 'email');
453
+ * // Throws if invalid: "Validation failed for email: Invalid email format"
454
+ * ```
455
+ */
456
+ export function assertValid(result, context) {
457
+ if (!result.valid) {
458
+ const message = context
459
+ ? `Validation failed for ${context}: ${result.error}`
460
+ : `Validation failed: ${result.error}`;
461
+ throw new Error(message);
462
+ }
463
+ }
464
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/utils/shared.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trentapps/manager-protocol",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "description": "Enterprise Agent Supervisor - Rules Engine MCP Server for AI Agent Governance",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -35,6 +35,7 @@
35
35
  "license": "MIT",
36
36
  "dependencies": {
37
37
  "@modelcontextprotocol/sdk": "^1.0.0",
38
+ "@octokit/rest": "^22.0.1",
38
39
  "@types/better-sqlite3": "^7.6.13",
39
40
  "better-sqlite3": "^12.5.0",
40
41
  "uuid": "^9.0.1",