@trentapps/manager-protocol 1.1.1

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +446 -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 +104 -0
  8. package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
  9. package/dist/analyzers/CSSAnalyzer.js +578 -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/AppMonitor.d.ts +162 -0
  28. package/dist/engine/AppMonitor.d.ts.map +1 -0
  29. package/dist/engine/AppMonitor.js +754 -0
  30. package/dist/engine/AppMonitor.js.map +1 -0
  31. package/dist/engine/AuditLogger.d.ts +138 -0
  32. package/dist/engine/AuditLogger.d.ts.map +1 -0
  33. package/dist/engine/AuditLogger.js +448 -0
  34. package/dist/engine/AuditLogger.js.map +1 -0
  35. package/dist/engine/GitHubApprovalManager.d.ts +106 -0
  36. package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
  37. package/dist/engine/GitHubApprovalManager.js +315 -0
  38. package/dist/engine/GitHubApprovalManager.js.map +1 -0
  39. package/dist/engine/RateLimiter.d.ts +79 -0
  40. package/dist/engine/RateLimiter.d.ts.map +1 -0
  41. package/dist/engine/RateLimiter.js +232 -0
  42. package/dist/engine/RateLimiter.js.map +1 -0
  43. package/dist/engine/RulesEngine.d.ts +77 -0
  44. package/dist/engine/RulesEngine.d.ts.map +1 -0
  45. package/dist/engine/RulesEngine.js +400 -0
  46. package/dist/engine/RulesEngine.js.map +1 -0
  47. package/dist/engine/TaskManager.d.ts +173 -0
  48. package/dist/engine/TaskManager.d.ts.map +1 -0
  49. package/dist/engine/TaskManager.js +678 -0
  50. package/dist/engine/TaskManager.js.map +1 -0
  51. package/dist/engine/index.d.ts +9 -0
  52. package/dist/engine/index.d.ts.map +1 -0
  53. package/dist/engine/index.js +9 -0
  54. package/dist/engine/index.js.map +1 -0
  55. package/dist/index.d.ts +21 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +29 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/rules/architecture.d.ts +9 -0
  60. package/dist/rules/architecture.d.ts.map +1 -0
  61. package/dist/rules/architecture.js +322 -0
  62. package/dist/rules/architecture.js.map +1 -0
  63. package/dist/rules/azure.d.ts +7 -0
  64. package/dist/rules/azure.d.ts.map +1 -0
  65. package/dist/rules/azure.js +138 -0
  66. package/dist/rules/azure.js.map +1 -0
  67. package/dist/rules/compliance.d.ts +9 -0
  68. package/dist/rules/compliance.d.ts.map +1 -0
  69. package/dist/rules/compliance.js +304 -0
  70. package/dist/rules/compliance.js.map +1 -0
  71. package/dist/rules/css.d.ts +10 -0
  72. package/dist/rules/css.d.ts.map +1 -0
  73. package/dist/rules/css.js +1239 -0
  74. package/dist/rules/css.js.map +1 -0
  75. package/dist/rules/flask.d.ts +7 -0
  76. package/dist/rules/flask.d.ts.map +1 -0
  77. package/dist/rules/flask.js +155 -0
  78. package/dist/rules/flask.js.map +1 -0
  79. package/dist/rules/index.d.ts +607 -0
  80. package/dist/rules/index.d.ts.map +1 -0
  81. package/dist/rules/index.js +401 -0
  82. package/dist/rules/index.js.map +1 -0
  83. package/dist/rules/ml-ai.d.ts +7 -0
  84. package/dist/rules/ml-ai.d.ts.map +1 -0
  85. package/dist/rules/ml-ai.js +150 -0
  86. package/dist/rules/ml-ai.js.map +1 -0
  87. package/dist/rules/operational.d.ts +9 -0
  88. package/dist/rules/operational.d.ts.map +1 -0
  89. package/dist/rules/operational.js +318 -0
  90. package/dist/rules/operational.js.map +1 -0
  91. package/dist/rules/security.d.ts +9 -0
  92. package/dist/rules/security.d.ts.map +1 -0
  93. package/dist/rules/security.js +287 -0
  94. package/dist/rules/security.js.map +1 -0
  95. package/dist/rules/storage.d.ts +7 -0
  96. package/dist/rules/storage.d.ts.map +1 -0
  97. package/dist/rules/storage.js +134 -0
  98. package/dist/rules/storage.js.map +1 -0
  99. package/dist/rules/stripe.d.ts +7 -0
  100. package/dist/rules/stripe.d.ts.map +1 -0
  101. package/dist/rules/stripe.js +140 -0
  102. package/dist/rules/stripe.js.map +1 -0
  103. package/dist/rules/testing.d.ts +7 -0
  104. package/dist/rules/testing.d.ts.map +1 -0
  105. package/dist/rules/testing.js +135 -0
  106. package/dist/rules/testing.js.map +1 -0
  107. package/dist/rules/ux.d.ts +9 -0
  108. package/dist/rules/ux.d.ts.map +1 -0
  109. package/dist/rules/ux.js +280 -0
  110. package/dist/rules/ux.js.map +1 -0
  111. package/dist/rules/websocket.d.ts +7 -0
  112. package/dist/rules/websocket.d.ts.map +1 -0
  113. package/dist/rules/websocket.js +136 -0
  114. package/dist/rules/websocket.js.map +1 -0
  115. package/dist/server.d.ts +49 -0
  116. package/dist/server.d.ts.map +1 -0
  117. package/dist/server.js +2330 -0
  118. package/dist/server.js.map +1 -0
  119. package/dist/supervisor/AgentSupervisor.d.ts +235 -0
  120. package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
  121. package/dist/supervisor/AgentSupervisor.js +596 -0
  122. package/dist/supervisor/AgentSupervisor.js.map +1 -0
  123. package/dist/supervisor/ManagedServerRegistry.d.ts +48 -0
  124. package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
  125. package/dist/supervisor/ManagedServerRegistry.js +145 -0
  126. package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
  127. package/dist/supervisor/ProjectTracker.d.ts +188 -0
  128. package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
  129. package/dist/supervisor/ProjectTracker.js +617 -0
  130. package/dist/supervisor/ProjectTracker.js.map +1 -0
  131. package/dist/supervisor/index.d.ts +6 -0
  132. package/dist/supervisor/index.d.ts.map +1 -0
  133. package/dist/supervisor/index.js +6 -0
  134. package/dist/supervisor/index.js.map +1 -0
  135. package/dist/types/index.d.ts +1176 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +391 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/dist/utils/errors.d.ts +86 -0
  140. package/dist/utils/errors.d.ts.map +1 -0
  141. package/dist/utils/errors.js +171 -0
  142. package/dist/utils/errors.js.map +1 -0
  143. package/dist/utils/index.d.ts +5 -0
  144. package/dist/utils/index.d.ts.map +1 -0
  145. package/dist/utils/index.js +5 -0
  146. package/dist/utils/index.js.map +1 -0
  147. package/dist/utils/shell.d.ts +22 -0
  148. package/dist/utils/shell.d.ts.map +1 -0
  149. package/dist/utils/shell.js +29 -0
  150. package/dist/utils/shell.js.map +1 -0
  151. package/package.json +63 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * GitHub-based Approval Manager
