@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.
- package/LICENSE +21 -0
- package/README.md +446 -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 +104 -0
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/CSSAnalyzer.js +578 -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/AppMonitor.d.ts +162 -0
- package/dist/engine/AppMonitor.d.ts.map +1 -0
- package/dist/engine/AppMonitor.js +754 -0
- package/dist/engine/AppMonitor.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +138 -0
- package/dist/engine/AuditLogger.d.ts.map +1 -0
- package/dist/engine/AuditLogger.js +448 -0
- package/dist/engine/AuditLogger.js.map +1 -0
- package/dist/engine/GitHubApprovalManager.d.ts +106 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
- package/dist/engine/GitHubApprovalManager.js +315 -0
- package/dist/engine/GitHubApprovalManager.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +79 -0
- package/dist/engine/RateLimiter.d.ts.map +1 -0
- package/dist/engine/RateLimiter.js +232 -0
- package/dist/engine/RateLimiter.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +77 -0
- package/dist/engine/RulesEngine.d.ts.map +1 -0
- package/dist/engine/RulesEngine.js +400 -0
- package/dist/engine/RulesEngine.js.map +1 -0
- package/dist/engine/TaskManager.d.ts +173 -0
- package/dist/engine/TaskManager.d.ts.map +1 -0
- package/dist/engine/TaskManager.js +678 -0
- package/dist/engine/TaskManager.js.map +1 -0
- package/dist/engine/index.d.ts +9 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +9 -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 +138 -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 +304 -0
- package/dist/rules/compliance.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 +1239 -0
- package/dist/rules/css.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 +155 -0
- package/dist/rules/flask.js.map +1 -0
- package/dist/rules/index.d.ts +607 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +401 -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 +150 -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/security.d.ts +9 -0
- package/dist/rules/security.d.ts.map +1 -0
- package/dist/rules/security.js +287 -0
- package/dist/rules/security.js.map +1 -0
- package/dist/rules/storage.d.ts +7 -0
- package/dist/rules/storage.d.ts.map +1 -0
- package/dist/rules/storage.js +134 -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 +140 -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 +136 -0
- package/dist/rules/websocket.js.map +1 -0
- package/dist/server.d.ts +49 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2330 -0
- package/dist/server.js.map +1 -0
- package/dist/supervisor/AgentSupervisor.d.ts +235 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
- package/dist/supervisor/AgentSupervisor.js +596 -0
- package/dist/supervisor/AgentSupervisor.js.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts +48 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.js +145 -0
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
- package/dist/supervisor/ProjectTracker.d.ts +188 -0
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
- package/dist/supervisor/ProjectTracker.js +617 -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/types/index.d.ts +1176 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +391 -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 +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.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 +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"}
|