(before, after)
| 1 | import { createComparisonNextAction } from "./presentation.js"; |
| 2 | |
| 3 | export function compareResults(before, after) { |
| 4 | const beforeFailures = new Set( |
| 5 | before.checks.filter((check) => check.status === "fail").map((check) => check.id), |
| 6 | ); |
| 7 | const afterFailures = new Set( |
| 8 | after.checks.filter((check) => check.status === "fail").map((check) => check.id), |
| 9 | ); |
| 10 | |
| 11 | const resolvedFailures = [...beforeFailures].filter((id) => !afterFailures.has(id)); |
| 12 | const newFailures = [...afterFailures].filter((id) => !beforeFailures.has(id)); |
| 13 | |
| 14 | const payload = { |
| 15 | kind: "comparison", |
| 16 | createdAt: new Date().toISOString(), |
| 17 | target: after.target, |
| 18 | scoreDelta: after.summary.score - before.summary.score, |
| 19 | gradeBefore: before.summary.grade, |
| 20 | gradeAfter: after.summary.grade, |
| 21 | riskBefore: before.summary.riskLevel, |
| 22 | riskAfter: after.summary.riskLevel, |
| 23 | budgetDelta: { |
| 24 | trigger_cost_tokens: |
| 25 | (after.budgets.trigger_cost_tokens?.value || 0) - (before.budgets.trigger_cost_tokens?.value || 0), |
| 26 | invoke_cost_tokens: |
| 27 | (after.budgets.invoke_cost_tokens?.value || 0) - (before.budgets.invoke_cost_tokens?.value || 0), |
| 28 | deferred_cost_tokens: |
| 29 | (after.budgets.deferred_cost_tokens?.value || 0) - (before.budgets.deferred_cost_tokens?.value || 0), |
| 30 | }, |
| 31 | resolvedFailures, |
| 32 | newFailures, |
| 33 | beforeSummary: before.summary, |
| 34 | afterSummary: after.summary, |
| 35 | }; |
| 36 | payload.nextAction = createComparisonNextAction(payload); |
| 37 | return payload; |
| 38 | } |
no test coverage detected