@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.
- package/dist/dashboard/routes/api-handler.d.ts.map +1 -1
- package/dist/dashboard/routes/api-handler.js +2 -0
- package/dist/dashboard/routes/api-handler.js.map +1 -1
- package/dist/hooks/bash-classifier.d.ts.map +1 -1
- package/dist/hooks/bash-classifier.js +4 -0
- package/dist/hooks/bash-classifier.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics/recommendation-engine.d.ts +4 -4
- package/dist/metrics/recommendation-engine.d.ts.map +1 -1
- package/dist/metrics/recommendation-engine.js +18 -22
- package/dist/metrics/recommendation-engine.js.map +1 -1
- package/dist/metrics/trend-analyzer.d.ts +26 -0
- package/dist/metrics/trend-analyzer.d.ts.map +1 -1
- package/dist/metrics/trend-analyzer.js +109 -0
- package/dist/metrics/trend-analyzer.js.map +1 -1
- package/dist/security/audit-trail.d.ts +13 -5
- package/dist/security/audit-trail.d.ts.map +1 -1
- package/dist/security/audit-trail.js +98 -89
- package/dist/security/audit-trail.js.map +1 -1
- package/dist/tools/cross-session-tools.d.ts +36 -0
- package/dist/tools/cross-session-tools.d.ts.map +1 -1
- package/dist/tools/cross-session-tools.js +53 -0
- package/dist/tools/cross-session-tools.js.map +1 -1
- package/dist/transport/log-ingest.d.ts.map +1 -1
- package/dist/transport/log-ingest.js +2 -2
- package/dist/transport/log-ingest.js.map +1 -1
- package/dist/web/assets/{index-DjEevDwH.js → index-Cn5bnoNJ.js} +2 -2
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"trend-analyzer.d.ts","sourceRoot":"","sources":["../../src/metrics/trend-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAoBjF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,qBAAqB,EAAE,eAAe,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,eAAe,EAAE,CAAC;IACnD,QAAQ,CAAC,mBAAmB,EAAE,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,CAAC;IAC1D,QAAQ,CAAC,uBAAuB,EAAE,eAAe,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,mBAAmB,CAAC;AAE5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;CACpD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,SAAM,GAAG,OAAO,CAkB5E;AAqKD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;gBAEhC,OAAO,EAAE;QAAE,YAAY,EAAE,YAAY,CAAA;KAAE;IAInD,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IA2CxE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc;IAoB1D,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAyB9E,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAyB3E,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAmD3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI;IA6B1E,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,yBAAyB;IAiC9F,OAAO,CAAC,iBAAiB;CAQ1B"}
|
|
@@ -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
|
|
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
|
|
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":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAW5D,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,WAAW,GACX,UAAU,GACV,aAAa,GACb,aAAa,GACb,YAAY,GACZ,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
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
|
-
|
|
392
|
+
const alertContext = {
|
|
353
393
|
severity: alert.severity,
|
|
354
394
|
alertType: alert.alertType,
|
|
355
395
|
tool: record.toolName,
|
|
356
396
|
detail,
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
|
|
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,
|