@newrelic/preflight 1.41.0 → 1.43.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.
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { MetricAggregator } from '../shared/index.js';
10
10
  import type { SessionStore } from '../storage/session-store.js';
11
+ import { type OutcomeType } from './cost-per-outcome.js';
11
12
  export interface WeeklyDataPoint {
12
13
  readonly week: string;
13
14
  readonly value: number;
@@ -56,6 +57,27 @@ export interface ModelComparison {
56
57
  readonly modelASessionCount: number;
57
58
  readonly modelBSessionCount: number;
58
59
  }
60
+ export interface ModelOutcomeStats {
61
+ readonly model: string;
62
+ readonly sessionCount: number;
63
+ readonly avgCostUsd: number;
64
+ readonly avgEfficiencyScore: number | null;
65
+ readonly avgTaskSuccessRate: number;
66
+ }
67
+ export type ModelRecommendationConfidence = 'high' | 'medium' | 'low' | 'insufficient_data';
68
+ export interface OutcomeModelRanking {
69
+ readonly outcome: OutcomeType;
70
+ readonly ranked: readonly ModelOutcomeStats[];
71
+ readonly recommendedModel: string | null;
72
+ readonly confidence: ModelRecommendationConfidence;
73
+ }
74
+ export interface ModelRecommendationReport {
75
+ readonly ranked: readonly ModelOutcomeStats[];
76
+ readonly recommendedModel: string | null;
77
+ readonly confidence: ModelRecommendationConfidence;
78
+ readonly byOutcome: readonly OutcomeModelRanking[];
79
+ readonly generatedAt: number;
80
+ }
59
81
  /**
60
82
  * Simple moving average over a series of values.
61
83
  * For indices where the full window is not available, uses whatever
@@ -88,6 +110,10 @@ export declare class TrendAnalyzer {
88
110
  detectModelMigrationImpact(modelA: string, modelB: string): ModelComparison;
89
111
  generateWeekSummary(weekId: string): string;
90
112
  emitWeeklySummaryEvent(weekId: string, aggregator: MetricAggregator): void;
113
+ rankModelsByOutcome(options?: {
114
+ developer?: string;
115
+ since?: Date;
116
+ }): ModelRecommendationReport;
91
117
  private loadWeekAggregate;
92
118
  }
93
119
  //# sourceMappingURL=trend-analyzer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trend-analyzer.d.ts","sourceRoot":"","sources":["../../src/metrics/trend-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trend-analyzer.d.ts","sourceRoot":"","sources":["../../src/metrics/trend-analyzer.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,18 @@
8
8
  */
9
9
  import { createLogger } from '../shared/index.js';
10
10
  import { getIsoWeekId, getWeekDateRange } from '../storage/weekly-summary.js';
11
+ import { classifySessionOutcome } from './cost-per-outcome.js';
12
+ // Canonical display order for outcome breakdowns — matches the order
13
+ // OutcomeType is declared in cost-per-outcome.ts, not session iteration order.
14
+ const OUTCOME_ORDER = [
15
+ 'bug_fix',
16
+ 'feature',
17
+ 'refactor',
18
+ 'investigation',
19
+ 'configuration',
20
+ 'documentation',
21
+ 'failed_attempt',
22
+ ];
11
23
  const logger = createLogger('trend-analyzer');
12
24
  // ---------------------------------------------------------------------------
13
25
  // Statistical helpers
@@ -119,6 +131,81 @@ function groupByWeek(sessions) {
119
131
  }
120
132
  return groups;
121
133
  }
