@waratahlabs/canopy 0.5.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/LICENSE +21 -0
- package/README.md +323 -0
- package/SKILL.md +97 -0
- package/demo/data/openclaw-demo.tc.json +397 -0
- package/demo/data/openclaw-nemoclaw-demo.tc.json +475 -0
- package/demo/index.html +556 -0
- package/dist/adapters/a2a.d.ts +82 -0
- package/dist/adapters/a2a.d.ts.map +1 -0
- package/dist/adapters/a2a.js +215 -0
- package/dist/adapters/a2a.js.map +1 -0
- package/dist/adapters/a2a.test.d.ts +2 -0
- package/dist/adapters/a2a.test.d.ts.map +1 -0
- package/dist/adapters/a2a.test.js +196 -0
- package/dist/adapters/a2a.test.js.map +1 -0
- package/dist/adapters/langfuse.d.ts +28 -0
- package/dist/adapters/langfuse.d.ts.map +1 -0
- package/dist/adapters/langfuse.js +192 -0
- package/dist/adapters/langfuse.js.map +1 -0
- package/dist/adapters/n8n.d.ts +4 -0
- package/dist/adapters/n8n.d.ts.map +1 -0
- package/dist/adapters/n8n.js +89 -0
- package/dist/adapters/n8n.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +58 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +275 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/types.d.ts +33 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/aivss/atlas/coverage-matrix.d.ts +12 -0
- package/dist/aivss/atlas/coverage-matrix.d.ts.map +1 -0
- package/dist/aivss/atlas/coverage-matrix.js +272 -0
- package/dist/aivss/atlas/coverage-matrix.js.map +1 -0
- package/dist/aivss/atlas/loader.d.ts +28 -0
- package/dist/aivss/atlas/loader.d.ts.map +1 -0
- package/dist/aivss/atlas/loader.js +126 -0
- package/dist/aivss/atlas/loader.js.map +1 -0
- package/dist/aivss/atlas/loader.test.d.ts +11 -0
- package/dist/aivss/atlas/loader.test.d.ts.map +1 -0
- package/dist/aivss/atlas/loader.test.js +111 -0
- package/dist/aivss/atlas/loader.test.js.map +1 -0
- package/dist/aivss/atlas/resolve-path.d.ts +34 -0
- package/dist/aivss/atlas/resolve-path.d.ts.map +1 -0
- package/dist/aivss/atlas/resolve-path.js +58 -0
- package/dist/aivss/atlas/resolve-path.js.map +1 -0
- package/dist/aivss/batch/batch-builder.d.ts +11 -0
- package/dist/aivss/batch/batch-builder.d.ts.map +1 -0
- package/dist/aivss/batch/batch-builder.js +75 -0
- package/dist/aivss/batch/batch-builder.js.map +1 -0
- package/dist/aivss/index.d.ts +21 -0
- package/dist/aivss/index.d.ts.map +1 -0
- package/dist/aivss/index.js +19 -0
- package/dist/aivss/index.js.map +1 -0
- package/dist/aivss/knowledge-base/kb-client.d.ts +9 -0
- package/dist/aivss/knowledge-base/kb-client.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/kb-client.js +139 -0
- package/dist/aivss/knowledge-base/kb-client.js.map +1 -0
- package/dist/aivss/knowledge-base/kb-types.d.ts +21 -0
- package/dist/aivss/knowledge-base/kb-types.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/kb-types.js +2 -0
- package/dist/aivss/knowledge-base/kb-types.js.map +1 -0
- package/dist/aivss/knowledge-base/search-builder.d.ts +7 -0
- package/dist/aivss/knowledge-base/search-builder.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/search-builder.js +119 -0
- package/dist/aivss/knowledge-base/search-builder.js.map +1 -0
- package/dist/aivss/metrics/aa.d.ts +3 -0
- package/dist/aivss/metrics/aa.d.ts.map +1 -0
- package/dist/aivss/metrics/aa.js +26 -0
- package/dist/aivss/metrics/aa.js.map +1 -0
- package/dist/aivss/metrics/ad.d.ts +3 -0
- package/dist/aivss/metrics/ad.d.ts.map +1 -0
- package/dist/aivss/metrics/ad.js +30 -0
- package/dist/aivss/metrics/ad.js.map +1 -0
- package/dist/aivss/metrics/cs.d.ts +3 -0
- package/dist/aivss/metrics/cs.d.ts.map +1 -0
- package/dist/aivss/metrics/cs.js +50 -0
- package/dist/aivss/metrics/cs.js.map +1 -0
- package/dist/aivss/metrics/dc.d.ts +3 -0
- package/dist/aivss/metrics/dc.d.ts.map +1 -0
- package/dist/aivss/metrics/dc.js +30 -0
- package/dist/aivss/metrics/dc.js.map +1 -0
- package/dist/aivss/metrics/ds.d.ts +3 -0
- package/dist/aivss/metrics/ds.d.ts.map +1 -0
- package/dist/aivss/metrics/ds.js +26 -0
- package/dist/aivss/metrics/ds.js.map +1 -0
- package/dist/aivss/metrics/ei.d.ts +3 -0
- package/dist/aivss/metrics/ei.d.ts.map +1 -0
- package/dist/aivss/metrics/ei.js +30 -0
- package/dist/aivss/metrics/ei.js.map +1 -0
- package/dist/aivss/metrics/gv.d.ts +3 -0
- package/dist/aivss/metrics/gv.d.ts.map +1 -0
- package/dist/aivss/metrics/gv.js +34 -0
- package/dist/aivss/metrics/gv.js.map +1 -0
- package/dist/aivss/metrics/ll.d.ts +3 -0
- package/dist/aivss/metrics/ll.d.ts.map +1 -0
- package/dist/aivss/metrics/ll.js +30 -0
- package/dist/aivss/metrics/ll.js.map +1 -0
- package/dist/aivss/metrics/mr.d.ts +3 -0
- package/dist/aivss/metrics/mr.d.ts.map +1 -0
- package/dist/aivss/metrics/mr.js +26 -0
- package/dist/aivss/metrics/mr.js.map +1 -0
- package/dist/aivss/metrics/shared.d.ts +22 -0
- package/dist/aivss/metrics/shared.d.ts.map +1 -0
- package/dist/aivss/metrics/shared.js +70 -0
- package/dist/aivss/metrics/shared.js.map +1 -0
- package/dist/aivss/prompts/base-system-prompt.d.ts +2 -0
- package/dist/aivss/prompts/base-system-prompt.d.ts.map +1 -0
- package/dist/aivss/prompts/base-system-prompt.js +31 -0
- package/dist/aivss/prompts/base-system-prompt.js.map +1 -0
- package/dist/aivss/prompts/prompt-composer.d.ts +13 -0
- package/dist/aivss/prompts/prompt-composer.d.ts.map +1 -0
- package/dist/aivss/prompts/prompt-composer.js +21 -0
- package/dist/aivss/prompts/prompt-composer.js.map +1 -0
- package/dist/aivss/scoring/a2a-corpus.test.d.ts +28 -0
- package/dist/aivss/scoring/a2a-corpus.test.d.ts.map +1 -0
- package/dist/aivss/scoring/a2a-corpus.test.js +109 -0
- package/dist/aivss/scoring/a2a-corpus.test.js.map +1 -0
- package/dist/aivss/scoring/determinism.test.d.ts +16 -0
- package/dist/aivss/scoring/determinism.test.d.ts.map +1 -0
- package/dist/aivss/scoring/determinism.test.js +169 -0
- package/dist/aivss/scoring/determinism.test.js.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.d.ts +21 -0
- package/dist/aivss/scoring/heuristic-scorer.d.ts.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.js +299 -0
- package/dist/aivss/scoring/heuristic-scorer.js.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.test.d.ts +8 -0
- package/dist/aivss/scoring/heuristic-scorer.test.d.ts.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.test.js +150 -0
- package/dist/aivss/scoring/heuristic-scorer.test.js.map +1 -0
- package/dist/aivss/scoring/scoring-mode.d.ts +48 -0
- package/dist/aivss/scoring/scoring-mode.d.ts.map +1 -0
- package/dist/aivss/scoring/scoring-mode.js +64 -0
- package/dist/aivss/scoring/scoring-mode.js.map +1 -0
- package/dist/aivss/scoring/v4-engine.d.ts +15 -0
- package/dist/aivss/scoring/v4-engine.d.ts.map +1 -0
- package/dist/aivss/scoring/v4-engine.js +84 -0
- package/dist/aivss/scoring/v4-engine.js.map +1 -0
- package/dist/aivss/scoring/v4-engine.test.d.ts +16 -0
- package/dist/aivss/scoring/v4-engine.test.d.ts.map +1 -0
- package/dist/aivss/scoring/v4-engine.test.js +156 -0
- package/dist/aivss/scoring/v4-engine.test.js.map +1 -0
- package/dist/aivss/types.d.ts +92 -0
- package/dist/aivss/types.d.ts.map +1 -0
- package/dist/aivss/types.js +25 -0
- package/dist/aivss/types.js.map +1 -0
- package/dist/baseline/baseline.test.d.ts +2 -0
- package/dist/baseline/baseline.test.d.ts.map +1 -0
- package/dist/baseline/baseline.test.js +219 -0
- package/dist/baseline/baseline.test.js.map +1 -0
- package/dist/baseline/diff.d.ts +42 -0
- package/dist/baseline/diff.d.ts.map +1 -0
- package/dist/baseline/diff.js +124 -0
- package/dist/baseline/diff.js.map +1 -0
- package/dist/baseline/store.d.ts +51 -0
- package/dist/baseline/store.d.ts.map +1 -0
- package/dist/baseline/store.js +92 -0
- package/dist/baseline/store.js.map +1 -0
- package/dist/batch/anthropic-batch-runner.d.ts +50 -0
- package/dist/batch/anthropic-batch-runner.d.ts.map +1 -0
- package/dist/batch/anthropic-batch-runner.js +91 -0
- package/dist/batch/anthropic-batch-runner.js.map +1 -0
- package/dist/batch/bedrock-batch-runner.d.ts +90 -0
- package/dist/batch/bedrock-batch-runner.d.ts.map +1 -0
- package/dist/batch/bedrock-batch-runner.js +199 -0
- package/dist/batch/bedrock-batch-runner.js.map +1 -0
- package/dist/batch/providers/anthropic.d.ts +55 -0
- package/dist/batch/providers/anthropic.d.ts.map +1 -0
- package/dist/batch/providers/anthropic.js +103 -0
- package/dist/batch/providers/anthropic.js.map +1 -0
- package/dist/batch/providers/bedrock.d.ts +31 -0
- package/dist/batch/providers/bedrock.d.ts.map +1 -0
- package/dist/batch/providers/bedrock.js +42 -0
- package/dist/batch/providers/bedrock.js.map +1 -0
- package/dist/batch/providers/harness.d.ts +36 -0
- package/dist/batch/providers/harness.d.ts.map +1 -0
- package/dist/batch/providers/harness.js +65 -0
- package/dist/batch/providers/harness.js.map +1 -0
- package/dist/batch/providers/harness.test.d.ts +7 -0
- package/dist/batch/providers/harness.test.d.ts.map +1 -0
- package/dist/batch/providers/harness.test.js +84 -0
- package/dist/batch/providers/harness.test.js.map +1 -0
- package/dist/batch/providers/index.d.ts +82 -0
- package/dist/batch/providers/index.d.ts.map +1 -0
- package/dist/batch/providers/index.js +82 -0
- package/dist/batch/providers/index.js.map +1 -0
- package/dist/batch/providers/ollama.d.ts +68 -0
- package/dist/batch/providers/ollama.d.ts.map +1 -0
- package/dist/batch/providers/ollama.js +108 -0
- package/dist/batch/providers/ollama.js.map +1 -0
- package/dist/batch/response-parser.d.ts +45 -0
- package/dist/batch/response-parser.d.ts.map +1 -0
- package/dist/batch/response-parser.js +161 -0
- package/dist/batch/response-parser.js.map +1 -0
- package/dist/batch/types.d.ts +87 -0
- package/dist/batch/types.d.ts.map +1 -0
- package/dist/batch/types.js +8 -0
- package/dist/batch/types.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1037 -0
- package/dist/cli.js.map +1 -0
- package/dist/examples/a2a-assessment.d.ts +20 -0
- package/dist/examples/a2a-assessment.d.ts.map +1 -0
- package/dist/examples/a2a-assessment.js +115 -0
- package/dist/examples/a2a-assessment.js.map +1 -0
- package/dist/examples/batch-assessment.d.ts +18 -0
- package/dist/examples/batch-assessment.d.ts.map +1 -0
- package/dist/examples/batch-assessment.js +112 -0
- package/dist/examples/batch-assessment.js.map +1 -0
- package/dist/examples/batch-submission-flow.d.ts +2 -0
- package/dist/examples/batch-submission-flow.d.ts.map +1 -0
- package/dist/examples/batch-submission-flow.js +279 -0
- package/dist/examples/batch-submission-flow.js.map +1 -0
- package/dist/examples/demo-agent-definition.json +58 -0
- package/dist/examples/langfuse-assessment.d.ts +2 -0
- package/dist/examples/langfuse-assessment.d.ts.map +1 -0
- package/dist/examples/langfuse-assessment.js +46 -0
- package/dist/examples/langfuse-assessment.js.map +1 -0
- package/dist/examples/model-eval.d.ts +25 -0
- package/dist/examples/model-eval.d.ts.map +1 -0
- package/dist/examples/model-eval.js +94 -0
- package/dist/examples/model-eval.js.map +1 -0
- package/dist/examples/openclaw-assessment.d.ts +17 -0
- package/dist/examples/openclaw-assessment.d.ts.map +1 -0
- package/dist/examples/openclaw-assessment.js +79 -0
- package/dist/examples/openclaw-assessment.js.map +1 -0
- package/dist/examples/simple-assessment.d.ts +2 -0
- package/dist/examples/simple-assessment.d.ts.map +1 -0
- package/dist/examples/simple-assessment.js +146 -0
- package/dist/examples/simple-assessment.js.map +1 -0
- package/dist/examples/threat-model-demo.d.ts +2 -0
- package/dist/examples/threat-model-demo.d.ts.map +1 -0
- package/dist/examples/threat-model-demo.js +103 -0
- package/dist/examples/threat-model-demo.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/output/likec4-generator.d.ts +43 -0
- package/dist/output/likec4-generator.d.ts.map +1 -0
- package/dist/output/likec4-generator.js +287 -0
- package/dist/output/likec4-generator.js.map +1 -0
- package/dist/output/slot-filler.d.ts +6 -0
- package/dist/output/slot-filler.d.ts.map +1 -0
- package/dist/output/slot-filler.js +71 -0
- package/dist/output/slot-filler.js.map +1 -0
- package/dist/output/tc-assembler.d.ts +30 -0
- package/dist/output/tc-assembler.d.ts.map +1 -0
- package/dist/output/tc-assembler.js +227 -0
- package/dist/output/tc-assembler.js.map +1 -0
- package/dist/output/tc-types.d.ts +41 -0
- package/dist/output/tc-types.d.ts.map +1 -0
- package/dist/output/tc-types.js +5 -0
- package/dist/output/tc-types.js.map +1 -0
- package/dist/output/tc-validator.test.d.ts +9 -0
- package/dist/output/tc-validator.test.d.ts.map +1 -0
- package/dist/output/tc-validator.test.js +194 -0
- package/dist/output/tc-validator.test.js.map +1 -0
- package/dist/providers/anthropic.d.ts +9 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +30 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +9 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +38 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +14 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +12 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/references/acsc-risks.d.ts +18 -0
- package/dist/references/acsc-risks.d.ts.map +1 -0
- package/dist/references/acsc-risks.js +232 -0
- package/dist/references/acsc-risks.js.map +1 -0
- package/dist/references/aicm.d.ts +41 -0
- package/dist/references/aicm.d.ts.map +1 -0
- package/dist/references/aicm.js +447 -0
- package/dist/references/aicm.js.map +1 -0
- package/dist/references/dstg-meaid.d.ts +59 -0
- package/dist/references/dstg-meaid.d.ts.map +1 -0
- package/dist/references/dstg-meaid.js +352 -0
- package/dist/references/dstg-meaid.js.map +1 -0
- package/dist/references/index.d.ts +20 -0
- package/dist/references/index.d.ts.map +1 -0
- package/dist/references/index.js +31 -0
- package/dist/references/index.js.map +1 -0
- package/dist/references/nemoclaw.d.ts +48 -0
- package/dist/references/nemoclaw.d.ts.map +1 -0
- package/dist/references/nemoclaw.js +140 -0
- package/dist/references/nemoclaw.js.map +1 -0
- package/dist/references/nist-ai-rmf.d.ts +31 -0
- package/dist/references/nist-ai-rmf.d.ts.map +1 -0
- package/dist/references/nist-ai-rmf.js +627 -0
- package/dist/references/nist-ai-rmf.js.map +1 -0
- package/dist/references/owasp-agentic-top10.d.ts +50 -0
- package/dist/references/owasp-agentic-top10.d.ts.map +1 -0
- package/dist/references/owasp-agentic-top10.js +202 -0
- package/dist/references/owasp-agentic-top10.js.map +1 -0
- package/dist/references/registry-parity.test.d.ts +17 -0
- package/dist/references/registry-parity.test.d.ts.map +1 -0
- package/dist/references/registry-parity.test.js +87 -0
- package/dist/references/registry-parity.test.js.map +1 -0
- package/dist/references/registry.d.ts +90 -0
- package/dist/references/registry.d.ts.map +1 -0
- package/dist/references/registry.js +29 -0
- package/dist/references/registry.js.map +1 -0
- package/dist/tools/model-eval.d.ts +97 -0
- package/dist/tools/model-eval.d.ts.map +1 -0
- package/dist/tools/model-eval.js +307 -0
- package/dist/tools/model-eval.js.map +1 -0
- package/package.json +105 -0
- package/schemas/threat-composer-v1.schema.json +966 -0
- package/vendor/atlas-release/ATLAS-2026.07.yaml +17877 -0
- package/vendor/atlas-release/README.md +41 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export type SeverityLabel = "Critical" | "High" | "Medium" | "Low" | "None";
|
|
2
|
+
export declare const SEVERITY_VALUES: Record<SeverityLabel, number>;
|
|
3
|
+
export type MetricCode = "MR" | "DS" | "EI" | "DC" | "AD" | "AA" | "LL" | "GV" | "CS";
|
|
4
|
+
export declare const METRIC_CODES: MetricCode[];
|
|
5
|
+
export type DeploymentContext = "General" | "FinancialServices" | "Healthcare" | "CriticalInfrastructure" | "AutomotiveTransport" | "LegalJustice" | "GovernmentPublic";
|
|
6
|
+
export declare const DEPLOYMENT_CONTEXTS: DeploymentContext[];
|
|
7
|
+
export type ModelComplexity = "Simple" | "Moderate" | "Complex" | "HighlyComplex";
|
|
8
|
+
export declare const MODEL_COMPLEXITY_VALUES: Record<ModelComplexity, number>;
|
|
9
|
+
export type MitigationMultiplier = number;
|
|
10
|
+
export interface AgentDefinition {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
model: string;
|
|
14
|
+
systemPrompt: string;
|
|
15
|
+
tools: Tool[];
|
|
16
|
+
permissions: string[];
|
|
17
|
+
deploymentContext: DeploymentContext;
|
|
18
|
+
modelComplexity: ModelComplexity;
|
|
19
|
+
mitigationMultiplier: MitigationMultiplier;
|
|
20
|
+
finetuned: boolean;
|
|
21
|
+
dependencies: string[];
|
|
22
|
+
secretManagement: string;
|
|
23
|
+
deployment: string;
|
|
24
|
+
dataSources?: string[];
|
|
25
|
+
autonomyLevel?: "supervised" | "semi-autonomous" | "autonomous";
|
|
26
|
+
objectives?: string[];
|
|
27
|
+
externalApiCount?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Tool {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
dangerous?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Prose fields for one threat statement — keyed by sub-category in batch responses. */
|
|
35
|
+
export interface ThreatSlots {
|
|
36
|
+
threatSource: string;
|
|
37
|
+
prerequisites: string;
|
|
38
|
+
threatAction: string;
|
|
39
|
+
threatImpact: string;
|
|
40
|
+
impactedGoal: string[];
|
|
41
|
+
impactedAssets: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface MetricAssessmentResponse {
|
|
44
|
+
metricCode: MetricCode;
|
|
45
|
+
/** Set when response came from a batch job — matches AgentDefinition.id. */
|
|
46
|
+
agentId?: string;
|
|
47
|
+
subCategoryScores: Record<string, SeverityLabel>;
|
|
48
|
+
findings: string[];
|
|
49
|
+
deploymentBlocker: boolean;
|
|
50
|
+
atlasTechniques?: string[];
|
|
51
|
+
/**
|
|
52
|
+
* Prose threat statement slots per sub-category, populated by batch jobs.
|
|
53
|
+
* Key = sub-category name (e.g. "Evasion Resistance").
|
|
54
|
+
* When present, assembler uses these instead of stub fills.
|
|
55
|
+
*/
|
|
56
|
+
threatSlots?: Record<string, ThreatSlots>;
|
|
57
|
+
}
|
|
58
|
+
export interface AtlasFinding {
|
|
59
|
+
metric: MetricCode;
|
|
60
|
+
subCategory: string;
|
|
61
|
+
atlasTechniqueIds: string[];
|
|
62
|
+
severity: number;
|
|
63
|
+
partial: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface V4Score {
|
|
66
|
+
aivssScore: number;
|
|
67
|
+
severity: SeverityLabel;
|
|
68
|
+
deploymentContext: DeploymentContext;
|
|
69
|
+
modifiedBaseScore: number;
|
|
70
|
+
aiSpecificScore: number;
|
|
71
|
+
impactScore: number;
|
|
72
|
+
temporalScore: number;
|
|
73
|
+
mitigationMultiplier: MitigationMultiplier;
|
|
74
|
+
metricScores: Record<MetricCode, number>;
|
|
75
|
+
allFindings: string[];
|
|
76
|
+
deploymentBlocker: boolean;
|
|
77
|
+
atlasFindings?: AtlasFinding[];
|
|
78
|
+
}
|
|
79
|
+
export interface BatchRequest {
|
|
80
|
+
custom_id: string;
|
|
81
|
+
params: {
|
|
82
|
+
model: string;
|
|
83
|
+
max_tokens: number;
|
|
84
|
+
temperature: number;
|
|
85
|
+
system: string;
|
|
86
|
+
messages: Array<{
|
|
87
|
+
role: "user" | "assistant";
|
|
88
|
+
content: string;
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/aivss/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Core types for the OWASP AIVSS V4 assessment system.
|
|
2
|
+
export const SEVERITY_VALUES = {
|
|
3
|
+
Critical: 0.9,
|
|
4
|
+
High: 0.7,
|
|
5
|
+
Medium: 0.5,
|
|
6
|
+
Low: 0.2,
|
|
7
|
+
None: 0,
|
|
8
|
+
};
|
|
9
|
+
export const METRIC_CODES = ["MR", "DS", "EI", "DC", "AD", "AA", "LL", "GV", "CS"];
|
|
10
|
+
export const DEPLOYMENT_CONTEXTS = [
|
|
11
|
+
"General",
|
|
12
|
+
"FinancialServices",
|
|
13
|
+
"Healthcare",
|
|
14
|
+
"CriticalInfrastructure",
|
|
15
|
+
"AutomotiveTransport",
|
|
16
|
+
"LegalJustice",
|
|
17
|
+
"GovernmentPublic",
|
|
18
|
+
];
|
|
19
|
+
export const MODEL_COMPLEXITY_VALUES = {
|
|
20
|
+
Simple: 1,
|
|
21
|
+
Moderate: 1.2,
|
|
22
|
+
Complex: 1.35,
|
|
23
|
+
HighlyComplex: 1.5,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/aivss/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,CAAC;CACR,CAAC;AAIF,MAAM,CAAC,MAAM,YAAY,GAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAWjG,MAAM,CAAC,MAAM,mBAAmB,GAAwB;IACtD,SAAS;IACT,mBAAmB;IACnB,YAAY;IACZ,wBAAwB;IACxB,qBAAqB;IACrB,cAAc;IACd,kBAAkB;CACnB,CAAC;AAIF,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACtE,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,GAAG;CACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.test.d.ts","sourceRoot":"","sources":["../../src/baseline/baseline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import { buildBaseline, saveBaseline, loadRecentBaselines } from "./store";
|
|
6
|
+
import { diffBaselines, formatDiff } from "./diff";
|
|
7
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
8
|
+
let tmpDir;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "canopy-test-"));
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
function makeBaseline(overrides = {}) {
|
|
16
|
+
return {
|
|
17
|
+
runId: "aabb1122",
|
|
18
|
+
timestamp: "2026-06-11T00:00:00.000Z",
|
|
19
|
+
applicationName: "Test App",
|
|
20
|
+
agents: [{ id: "agent-01", name: "Test Agent" }],
|
|
21
|
+
severities: {
|
|
22
|
+
"agent-01|MR|Evasion Resistance": "Medium",
|
|
23
|
+
"agent-01|DS|Data Confidentiality": "Low",
|
|
24
|
+
"agent-01|GV|Human Oversight": "High",
|
|
25
|
+
},
|
|
26
|
+
counts: { Critical: 0, High: 1, Medium: 1, Low: 1, None: 0 },
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// ── Store ─────────────────────────────────────────────────────────────────────
|
|
31
|
+
describe("buildBaseline", () => {
|
|
32
|
+
it("counts severities correctly", () => {
|
|
33
|
+
const severities = new Map([
|
|
34
|
+
["a|MR|Evasion Resistance", "High"],
|
|
35
|
+
["a|DS|Data Confidentiality", "High"],
|
|
36
|
+
["a|GV|Human Oversight", "Medium"],
|
|
37
|
+
["a|AD|Continuous Monitoring", "Low"],
|
|
38
|
+
]);
|
|
39
|
+
const b = buildBaseline("App", [{ id: "a", name: "Agent" }], severities);
|
|
40
|
+
expect(b.counts.High).toBe(2);
|
|
41
|
+
expect(b.counts.Medium).toBe(1);
|
|
42
|
+
expect(b.counts.Low).toBe(1);
|
|
43
|
+
expect(b.counts.Critical).toBe(0);
|
|
44
|
+
});
|
|
45
|
+
it("generates a unique runId each call", () => {
|
|
46
|
+
const a = buildBaseline("App", [], new Map());
|
|
47
|
+
const b = buildBaseline("App", [], new Map());
|
|
48
|
+
expect(a.runId).not.toBe(b.runId);
|
|
49
|
+
});
|
|
50
|
+
it("includes optional tcJsonPath when provided", () => {
|
|
51
|
+
const b = buildBaseline("App", [], new Map(), "./out/model.tc.json");
|
|
52
|
+
expect(b.tcJsonPath).toBe("./out/model.tc.json");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("saveBaseline / loadRecentBaselines", () => {
|
|
56
|
+
it("round-trips a saved baseline", () => {
|
|
57
|
+
const b = makeBaseline();
|
|
58
|
+
saveBaseline(b, tmpDir);
|
|
59
|
+
const loaded = loadRecentBaselines(tmpDir, "Test App", 1);
|
|
60
|
+
expect(loaded).toHaveLength(1);
|
|
61
|
+
expect(loaded[0].runId).toBe(b.runId);
|
|
62
|
+
expect(loaded[0].applicationName).toBe("Test App");
|
|
63
|
+
});
|
|
64
|
+
it("returns empty array when no history exists", () => {
|
|
65
|
+
const loaded = loadRecentBaselines(tmpDir, "Nonexistent App", 2);
|
|
66
|
+
expect(loaded).toHaveLength(0);
|
|
67
|
+
});
|
|
68
|
+
it("returns baselines newest-first", async () => {
|
|
69
|
+
const b1 = makeBaseline({ runId: "old", timestamp: "2026-06-10T00:00:00.000Z" });
|
|
70
|
+
const b2 = makeBaseline({ runId: "new", timestamp: "2026-06-11T00:00:00.000Z" });
|
|
71
|
+
saveBaseline(b1, tmpDir);
|
|
72
|
+
// Small delay to ensure distinct filenames
|
|
73
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
74
|
+
saveBaseline(b2, tmpDir);
|
|
75
|
+
const loaded = loadRecentBaselines(tmpDir, "Test App", 2);
|
|
76
|
+
expect(loaded[0].runId).toBe("new");
|
|
77
|
+
expect(loaded[1].runId).toBe("old");
|
|
78
|
+
});
|
|
79
|
+
it("respects the n limit", () => {
|
|
80
|
+
for (let i = 0; i < 5; i++) {
|
|
81
|
+
saveBaseline(makeBaseline({ runId: `run-${i}`, timestamp: `2026-06-1${i}T00:00:00.000Z` }), tmpDir);
|
|
82
|
+
}
|
|
83
|
+
const loaded = loadRecentBaselines(tmpDir, "Test App", 2);
|
|
84
|
+
expect(loaded).toHaveLength(2);
|
|
85
|
+
});
|
|
86
|
+
it("slugifies application names with spaces and special chars", () => {
|
|
87
|
+
const b = makeBaseline({ applicationName: "My App / v2.0" });
|
|
88
|
+
saveBaseline(b, tmpDir);
|
|
89
|
+
const loaded = loadRecentBaselines(tmpDir, "My App / v2.0", 1);
|
|
90
|
+
expect(loaded).toHaveLength(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
// ── Diff ──────────────────────────────────────────────────────────────────────
|
|
94
|
+
describe("diffBaselines — regressions and improvements", () => {
|
|
95
|
+
it("detects a regression (severity increase)", () => {
|
|
96
|
+
const prior = makeBaseline();
|
|
97
|
+
const current = makeBaseline({
|
|
98
|
+
runId: "ccdd3344",
|
|
99
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
100
|
+
severities: {
|
|
101
|
+
...makeBaseline().severities,
|
|
102
|
+
"agent-01|MR|Evasion Resistance": "High", // was Medium
|
|
103
|
+
},
|
|
104
|
+
counts: { Critical: 0, High: 2, Medium: 0, Low: 1, None: 0 },
|
|
105
|
+
});
|
|
106
|
+
const diff = diffBaselines(prior, current);
|
|
107
|
+
expect(diff.hasRegressions).toBe(true);
|
|
108
|
+
expect(diff.regressions).toHaveLength(1);
|
|
109
|
+
expect(diff.regressions[0].subCategory).toBe("Evasion Resistance");
|
|
110
|
+
expect(diff.regressions[0].from).toBe("Medium");
|
|
111
|
+
expect(diff.regressions[0].to).toBe("High");
|
|
112
|
+
});
|
|
113
|
+
it("detects an improvement (severity decrease)", () => {
|
|
114
|
+
const prior = makeBaseline();
|
|
115
|
+
const current = makeBaseline({
|
|
116
|
+
runId: "ccdd3344",
|
|
117
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
118
|
+
severities: {
|
|
119
|
+
...makeBaseline().severities,
|
|
120
|
+
"agent-01|GV|Human Oversight": "Medium", // was High
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
const diff = diffBaselines(prior, current);
|
|
124
|
+
expect(diff.hasRegressions).toBe(false);
|
|
125
|
+
expect(diff.improvements).toHaveLength(1);
|
|
126
|
+
expect(diff.improvements[0].from).toBe("High");
|
|
127
|
+
expect(diff.improvements[0].to).toBe("Medium");
|
|
128
|
+
});
|
|
129
|
+
it("no changes → empty diff", () => {
|
|
130
|
+
const b = makeBaseline();
|
|
131
|
+
const diff = diffBaselines(b, { ...b, runId: "xxxx", timestamp: "2026-06-12T00:00:00.000Z" });
|
|
132
|
+
expect(diff.regressions).toHaveLength(0);
|
|
133
|
+
expect(diff.improvements).toHaveLength(0);
|
|
134
|
+
expect(diff.hasRegressions).toBe(false);
|
|
135
|
+
});
|
|
136
|
+
it("new sub-category appearing at High counts as regression from None", () => {
|
|
137
|
+
const prior = makeBaseline({ severities: {} });
|
|
138
|
+
const current = makeBaseline({
|
|
139
|
+
runId: "new",
|
|
140
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
141
|
+
severities: { "agent-01|CS|Data Poisoning": "High" },
|
|
142
|
+
});
|
|
143
|
+
const diff = diffBaselines(prior, current);
|
|
144
|
+
expect(diff.regressions).toHaveLength(1);
|
|
145
|
+
expect(diff.regressions[0].from).toBe("None");
|
|
146
|
+
expect(diff.regressions[0].to).toBe("High");
|
|
147
|
+
});
|
|
148
|
+
it("sub-category disappearing from High counts as improvement to None", () => {
|
|
149
|
+
const prior = makeBaseline({ severities: { "agent-01|CS|Data Poisoning": "High" } });
|
|
150
|
+
const current = makeBaseline({ runId: "new", timestamp: "2026-06-12T00:00:00.000Z", severities: {} });
|
|
151
|
+
const diff = diffBaselines(prior, current);
|
|
152
|
+
expect(diff.improvements).toHaveLength(1);
|
|
153
|
+
expect(diff.improvements[0].from).toBe("High");
|
|
154
|
+
expect(diff.improvements[0].to).toBe("None");
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe("diffBaselines — agent changes", () => {
|
|
158
|
+
it("detects new agents", () => {
|
|
159
|
+
const prior = makeBaseline({ agents: [{ id: "a", name: "Alpha" }] });
|
|
160
|
+
const current = makeBaseline({
|
|
161
|
+
runId: "new",
|
|
162
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
163
|
+
agents: [{ id: "a", name: "Alpha" }, { id: "b", name: "Beta" }],
|
|
164
|
+
});
|
|
165
|
+
const diff = diffBaselines(prior, current);
|
|
166
|
+
expect(diff.newAgents).toHaveLength(1);
|
|
167
|
+
expect(diff.newAgents[0].id).toBe("b");
|
|
168
|
+
});
|
|
169
|
+
it("detects removed agents", () => {
|
|
170
|
+
const prior = makeBaseline({
|
|
171
|
+
agents: [{ id: "a", name: "Alpha" }, { id: "b", name: "Beta" }],
|
|
172
|
+
});
|
|
173
|
+
const current = makeBaseline({
|
|
174
|
+
runId: "new",
|
|
175
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
176
|
+
agents: [{ id: "a", name: "Alpha" }],
|
|
177
|
+
});
|
|
178
|
+
const diff = diffBaselines(prior, current);
|
|
179
|
+
expect(diff.removedAgents).toHaveLength(1);
|
|
180
|
+
expect(diff.removedAgents[0].id).toBe("b");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe("diffBaselines — count delta", () => {
|
|
184
|
+
it("reflects net change in severity counts", () => {
|
|
185
|
+
const prior = makeBaseline({ counts: { Critical: 0, High: 1, Medium: 2, Low: 3, None: 0 } });
|
|
186
|
+
const current = makeBaseline({
|
|
187
|
+
runId: "new",
|
|
188
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
189
|
+
counts: { Critical: 1, High: 3, Medium: 1, Low: 3, None: 0 },
|
|
190
|
+
});
|
|
191
|
+
const diff = diffBaselines(prior, current);
|
|
192
|
+
expect(diff.countDelta.Critical).toBe(1);
|
|
193
|
+
expect(diff.countDelta.High).toBe(2);
|
|
194
|
+
expect(diff.countDelta.Medium).toBe(-1);
|
|
195
|
+
expect(diff.countDelta.Low).toBe(0);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe("formatDiff", () => {
|
|
199
|
+
it("produces non-empty human-readable output", () => {
|
|
200
|
+
const prior = makeBaseline();
|
|
201
|
+
const current = makeBaseline({
|
|
202
|
+
runId: "ccdd3344",
|
|
203
|
+
timestamp: "2026-06-12T00:00:00.000Z",
|
|
204
|
+
severities: { ...makeBaseline().severities, "agent-01|MR|Evasion Resistance": "High" },
|
|
205
|
+
counts: { Critical: 0, High: 2, Medium: 0, Low: 1, None: 0 },
|
|
206
|
+
});
|
|
207
|
+
const diff = diffBaselines(prior, current);
|
|
208
|
+
const report = formatDiff(diff);
|
|
209
|
+
expect(report).toContain("Canopy diff");
|
|
210
|
+
expect(report).toContain("Evasion Resistance");
|
|
211
|
+
expect(report).toContain("Medium → High");
|
|
212
|
+
});
|
|
213
|
+
it("says 'no severity changes' when nothing changed", () => {
|
|
214
|
+
const b = makeBaseline();
|
|
215
|
+
const diff = diffBaselines(b, { ...b, runId: "x", timestamp: "2026-06-12T00:00:00.000Z" });
|
|
216
|
+
expect(formatDiff(diff)).toContain("No severity changes");
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=baseline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.test.js","sourceRoot":"","sources":["../../src/baseline/baseline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline diff — compares two AssessmentBaseline snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Severity ordering (ascending risk): None < Low < Medium < High < Critical
|
|
5
|
+
* A regression is any sub-category that moved to a higher severity.
|
|
6
|
+
* An improvement is any sub-category that moved to a lower severity.
|
|
7
|
+
*/
|
|
8
|
+
import type { SeverityLabel } from "../aivss/types.js";
|
|
9
|
+
import type { AssessmentBaseline } from "./store.js";
|
|
10
|
+
export interface SeverityChange {
|
|
11
|
+
agentId: string;
|
|
12
|
+
agentName: string;
|
|
13
|
+
metric: string;
|
|
14
|
+
subCategory: string;
|
|
15
|
+
from: SeverityLabel;
|
|
16
|
+
to: SeverityLabel;
|
|
17
|
+
}
|
|
18
|
+
export interface BaselineDiff {
|
|
19
|
+
priorRunId: string;
|
|
20
|
+
currentRunId: string;
|
|
21
|
+
priorTimestamp: string;
|
|
22
|
+
currentTimestamp: string;
|
|
23
|
+
/** Sub-categories that moved to a higher severity — the actionable list. */
|
|
24
|
+
regressions: SeverityChange[];
|
|
25
|
+
/** Sub-categories that moved to a lower severity. */
|
|
26
|
+
improvements: SeverityChange[];
|
|
27
|
+
/** Agent IDs present in current but absent in prior. */
|
|
28
|
+
newAgents: AgentDelta[];
|
|
29
|
+
/** Agent IDs present in prior but absent in current. */
|
|
30
|
+
removedAgents: AgentDelta[];
|
|
31
|
+
/** Positive = more findings at that severity; negative = fewer. */
|
|
32
|
+
countDelta: Record<SeverityLabel, number>;
|
|
33
|
+
/** True if any regressions exist — use as CI exit-code signal. */
|
|
34
|
+
hasRegressions: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface AgentDelta {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function diffBaselines(prior: AssessmentBaseline, current: AssessmentBaseline): BaselineDiff;
|
|
41
|
+
export declare function formatDiff(diff: BaselineDiff): string;
|
|
42
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/baseline/diff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,aAAa,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,qDAAqD;IACrD,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,wDAAwD;IACxD,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,wDAAwD;IACxD,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AA2BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAqDlG;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAkDrD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline diff — compares two AssessmentBaseline snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Severity ordering (ascending risk): None < Low < Medium < High < Critical
|
|
5
|
+
* A regression is any sub-category that moved to a higher severity.
|
|
6
|
+
* An improvement is any sub-category that moved to a lower severity.
|
|
7
|
+
*/
|
|
8
|
+
// ── Severity ordering ─────────────────────────────────────────────────────────
|
|
9
|
+
const SEVERITY_RANK = {
|
|
10
|
+
None: 0, Low: 1, Medium: 2, High: 3, Critical: 4,
|
|
11
|
+
};
|
|
12
|
+
function isRegression(from, to) {
|
|
13
|
+
return SEVERITY_RANK[to] > SEVERITY_RANK[from];
|
|
14
|
+
}
|
|
15
|
+
function isImprovement(from, to) {
|
|
16
|
+
return SEVERITY_RANK[to] < SEVERITY_RANK[from];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Decode a severityKey of the form "{agentId}|{metric}|{subCategory}".
|
|
20
|
+
* Metric codes are always 2 uppercase ASCII chars; agentId may contain pipes
|
|
21
|
+
* in theory but doesn't in practice (kebab-case IDs).
|
|
22
|
+
*/
|
|
23
|
+
function decodeKey(key) {
|
|
24
|
+
const parts = key.split("|");
|
|
25
|
+
// Last part is subCategory (may contain spaces), second-to-last is metric (2 chars), rest is agentId
|
|
26
|
+
if (parts.length < 3)
|
|
27
|
+
return { agentId: key, metric: "??", subCategory: "??" };
|
|
28
|
+
const subCategory = parts.slice(2).join("|");
|
|
29
|
+
const metric = parts[1] ?? "??";
|
|
30
|
+
const agentId = parts[0] ?? "??";
|
|
31
|
+
return { agentId, metric, subCategory };
|
|
32
|
+
}
|
|
33
|
+
// ── Diff ──────────────────────────────────────────────────────────────────────
|
|
34
|
+
export function diffBaselines(prior, current) {
|
|
35
|
+
const priorAgentMap = new Map(prior.agents.map((a) => [a.id, a.name]));
|
|
36
|
+
const currentAgentMap = new Map(current.agents.map((a) => [a.id, a.name]));
|
|
37
|
+
const newAgents = current.agents.filter((a) => !priorAgentMap.has(a.id));
|
|
38
|
+
const removedAgents = prior.agents.filter((a) => !currentAgentMap.has(a.id));
|
|
39
|
+
const regressions = [];
|
|
40
|
+
const improvements = [];
|
|
41
|
+
// Walk all keys present in either snapshot
|
|
42
|
+
const allKeys = new Set([
|
|
43
|
+
...Object.keys(prior.severities),
|
|
44
|
+
...Object.keys(current.severities),
|
|
45
|
+
]);
|
|
46
|
+
for (const key of allKeys) {
|
|
47
|
+
const from = prior.severities[key] ?? "None";
|
|
48
|
+
const to = current.severities[key] ?? "None";
|
|
49
|
+
if (from === to)
|
|
50
|
+
continue;
|
|
51
|
+
const { agentId, metric, subCategory } = decodeKey(key);
|
|
52
|
+
const agentName = currentAgentMap.get(agentId) ?? priorAgentMap.get(agentId) ?? agentId;
|
|
53
|
+
const change = { agentId, agentName, metric, subCategory, from, to };
|
|
54
|
+
if (isRegression(from, to))
|
|
55
|
+
regressions.push(change);
|
|
56
|
+
else if (isImprovement(from, to))
|
|
57
|
+
improvements.push(change);
|
|
58
|
+
}
|
|
59
|
+
// Sort regressions by severity drop magnitude (biggest first)
|
|
60
|
+
regressions.sort((a, b) => (SEVERITY_RANK[b.to] - SEVERITY_RANK[b.from]) - (SEVERITY_RANK[a.to] - SEVERITY_RANK[a.from]));
|
|
61
|
+
const countDelta = {
|
|
62
|
+
Critical: 0, High: 0, Medium: 0, Low: 0, None: 0,
|
|
63
|
+
};
|
|
64
|
+
for (const sev of ["Critical", "High", "Medium", "Low", "None"]) {
|
|
65
|
+
countDelta[sev] = (current.counts[sev] ?? 0) - (prior.counts[sev] ?? 0);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
priorRunId: prior.runId,
|
|
69
|
+
currentRunId: current.runId,
|
|
70
|
+
priorTimestamp: prior.timestamp,
|
|
71
|
+
currentTimestamp: current.timestamp,
|
|
72
|
+
regressions,
|
|
73
|
+
improvements,
|
|
74
|
+
newAgents,
|
|
75
|
+
removedAgents,
|
|
76
|
+
countDelta,
|
|
77
|
+
hasRegressions: regressions.length > 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ── Human-readable report ─────────────────────────────────────────────────────
|
|
81
|
+
export function formatDiff(diff) {
|
|
82
|
+
const lines = [];
|
|
83
|
+
const fmtTs = (iso) => iso.replace("T", " ").replace(/\.\d+Z$/, " UTC");
|
|
84
|
+
lines.push(`Canopy diff — ${fmtTs(diff.priorTimestamp)} → ${fmtTs(diff.currentTimestamp)}`);
|
|
85
|
+
lines.push(` prior: ${diff.priorRunId} current: ${diff.currentRunId}`);
|
|
86
|
+
lines.push("");
|
|
87
|
+
// Count summary
|
|
88
|
+
const deltaLine = ["Critical", "High", "Medium", "Low"]
|
|
89
|
+
.map((s) => {
|
|
90
|
+
const d = diff.countDelta[s] ?? 0;
|
|
91
|
+
if (d === 0)
|
|
92
|
+
return null;
|
|
93
|
+
return `${s} ${d > 0 ? `+${d}` : d}`;
|
|
94
|
+
})
|
|
95
|
+
.filter(Boolean)
|
|
96
|
+
.join(" ");
|
|
97
|
+
lines.push(deltaLine ? ` Counts: ${deltaLine}` : " Counts: no change");
|
|
98
|
+
if (diff.newAgents.length > 0) {
|
|
99
|
+
lines.push(` New agents: ${diff.newAgents.map((a) => a.name).join(", ")}`);
|
|
100
|
+
}
|
|
101
|
+
if (diff.removedAgents.length > 0) {
|
|
102
|
+
lines.push(` Removed agents: ${diff.removedAgents.map((a) => a.name).join(", ")}`);
|
|
103
|
+
}
|
|
104
|
+
lines.push("");
|
|
105
|
+
if (diff.regressions.length === 0 && diff.improvements.length === 0) {
|
|
106
|
+
lines.push(" No severity changes.");
|
|
107
|
+
return lines.join("\n");
|
|
108
|
+
}
|
|
109
|
+
if (diff.regressions.length > 0) {
|
|
110
|
+
lines.push(` Regressions (${diff.regressions.length}):`);
|
|
111
|
+
for (const r of diff.regressions) {
|
|
112
|
+
lines.push(` ↑ ${r.agentName} / ${r.metric} / ${r.subCategory} ${r.from} → ${r.to}`);
|
|
113
|
+
}
|
|
114
|
+
lines.push("");
|
|
115
|
+
}
|
|
116
|
+
if (diff.improvements.length > 0) {
|
|
117
|
+
lines.push(` Improvements (${diff.improvements.length}):`);
|
|
118
|
+
for (const r of diff.improvements) {
|
|
119
|
+
lines.push(` ↓ ${r.agentName} / ${r.metric} / ${r.subCategory} ${r.from} → ${r.to}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/baseline/diff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,iFAAiF;AAEjF,MAAM,aAAa,GAAkC;IACnD,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;CACjD,CAAC;AAEF,SAAS,YAAY,CAAC,IAAmB,EAAE,EAAiB;IAC1D,OAAO,aAAa,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB,EAAE,EAAiB;IAC3D,OAAO,aAAa,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AA6CD;;;;GAIG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,qGAAqG;IACrG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/E,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,aAAa,CAAC,KAAyB,EAAE,OAA2B;IAClF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,SAAS,GAAiB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,aAAa,GAAiB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3F,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAqB,EAAE,CAAC;IAE1C,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAChC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;QAC7C,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAE1B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;QACxF,MAAM,MAAM,GAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAErF,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAChD,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,8DAA8D;IAC9D,WAAW,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACxG,CAAC;IAEF,MAAM,UAAU,GAAkC;QAChD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;KACjD,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAoB,EAAE,CAAC;QACnF,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,KAAK;QACvB,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,cAAc,EAAE,KAAK,CAAC,SAAS;QAC/B,gBAAgB,EAAE,OAAO,CAAC,SAAS;QACnC,WAAW;QACX,YAAY;QACZ,SAAS;QACT,aAAa;QACb,UAAU;QACV,cAAc,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,UAAU,CAAC,IAAkB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEhF,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,MAAM,SAAS,GAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAqB;SACzE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAEzE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline store — persists compact assessment snapshots for diffing.
|
|
3
|
+
*
|
|
4
|
+
* Each snapshot is written as a JSON file under:
|
|
5
|
+
* {historyDir}/.canopy-history/{slug}/{ISO-timestamp}.json
|
|
6
|
+
*
|
|
7
|
+
* "Latest" is resolved by lexicographic sort on ISO timestamps — no registry needed.
|
|
8
|
+
* The store is append-only; nothing is ever deleted by Canopy.
|
|
9
|
+
*/
|
|
10
|
+
import type { SeverityLabel } from "../aivss/types.js";
|
|
11
|
+
export interface AgentSummary {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AssessmentBaseline {
|
|
16
|
+
/** Short random ID for this run — used in diff output. */
|
|
17
|
+
runId: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
applicationName: string;
|
|
20
|
+
agents: AgentSummary[];
|
|
21
|
+
/**
|
|
22
|
+
* Flat severity map. Key format: "{agentId}|{metricCode}|{subCategory}".
|
|
23
|
+
* Matches the severityKey() encoding in tc-assembler.
|
|
24
|
+
*/
|
|
25
|
+
severities: Record<string, SeverityLabel>;
|
|
26
|
+
counts: Record<SeverityLabel, number>;
|
|
27
|
+
/** Relative path to the full .tc.json, if one was written. */
|
|
28
|
+
tcJsonPath?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Save a baseline snapshot.
|
|
32
|
+
*
|
|
33
|
+
* @param baseline The snapshot to persist.
|
|
34
|
+
* @param baseDir Directory under which .canopy-history/ is created (typically the output dir).
|
|
35
|
+
*/
|
|
36
|
+
export declare function saveBaseline(baseline: AssessmentBaseline, baseDir: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Load the N most recent baselines for an application, newest first.
|
|
39
|
+
* Returns an empty array if none exist.
|
|
40
|
+
*/
|
|
41
|
+
export declare function loadRecentBaselines(baseDir: string, applicationName: string, n?: number): AssessmentBaseline[];
|
|
42
|
+
/**
|
|
43
|
+
* Build an AssessmentBaseline from the data produced by an assessment run.
|
|
44
|
+
*
|
|
45
|
+
* @param applicationName Name of the system assessed.
|
|
46
|
+
* @param agents Agent summaries (id + name).
|
|
47
|
+
* @param severities Flat severity map from the assembler (severityKey → SeverityLabel).
|
|
48
|
+
* @param tcJsonPath Optional relative path to the .tc.json written this run.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildBaseline(applicationName: string, agents: AgentSummary[], severities: Map<string, SeverityLabel>, tcJsonPath?: string): AssessmentBaseline;
|
|
51
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/baseline/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACtC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,CAAC,SAAI,GACJ,kBAAkB,EAAE,CAkBtB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,YAAY,EAAE,EACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,kBAAkB,CAoBpB"}
|