3
+ *
4
+ * Uses GitHub Issues via `gh` CLI as the source of truth for approval requests.
5
+ * Integrates with the task management system.
6
+ */
7
+ export interface GitHubApprovalOptions {
8
+ defaultRepo?: string;
9
+ approvalLabelName?: string;
10
+ approvedLabelName?: string;
11
+ deniedLabelName?: string;
12
+ expirationHours?: number;
13
+ }
14
+ export interface ApprovalRequest {
15
+ requestId: string;
16
+ issueNumber: number;
17
+ issueUrl: string;
18
+ repo: string;
19
+ actionId: string;
20
+ reason: string;
21
+ details?: string;
22
+ priority: 'low' | 'normal' | 'high' | 'urgent';
23
+ riskScore?: number;
24
+ status: 'pending' | 'approved' | 'denied' | 'expired';
25
+ createdAt: string;
26
+ expiresAt?: string;
27
+ }
28
+ export declare class GitHubApprovalManager {
29
+ private defaultRepo;
30
+ private approvalLabel;
31
+ private approvedLabel;
32
+ private deniedLabel;
33
+ private expirationHours;
34
+ constructor(options?: GitHubApprovalOptions);
35
+ /**
36
+ * Create a new approval request as a GitHub issue
37
+ */
38
+ createApprovalIssue(params: {
39
+ repo?: string;
40
+ actionId: string;
41
+ action: string;
42
+ reason: string;
43
+ details?: Record<string, unknown>;
44
+ priority?: 'low' | 'normal' | 'high' | 'urgent';
45
+ riskScore?: number;
46
+ violations?: string[];
47
+ warnings?: string[];
48
+ context?: Record<string, unknown>;
49
+ }): Promise<ApprovalRequest>;
50
+ private parseApprovalResponse;
51
+ /**
52
+ * Add approval request to existing task issue
53
+ */
54
+ addApprovalToTask(params: {
55
+ repo?: string;
56
+ issueNumber: number;
57
+ actionId: string;
58
+ reason: string;
59
+ details?: Record<string, unknown>;
60
+ riskScore?: number;
61
+ violations?: string[];
62
+ warnings?: string[];
63
+ }): Promise<void>;
64
+ /**
65
+ * Check approval status of a GitHub issue
66
+ */
67
+ checkApprovalStatus(params: {
68
+ repo?: string;
69
+ issueNumber: number;
70
+ }): Promise<ApprovalRequest>;
71
+ /**
72
+ * Approve a request (remove needs-approval label, add approved label)
73
+ */
74
+ approveRequest(params: {
75
+ repo?: string;
76
+ issueNumber: number;
77
+ approverId: string;
78
+ comments?: string;
79
+ }): Promise<void>;
80
+ /**
81
+ * Deny a request (add denied label, close issue)
82
+ */
83
+ denyRequest(params: {
84
+ repo?: string;
85
+ issueNumber: number;
86
+ denierId: string;
87
+ reason?: string;
88
+ }): Promise<void>;
89
+ /**
90
+ * Get all pending approval requests
91
+ */
92
+ getPendingApprovals(repo?: string): Promise<ApprovalRequest[]>;
93
+ /**
94
+ * Extract priority from labels
95
+ */
96
+ private extractPriority;
97
+ /**
98
+ * Format approval issue body
99
+ */
100
+ private formatApprovalIssueBody;
101
+ /**
102
+ * Format approval comment for existing task
103
+ */
104
+ private formatApprovalComment;
105
+ }
106
+ //# sourceMappingURL=GitHubApprovalManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubApprovalManager.d.ts","sourceRoot":"","sources":["../../src/engine/GitHubApprovalManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,315 @@
1
+ /**
2
+ * GitHub-based Approval Manager
3
+ *
4
+ * Uses GitHub Issues via `gh` CLI as the source of truth for approval requests.
5
+ * Integrates with the task management system.
6
+ */
7
+ import { exec } from 'child_process';
8
+ import { promisify } from 'util';
9
+ import { writeFileSync, unlinkSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { tmpdir } from 'os';
12
+ const execAsync = promisify(exec);
13
+ export class GitHubApprovalManager {
14
+ defaultRepo;
15
+ approvalLabel;
16
+ approvedLabel;
17
+ deniedLabel;
18
+ expirationHours;
19
+ constructor(options = {}) {
20
+ this.defaultRepo = options.defaultRepo || '';
21
+ this.approvalLabel = options.approvalLabelName || 'needs-approval';
22
+ this.approvedLabel = options.approvedLabelName || 'approved';
23
+ this.deniedLabel = options.deniedLabelName || 'denied';
24
+ this.expirationHours = options.expirationHours || 24;
25
+ }
26
+ /**
27
+ * Create a new approval request as a GitHub issue
28
+ */
29
+ async createApprovalIssue(params) {
30
+ const repo = params.repo || this.defaultRepo;
31
+ if (!repo)
32
+ throw new Error('Repository required');
33
+ const labels = [this.approvalLabel];
34
+ if (params.priority)
35
+ labels.push(`priority:${params.priority}`);
36
+ if (params.riskScore && params.riskScore >= 80)
37
+ labels.push('security');
38
+ const expiresAt = new Date(Date.now() + this.expirationHours * 60 * 60 * 1000).toISOString();
39
+ const body = this.formatApprovalIssueBody({
40
+ actionId: params.actionId,
41
+ action: params.action,
42
+ reason: params.reason,
43
+ details: params.details,
44
+ riskScore: params.riskScore,
45
+ violations: params.violations,
46
+ warnings: params.warnings,
47
+ context: params.context,
48
+ expiresAt
49
+ });
50
+ // Create issue using gh CLI
51
+ const title = `[APPROVAL REQUIRED] ${params.action}`;
52
+ const labelArgs = labels.map(l => `--label "${l}"`).join(' ');
53
+ // Write body to temp file to avoid shell escaping issues
54
+ const tempFile = join(tmpdir(), `gh-issue-${Date.now()}.md`);
55
+ writeFileSync(tempFile, body, 'utf-8');
56
+ try {
57
+ const cmd = `gh issue create --repo "${repo}" --title "${title}" ${labelArgs} --body-file "${tempFile}"`;
58
+ const { stdout } = await execAsync(cmd);
59
+ const issueUrl = stdout.trim();
60
+ return this.parseApprovalResponse(issueUrl, repo, params, expiresAt);
61
+ }
62
+ finally {
63
+ // Clean up temp file
64
+ try {
65
+ unlinkSync(tempFile);
66
+ }
67
+ catch { }
68
+ }
69
+ }
70
+ parseApprovalResponse(issueUrl, repo, params, expiresAt) {
71
+ // Extract issue number from URL
72
+ const issueNumber = parseInt(issueUrl.split('/').pop() || '0');
73
+ const createdAt = new Date().toISOString();
74
+ return {
75
+ requestId: `approval-${params.actionId}`,
76
+ issueNumber,
77
+ issueUrl,
78
+ repo,
79
+ actionId: params.actionId,
80
+ reason: params.reason,
81
+ details: params.details ? JSON.stringify(params.details) : undefined,
82
+ priority: params.priority || 'normal',
83
+ riskScore: params.riskScore,
84
+ status: 'pending',
85
+ createdAt,
86
+ expiresAt
87
+ };
88
+ }
89
+ /**
90
+ * Add approval request to existing task issue
91
+ */
92
+ async addApprovalToTask(params) {
93
+ const repo = params.repo || this.defaultRepo;
94
+ if (!repo)
95
+ throw new Error('Repository required');
96
+ // Add approval label
97
+ await execAsync(`gh issue edit ${params.issueNumber} --repo "${repo}" --add-label "${this.approvalLabel}"`);
98
+ // Add comment with approval details
99
+ const expiresAt = new Date(Date.now() + this.expirationHours * 60 * 60 * 1000).toISOString();
100
+ const comment = this.formatApprovalComment({
101
+ actionId: params.actionId,
102
+ reason: params.reason,
103
+ details: params.details,
104
+ riskScore: params.riskScore,
105
+ violations: params.violations,
106
+ warnings: params.warnings,
107
+ expiresAt
108
+ });
109
+ // Write comment to temp file
110
+ const tempFile = join(tmpdir(), `gh-comment-${Date.now()}.md`);
111
+ writeFileSync(tempFile, comment, 'utf-8');
112
+ try {
113
+ await execAsync(`gh issue comment ${params.issueNumber} --repo "${repo}" --body-file "${tempFile}"`);
114
+ }
115
+ finally {
116
+ try {
117
+ unlinkSync(tempFile);
118
+ }
119
+ catch { }
120
+ }
121
+ }
122
+ /**
123
+ * Check approval status of a GitHub issue
124
+ */
125
+ async checkApprovalStatus(params) {
126
+ const repo = params.repo || this.defaultRepo;
127
+ if (!repo)
128
+ throw new Error('Repository required');
129
+ // Get issue details
130
+ const { stdout } = await execAsync(`gh issue view ${params.issueNumber} --repo "${repo}" --json number,title,url,labels,state,createdAt,comments`);
131
+ const issue = JSON.parse(stdout);
132
+ const labels = issue.labels.map((l) => l.name);
133
+ const hasApprovalLabel = labels.includes(this.approvalLabel);
134
+ const hasApprovedLabel = labels.includes(this.approvedLabel);
135
+ const hasDeniedLabel = labels.includes(this.deniedLabel);
136
+ const isClosed = issue.state === 'CLOSED';
137
+ let status = 'pending';
138
+ if (hasApprovedLabel || (!hasApprovalLabel && !hasDeniedLabel && !isClosed)) {
139
+ status = 'approved';
140
+ }
141
+ else if (hasDeniedLabel || isClosed) {
142
+ status = 'denied';
143
+ }
144
+ // Check comments for /approve or /deny commands
145
+ for (const comment of issue.comments) {
146
+ const body = comment.body?.toLowerCase() || '';
147
+ if (body.includes('/approve')) {
148
+ status = 'approved';
149
+ break;
150
+ }
151
+ if (body.includes('/deny')) {
152
+ status = 'denied';
153
+ break;
154
+ }
155
+ }
156
+ return {
157
+ requestId: `approval-${issue.number}`,
158
+ issueNumber: issue.number,
159
+ issueUrl: issue.url,
160
+ repo,
161
+ actionId: issue.number.toString(),
162
+ reason: issue.title,
163
+ status,
164
+ createdAt: issue.createdAt,
165
+ priority: 'normal'
166
+ };
167
+ }
168
+ /**
169
+ * Approve a request (remove needs-approval label, add approved label)
170
+ */
171
+ async approveRequest(params) {
172
+ const repo = params.repo || this.defaultRepo;
173
+ if (!repo)
174
+ throw new Error('Repository required');
175
+ // Remove needs-approval label and add approved label
176
+ await execAsync(`gh issue edit ${params.issueNumber} --repo "${repo}" --remove-label "${this.approvalLabel}" --add-label "${this.approvedLabel}"`);
177
+ // Add approval comment
178
+ const comment = `✅ **Approved** by ${params.approverId}\n\n${params.comments || 'No comments provided.'}`;
179
+ const tempFile = join(tmpdir(), `gh-approve-${Date.now()}.md`);
180
+ writeFileSync(tempFile, comment, 'utf-8');
181
+ try {
182
+ await execAsync(`gh issue comment ${params.issueNumber} --repo "${repo}" --body-file "${tempFile}"`);
183
+ }
184
+ finally {
185
+ try {
186
+ unlinkSync(tempFile);
187
+ }
188
+ catch { }
189
+ }
190
+ }
191
+ /**
192
+ * Deny a request (add denied label, close issue)
193
+ */
194
+ async denyRequest(params) {
195
+ const repo = params.repo || this.defaultRepo;
196
+ if (!repo)
197
+ throw new Error('Repository required');
198
+ // Add denied label
199
+ await execAsync(`gh issue edit ${params.issueNumber} --repo "${repo}" --add-label "${this.deniedLabel}"`);
200
+ // Add denial comment
201
+ const comment = `❌ **Denied** by ${params.denierId}\n\n${params.reason || 'No reason provided.'}`;
202
+ const tempFile = join(tmpdir(), `gh-deny-${Date.now()}.md`);
203
+ writeFileSync(tempFile, comment, 'utf-8');
204
+ try {
205
+ await execAsync(`gh issue comment ${params.issueNumber} --repo "${repo}" --body-file "${tempFile}"`);
206
+ }
207
+ finally {
208
+ try {
209
+ unlinkSync(tempFile);
210
+ }
211
+ catch { }
212
+ }
213
+ // Close the issue
214
+ await execAsync(`gh issue close ${params.issueNumber} --repo "${repo}" --reason "not planned"`);
215
+ }
216
+ /**
217
+ * Get all pending approval requests
218
+ */
219
+ async getPendingApprovals(repo) {
220
+ const targetRepo = repo || this.defaultRepo;
221
+ if (!targetRepo)
222
+ throw new Error('Repository required');
223
+ const { stdout } = await execAsync(`gh issue list --repo "${targetRepo}" --label "${this.approvalLabel}" --state open --json number,title,url,labels,createdAt --limit 100`);
224
+ const issues = JSON.parse(stdout);
225
+ return issues.map((issue) => ({
226
+ requestId: `approval-${issue.number}`,
227
+ issueNumber: issue.number,
228
+ issueUrl: issue.url,
229
+ repo: targetRepo,
230
+ actionId: issue.number.toString(),
231
+ reason: issue.title,
232
+ status: 'pending',
233
+ createdAt: issue.createdAt,
234
+ priority: this.extractPriority(issue.labels)
235
+ }));
236
+ }
237
+ /**
238
+ * Extract priority from labels
239
+ */
240
+ extractPriority(labels) {
241
+ const labelNames = labels.map(l => l.name);
242
+ if (labelNames.includes('priority:urgent'))
243
+ return 'urgent';
244
+ if (labelNames.includes('priority:high'))
245
+ return 'high';
246
+ if (labelNames.includes('priority:low'))
247
+ return 'low';
248
+ return 'normal';
249
+ }
250
+ /**
251
+ * Format approval issue body
252
+ */
253
+ formatApprovalIssueBody(params) {
254
+ let body = `## 🔐 Approval Required\n\n`;
255
+ body += `**Action:** ${params.action}\n`;
256
+ body += `**Reason:** ${params.reason}\n`;
257
+ body += `**Action ID:** \`${params.actionId}\`\n`;
258
+ if (params.riskScore) {
259
+ const emoji = params.riskScore >= 80 ? '🔴' : params.riskScore >= 60 ? '🟠' : '🟡';
260
+ body += `**Risk Score:** ${emoji} ${params.riskScore}/100\n`;
261
+ }
262
+ body += `**Expires:** ${new Date(params.expiresAt).toLocaleString()}\n\n`;
263
+ if (params.violations && params.violations.length > 0) {
264
+ body += `### ⚠️ Violations\n`;
265
+ params.violations.forEach(v => body += `- ${v}\n`);
266
+ body += `\n`;
267
+ }
268
+ if (params.warnings && params.warnings.length > 0) {
269
+ body += `### ⚡ Warnings\n`;
270
+ params.warnings.forEach(w => body += `- ${w}\n`);
271
+ body += `\n`;
272
+ }
273
+ if (params.details) {
274
+ body += `### 📋 Details\n\`\`\`json\n${JSON.stringify(params.details, null, 2)}\n\`\`\`\n\n`;
275
+ }
276
+ if (params.context) {
277
+ body += `### 🔍 Context\n\`\`\`json\n${JSON.stringify(params.context, null, 2)}\n\`\`\`\n\n`;
278
+ }
279
+ body += `---\n\n`;
280
+ body += `### How to Approve/Deny\n\n`;
281
+ body += `- **Approve:** Remove the \`needs-approval\` label or comment \`/approve\`\n`;
282
+ body += `- **Deny:** Add the \`denied\` label or comment \`/deny\`\n`;
283
+ return body;
284
+ }
285
+ /**
286
+ * Format approval comment for existing task
287
+ */
288
+ formatApprovalComment(params) {
289
+ let comment = `## 🔐 Approval Required for This Task\n\n`;
290
+ comment += `**Reason:** ${params.reason}\n`;
291
+ comment += `**Action ID:** \`${params.actionId}\`\n`;
292
+ if (params.riskScore) {
293
+ const emoji = params.riskScore >= 80 ? '🔴' : params.riskScore >= 60 ? '🟠' : '🟡';
294
+ comment += `**Risk Score:** ${emoji} ${params.riskScore}/100\n`;
295
+ }
296
+ comment += `**Expires:** ${new Date(params.expiresAt).toLocaleString()}\n\n`;
297
+ if (params.violations && params.violations.length > 0) {
298
+ comment += `### ⚠️ Violations\n`;
299
+ params.violations.forEach(v => comment += `- ${v}\n`);
300
+ comment += `\n`;
301
+ }
302
+ if (params.warnings && params.warnings.length > 0) {
303
+ comment += `### ⚡ Warnings\n`;
304
+ params.warnings.forEach(w => comment += `- ${w}\n`);
305
+ comment += `\n`;
306
+ }
307
+ if (params.details) {
308
+ comment += `### 📋 Details\n\`\`\`json\n${JSON.stringify(params.details, null, 2)}\n\`\`\`\n\n`;
309
+ }
310
+ comment += `**To approve:** Remove the \`needs-approval\` label or comment \`/approve\`\n`;
311
+ comment += `**To deny:** Add the \`denied\` label or comment \`/deny\`\n`;
312
+ return comment;
313
+ }
314
+ }
315
+ //# sourceMappingURL=GitHubApprovalManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitHubApprovalManager.js","sourceRoot":"","sources":["../../src/engine/GitHubApprovalManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Enterprise Agent Supervisor - Rate Limiter
3
+ *
4
+ * Token bucket rate limiting with multiple scopes and configurations.
5
+ */
6
+ import type { RateLimitConfig, RateLimitState, ActionCategory } from '../types/index.js';
7
+ export declare class RateLimiter {
8
+ private configs;
9
+ private buckets;
10
+ private lastCleanup;
11
+ private cleanupIntervalMs;
12
+ /**
13
+ * Register a rate limit configuration
14
+ */
15
+ registerLimit(config: RateLimitConfig): void;
16
+ /**
17
+ * Register multiple rate limit configurations
18
+ */
19
+ registerLimits(configs: RateLimitConfig[]): void;
20
+ /**
21
+ * Remove a rate limit configuration
22
+ */
23
+ removeLimit(configId: string): boolean;
24
+ /**
25
+ * Check if an action should be rate limited
26
+ */
27
+ checkLimit(params: {
28
+ agentId?: string;
29
+ sessionId?: string;
30
+ userId?: string;
31
+ actionCategory?: ActionCategory;
32
+ actionType?: string;
33
+ }): {
34
+ allowed: boolean;
35
+ limitId?: string;
36
+ state?: RateLimitState;
37
+ };
38
+ /**
39
+ * Record a request (consume from bucket)
40
+ */
41
+ recordRequest(params: {
42
+ agentId?: string;
43
+ sessionId?: string;
44
+ userId?: string;
45
+ actionCategory?: ActionCategory;
46
+ actionType?: string;
47
+ }): void;
48
+ /**
49
+ * Get current state for a specific limit
50
+ */
51
+ getState(configId: string, params: {
52
+ agentId?: string;
53
+ sessionId?: string;
54
+ userId?: string;
55
+ }): RateLimitState | null;
56
+ /**
57
+ * Get all registered configurations
58
+ */
59
+ getConfigs(): RateLimitConfig[];
60
+ /**
61
+ * Clear all buckets (useful for testing)
62
+ */
63
+ clearBuckets(): void;
64
+ /**
65
+ * Build a bucket key based on scope
66
+ */
67
+ private buildBucketKey;
68
+ /**
69
+ * Get or create a bucket
70
+ */
71
+ private getOrCreateBucket;
72
+ /**
73
+ * Clean up expired buckets to prevent memory leaks
74
+ * Removes buckets that are older than their window duration
75
+ */
76
+ private cleanupExpiredBuckets;
77
+ }
78
+ export declare const rateLimiter: RateLimiter;
79
+ //# sourceMappingURL=RateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/engine/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQzF,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;IAgElE;;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;IA2BR;;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;IAsCzB;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAI/B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAgC9B;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}