134
+ // Minimum sessions-on-the-top-ranked-model before a recommendation is
135
+ // trusted at each confidence tier. Hand-picked judgment calls, not derived
136
+ // from data — tune here if this fires too often or too rarely in practice.
137
+ const MIN_SESSIONS_LOW_CONFIDENCE = 3;
138
+ const MIN_SESSIONS_MEDIUM_CONFIDENCE = 8;
139
+ const MIN_SESSIONS_HIGH_CONFIDENCE = 20;
140
+ // A model only "wins" if it beats the runner-up by a real margin, not just
141
+ // noise — same hand-picked-judgment-call caveat as the sample thresholds
142
+ // above. On the [0,1] efficiency scale, 0.05 is treated as the smallest gap
143
+ // worth acting on.
144
+ const MIN_MEANINGFUL_EFFICIENCY_GAP = 0.05;
145
+ function confidenceForSampleSize(n) {
146
+ if (n >= MIN_SESSIONS_HIGH_CONFIDENCE)
147
+ return 'high';
148
+ if (n >= MIN_SESSIONS_MEDIUM_CONFIDENCE)
149
+ return 'medium';
150
+ if (n >= MIN_SESSIONS_LOW_CONFIDENCE)
151
+ return 'low';
152
+ return 'insufficient_data';
153
+ }
154
+ function rankModelsForSessions(sessions) {
155
+ const byModel = new Map();
156
+ for (const s of sessions) {
157
+ if (!s.model)
158
+ continue;
159
+ const group = byModel.get(s.model) ?? [];
160
+ group.push(s);
161
+ byModel.set(s.model, group);
162
+ }
163
+ const ranked = [];
164
+ for (const [model, group] of byModel) {
165
+ const agg = aggregateWeek(group);
166
+ ranked.push({
167
+ model,
168
+ sessionCount: group.length,
169
+ avgCostUsd: round(agg.cost / group.length, 4),
170
+ avgEfficiencyScore: agg.efficiency,
171
+ avgTaskSuccessRate: agg.taskSuccess,
172
+ });
173
+ }
174
+ // Higher efficiency first; sessions with no scored tasks (null) sort last;
175
+ // ties broken by lower cost.
176
+ ranked.sort((a, b) => {
177
+ if (a.avgEfficiencyScore === null && b.avgEfficiencyScore === null) {
178
+ return a.avgCostUsd - b.avgCostUsd;
179
+ }
180
+ if (a.avgEfficiencyScore === null)
181
+ return 1;
182
+ if (b.avgEfficiencyScore === null)
183
+ return -1;
184
+ if (b.avgEfficiencyScore !== a.avgEfficiencyScore) {
185
+ return b.avgEfficiencyScore - a.avgEfficiencyScore;
186
+ }
187
+ return a.avgCostUsd - b.avgCostUsd;
188
+ });
189
+ const top = ranked[0];
190
+ const runnerUp = ranked[1];
191
+ // A recommendation requires a real comparison: a runner-up backed by
192
+ // enough of its own sessions to not be noise, and a gap between the two
193
+ // large enough to not be noise either. Without both, there's nothing
194
+ // confidently recommendable — regardless of how many sessions the
195
+ // leader alone has. This also correctly handles the case of only one
196
+ // model ever being used: no runner-up means no comparison happened.
197
+ const hasComparableRunnerUp = runnerUp != null && runnerUp.sessionCount >= MIN_SESSIONS_LOW_CONFIDENCE;
198
+ const hasMeaningfulGap = hasComparableRunnerUp &&
199
+ top.avgEfficiencyScore !== null &&
200
+ runnerUp.avgEfficiencyScore !== null &&
201
+ top.avgEfficiencyScore - runnerUp.avgEfficiencyScore >= MIN_MEANINGFUL_EFFICIENCY_GAP;
202
+ const confidence = top && hasMeaningfulGap ? confidenceForSampleSize(top.sessionCount) : 'insufficient_data';
203
+ return {
204
+ ranked,
205
+ recommendedModel: confidence === 'insufficient_data' ? null : (top?.model ?? null),
206
+ confidence,
207
+ };
208
+ }
122
209
  // ---------------------------------------------------------------------------
123
210
  // TrendAnalyzer
124
211
  // ---------------------------------------------------------------------------
@@ -286,6 +373,28 @@ export class TrendAnalyzer {
286
373
  }
287
374
  logger.debug('Weekly trend metrics emitted', { weekId, developers: byDeveloper.size });
288
375
  }
376
+ rankModelsByOutcome(options) {
377
+ let sessions = this.sessionStore.loadAllSessions({ since: options?.since });
378
+ if (options?.developer) {
379
+ sessions = sessions.filter((s) => s.developer === options.developer);
380
+ }
381
+ const overall = rankModelsForSessions(sessions);
382
+ const byOutcomeSessions = new Map();
383
+ for (const s of sessions) {
384
+ const outcome = classifySessionOutcome(s);
385
+ const group = byOutcomeSessions.get(outcome) ?? [];
386
+ group.push(s);
387
+ byOutcomeSessions.set(outcome, group);
388
+ }
389
+ const byOutcome = OUTCOME_ORDER.filter((outcome) => byOutcomeSessions.has(outcome)).map((outcome) => ({ outcome, ...rankModelsForSessions(byOutcomeSessions.get(outcome)) }));
390
+ return {
391
+ ranked: overall.ranked,
392
+ recommendedModel: overall.recommendedModel,
393
+ confidence: overall.confidence,
394
+ byOutcome,
395
+ generatedAt: Date.now(),
396
+ };
397
+ }
289
398
  // ---------------------------------------------------------------------------
