forked from microsoft/agent-governance-toolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauditLogger.ts
More file actions
154 lines (131 loc) · 3.75 KB
/
auditLogger.ts
File metadata and controls
154 lines (131 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
/**
* Audit Logger for Agent OS VS Code Extension
*
* Logs all policy enforcement actions, blocked code, and CMVK reviews.
*/
import * as vscode from 'vscode';
export interface AuditEntry {
type: 'blocked' | 'warning' | 'allowed' | 'cmvk_review';
timestamp: Date;
file?: string;
language?: string;
code?: string;
violation?: string;
reason?: string;
result?: any;
}
export class AuditLogger {
private logs: AuditEntry[] = [];
private storageKey = 'agent-os.auditLogs';
private context: vscode.ExtensionContext;
private maxLogs = 1000;
constructor(context: vscode.ExtensionContext) {
this.context = context;
this.loadLogs();
this.cleanOldLogs();
}
/**
* Log an audit entry
*/
log(entry: AuditEntry): void {
this.logs.unshift(entry);
// Trim to max size
if (this.logs.length > this.maxLogs) {
this.logs = this.logs.slice(0, this.maxLogs);
}
this.saveLogs();
}
/**
* Get all logs
*/
getAll(): AuditEntry[] {
return [...this.logs];
}
/**
* Get recent logs (last N entries)
*/
getRecent(count: number = 10): AuditEntry[] {
return this.logs.slice(0, count);
}
/**
* Get logs by type
*/
getByType(type: AuditEntry['type']): AuditEntry[] {
return this.logs.filter(log => log.type === type);
}
/**
* Get logs for today
*/
getToday(): AuditEntry[] {
const today = new Date();
today.setHours(0, 0, 0, 0);
return this.logs.filter(log => new Date(log.timestamp) >= today);
}
/**
* Get logs for this week
*/
getThisWeek(): AuditEntry[] {
const weekAgo = new Date();
weekAgo.setDate(weekAgo.getDate() - 7);
return this.logs.filter(log => new Date(log.timestamp) >= weekAgo);
}
/**
* Get statistics
*/
getStats(): {
blockedToday: number;
blockedThisWeek: number;
warningsToday: number;
cmvkReviewsToday: number;
totalLogs: number;
} {
const todayLogs = this.getToday();
const weekLogs = this.getThisWeek();
return {
blockedToday: todayLogs.filter(l => l.type === 'blocked').length,
blockedThisWeek: weekLogs.filter(l => l.type === 'blocked').length,
warningsToday: todayLogs.filter(l => l.type === 'warning').length,
cmvkReviewsToday: todayLogs.filter(l => l.type === 'cmvk_review').length,
totalLogs: this.logs.length
};
}
/**
* Clear all logs
*/
clear(): void {
this.logs = [];
this.saveLogs();
}
/**
* Load logs from storage
*/
private loadLogs(): void {
const stored = this.context.globalState.get<AuditEntry[]>(this.storageKey, []);
this.logs = stored.map(log => ({
...log,
timestamp: new Date(log.timestamp)
}));
}
/**
* Save logs to storage
*/
private saveLogs(): void {
this.context.globalState.update(this.storageKey, this.logs);
}
/**
* Clean logs older than retention period
*/
private cleanOldLogs(): void {
const config = vscode.workspace.getConfiguration('agentOS');
const retentionDays = config.get<number>('audit.retentionDays', 7);
const cutoff = new Date();
cutoff.setDate(cutoff.getDate() - retentionDays);
const originalCount = this.logs.length;
this.logs = this.logs.filter(log => new Date(log.timestamp) >= cutoff);
if (this.logs.length !== originalCount) {
this.saveLogs();
}
}
}