computeAuditDiff produces a full AuditDiff combining firewall, MCP tool, and run metrics diffs.
(run1ID, run2ID int64, summary1, summary2 *RunSummary)
| 368 | |
| 369 | // computeAuditDiff produces a full AuditDiff combining firewall, MCP tool, and run metrics diffs. |
| 370 | func computeAuditDiff(run1ID, run2ID int64, summary1, summary2 *RunSummary) *AuditDiff { |
| 371 | auditDiffLog.Printf("Computing full audit diff: run1=%d, run2=%d", run1ID, run2ID) |
| 372 | diff := &AuditDiff{ |
| 373 | Run1ID: run1ID, |
| 374 | Run2ID: run2ID, |
| 375 | } |
| 376 | |
| 377 | var fw1, fw2 *FirewallAnalysis |
| 378 | if summary1 != nil { |
| 379 | fw1 = summary1.FirewallAnalysis |
| 380 | } |
| 381 | if summary2 != nil { |
| 382 | fw2 = summary2.FirewallAnalysis |
| 383 | } |
| 384 | diff.FirewallDiff = computeFirewallDiff(run1ID, run2ID, fw1, fw2) |
| 385 | |
| 386 | var mcp1, mcp2 *MCPToolUsageData |
| 387 | if summary1 != nil { |
| 388 | mcp1 = summary1.MCPToolUsage |
| 389 | } |
| 390 | if summary2 != nil { |
| 391 | mcp2 = summary2.MCPToolUsage |
| 392 | } |
| 393 | if mcp1 != nil || mcp2 != nil { |
| 394 | diff.MCPToolsDiff = computeMCPToolsDiff(mcp1, mcp2) |
| 395 | } |
| 396 | |
| 397 | metricsDiff := computeRunMetricsDiff(summary1, summary2) |
| 398 | if metricsDiff != nil { |
| 399 | diff.RunMetricsDiff = metricsDiff |
| 400 | } |
| 401 | |
| 402 | return diff |
| 403 | } |
| 404 | |
| 405 | // mcpToolKey returns a unique key for an MCP tool given its server and tool name. |
| 406 | func mcpToolKey(serverName, toolName string) string { |