290
399
  // Private
291
400
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"trend-analyzer.js","sourceRoot":"","sources":["../../src/metrics/trend-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trend-analyzer.js","sourceRoot":"","sources":["../../src/metrics/trend-analyzer.ts"],"names":[],"mappings":"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"}
@@ -14,13 +14,18 @@ export interface SecurityAlert {
14
14
  readonly alertType: string;
15
15
  readonly description: string;
16
16
  }
17
- export interface AuditRecord {
17
+ export interface AuditAttribution {
18
+ readonly sessionId: string | null;
19
+ /** Subagent that made the call. Absent for the parent session. Same id space as AiToolCall.agent_id. */
20
+ readonly agentId?: string;
21
+ readonly agentType?: string;
22
+ }
23
+ export interface AuditRecord extends AuditAttribution {
18
24
  /** Stable per-call id, sourced from `ToolCallRecord.id`/`ProxyToolCallRecord.id` — lets
19
25
  * consumers (e.g. the Audit page's React key) distinguish two entries that otherwise
20
26
  * share the same timestamp/tool/detail. */
21
27
  readonly id: string;
22
28
  readonly timestamp: number;
23
- readonly sessionId: string | null;
24
29
  readonly action: AuditAction;
25
30
  readonly tool: string;
26
31
  readonly detail: string;
@@ -37,6 +42,8 @@ export interface AuditMetrics {
37
42
  export declare const DEFAULT_SENSITIVE_FILE_PATTERNS: RegExp[];
38
43
  export declare const DEFAULT_DESTRUCTIVE_COMMAND_PATTERNS: RegExp[];
39
44
  export declare const DEFAULT_NETWORK_COMMAND_PATTERNS: RegExp[];
45
+ export declare const DEFAULT_DELETION_COMMAND_PATTERNS: RegExp[];
46
+ export declare function attachAuditAttribution(target: Record<string, string | number | boolean>, source: AuditAttribution): void;
40
47
  export declare function auditRecordToNrEvent(record: AuditRecord, attrs?: {
41
48
  teamId?: string | null;
42
49
  projectId?: string | null;
@@ -55,15 +62,15 @@ export interface AuditTrailManagerOptions {
55
62
  sensitivePatterns?: RegExp[];
56
63
  destructivePatterns?: RegExp[];
57
64
  networkPatterns?: RegExp[];
65
+ /** Non-recursive delete detection (medium). Pass [] to disable. Defaults to DEFAULT_DELETION_COMMAND_PATTERNS. */
66
+ deletionPatterns?: RegExp[];
58
67
  /** Optional local store for persisting each audit record to disk immediately. */
59
68
  localStore?: LocalStore;
60
69
  }
61
70
  export declare class AuditTrailManager {
62
71
  private readonly developer;
63
72
  private sessionId;
64
- private readonly sensitivePatterns;
65
- private readonly destructivePatterns;
66
- private readonly networkPatterns;
73
+ private readonly rules;
67
74
  private readonly localStore;
68
75
  private entries;
69
76
  private sensitiveAccessLog;
@@ -81,6 +88,7 @@ export declare class AuditTrailManager {
81
88
  constructor(options: AuditTrailManagerOptions);
82
89
  recordToolCall(record: ToolCallRecord): AuditRecord;
83
90
  recordProxyCall(record: ProxyToolCallRecord): AuditRecord;
91
+ private commit;
84
92
  /**
85
93
  * Merges this process's own in-memory `entries` (capped at
86
94
  * `MAX_ENTRIES`, evicted FIFO) with every process's persisted history from
@@ -1 +1 @@
1
- {"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/security/audit-trail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/security/audit-trail.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,10 @@ export const DEFAULT_DESTRUCTIVE_COMMAND_PATTERNS = [
36
36
  /\bgit\s+push\s+--force(?!-(?:with-lease|if-includes))\b/i,
37
37
  /\bgit\s+push\s+-f\b/i,
38
38
  /\bgit\s+reset\s+--hard\b/i,
39
+ // git clean only deletes with -f/--force (clean.requireForce defaults to true);
40
+ // -n/--dry-run and bare `git clean` are safe and stay unflagged.
41
+ /\bgit\s+clean\b(?=.*\s(?:-[a-zA-Z]*f[a-zA-Z]*|--force)\b)/i,
42
+ /\bfind\b.*\s-delete\b/i,
39
43
  /\bDROP\s+TABLE\b/i,
40
44
  /\bDROP\s+DATABASE\b/i,
41
45
  /\bDELETE\s+FROM\b/i,
@@ -52,6 +56,21 @@ export const DEFAULT_NETWORK_COMMAND_PATTERNS = [
52
56
  /\bnc\b/,
53
57
  /\bssh\b/,
54
58
  ];
59
+ const RM_OR_UNLINK_IN_COMMAND_POSITION = /(?:^|[;&|(])\s*(?:sudo\s+)?(?:rm|unlink)\s/m;
60
+ export const DEFAULT_DELETION_COMMAND_PATTERNS = [RM_OR_UNLINK_IN_COMMAND_POSITION];
61
+ const ATTRIBUTION_WIRE_KEYS = {
62
+ sessionId: 'session_id',
63
+ agentId: 'agent_id',
64
+ agentType: 'agent_type',
65
+ };
66
+ const ATTRIBUTION_KEYS = Object.keys(ATTRIBUTION_WIRE_KEYS);
67
+ export function attachAuditAttribution(target, source) {
68
+ for (const key of ATTRIBUTION_KEYS) {
69
+ const value = source[key];
70
+ if (typeof value === 'string')
71
+ target[ATTRIBUTION_WIRE_KEYS[key]] = value;
72
+ }
73
+ }
55
74
  // ---------------------------------------------------------------------------
56
75
  // Tool name → AuditAction mapping
57
76
  // ---------------------------------------------------------------------------
@@ -98,50 +117,59 @@ function buildDetail(record) {
98
117
  function matchesAny(value, patterns) {
99
118
  return patterns.some((p) => p.test(value));
100
119
  }
101
- function detectSecurityAlert(record, sensitivePatterns, destructivePatterns, networkPatterns) {
102
- const command = record.command;
103
- const filePath = record.filePath;
104
- // Defense in depth: the classifier's verdict and the pattern lists are
105
- // OR-ed together. Either layer flagging is enough to alert. We deliberately
106
- // do NOT short-circuit on `bashDestructive === false` — the two layers can
107
- // diverge (the classifier and the audit pattern list maintain independent
108
- // regexes), so treating the classifier as authoritative would let a
109
- // narrower classifier silently suppress a hit the audit list would have
110
- // caught. Treat the classifier as additive, not authoritative, for
111
- // security-critical decisions.
112
- const classifierDestructive = record.bashDestructive === true;
113
- const classifierNetwork = record.bashNetwork === true;
114
- // Destructive commands (critical) — check first, highest priority
115
- if (command) {
116
- const isDestructive = classifierDestructive || matchesAny(command, destructivePatterns);
117
- if (isDestructive) {
118
- return {
119
- severity: 'critical',
120
- alertType: 'destructive_command',
121
- description: `Destructive command detected: ${redactSensitive(command)}`,
122
- };
123
- }
124
- }
125
- // Sensitive file access (high)
126
- if (filePath && matchesAny(filePath, sensitivePatterns)) {
127
- return {
128
- severity: 'high',
120
+ const SEVERITY_RANK = { critical: 3, high: 2, medium: 1 };
121
+ function buildAlertRules(p) {
122
+ return [
123
+ {
124
+ alertType: 'destructive_command',
125
+ severity: 'critical',
126
+ subject: 'command',
127
+ patterns: p.destructive,
128
+ classifierHit: (r) => r.bashDestructive === true,
129
+ describe: (c) => `Destructive command detected: ${c}`,
130
+ },
131
+ {
129
132
  alertType: 'sensitive_file',
130
- description: `Sensitive file accessed: ${redactSensitive(filePath)}`,
133
+ severity: 'high',
134
+ subject: 'filePath',
135
+ patterns: p.sensitive,
136
+ describe: (f) => `Sensitive file accessed: ${f}`,
137
+ },
138
+ {
139
+ alertType: 'external_network',
140
+ severity: 'medium',
141
+ subject: 'command',
142
+ patterns: p.network,
143
+ classifierHit: (r) => r.bashNetwork === true,
144
+ describe: (c) => `External network request: ${c}`,
145
+ },
146
+ {
147
+ alertType: 'file_deletion',
148
+ severity: 'medium',
149
+ subject: 'command',
150
+ patterns: p.deletion,
151
+ classifierHit: (r) => r.bashLeading === 'rm' || r.bashLeading === 'unlink',
152
+ describe: (c) => `File deletion: ${c}`,
153
+ },
154
+ ];
155
+ }
156
+ function detectSecurityAlert(record, rules) {
157
+ let best;
158
+ for (const rule of rules) {
159
+ const value = record[rule.subject];
160
+ if (typeof value !== 'string' || value.length === 0)
161
+ continue;
162
+ if (!rule.classifierHit?.(record) && !matchesAny(value, rule.patterns))
163
+ continue;
164
+ if (best && SEVERITY_RANK[best.severity] >= SEVERITY_RANK[rule.severity])
165
+ continue;
166
+ best = {
167
+ severity: rule.severity,
168
+ alertType: rule.alertType,
169
+ description: rule.describe(redactSensitive(value)),
131
170
  };
132
171
  }
133
- // External network request (medium) — only for Bash commands
134
- if (command) {
135
- const isNetwork = classifierNetwork || matchesAny(command, networkPatterns);
136
- if (isNetwork) {
137
- return {
138
- severity: 'medium',
139
- alertType: 'external_network',
140
- description: `External network request: ${redactSensitive(command)}`,
141
- };
142
- }
143
- }
144
- return undefined;
172
+ return best;
145
173
  }
146
174
  // ---------------------------------------------------------------------------
147
175
  // NR Event helpers
@@ -157,8 +185,7 @@ export function auditRecordToNrEvent(record, attrs) {
157
185
  developer: record.developer,
158
186
  };
159
187
  attachTeamAttribution(event, attrs ?? {});
160
- if (record.sessionId != null)
161
- event.session_id = record.sessionId;
188
+ attachAuditAttribution(event, record);
162
189
  if (record.filePath != null)
163
190
  event.file_path = redactSensitive(record.filePath);
164
191
  if (record.command != null)
@@ -188,8 +215,7 @@ export function securityAlertToNrEvent(record, attrs) {
188
215
  developer: record.developer,
189
216
  };
190
217
  attachTeamAttribution(event, attrs ?? {});
191
- if (record.sessionId != null)
192
- event.session_id = record.sessionId;
218
+ attachAuditAttribution(event, record);
193
219
  if (record.filePath != null)
194
220
  event.file_path = redactSensitive(record.filePath);
195
221
  if (record.command != null)
@@ -254,6 +280,8 @@ function auditEntryToRecord(entry) {
254
280
  const sessionId = typeof rawSessionId === 'string' && !isSyntheticSessionId(rawSessionId) ? rawSessionId : null;
255
281
  const filePath = typeof entry.filePath === 'string' ? entry.filePath : undefined;
256
282
  const command = typeof entry.command === 'string' ? entry.command : undefined;
283
+ const agentId = typeof entry.agentId === 'string' && entry.agentId.length > 0 ? entry.agentId : undefined;
284
+ const agentType = typeof entry.agentType === 'string' && entry.agentType.length > 0 ? entry.agentType : undefined;
257
285
  // Disk entries written before this field was introduced have no `id`; fall
258
286
  // back to the same content fingerprint used for cross-process dedup below.
259
287
  // That fingerprint isn't guaranteed unique across two distinct legacy
@@ -278,6 +306,8 @@ function auditEntryToRecord(entry) {
278
306
  id,
279
307
  timestamp,
280
308
  sessionId,
309
+ agentId,
310
+ agentType,
281
311
  action,
282
312
  tool,
283
313
  detail,
@@ -297,9 +327,7 @@ function auditIdentityKey(r) {
297
327
  export class AuditTrailManager {
298
328
  developer;
299
329
  sessionId;
300
- sensitivePatterns;
301
- destructivePatterns;
302
- networkPatterns;
330
+ rules;
303
331
  localStore;
304
332
  entries = [];
305
333
  sensitiveAccessLog = [];
@@ -317,21 +345,33 @@ export class AuditTrailManager {
317
345
  constructor(options) {
318
346
  this.developer = options.developer;
319
347
  this.sessionId = options.sessionId;
320
- this.sensitivePatterns = options.sensitivePatterns ?? DEFAULT_SENSITIVE_FILE_PATTERNS;
321
- this.destructivePatterns = options.destructivePatterns ?? DEFAULT_DESTRUCTIVE_COMMAND_PATTERNS;
322
- this.networkPatterns = options.networkPatterns ?? DEFAULT_NETWORK_COMMAND_PATTERNS;
348
+ this.rules = buildAlertRules({
349
+ sensitive: options.sensitivePatterns ?? DEFAULT_SENSITIVE_FILE_PATTERNS,
350
+ destructive: options.destructivePatterns ?? DEFAULT_DESTRUCTIVE_COMMAND_PATTERNS,
351
+ network: options.networkPatterns ?? DEFAULT_NETWORK_COMMAND_PATTERNS,
352
+ deletion: options.deletionPatterns ?? DEFAULT_DELETION_COMMAND_PATTERNS,
353
+ });
323
354
  this.localStore = options.localStore ?? null;
324
355
  }
325
356
  recordToolCall(record) {
326
357
  const action = classifyTool(record.toolName);
327
358
  const detail = buildDetail(record);
328
- const alert = detectSecurityAlert(record, this.sensitivePatterns, this.destructivePatterns, this.networkPatterns);
359
+ return this.commit(record, action, detail);
360
+ }
361
+ recordProxyCall(record) {
362
+ const detail = `McpToolCall: ${record.serverName}/${record.toolName}`;
363
+ return this.commit(record, 'McpToolCall', detail);
364
+ }
365
+ commit(record, action, detail) {
366
+ const alert = detectSecurityAlert(record, this.rules);
329
367
  const rawFilePath = record.filePath;
330
368
  const rawCommand = record.command;
331
369
  const auditRecord = {
332
370
  id: record.id,
333
371
  timestamp: record.timestamp,
334
372
  sessionId: resolveAuditSessionId(record.sessionId, this.sessionId),
373
+ agentId: typeof record.agentId === 'string' ? record.agentId : undefined,
374
+ agentType: typeof record.agentType === 'string' ? record.agentType : undefined,
335
375
  action,
336
376
  tool: record.toolName,
337
377
  detail,
@@ -349,47 +389,14 @@ export class AuditTrailManager {
349
389
  if (this.sensitiveAccessLog.length >= AuditTrailManager.MAX_ENTRIES)
350
390
  this.sensitiveAccessLog.shift();
351
391
  this.sensitiveAccessLog.push(auditRecord);
352
- logger.warn('Security alert', {
392
+ const alertContext = {
353
393
  severity: alert.severity,
354
394
  alertType: alert.alertType,
355
395
  tool: record.toolName,
356
396
  detail,
357
- });
358
- }
359
- this.persistToDisk(auditRecord);
360
- return auditRecord;
361
- }
362
- recordProxyCall(record) {
363
- const detail = `McpToolCall: ${record.serverName}/${record.toolName}`;
364
- const filePath = record.filePath;
365
- const command = record.command;
366
- const alert = detectSecurityAlert(record, this.sensitivePatterns, this.destructivePatterns, this.networkPatterns);
367
- const auditRecord = {
368
- id: record.id,
369
- timestamp: record.timestamp,
370
- sessionId: resolveAuditSessionId(record.sessionId, this.sessionId),
371
- action: 'McpToolCall',
372
- tool: record.toolName,
373
- detail,
374
- developer: this.developer,
375
- // Same redaction policy as recordToolCall — see comment there.
376
- filePath: filePath != null ? redactSensitive(filePath) : undefined,
377
- command: command != null ? redactSensitive(command) : undefined,
378
- securityAlert: alert,
379
- };
380
- if (this.entries.length >= AuditTrailManager.MAX_ENTRIES)
381
- this.entries.shift();
382
- this.entries.push(auditRecord);
383
- if (alert) {
384
- if (this.sensitiveAccessLog.length >= AuditTrailManager.MAX_ENTRIES)
385
- this.sensitiveAccessLog.shift();
386
- this.sensitiveAccessLog.push(auditRecord);
387
- logger.warn('Security alert', {
388
- severity: alert.severity,
389
- alertType: alert.alertType,
390
- tool: record.toolName,
391
- detail,
392
- });
397
+ };
398
+ attachAuditAttribution(alertContext, auditRecord);
399
+ logger.warn('Security alert', alertContext);
393
400
  }
394
401
  this.persistToDisk(auditRecord);
395
402
  return auditRecord;
@@ -475,6 +482,8 @@ export class AuditTrailManager {
475
482
  developer: record.developer,
476
483
  filePath: record.filePath,
477
484
  command: record.command,
485
+ agentId: record.agentId,
486
+ agentType: record.agentType,
478
487
  securityAlert: record.securityAlert
479
488
  ? { severity: record.securityAlert.severity, alertType: record.securityAlert.alertType }
480
489
  : undefined,