@pagopa/dx-savemoney 0.6.3 → 0.6.5
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/README.md +38 -0
- package/dist/azure/analyzer.d.ts.map +1 -1
- package/dist/azure/analyzer.js +42 -16
- package/dist/azure/analyzer.js.map +1 -1
- package/dist/azure/analyzers/advisor.js +11 -0
- package/dist/azure/analyzers/advisor.js.map +1 -1
- package/dist/azure/azqr.d.ts +3 -3
- package/dist/azure/azqr.d.ts.map +1 -1
- package/dist/azure/azqr.js +26 -4
- package/dist/azure/azqr.js.map +1 -1
- package/dist/azure/finding-category.d.ts +45 -0
- package/dist/azure/finding-category.d.ts.map +1 -0
- package/dist/azure/finding-category.js +65 -0
- package/dist/azure/finding-category.js.map +1 -0
- package/dist/azure/finding-code.d.ts +46 -0
- package/dist/azure/finding-code.d.ts.map +1 -0
- package/dist/azure/finding-code.js +127 -0
- package/dist/azure/finding-code.js.map +1 -0
- package/dist/azure/finding-dedup.d.ts +44 -0
- package/dist/azure/finding-dedup.d.ts.map +1 -0
- package/dist/azure/finding-dedup.js +132 -0
- package/dist/azure/finding-dedup.js.map +1 -0
- package/dist/finding.d.ts +19 -7
- package/dist/finding.d.ts.map +1 -1
- package/dist/finding.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
- package/src/azure/__tests__/azqr.test.ts +45 -1
- package/src/azure/__tests__/finding-category.test.ts +68 -0
- package/src/azure/__tests__/finding-code.test.ts +128 -0
- package/src/azure/__tests__/finding-dedup.test.ts +269 -0
- package/src/azure/analyzer.ts +54 -18
- package/src/azure/analyzers/__tests__/advisor.test.ts +60 -0
- package/src/azure/analyzers/advisor.ts +14 -0
- package/src/azure/azqr.ts +28 -4
- package/src/azure/finding-category.ts +75 -0
- package/src/azure/finding-code.ts +148 -0
- package/src/azure/finding-dedup.ts +157 -0
- package/src/finding.ts +19 -7
- package/src/types.ts +16 -0
package/README.md
CHANGED
|
@@ -77,6 +77,7 @@ yarn add @pagopa/dx-savemoney
|
|
|
77
77
|
- **Intelligent Detection**: Uses Azure Monitor metrics (e.g. CPU, network traffic, transactions) to scientifically identify inactive resources.
|
|
78
78
|
- **Azure Advisor Integration**: Fetches Cost recommendations directly from Azure Advisor, including Reserved Instance and Savings Plan opportunities with estimated monthly savings.
|
|
79
79
|
- **Orphaned Resource Identification**: Detects commonly "forgotten" resources like unattached disks, unassociated public IPs, and unused network interfaces.
|
|
80
|
+
- **Cross-Source Deduplication**: Findings reported by more than one source (live scan, Azure Advisor, AZQR) are collapsed onto a single entry, keeping the one that carries the monetary estimate.
|
|
80
81
|
- **Flexible Reporting**: Offers multiple output formats:
|
|
81
82
|
- `table`: A human-readable summary for the terminal.
|
|
82
83
|
- `json`: Standard format for integration with other tools.
|
|
@@ -123,6 +124,9 @@ All resources are also checked for:
|
|
|
123
124
|
- **Missing tags**: Resources without tags are flagged as potentially unmanaged
|
|
124
125
|
- **Location mismatch**: Resources not in the preferred location are reported
|
|
125
126
|
|
|
127
|
+
Both are governance signals, not billable waste, so they are reported under the
|
|
128
|
+
`operationalExcellence` category and never carry a saving estimate.
|
|
129
|
+
|
|
126
130
|
### Prerequisites
|
|
127
131
|
|
|
128
132
|
1. **Node.js**: Version 22 or higher.
|
|
@@ -375,6 +379,40 @@ Notes:
|
|
|
375
379
|
verifying they are unused.
|
|
376
380
|
- AZQR carries no monetary estimate, so these findings have no per-finding
|
|
377
381
|
saving amount; they surface as opportunities to review.
|
|
382
|
+
- **Cross-source deduplication.** An AZQR row is dropped when the live scan
|
|
383
|
+
already reports the same problem on the same resource (see below).
|
|
384
|
+
|
|
385
|
+
#### Cross-Source Deduplication
|
|
386
|
+
|
|
387
|
+
The three sources overlap: an unattached disk is waste whether it is spotted by
|
|
388
|
+
the live analyzers, by Azure Advisor, or by AZQR. Findings are therefore
|
|
389
|
+
unified on the `resourceId + recommendationId` key, where `recommendationId` is
|
|
390
|
+
normalised onto a shared vocabulary — orphaned resources become
|
|
391
|
+
`orphan.<resourceType>` regardless of which source detected them.
|
|
392
|
+
|
|
393
|
+
When an AZQR row collides with an already-collected finding, the AZQR row is
|
|
394
|
+
dropped and the surviving finding keeps the highest severity, the only
|
|
395
|
+
available monetary estimate, and gains a short note recording the corroborating
|
|
396
|
+
source (e.g. `Also flagged by azqr as an orphaned resource.`). This keeps a
|
|
397
|
+
resource on a single line of the report while preserving its provenance.
|
|
398
|
+
|
|
399
|
+
Only findings that carry a `recommendationId` participate. Custom analyzer
|
|
400
|
+
sentences with a known template (e.g. `Disk is unattached.`, `Very low CPU
|
|
401
|
+
usage (...)`) get a stable `custom.<id>` identity, so two custom findings
|
|
402
|
+
describing the same problem on the same resource collapse just like a
|
|
403
|
+
custom/advisor pair would. Sentences that match no known template keep
|
|
404
|
+
`code: "custom.unknown"` and no `recommendationId`, and are never collapsed on
|
|
405
|
+
guesswork.
|
|
406
|
+
|
|
407
|
+
#### Cost vs Governance Findings
|
|
408
|
+
|
|
409
|
+
The `cost` category means "money is being wasted". Governance and diagnostic
|
|
410
|
+
observations from the custom analyzers — missing tags, a resource outside the
|
|
411
|
+
preferred location, an unsupported resource type, a failed detail lookup — are
|
|
412
|
+
reported as `operationalExcellence` instead, and never carry a saving estimate.
|
|
413
|
+
Besides keeping the FinOps signal clean, this is what makes deduplication safe:
|
|
414
|
+
a resource flagged only for missing tags is not evidence of waste, so it does
|
|
415
|
+
not absorb the corresponding AZQR orphan row.
|
|
378
416
|
|
|
379
417
|
## AWS (Coming Soon)
|
|
380
418
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/azure/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,OAAO,KAAK,YAAY,MAAM,sBAAsB,CAAC;AAKrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAG3E,OAAO,EACL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/azure/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,OAAO,KAAK,YAAY,MAAM,sBAAsB,CAAC;AAKrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAG3E,OAAO,EACL,KAAK,cAAc,EAKnB,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,YAAY,EAIlB,MAAM,sBAAsB,CAAC;AAc9B,OAAO,EAAiB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAyHxC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,YAAY,CAAC,eAAe,EACtC,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,YAAY,YAAY,EACtC,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,UAAQ,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CA+CzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,2BAA2B,EAAE,EACtC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,GACpD,IAAI,CA8BN;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,EACtC,eAAe,EAAE,OAAO,GACvB,OAAO,CAYT"}
|
package/dist/azure/analyzer.js
CHANGED
|
@@ -28,13 +28,15 @@ import { DefaultAzureCredential } from "@azure/identity";
|
|
|
28
28
|
import { getLogger } from "@logtape/logtape";
|
|
29
29
|
import pLimit from "p-limit";
|
|
30
30
|
import { findingsFromAnalysisResult } from "../finding.js";
|
|
31
|
-
import { DEFAULT_THRESHOLDS, mergeResults, } from "../types.js";
|
|
31
|
+
import { COST_RISK_ORDER, DEFAULT_THRESHOLDS, maxCostRisk, mergeResults, } from "../types.js";
|
|
32
32
|
import { createDefaultAnalyzers, createDefaultSubscriptionAnalyzers, } from "./analyzers/index.js";
|
|
33
33
|
import { azqrImpactedToFindings, isAzqrReportMasked, loadAzqrReport, } from "./azqr.js";
|
|
34
|
+
import { categorizeCustomFindings, MISSING_TAGS_REASON, NO_ANALYZER_REASON, unpreferredLocationReason, } from "./finding-category.js";
|
|
35
|
+
import { assignCustomFindingCodes } from "./finding-code.js";
|
|
36
|
+
import { foldDuplicateFinding } from "./finding-dedup.js";
|
|
34
37
|
import { PricingClient, PricingService } from "./pricing/index.js";
|
|
35
38
|
import { matchesTags } from "./utils.js";
|
|
36
39
|
const DEFAULT_CONCURRENCY = 8;
|
|
37
|
-
const RISK_ORDER = { high: 0, low: 2, medium: 1 };
|
|
38
40
|
/**
|
|
39
41
|
* Analyzes resources in every configured Azure subscription and returns
|
|
40
42
|
* the structured report.
|
|
@@ -152,7 +154,8 @@ export async function analyzeAzureResources(config) {
|
|
|
152
154
|
return aSub ? 1 : -1;
|
|
153
155
|
if (a.analysis.costRisk === b.analysis.costRisk)
|
|
154
156
|
return (a.resource.name ?? "").localeCompare(b.resource.name ?? "");
|
|
155
|
-
return
|
|
157
|
+
return (COST_RISK_ORDER[a.analysis.costRisk] -
|
|
158
|
+
COST_RISK_ORDER[b.analysis.costRisk]);
|
|
156
159
|
});
|
|
157
160
|
return allReports;
|
|
158
161
|
}
|
|
@@ -180,7 +183,7 @@ export async function analyzeResource(resource, analyzers, clients, metricsCache
|
|
|
180
183
|
// Generic check: lack of tags is a common sign of unmanaged resources.
|
|
181
184
|
if (!resource.tags || Object.keys(resource.tags).length === 0) {
|
|
182
185
|
result.suspectedUnused = true;
|
|
183
|
-
result.reason +=
|
|
186
|
+
result.reason += `${MISSING_TAGS_REASON} `;
|
|
184
187
|
}
|
|
185
188
|
const ctx = {
|
|
186
189
|
clients,
|
|
@@ -202,12 +205,12 @@ export async function analyzeResource(resource, analyzers, clients, metricsCache
|
|
|
202
205
|
result = mergeResults(result, specific);
|
|
203
206
|
}
|
|
204
207
|
if (!matched) {
|
|
205
|
-
result.reason +=
|
|
208
|
+
result.reason += `${NO_ANALYZER_REASON} `;
|
|
206
209
|
}
|
|
207
210
|
// Generic check for location
|
|
208
211
|
if (resource.location &&
|
|
209
212
|
!resource.location.toLowerCase().includes(preferredLocation.toLowerCase())) {
|
|
210
|
-
result.reason +=
|
|
213
|
+
result.reason += `${unpreferredLocationReason(preferredLocation)} `;
|
|
211
214
|
}
|
|
212
215
|
return { ...result, reason: result.reason.trim() };
|
|
213
216
|
}
|
|
@@ -226,9 +229,7 @@ export function mergeFinding(finding, reports, reportsById) {
|
|
|
226
229
|
// don't produce "Sentence one.Sentence two." when the existing reason is
|
|
227
230
|
// already trimmed (i.e. has no trailing separator space).
|
|
228
231
|
existing.analysis = {
|
|
229
|
-
costRisk:
|
|
230
|
-
? existing.analysis.costRisk
|
|
231
|
-
: added.costRisk,
|
|
232
|
+
costRisk: maxCostRisk(existing.analysis.costRisk, added.costRisk),
|
|
232
233
|
estimatedMonthlySavings: existing.analysis.estimatedMonthlySavings,
|
|
233
234
|
reason: existing.analysis.reason && added.reason
|
|
234
235
|
? `${existing.analysis.reason.trimEnd()} ${added.reason.trimStart()}`
|
|
@@ -356,6 +357,11 @@ function hasTagFilter(filterTags) {
|
|
|
356
357
|
* report collected during the live scan so AZQR findings attach to their
|
|
357
358
|
* resource when present or create a stub otherwise.
|
|
358
359
|
*
|
|
360
|
+
* Findings that duplicate what a live source already reported for the same
|
|
361
|
+
* resource are folded into the existing finding instead of being appended, so
|
|
362
|
+
* an orphaned resource seen by both AZQR and Advisor/custom analyzers shows up
|
|
363
|
+
* once — on the entry that carries the monetary estimate.
|
|
364
|
+
*
|
|
359
365
|
* When the report is still masked, findings cannot match live resource IDs, so
|
|
360
366
|
* a warning advises re-running AZQR with `--mask=false`.
|
|
361
367
|
*/
|
|
@@ -368,10 +374,21 @@ async function ingestAzqrReport(azqrReportPath, reports, logger) {
|
|
|
368
374
|
}
|
|
369
375
|
const findings = azqrImpactedToFindings(report);
|
|
370
376
|
const reportsById = new Map(reports.map((r) => [(r.resource.id ?? "").toLowerCase(), r]));
|
|
377
|
+
let merged = 0;
|
|
378
|
+
let deduplicated = 0;
|
|
371
379
|
for (const finding of findings) {
|
|
380
|
+
const existing = reportsById.get(finding.resourceId.toLowerCase());
|
|
381
|
+
if (existing && foldDuplicateFinding(finding, existing)) {
|
|
382
|
+
deduplicated++;
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
372
385
|
mergeFinding(finding, reports, reportsById);
|
|
386
|
+
merged++;
|
|
373
387
|
}
|
|
374
|
-
logger.info(`AZQR: merged ${
|
|
388
|
+
logger.info(`AZQR: merged ${merged} finding(s) from ${azqrReportPath}` +
|
|
389
|
+
(deduplicated > 0
|
|
390
|
+
? `, ${deduplicated} deduplicated onto existing findings`
|
|
391
|
+
: ""));
|
|
375
392
|
}
|
|
376
393
|
function isResourceScopedFinding(resourceId) {
|
|
377
394
|
return /\/providers\//i.test(resourceId);
|
|
@@ -410,16 +427,25 @@ async function runPerResourceAnalysis(args) {
|
|
|
410
427
|
const analysis = await analyzeResource(resource, analyzers, clients, runCache, config.preferredLocation, config.timespanDays, thresholds, config.verbose || false, pricing);
|
|
411
428
|
if (analysis.suspectedUnused) {
|
|
412
429
|
const reason = analysis.reason || "No specific findings.";
|
|
430
|
+
const findings = assignCustomFindingCodes(categorizeCustomFindings(findingsFromAnalysisResult({
|
|
431
|
+
reason,
|
|
432
|
+
resourceId: resource.id ?? "",
|
|
433
|
+
severity: analysis.costRisk,
|
|
434
|
+
source: "custom",
|
|
435
|
+
})));
|
|
413
436
|
const report = {
|
|
414
437
|
analysis: { ...analysis, reason },
|
|
415
|
-
findings:
|
|
416
|
-
reason,
|
|
417
|
-
resourceId: resource.id ?? "",
|
|
418
|
-
severity: analysis.costRisk,
|
|
419
|
-
source: "custom",
|
|
420
|
-
}),
|
|
438
|
+
findings: [],
|
|
421
439
|
resource,
|
|
422
440
|
};
|
|
441
|
+
// Fold sentences that share a stable recommendationId so e.g. two
|
|
442
|
+
// "Very low CPU usage" hits on the same resource collapse into one
|
|
443
|
+
// row instead of appearing as separate findings.
|
|
444
|
+
for (const finding of findings) {
|
|
445
|
+
if (!foldDuplicateFinding(finding, report)) {
|
|
446
|
+
report.findings?.push(finding);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
423
449
|
reports.push(report);
|
|
424
450
|
const idKey = (resource.id ?? "").toLowerCase();
|
|
425
451
|
if (idKey)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/azure/analyzer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/azure/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,YAAY,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,MAAM,MAAM,SAAS,CAAC;AAK7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAEL,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,YAAY,GAEb,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,sBAAsB,EACtB,kCAAkC,GAEnC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAE5D,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAmB;IAEnB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAChD,MAAM,UAAU,GAAkC,EAAE,CAAC;IAErD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE1D,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,MAAM,qBAAqB,GAAG,cAAc;QAC1C,CAAC,CAAC,kCAAkC,EAAE;QACtC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAe,MAAM,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAEvE,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5C,sEAAsE;IACtE,yEAAyE;IACzE,oDAAoD;IACpD,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,IAAI,mBAAmB,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAElC,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;IAEpC,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,2BAA2B,cAAc,EAAE,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;QAElC,yEAAyE;QACzE,uEAAuE;QACvE,0CAA0C;QAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuC,CAAC;QACnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE5C,0EAA0E;QAC1E,8EAA8E;QAC9E,MAAM,QAAQ,GAAiB,IAAI,GAAG,EAAE,CAAC;QAEzC,MAAM,OAAO,GAAiB;YAC5B,OAAO,EAAE,IAAI,uBAAuB,CAAC,UAAU,EAAE,GAAG,CAAC;YACrD,aAAa,EAAE,IAAI,sBAAsB,CAAC,UAAU,EAAE,GAAG,CAAC;YAC1D,OAAO,EAAE,IAAI,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC;YAC3C,OAAO,EAAE,IAAI,uBAAuB,CAAC,UAAU,EAAE,GAAG,CAAC;YACrD,OAAO,EAAE,IAAI,uBAAuB,CAAC,UAAU,EAAE,GAAG,CAAC;SACtD,CAAC;QAEF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,sBAAsB,CAAC;gBAC3B,SAAS;gBACT,OAAO;gBACP,MAAM;gBACN,UAAU;gBACV,KAAK;gBACL,MAAM;gBACN,WAAW;gBACX,OAAO;gBACP,OAAO,EAAE,UAAU;gBACnB,WAAW;gBACX,QAAQ;gBACR,GAAG;gBACH,iBAAiB;gBACjB,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,cAAc,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACxE,MAAM,wBAAwB,CAAC;gBAC7B,MAAM;gBACN,UAAU;gBACV,GAAG;gBACH,iBAAiB;aAClB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,wBAAwB,CAAC;gBAC7B,SAAS,EAAE,qBAAqB;gBAChC,UAAU;gBACV,MAAM;gBACN,OAAO,EAAE,UAAU;gBACnB,WAAW;gBACX,GAAG;gBACH,eAAe,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;gBAChD,iBAAiB;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,yCAAyC;IACzC,2EAA2E;IAC3E,2EAA2E;IAC3E,oEAAoE;IACpE,iEAAiE;IACjE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ;YAC7C,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,CACL,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAsC,EACtC,SAAqB,EACrB,OAAqB,EACrB,eAA6B,IAAI,GAAG,EAAE,EACtC,iBAAyB,EACzB,YAAoB,EACpB,UAAsB,EACtB,OAAO,GAAG,KAAK,EACf,OAAwB;IAExB,IAAI,MAAM,GAAmB;QAC3B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,KAAK;KACvB,CAAC;IAEF,uEAAuE;IACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,MAAM,CAAC,MAAM,IAAI,GAAG,mBAAmB,GAAG,CAAC;IAC7C,CAAC;IAED,MAAM,GAAG,GAAoB;QAC3B,OAAO;QACP,YAAY;QACZ,iBAAiB;QACjB,OAAO;QACP,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,OAAO;KACR,CAAC;IAEF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,GAAG,CAAC;IAC5C,CAAC;IAED,6BAA6B;IAC7B,IACE,QAAQ,CAAC,QAAQ;QACjB,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,EAC1E,CAAC;QACD,MAAM,CAAC,MAAM,IAAI,GAAG,yBAAyB,CAAC,iBAAiB,CAAC,GAAG,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,OAAsC,EACtC,WAAqD;IAErD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,uEAAuE;QACvE,yEAAyE;QACzE,0DAA0D;QAC1D,QAAQ,CAAC,QAAQ,GAAG;YAClB,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;YACjE,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,CAAC,uBAAuB;YAClE,MAAM,EACJ,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;gBACtC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE;gBACrE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;YAC9C,eAAe,EACb,QAAQ,CAAC,QAAQ,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe;SAC7D,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,MAAM,GAAgC;QAC1C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACtC,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,OAAgB,EAChB,iBAAsC,EACtC,eAAwB;IAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,+DAA+D;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,iBAAiB,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IAC/D,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM;QACN,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAmB;IAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,cAAc,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAI,YAAY,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;QACzD,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,sCAAsC;QAClF,MAAM,YAAY,GAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3B,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3C,4BAA4B;QAC5B,OAAO;YACL,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YACtB,IAAI,EAAE,oCAAoC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,mEAAmE;QACnE,OAAO;YACL,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,IAAI,EAAE,wBAAwB;SAC/B,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,IAKvC;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAC5D,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,wBAAwB,CAC9D,UAAU,EACV,GAAG,CACJ,CAAC;IACF,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,UAA2C;IAC/D,OAAO,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,gBAAgB,CAC7B,cAAsB,EACtB,OAAsC,EACtC,MAAoC;IAEpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,sEAAsE;YACpE,iEAAiE;YACjE,iDAAiD,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC7D,CAAC;IACF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QACnE,IAAI,QAAQ,IAAI,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxD,YAAY,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC;IACX,CAAC;IACD,MAAM,CAAC,IAAI,CACT,gBAAgB,MAAM,oBAAoB,cAAc,EAAE;QACxD,CAAC,YAAY,GAAG,CAAC;YACf,CAAC,CAAC,KAAK,YAAY,sCAAsC;YACzD,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,0BAA0B,CAAC,CAA8B;IAChE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,wBAAwB,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA8B;IACzD,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,sBAAsB,CAAC,IAerC;IACC,MAAM,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAK,EACL,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,WAAW,EACX,QAAQ,EACR,GAAG,EACH,iBAAiB,EACjB,UAAU,GACX,GAAG,IAAI,CAAC;IACT,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,wBAAwB,CAC9D,UAAU,EACV,GAAG,CACJ,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE1C,6EAA6E;IAC7E,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,uEAAuE;QACvE,0EAA0E;QAC1E,4CAA4C;QAC5C,OAAO,QAAQ,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACpC,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,GAAkB,KAAK,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,YAAY,EACnB,UAAU,EACV,MAAM,CAAC,OAAO,IAAI,KAAK,EACvB,OAAO,CACR,CAAC;YAEF,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,uBAAuB,CAAC;gBAC1D,MAAM,QAAQ,GAAG,wBAAwB,CACvC,wBAAwB,CACtB,0BAA0B,CAAC;oBACzB,MAAM;oBACN,UAAU,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE;oBAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,MAAM,EAAE,QAAQ;iBACjB,CAAC,CACH,CACF,CAAC;gBACF,MAAM,MAAM,GAAgC;oBAC1C,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;oBACjC,QAAQ,EAAE,EAAE;oBACZ,QAAQ;iBACT,CAAC;gBACF,kEAAkE;gBAClE,mEAAmE;gBACnE,iDAAiD;gBACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;wBAC3C,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChD,IAAI,KAAK;oBAAE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,sDAAsD;QACtD,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,qEAAqE;IACrE,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,wBAAwB,CAAC,IAUvC;IACC,MAAM,EACJ,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,WAAW,EACX,GAAG,EACH,eAAe,EACf,iBAAiB,EACjB,OAAO,GACR,GAAG,IAAI,CAAC;IAET,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAClB,CAAC;SACE,OAAO,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SACrD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,YAAY,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,EAAe,CAAC;IACzB,CAAC,CAAC,CACL,CACF,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IACE,CAAC,kCAAkC,CACjC,OAAO,EACP,iBAAiB,EACjB,eAAe,CAChB,EACD,CAAC;gBACD,SAAS;YACX,CAAC;YACD,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -83,6 +83,15 @@ function addToSubGroups(subGroups, rec, savings, ctx, logger) {
|
|
|
83
83
|
subGroups.set(typeKey, createSubGroup(rec, typeKey, savings, ctx, logger));
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Namespaced canonical identity of an Advisor recommendation. Combined with the
|
|
88
|
+
* resource ID it is the deduplication key that lets the same problem reported
|
|
89
|
+
* by another source collapse onto this finding. Left unset when Advisor does
|
|
90
|
+
* not report a type ID, so unrelated recommendations are never merged.
|
|
91
|
+
*/
|
|
92
|
+
function advisorRecommendationId(recommendationTypeId) {
|
|
93
|
+
return recommendationTypeId ? `advisor.${recommendationTypeId}` : undefined;
|
|
94
|
+
}
|
|
86
95
|
function buildResourceFinding(rec, savings, props, rawResourceId) {
|
|
87
96
|
const problem = rec.shortDescription?.problem ??
|
|
88
97
|
rec.shortDescription?.solution ??
|
|
@@ -92,6 +101,7 @@ function buildResourceFinding(rec, savings, props, rawResourceId) {
|
|
|
92
101
|
code: `advisor.${rec.recommendationTypeId ?? "unknown"}`,
|
|
93
102
|
estimatedMonthlySavings: savings,
|
|
94
103
|
reason: enrichReason(problem, props),
|
|
104
|
+
recommendationId: advisorRecommendationId(rec.recommendationTypeId),
|
|
95
105
|
recommendedAction: rec.shortDescription?.solution,
|
|
96
106
|
resourceId: rawResourceId,
|
|
97
107
|
severity: mapImpact(rec.impact),
|
|
@@ -116,6 +126,7 @@ function createSubGroup(rec, typeKey, savings, ctx, logger) {
|
|
|
116
126
|
category: "cost",
|
|
117
127
|
code: `advisor.${typeKey}`,
|
|
118
128
|
reason,
|
|
129
|
+
recommendationId: advisorRecommendationId(rec.recommendationTypeId),
|
|
119
130
|
recommendedAction: rec.shortDescription?.solution,
|
|
120
131
|
resourceId,
|
|
121
132
|
severity: mapImpact(rec.impact),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisor.js","sourceRoot":"","sources":["../../../src/azure/analyzers/advisor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"advisor.js","sourceRoot":"","sources":["../../../src/azure/analyzers/advisor.ts"],"names":[],"mappings":"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"}
|
package/dist/azure/azqr.d.ts
CHANGED
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
* resources — {@link isAzqrReportMasked} lets the orchestrator warn and advise
|
|
24
24
|
* re-running with `azqr scan --mask=false`.
|
|
25
25
|
*
|
|
26
|
-
* Scope note
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Scope note: only `impacted` rows are ingested, enriched with `inventory`
|
|
27
|
+
* metadata when available. AZQR `advisor` rows are ignored to avoid
|
|
28
|
+
* duplicating SaveMoney's own Azure Advisor cost query.
|
|
29
29
|
*/
|
|
30
30
|
import { z } from "zod";
|
|
31
31
|
import { type Finding } from "../finding.js";
|
package/dist/azure/azqr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azqr.d.ts","sourceRoot":"","sources":["../../src/azure/azqr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"azqr.d.ts","sourceRoot":"","sources":["../../src/azure/azqr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,4EAA4E;AAC5E,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;iBAazB,CAAC;AAEH,+EAA+E;AAC/E,QAAA,MAAM,sBAAsB;;;;;;;;iBAQ1B,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBAGpB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAiC1D,2DAA2D;AAC3D,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;AAQrD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,EAAE,CA2BpE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,GACnB,mBAAmB,GAAG,IAAI,CAS5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAM9D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAQxD"}
|
package/dist/azure/azqr.js
CHANGED
|
@@ -23,12 +23,13 @@
|
|
|
23
23
|
* resources — {@link isAzqrReportMasked} lets the orchestrator warn and advise
|
|
24
24
|
* re-running with `azqr scan --mask=false`.
|
|
25
25
|
*
|
|
26
|
-
* Scope note
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Scope note: only `impacted` rows are ingested, enriched with `inventory`
|
|
27
|
+
* metadata when available. AZQR `advisor` rows are ignored to avoid
|
|
28
|
+
* duplicating SaveMoney's own Azure Advisor cost query.
|
|
29
29
|
*/
|
|
30
30
|
import { readFile } from "node:fs/promises";
|
|
31
31
|
import { z } from "zod";
|
|
32
|
+
import { orphanRecommendationId } from "./finding-dedup.js";
|
|
32
33
|
/** A single `impacted` row from an AZQR JSON report (fields we consume). */
|
|
33
34
|
const azqrImpactedRowSchema = z.object({
|
|
34
35
|
category: z.string().optional(),
|
|
@@ -116,6 +117,7 @@ export function azqrImpactedToFindings(report) {
|
|
|
116
117
|
? `azqr.${row.recommendationId}`
|
|
117
118
|
: "azqr.impacted",
|
|
118
119
|
reason: buildReason(row, inventory),
|
|
120
|
+
recommendationId: canonicalRecommendationId(row),
|
|
119
121
|
recommendedAction: row.learn
|
|
120
122
|
? `${remediation} Learn more: ${row.learn}`
|
|
121
123
|
: remediation,
|
|
@@ -145,7 +147,7 @@ export function classifyAzqrRow(row) {
|
|
|
145
147
|
if ((row.category ?? "").toLowerCase().includes("cost")) {
|
|
146
148
|
return "cost";
|
|
147
149
|
}
|
|
148
|
-
if ((row
|
|
150
|
+
if (!isOrphanRow(row)) {
|
|
149
151
|
return null;
|
|
150
152
|
}
|
|
151
153
|
const resourceType = (row.resourceType ?? "").toLowerCase();
|
|
@@ -218,6 +220,26 @@ function buildReason(row, inventory) {
|
|
|
218
220
|
context.push(inventory.location);
|
|
219
221
|
return context.length > 0 ? `${sentence} (${context.join(", ")})` : sentence;
|
|
220
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Canonical identity of the problem a row describes, used to deduplicate it
|
|
225
|
+
* against findings coming from other sources.
|
|
226
|
+
*
|
|
227
|
+
* Orphaned resources (AZQR's `AOR` check) map onto the shared
|
|
228
|
+
* `orphan.<resourceType>` vocabulary, so the same waste reported by Azure
|
|
229
|
+
* Advisor or by a custom analyzer collapses onto a single finding. Every other
|
|
230
|
+
* row keeps AZQR's own recommendation ID, namespaced so it can only ever match
|
|
231
|
+
* another AZQR row.
|
|
232
|
+
*/
|
|
233
|
+
function canonicalRecommendationId(row) {
|
|
234
|
+
if (isOrphanRow(row) && row.resourceType) {
|
|
235
|
+
return orphanRecommendationId(row.resourceType);
|
|
236
|
+
}
|
|
237
|
+
return row.recommendationId ? `azqr.${row.recommendationId}` : undefined;
|
|
238
|
+
}
|
|
239
|
+
/** Whether the row comes from AZQR's Azure Orphan Resources check. */
|
|
240
|
+
function isOrphanRow(row) {
|
|
241
|
+
return (row.source ?? "").toLowerCase() === ORPHAN_CHECK_SOURCE;
|
|
242
|
+
}
|
|
221
243
|
/**
|
|
222
244
|
* Maps AZQR/APRL `impact` (`High` | `Medium` | `Low`) onto the SaveMoney
|
|
223
245
|
* `CostRisk` scale, defaulting to `low` for unknown values.
|
package/dist/azure/azqr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azqr.js","sourceRoot":"","sources":["../../src/azure/azqr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"azqr.js","sourceRoot":"","sources":["../../src/azure/azqr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categorisation of the reasons emitted by the custom (live-scan) Azure
|
|
3
|
+
* analyzers.
|
|
4
|
+
*
|
|
5
|
+
* The per-resource analyzers describe everything they observe in a single
|
|
6
|
+
* concatenated `reason` string, which `findingsFromAnalysisResult` then splits
|
|
7
|
+
* into one `Finding` per sentence. Historically every sentence was labelled
|
|
8
|
+
* `category: "cost"`, including governance and diagnostic observations such as
|
|
9
|
+
* missing tags or a failed detail lookup — statements that carry no billable
|
|
10
|
+
* waste and would suggest a "saving" that does not exist.
|
|
11
|
+
*
|
|
12
|
+
* This module separates the two: governance / diagnostic sentences are
|
|
13
|
+
* reported as `operationalExcellence`, leaving `cost` to mean "actual billable
|
|
14
|
+
* waste". The distinction is also what makes cross-source deduplication safe
|
|
15
|
+
* (see `finding-dedup.ts`): a resource flagged only for missing tags is not
|
|
16
|
+
* evidence that it is wasted, so it must not absorb the corresponding AZQR
|
|
17
|
+
* orphan row.
|
|
18
|
+
*
|
|
19
|
+
* The generic reason strings are defined here and consumed by `analyzer.ts`, so
|
|
20
|
+
* the classifier cannot drift from the text it has to recognise. `finding-code.ts`
|
|
21
|
+
* reuses the same constants to assign a stable per-sentence `recommendationId`,
|
|
22
|
+
* so both classifiers stay in sync with the actual analyzer output.
|
|
23
|
+
*/
|
|
24
|
+
import type { Finding } from "../finding.js";
|
|
25
|
+
/** Reason emitted when a resource carries no tags at all. */
|
|
26
|
+
export declare const MISSING_TAGS_REASON = "No tags found.";
|
|
27
|
+
/** Reason emitted when no analyzer plugin supports the resource type. */
|
|
28
|
+
export declare const NO_ANALYZER_REASON = "No specific analysis for this resource type.";
|
|
29
|
+
/**
|
|
30
|
+
* Prefix of the diagnostic sentences emitted by the per-resource analyzers when
|
|
31
|
+
* an Azure detail lookup fails (e.g. "Could not retrieve detailed NIC
|
|
32
|
+
* information."). They report a gap in the scan, not a cost opportunity.
|
|
33
|
+
*/
|
|
34
|
+
export declare const DETAIL_LOOKUP_FAILURE_PREFIX = "could not retrieve detailed";
|
|
35
|
+
/** Prefix of the reason emitted when a resource sits outside the target region. */
|
|
36
|
+
export declare const UNPREFERRED_LOCATION_REASON = "Resource not in preferred location";
|
|
37
|
+
/**
|
|
38
|
+
* Re-categorises the findings produced from a custom analyzer's `reason`
|
|
39
|
+
* string, so governance and diagnostic sentences stop being reported as cost
|
|
40
|
+
* opportunities.
|
|
41
|
+
*/
|
|
42
|
+
export declare function categorizeCustomFindings(findings: Finding[]): Finding[];
|
|
43
|
+
/** Builds the reason emitted when a resource sits outside the target region. */
|
|
44
|
+
export declare function unpreferredLocationReason(preferredLocation: string): string;
|
|
45
|
+
//# sourceMappingURL=finding-category.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-category.d.ts","sourceRoot":"","sources":["../../src/azure/finding-category.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,eAAe,CAAC;AAE9D,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,iDACiB,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,gCAAgC,CAAC;AAE1E,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,uCAAuC,CAAC;AAEhF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAKvE;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAE3E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categorisation of the reasons emitted by the custom (live-scan) Azure
|
|
3
|
+
* analyzers.
|
|
4
|
+
*
|
|
5
|
+
* The per-resource analyzers describe everything they observe in a single
|
|
6
|
+
* concatenated `reason` string, which `findingsFromAnalysisResult` then splits
|
|
7
|
+
* into one `Finding` per sentence. Historically every sentence was labelled
|
|
8
|
+
* `category: "cost"`, including governance and diagnostic observations such as
|
|
9
|
+
* missing tags or a failed detail lookup — statements that carry no billable
|
|
10
|
+
* waste and would suggest a "saving" that does not exist.
|
|
11
|
+
*
|
|
12
|
+
* This module separates the two: governance / diagnostic sentences are
|
|
13
|
+
* reported as `operationalExcellence`, leaving `cost` to mean "actual billable
|
|
14
|
+
* waste". The distinction is also what makes cross-source deduplication safe
|
|
15
|
+
* (see `finding-dedup.ts`): a resource flagged only for missing tags is not
|
|
16
|
+
* evidence that it is wasted, so it must not absorb the corresponding AZQR
|
|
17
|
+
* orphan row.
|
|
18
|
+
*
|
|
19
|
+
* The generic reason strings are defined here and consumed by `analyzer.ts`, so
|
|
20
|
+
* the classifier cannot drift from the text it has to recognise. `finding-code.ts`
|
|
21
|
+
* reuses the same constants to assign a stable per-sentence `recommendationId`,
|
|
22
|
+
* so both classifiers stay in sync with the actual analyzer output.
|
|
23
|
+
*/
|
|
24
|
+
/** Reason emitted when a resource carries no tags at all. */
|
|
25
|
+
export const MISSING_TAGS_REASON = "No tags found.";
|
|
26
|
+
/** Reason emitted when no analyzer plugin supports the resource type. */
|
|
27
|
+
export const NO_ANALYZER_REASON = "No specific analysis for this resource type.";
|
|
28
|
+
/**
|
|
29
|
+
* Prefix of the diagnostic sentences emitted by the per-resource analyzers when
|
|
30
|
+
* an Azure detail lookup fails (e.g. "Could not retrieve detailed NIC
|
|
31
|
+
* information."). They report a gap in the scan, not a cost opportunity.
|
|
32
|
+
*/
|
|
33
|
+
export const DETAIL_LOOKUP_FAILURE_PREFIX = "could not retrieve detailed";
|
|
34
|
+
/** Prefix of the reason emitted when a resource sits outside the target region. */
|
|
35
|
+
export const UNPREFERRED_LOCATION_REASON = "Resource not in preferred location";
|
|
36
|
+
/**
|
|
37
|
+
* Re-categorises the findings produced from a custom analyzer's `reason`
|
|
38
|
+
* string, so governance and diagnostic sentences stop being reported as cost
|
|
39
|
+
* opportunities.
|
|
40
|
+
*/
|
|
41
|
+
export function categorizeCustomFindings(findings) {
|
|
42
|
+
return findings.map((finding) => ({
|
|
43
|
+
...finding,
|
|
44
|
+
category: categorizeCustomReason(finding.reason),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
/** Builds the reason emitted when a resource sits outside the target region. */
|
|
48
|
+
export function unpreferredLocationReason(preferredLocation) {
|
|
49
|
+
return `${UNPREFERRED_LOCATION_REASON} (${preferredLocation}).`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Classifies a single custom analyzer sentence.
|
|
53
|
+
*
|
|
54
|
+
* @returns `"operationalExcellence"` for governance / diagnostic statements,
|
|
55
|
+
* `"cost"` for everything else (the analyzers' actual waste signals).
|
|
56
|
+
*/
|
|
57
|
+
function categorizeCustomReason(reason) {
|
|
58
|
+
const normalized = reason.trim().toLowerCase();
|
|
59
|
+
const isNonCost = normalized.startsWith(MISSING_TAGS_REASON.toLowerCase()) ||
|
|
60
|
+
normalized.startsWith(NO_ANALYZER_REASON.toLowerCase()) ||
|
|
61
|
+
normalized.startsWith(UNPREFERRED_LOCATION_REASON.toLowerCase()) ||
|
|
62
|
+
normalized.startsWith(DETAIL_LOOKUP_FAILURE_PREFIX);
|
|
63
|
+
return isNonCost ? "operationalExcellence" : "cost";
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=finding-category.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-category.js","sourceRoot":"","sources":["../../src/azure/finding-category.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,8CAA8C,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,6BAA6B,CAAC;AAE1E,mFAAmF;AACnF,MAAM,CAAC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAmB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,OAAO;QACV,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,iBAAyB;IACjE,OAAO,GAAG,2BAA2B,KAAK,iBAAiB,IAAI,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,MAAc;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,SAAS,GACb,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC;QACxD,UAAU,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACvD,UAAU,CAAC,UAAU,CAAC,2BAA2B,CAAC,WAAW,EAAE,CAAC;QAChE,UAAU,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable per-sentence identity for custom (live-scan) analyzer findings.
|
|
3
|
+
*
|
|
4
|
+
* `Finding.recommendationId` powers cross-source dedup, but custom analyzer
|
|
5
|
+
* sentences were deliberately excluded from it: every sentence produced by
|
|
6
|
+
* `findingsFromAnalysisResult` shared the generic `code: "custom.unknown"`
|
|
7
|
+
* and had no stable identifier, so two different sentences could never be
|
|
8
|
+
* told apart safely.
|
|
9
|
+
*
|
|
10
|
+
* This module closes that gap for the sentences whose wording is known ahead
|
|
11
|
+
* of time: each per-resource analyzer in `azure/resources/` builds its
|
|
12
|
+
* `reason` string from a fixed set of templates (e.g. "Disk is unattached.",
|
|
13
|
+
* "VM is deallocated."). This module recognises those templates by a
|
|
14
|
+
* case-insensitive prefix match on the (already sentence-split) `reason` and
|
|
15
|
+
* assigns both `code` and `recommendationId` to a stable `custom.<id>` value,
|
|
16
|
+
* following the same convention as `advisor.<recommendationTypeId>` /
|
|
17
|
+
* `azqr.<recommendationId>`. That is what lets `foldDuplicateFinding`
|
|
18
|
+
* (`finding-dedup.ts`) — whose matching is already identity-based and
|
|
19
|
+
* source-agnostic — collapse two custom findings that describe the same
|
|
20
|
+
* problem on the same resource.
|
|
21
|
+
*
|
|
22
|
+
* A handful of sentences are worded identically by more than one resource
|
|
23
|
+
* type (e.g. App Service Plan and Container App both emit "Very low CPU usage
|
|
24
|
+
* (…)."). Those intentionally share one generic code: dedup only ever
|
|
25
|
+
* compares findings within the same `resourceId`, and a resource can't be two
|
|
26
|
+
* types at once, so the shared code cannot cause a false merge across
|
|
27
|
+
* unrelated resources.
|
|
28
|
+
*
|
|
29
|
+
* Sentences that don't match any known template are left untouched — they
|
|
30
|
+
* keep `code: "custom.unknown"` and no `recommendationId`, exactly like
|
|
31
|
+
* before, so genuinely unrecognised text is never merged on a guess.
|
|
32
|
+
*/
|
|
33
|
+
import type { Finding } from "../finding.js";
|
|
34
|
+
/**
|
|
35
|
+
* Assigns a stable `code`/`recommendationId` to every custom finding whose
|
|
36
|
+
* `reason` matches a known sentence template, so equivalent sentences about
|
|
37
|
+
* the same resource collapse via `foldDuplicateFinding` instead of appearing
|
|
38
|
+
* as separate rows.
|
|
39
|
+
*
|
|
40
|
+
* Leaves untouched: non-`"custom"` findings, and findings that already carry
|
|
41
|
+
* a `recommendationId` (nothing to add) or whose `reason` matches no known
|
|
42
|
+
* template (stays `"custom.unknown"`, ungrouped — the same fallback behaviour
|
|
43
|
+
* as before this module existed).
|
|
44
|
+
*/
|
|
45
|
+
export declare function assignCustomFindingCodes(findings: Finding[]): Finding[];
|
|
46
|
+
//# sourceMappingURL=finding-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-code.d.ts","sourceRoot":"","sources":["../../src/azure/finding-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAyF7C;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAQvE"}
|