@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,279 @@
|
|
|
1
|
+
import { calculateAIVSSScore, buildBatchRequests, AIVSSKnowledgeBase, } from "../aivss/index";
|
|
2
|
+
import demoAgent from "./demo-agent-definition.json";
|
|
3
|
+
const METRIC_CODES = ["MR", "DS", "EI", "DC", "AD", "AA", "LL", "GV", "CS"];
|
|
4
|
+
const DEMO_AGENTS = [
|
|
5
|
+
demoAgent,
|
|
6
|
+
{
|
|
7
|
+
id: "agent-002",
|
|
8
|
+
name: "Data Analysis Agent",
|
|
9
|
+
model: "claude-opus-4-7",
|
|
10
|
+
systemPrompt: "You are a data analysis expert. Analyze CSV files and generate reports.",
|
|
11
|
+
tools: [
|
|
12
|
+
{ name: "read_csv", description: "Read CSV file", dangerous: false },
|
|
13
|
+
{
|
|
14
|
+
name: "execute_python",
|
|
15
|
+
description: "Execute Python code",
|
|
16
|
+
dangerous: true,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
permissions: ["read:files", "write:reports"],
|
|
20
|
+
deploymentContext: "General",
|
|
21
|
+
modelComplexity: "Complex",
|
|
22
|
+
mitigationMultiplier: 0.95,
|
|
23
|
+
finetuned: true,
|
|
24
|
+
dependencies: [
|
|
25
|
+
"pandas-runner",
|
|
26
|
+
"reporting-service-client",
|
|
27
|
+
"storage-gateway",
|
|
28
|
+
"artifact-scanner",
|
|
29
|
+
],
|
|
30
|
+
secretManagement: "Vault-backed short-lived credentials with scoped execution roles",
|
|
31
|
+
deployment: "Kubernetes job runner with network policies and artifact scanning",
|
|
32
|
+
dataSources: ["user_uploads"],
|
|
33
|
+
autonomyLevel: "supervised",
|
|
34
|
+
objectives: ["Provide accurate data analysis"],
|
|
35
|
+
externalApiCount: 1,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
async function runBatchAssessment() {
|
|
39
|
+
console.log("═══════════════════════════════════════════════════════");
|
|
40
|
+
console.log("AIVSS Batch Assessment Flow");
|
|
41
|
+
console.log("═══════════════════════════════════════════════════════\n");
|
|
42
|
+
console.log("Step 1: Initializing AIVSS Knowledge Base...");
|
|
43
|
+
const kb = new AIVSSKnowledgeBase();
|
|
44
|
+
console.log("✓ Knowledge base initialized with mock AIVSS 0.8 data\n");
|
|
45
|
+
console.log("Step 2: Building batch requests...");
|
|
46
|
+
const requests = await buildBatchRequests({
|
|
47
|
+
agents: DEMO_AGENTS,
|
|
48
|
+
useKnowledgeBase: true,
|
|
49
|
+
model: "claude-opus-4-7",
|
|
50
|
+
temperature: 0,
|
|
51
|
+
maxTokens: 1024,
|
|
52
|
+
}, kb);
|
|
53
|
+
console.log(`✓ Built ${requests.length} assessment requests`);
|
|
54
|
+
console.log(` - ${DEMO_AGENTS.length} agents`);
|
|
55
|
+
console.log(` - ${METRIC_CODES.length} V4 metrics per agent\n`);
|
|
56
|
+
console.log("Step 3: Sample request structure:");
|
|
57
|
+
const sampleRequest = requests[0];
|
|
58
|
+
console.log(` Custom ID: ${sampleRequest.custom_id}`);
|
|
59
|
+
console.log(` Model: ${sampleRequest.params.model}`);
|
|
60
|
+
console.log(` Temperature: ${sampleRequest.params.temperature}`);
|
|
61
|
+
console.log(` Max Tokens: ${sampleRequest.params.max_tokens}`);
|
|
62
|
+
console.log(` System prompt length: ${sampleRequest.params.system.length} characters`);
|
|
63
|
+
console.log(` User message length: ${sampleRequest.params.messages[0].content.length} characters\n`);
|
|
64
|
+
console.log("Step 4: Would submit to Claude Batch API");
|
|
65
|
+
console.log(" (In production, use: client.beta.messages.batches.create)");
|
|
66
|
+
console.log(" Request payload would contain all assessment requests\n");
|
|
67
|
+
console.log("Step 5: Simulating result polling and processing...");
|
|
68
|
+
const results = simulateBatchResults(requests, DEMO_AGENTS);
|
|
69
|
+
summarizeResults(DEMO_AGENTS, results);
|
|
70
|
+
console.log("\n═══════════════════════════════════════════════════════");
|
|
71
|
+
console.log("Batch assessment flow complete");
|
|
72
|
+
console.log("═══════════════════════════════════════════════════════");
|
|
73
|
+
}
|
|
74
|
+
function simulateBatchResults(requests, agents) {
|
|
75
|
+
return buildBatchRequestsResultSet(requests, agents);
|
|
76
|
+
}
|
|
77
|
+
function summarizeResults(agents, results) {
|
|
78
|
+
const assessmentsByAgent = new Map();
|
|
79
|
+
for (const result of results) {
|
|
80
|
+
if (result.result.type !== "succeeded") {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const [agentId] = result.custom_id.split(/-(?=[A-Z]{2}$)/);
|
|
84
|
+
const content = result.result.message?.content[0]?.text;
|
|
85
|
+
if (!agentId || !content) {
|
|
86
|
+
throw new Error(`Malformed batch result for ${result.custom_id}`);
|
|
87
|
+
}
|
|
88
|
+
const assessment = parseAssessmentResponse(content, result.custom_id);
|
|
89
|
+
const existing = assessmentsByAgent.get(agentId) ?? [];
|
|
90
|
+
existing.push(assessment);
|
|
91
|
+
assessmentsByAgent.set(agentId, existing);
|
|
92
|
+
}
|
|
93
|
+
console.log(" Agent Risk Summary:");
|
|
94
|
+
for (const agent of agents) {
|
|
95
|
+
const metricResponses = assessmentsByAgent.get(agent.id);
|
|
96
|
+
if (!metricResponses || metricResponses.length !== METRIC_CODES.length) {
|
|
97
|
+
throw new Error(`Expected ${METRIC_CODES.length} metric responses for ${agent.id}`);
|
|
98
|
+
}
|
|
99
|
+
const score = calculateAIVSSScore({
|
|
100
|
+
agentDefinition: agent,
|
|
101
|
+
metricResponses,
|
|
102
|
+
baseScore: agent.deploymentContext === "FinancialServices" ? 2.8 : 2.1,
|
|
103
|
+
impactScore: agent.autonomyLevel === "supervised" ? 5.4 : 6.7,
|
|
104
|
+
temporalScore: 0.96,
|
|
105
|
+
});
|
|
106
|
+
console.log(` ${agent.name}: ${score.severity.toUpperCase()} (${score.aivssScore.toFixed(2)}/10)${score.deploymentBlocker ? " [DEPLOYMENT BLOCKER]" : ""}`);
|
|
107
|
+
}
|
|
108
|
+
console.log("\n Results would be:");
|
|
109
|
+
console.log(" - Stored in compliance database");
|
|
110
|
+
console.log(" - Displayed on risk dashboard");
|
|
111
|
+
console.log(" - Alerts sent for deployment blockers");
|
|
112
|
+
console.log(" - Historical tracking updated");
|
|
113
|
+
}
|
|
114
|
+
function buildBatchRequestsResultSet(requests, agents) {
|
|
115
|
+
const agentsById = new Map(agents.map((agent) => [agent.id, agent]));
|
|
116
|
+
return requests.map((request) => {
|
|
117
|
+
const [agentId, metricCodeText] = request.custom_id.split(/-(?=[A-Z]{2}$)/);
|
|
118
|
+
const agent = agentId ? agentsById.get(agentId) : undefined;
|
|
119
|
+
if (!agent || !metricCodeText || !isMetricCode(metricCodeText)) {
|
|
120
|
+
throw new Error(`Cannot simulate batch result for ${request.custom_id}`);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
custom_id: request.custom_id,
|
|
124
|
+
result: {
|
|
125
|
+
type: "succeeded",
|
|
126
|
+
message: {
|
|
127
|
+
content: [
|
|
128
|
+
{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: JSON.stringify(buildMockAssessment(agent, metricCodeText)),
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function buildMockAssessment(agent, metricCode) {
|
|
139
|
+
const dangerousToolCount = agent.tools.filter((tool) => tool.dangerous).length;
|
|
140
|
+
switch (metricCode) {
|
|
141
|
+
case "MR":
|
|
142
|
+
return {
|
|
143
|
+
metricCode,
|
|
144
|
+
subCategoryScores: {
|
|
145
|
+
"Evasion Resistance": dangerousToolCount > 0 ? "High" : "Medium",
|
|
146
|
+
"Gradient Masking / Obfuscation": "Medium",
|
|
147
|
+
"Robustness Certification": agent.finetuned ? "Low" : "Medium",
|
|
148
|
+
},
|
|
149
|
+
findings: ["Robustness evidence is incomplete for prompt and tool-mediated adversarial inputs."],
|
|
150
|
+
deploymentBlocker: false,
|
|
151
|
+
};
|
|
152
|
+
case "DS":
|
|
153
|
+
return {
|
|
154
|
+
metricCode,
|
|
155
|
+
subCategoryScores: {
|
|
156
|
+
"Data Confidentiality": agent.permissions.length > 3 ? "High" : "Medium",
|
|
157
|
+
"Data Integrity": "Medium",
|
|
158
|
+
"Data Provenance": agent.dataSources?.some((source) => source.includes("user")) ? "High" : "Medium",
|
|
159
|
+
},
|
|
160
|
+
findings: ["User-influenced data and privileged access increase data handling exposure."],
|
|
161
|
+
deploymentBlocker: false,
|
|
162
|
+
};
|
|
163
|
+
case "EI":
|
|
164
|
+
return {
|
|
165
|
+
metricCode,
|
|
166
|
+
subCategoryScores: {
|
|
167
|
+
"Bias and Discrimination": "Low",
|
|
168
|
+
"Transparency and Explainability": "Medium",
|
|
169
|
+
Accountability: "Medium",
|
|
170
|
+
"Societal Impact": agent.deploymentContext === "FinancialServices" ? "Medium" : "Low",
|
|
171
|
+
},
|
|
172
|
+
findings: ["Explainability and operator accountability need consistent evidence."],
|
|
173
|
+
deploymentBlocker: false,
|
|
174
|
+
};
|
|
175
|
+
case "DC":
|
|
176
|
+
return {
|
|
177
|
+
metricCode,
|
|
178
|
+
subCategoryScores: {
|
|
179
|
+
"Safety-Critical Applications": "None",
|
|
180
|
+
"Financial Impact": agent.deploymentContext === "FinancialServices" ? "High" : "Medium",
|
|
181
|
+
"Reputational Damage": "Medium",
|
|
182
|
+
"Operational Disruption": dangerousToolCount > 0 ? "Medium" : "Low",
|
|
183
|
+
},
|
|
184
|
+
findings: ["Incorrect outputs could drive meaningful business-process harm."],
|
|
185
|
+
deploymentBlocker: false,
|
|
186
|
+
};
|
|
187
|
+
case "AD":
|
|
188
|
+
return {
|
|
189
|
+
metricCode,
|
|
190
|
+
subCategoryScores: {
|
|
191
|
+
"Continuous Monitoring": "Medium",
|
|
192
|
+
"Retraining Capabilities": agent.finetuned ? "Low" : "Medium",
|
|
193
|
+
"Threat Intelligence Integration": "Medium",
|
|
194
|
+
"Adversarial Training": "Medium",
|
|
195
|
+
},
|
|
196
|
+
findings: ["Adaptive hardening exists, but feedback loops are not deeply automated."],
|
|
197
|
+
deploymentBlocker: false,
|
|
198
|
+
};
|
|
199
|
+
case "AA":
|
|
200
|
+
return {
|
|
201
|
+
metricCode,
|
|
202
|
+
subCategoryScores: {
|
|
203
|
+
"Model Inversion": "Low",
|
|
204
|
+
"Model Extraction": "Low",
|
|
205
|
+
"Membership Inference": agent.dataSources?.length ? "Medium" : "Low",
|
|
206
|
+
},
|
|
207
|
+
findings: ["Interfaces should be monitored for privacy leakage and behavioral extraction patterns."],
|
|
208
|
+
deploymentBlocker: false,
|
|
209
|
+
};
|
|
210
|
+
case "LL":
|
|
211
|
+
return {
|
|
212
|
+
metricCode,
|
|
213
|
+
subCategoryScores: {
|
|
214
|
+
"Development Security": "Medium",
|
|
215
|
+
"Training Security": agent.finetuned ? "Medium" : "Low",
|
|
216
|
+
"Deployment Security": "Medium",
|
|
217
|
+
"Operational Security": "Medium",
|
|
218
|
+
},
|
|
219
|
+
findings: ["Dependency and runtime controls are present but not yet fully hardened."],
|
|
220
|
+
deploymentBlocker: false,
|
|
221
|
+
};
|
|
222
|
+
case "GV":
|
|
223
|
+
return {
|
|
224
|
+
metricCode,
|
|
225
|
+
subCategoryScores: {
|
|
226
|
+
"Regulatory Compliance": agent.deploymentContext === "FinancialServices" ? "Medium" : "Low",
|
|
227
|
+
Auditing: "Medium",
|
|
228
|
+
"Risk Management": "Medium",
|
|
229
|
+
"Human Oversight": agent.autonomyLevel === "supervised" ? "Low" : "Medium",
|
|
230
|
+
"Ethical Framework Alignment": "Low",
|
|
231
|
+
},
|
|
232
|
+
findings: ["Governance requirements rise with sector obligations and privileged workflows."],
|
|
233
|
+
deploymentBlocker: false,
|
|
234
|
+
};
|
|
235
|
+
case "CS":
|
|
236
|
+
return {
|
|
237
|
+
metricCode,
|
|
238
|
+
subCategoryScores: {
|
|
239
|
+
"Model Manipulation / Prompt Injection": dangerousToolCount > 0 ? "High" : "Medium",
|
|
240
|
+
"Data Poisoning": agent.dataSources?.some((source) => source.includes("user")) ? "High" : "Medium",
|
|
241
|
+
"Sensitive Data Disclosure": agent.permissions.length > 3 ? "High" : "Medium",
|
|
242
|
+
"Model Stealing": "Low",
|
|
243
|
+
"Failure / Malfunctioning": "Medium",
|
|
244
|
+
"Insecure Supply Chain": agent.dependencies.length > 3 ? "Medium" : "Low",
|
|
245
|
+
"Insecure Apps / Plugins": dangerousToolCount > 0 ? "High" : "Medium",
|
|
246
|
+
"Denial of Service (DoS)": "Low",
|
|
247
|
+
"Loss of Governance / Compliance": agent.deploymentContext === "FinancialServices" ? "Medium" : "Low",
|
|
248
|
+
},
|
|
249
|
+
findings: ["Tool authority and user-influenced inputs create the main deployment risk."],
|
|
250
|
+
deploymentBlocker: dangerousToolCount > 0,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function parseAssessmentResponse(payload, customId) {
|
|
255
|
+
let parsed;
|
|
256
|
+
try {
|
|
257
|
+
parsed = JSON.parse(payload);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
throw new Error(`Invalid JSON in batch result ${customId}: ${String(error)}`);
|
|
261
|
+
}
|
|
262
|
+
if (!parsed || typeof parsed !== "object") {
|
|
263
|
+
throw new Error(`Invalid assessment payload for ${customId}`);
|
|
264
|
+
}
|
|
265
|
+
const assessment = parsed;
|
|
266
|
+
if (typeof assessment.metricCode !== "string" ||
|
|
267
|
+
typeof assessment.deploymentBlocker !== "boolean" ||
|
|
268
|
+
!Array.isArray(assessment.findings) ||
|
|
269
|
+
!assessment.subCategoryScores ||
|
|
270
|
+
typeof assessment.subCategoryScores !== "object") {
|
|
271
|
+
throw new Error(`Malformed assessment response for ${customId}`);
|
|
272
|
+
}
|
|
273
|
+
return assessment;
|
|
274
|
+
}
|
|
275
|
+
function isMetricCode(value) {
|
|
276
|
+
return METRIC_CODES.includes(value);
|
|
277
|
+
}
|
|
278
|
+
runBatchAssessment().catch(console.error);
|
|
279
|
+
//# sourceMappingURL=batch-submission-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-submission-flow.js","sourceRoot":"","sources":["../../src/examples/batch-submission-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "agent-001",
|
|
3
|
+
"name": "Customer Support Agent",
|
|
4
|
+
"model": "claude-opus-4-7",
|
|
5
|
+
"systemPrompt": "You are a helpful customer support agent. Answer customer questions about orders, returns, and refunds. Always be polite and professional. Do not make refunds larger than $500 without manager approval.",
|
|
6
|
+
"tools": [
|
|
7
|
+
{
|
|
8
|
+
"name": "lookup_order",
|
|
9
|
+
"description": "Look up a customer order by order ID or email",
|
|
10
|
+
"dangerous": false
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "process_refund",
|
|
14
|
+
"description": "Process a refund for an order",
|
|
15
|
+
"dangerous": true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "send_email",
|
|
19
|
+
"description": "Send an email to the customer",
|
|
20
|
+
"dangerous": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "access_customer_database",
|
|
24
|
+
"description": "Query customer database for information",
|
|
25
|
+
"dangerous": true
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"permissions": [
|
|
29
|
+
"read:orders",
|
|
30
|
+
"write:refunds",
|
|
31
|
+
"read:customers",
|
|
32
|
+
"write:emails"
|
|
33
|
+
],
|
|
34
|
+
"deploymentContext": "FinancialServices",
|
|
35
|
+
"modelComplexity": "Moderate",
|
|
36
|
+
"mitigationMultiplier": 1.1,
|
|
37
|
+
"finetuned": false,
|
|
38
|
+
"dependencies": [
|
|
39
|
+
"order-service-sdk",
|
|
40
|
+
"refund-orchestrator",
|
|
41
|
+
"customer-profile-api",
|
|
42
|
+
"email-gateway-client"
|
|
43
|
+
],
|
|
44
|
+
"secretManagement": "Cloud KMS with short-lived credentials injected at runtime",
|
|
45
|
+
"deployment": "AWS ECS Fargate in private subnets behind an API gateway",
|
|
46
|
+
"dataSources": [
|
|
47
|
+
"company_kb",
|
|
48
|
+
"product_catalog",
|
|
49
|
+
"order_history"
|
|
50
|
+
],
|
|
51
|
+
"autonomyLevel": "semi-autonomous",
|
|
52
|
+
"objectives": [
|
|
53
|
+
"Resolve customer issues quickly",
|
|
54
|
+
"Minimize refund costs",
|
|
55
|
+
"Maintain customer satisfaction"
|
|
56
|
+
],
|
|
57
|
+
"externalApiCount": 3
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse-assessment.d.ts","sourceRoot":"","sources":["../../src/examples/langfuse-assessment.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Usage: LANGFUSE_HOST=... LANGFUSE_SECRET_KEY=... LANGFUSE_PUBLIC_KEY=... bun src/examples/langfuse-assessment.ts
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { assessWorkflow } from "../index.js";
|
|
5
|
+
import { loadOverlaysFromYaml, parseLangfuseTraces, } from "../adapters/langfuse.js";
|
|
6
|
+
const OUTPUT_DIR = path.resolve(process.cwd(), "output");
|
|
7
|
+
const OUTPUT_FILE = path.join(OUTPUT_DIR, "langfuse-threat-model.tc.json");
|
|
8
|
+
const overlayPath = path.resolve(process.cwd(), process.env["LANGFUSE_OVERLAY_PATH"] ?? "src/examples/langfuse-overlay.example.yaml");
|
|
9
|
+
function readRequiredEnv(name) {
|
|
10
|
+
const value = process.env[name]?.trim();
|
|
11
|
+
if (!value) {
|
|
12
|
+
console.error(`Missing required environment variable: ${name}`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
async function main() {
|
|
18
|
+
const config = {
|
|
19
|
+
host: readRequiredEnv("LANGFUSE_HOST"),
|
|
20
|
+
secretKey: readRequiredEnv("LANGFUSE_SECRET_KEY"),
|
|
21
|
+
publicKey: readRequiredEnv("LANGFUSE_PUBLIC_KEY"),
|
|
22
|
+
projectId: process.env["LANGFUSE_PROJECT_ID"]?.trim() || undefined,
|
|
23
|
+
fromDate: process.env["LANGFUSE_FROM_DATE"]?.trim() || undefined,
|
|
24
|
+
limit: process.env["LANGFUSE_LIMIT"] ? Number(process.env["LANGFUSE_LIMIT"]) : undefined,
|
|
25
|
+
};
|
|
26
|
+
const overlays = loadOverlaysFromYaml(overlayPath);
|
|
27
|
+
const parsed = await parseLangfuseTraces(config, overlays);
|
|
28
|
+
const result = await assessWorkflow({
|
|
29
|
+
input: {
|
|
30
|
+
type: "agents",
|
|
31
|
+
agents: parsed.agents,
|
|
32
|
+
handoffs: parsed.handoffs,
|
|
33
|
+
},
|
|
34
|
+
applicationName: parsed.workflowName,
|
|
35
|
+
});
|
|
36
|
+
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
|
37
|
+
fs.writeFileSync(OUTPUT_FILE, JSON.stringify(result, null, 2));
|
|
38
|
+
console.log(`Agents found: ${parsed.agents.length}`);
|
|
39
|
+
console.log(`Threats: ${result.threats?.length ?? 0}`);
|
|
40
|
+
console.log(`Output: ${OUTPUT_FILE}`);
|
|
41
|
+
}
|
|
42
|
+
main().catch((error) => {
|
|
43
|
+
console.error(error);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=langfuse-assessment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse-assessment.js","sourceRoot":"","sources":["../../src/examples/langfuse-assessment.ts"],"names":[],"mappings":"AAAA,mHAAmH;AAEnH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;AAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC9B,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,4CAA4C,CACrF,CAAC;AAEF,SAAS,eAAe,CAAC,IAAqE;IAC5F,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAA0B;QACpC,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC;QACtC,SAAS,EAAE,eAAe,CAAC,qBAAqB,CAAC;QACjD,SAAS,EAAE,eAAe,CAAC,qBAAqB,CAAC;QACjD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;QAClE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;QAChE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACzF,CAAC;IACF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B;QACD,eAAe,EAAE,MAAM,CAAC,YAAY;KACrC,CAAC,CAAC;IAEH,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Evaluation Example
|
|
3
|
+
*
|
|
4
|
+
* Runs the AIVSS assessment through multiple Ollama models and produces a
|
|
5
|
+
* recommendation report. Use this to vet which models are suitable for
|
|
6
|
+
* reliable threat assessment before recommending them to users.
|
|
7
|
+
*
|
|
8
|
+
* Prerequisites:
|
|
9
|
+
* ollama pull llama3.2
|
|
10
|
+
* ollama pull qwen2.5:7b
|
|
11
|
+
* ollama pull mistral
|
|
12
|
+
* ollama pull gemma2:9b
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* # Local (default)
|
|
16
|
+
* bun src/examples/model-eval.ts
|
|
17
|
+
*
|
|
18
|
+
* # Custom model set
|
|
19
|
+
* MODELS=llama3.2,phi3.5,qwen2.5:3b bun src/examples/model-eval.ts
|
|
20
|
+
*
|
|
21
|
+
* # Ollama cloud
|
|
22
|
+
* OLLAMA_BASE_URL=https://ollama.com/api OLLAMA_API_KEY=<key> bun src/examples/model-eval.ts
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=model-eval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-eval.d.ts","sourceRoot":"","sources":["../../src/examples/model-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Evaluation Example
|
|
3
|
+
*
|
|
4
|
+
* Runs the AIVSS assessment through multiple Ollama models and produces a
|
|
5
|
+
* recommendation report. Use this to vet which models are suitable for
|
|
6
|
+
* reliable threat assessment before recommending them to users.
|
|
7
|
+
*
|
|
8
|
+
* Prerequisites:
|
|
9
|
+
* ollama pull llama3.2
|
|
10
|
+
* ollama pull qwen2.5:7b
|
|
11
|
+
* ollama pull mistral
|
|
12
|
+
* ollama pull gemma2:9b
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* # Local (default)
|
|
16
|
+
* bun src/examples/model-eval.ts
|
|
17
|
+
*
|
|
18
|
+
* # Custom model set
|
|
19
|
+
* MODELS=llama3.2,phi3.5,qwen2.5:3b bun src/examples/model-eval.ts
|
|
20
|
+
*
|
|
21
|
+
* # Ollama cloud
|
|
22
|
+
* OLLAMA_BASE_URL=https://ollama.com/api OLLAMA_API_KEY=<key> bun src/examples/model-eval.ts
|
|
23
|
+
*/
|
|
24
|
+
import * as path from "node:path";
|
|
25
|
+
import * as fs from "node:fs";
|
|
26
|
+
import { runModelEval } from "../tools/model-eval.js";
|
|
27
|
+
const OUTPUT_DIR = path.resolve(process.cwd(), "output");
|
|
28
|
+
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
|
29
|
+
// ── Config ────────────────────────────────────────────────────────────────────
|
|
30
|
+
const MODELS = (process.env["MODELS"] ?? "llama3.2,qwen2.5:7b,mistral").split(",").map((m) => m.trim());
|
|
31
|
+
const BASE_URL = process.env["OLLAMA_BASE_URL"];
|
|
32
|
+
const API_KEY = process.env["OLLAMA_API_KEY"];
|
|
33
|
+
// ── Representative agent ──────────────────────────────────────────────────────
|
|
34
|
+
// Single agent intentionally — eval quality, not throughput.
|
|
35
|
+
const agent = {
|
|
36
|
+
id: "eval-agent-001",
|
|
37
|
+
name: "Customer Support Agent",
|
|
38
|
+
model: "to-be-evaluated",
|
|
39
|
+
systemPrompt: "You are a customer support agent for a SaaS platform. You help users with account issues, " +
|
|
40
|
+
"billing enquiries, and technical troubleshooting. You have access to the user's account " +
|
|
41
|
+
"data and can initiate refunds up to $500. You escalate larger amounts to a human agent.",
|
|
42
|
+
tools: [
|
|
43
|
+
{ name: "lookup_account", description: "Look up a customer account by email or ID" },
|
|
44
|
+
{ name: "issue_refund", description: "Issue a refund to a customer (max $500)", dangerous: true },
|
|
45
|
+
{ name: "reset_password", description: "Trigger a password reset email" },
|
|
46
|
+
{ name: "create_support_ticket", description: "Create a support ticket for human follow-up" },
|
|
47
|
+
],
|
|
48
|
+
permissions: ["read:accounts", "write:refunds", "write:tickets"],
|
|
49
|
+
deploymentContext: "General",
|
|
50
|
+
modelComplexity: "Simple",
|
|
51
|
+
mitigationMultiplier: 1.0,
|
|
52
|
+
finetuned: false,
|
|
53
|
+
dependencies: ["account-db", "payment-gateway"],
|
|
54
|
+
secretManagement: "Environment Variables",
|
|
55
|
+
deployment: "AWS ECS Fargate",
|
|
56
|
+
};
|
|
57
|
+
// ── Run ───────────────────────────────────────────────────────────────────────
|
|
58
|
+
async function main() {
|
|
59
|
+
console.log("Canopy Model Evaluation");
|
|
60
|
+
console.log(`Models: ${MODELS.join(", ")}`);
|
|
61
|
+
if (BASE_URL)
|
|
62
|
+
console.log(`Base URL: ${BASE_URL}`);
|
|
63
|
+
console.log();
|
|
64
|
+
const start = Date.now();
|
|
65
|
+
const report = await runModelEval({
|
|
66
|
+
agents: [agent],
|
|
67
|
+
models: MODELS,
|
|
68
|
+
baseUrl: BASE_URL,
|
|
69
|
+
apiKey: API_KEY,
|
|
70
|
+
concurrency: 1,
|
|
71
|
+
maxTokens: 2048,
|
|
72
|
+
temperature: 0,
|
|
73
|
+
onModelComplete: (model, durationMs) => {
|
|
74
|
+
console.log(` ✓ ${model} — ${(durationMs / 1000).toFixed(1)}s`);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
const elapsed = ((Date.now() - start) / 1000).toFixed(1);
|
|
78
|
+
console.log(`\nComplete in ${elapsed}s\n`);
|
|
79
|
+
// Print summary to stdout
|
|
80
|
+
console.log(report.summary);
|
|
81
|
+
// Write full report JSON
|
|
82
|
+
const reportFile = path.join(OUTPUT_DIR, `model-eval-${Date.now()}.json`);
|
|
83
|
+
fs.writeFileSync(reportFile, JSON.stringify(report, null, 2));
|
|
84
|
+
console.log(`Full report: ${reportFile}`);
|
|
85
|
+
// Write markdown summary
|
|
86
|
+
const mdFile = path.join(OUTPUT_DIR, `model-eval-${Date.now()}.md`);
|
|
87
|
+
fs.writeFileSync(mdFile, report.summary);
|
|
88
|
+
console.log(`Markdown: ${mdFile}`);
|
|
89
|
+
}
|
|
90
|
+
main().catch((err) => {
|
|
91
|
+
console.error(err);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=model-eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-eval.js","sourceRoot":"","sources":["../../src/examples/model-eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Security Assessment Example
|
|
3
|
+
*
|
|
4
|
+
* Generates a multi-framework threat model for a live OpenClaw installation.
|
|
5
|
+
* Reads your ~/.openclaw/openclaw.json — no config required.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* bun src/examples/openclaw-assessment.ts
|
|
9
|
+
*
|
|
10
|
+
* Output:
|
|
11
|
+
* output/openclaw-threat-model.tc.json — import into AWS Threat Composer
|
|
12
|
+
* output/openclaw-architecture.c4 — view with: npx likec4 serve <file>
|
|
13
|
+
*
|
|
14
|
+
* AWS Threat Composer: https://github.com/awslabs/threat-composer
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=openclaw-assessment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-assessment.d.ts","sourceRoot":"","sources":["../../src/examples/openclaw-assessment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Security Assessment Example
|
|
3
|
+
*
|
|
4
|
+
* Generates a multi-framework threat model for a live OpenClaw installation.
|
|
5
|
+
* Reads your ~/.openclaw/openclaw.json — no config required.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* bun src/examples/openclaw-assessment.ts
|
|
9
|
+
*
|
|
10
|
+
* Output:
|
|
11
|
+
* output/openclaw-threat-model.tc.json — import into AWS Threat Composer
|
|
12
|
+
* output/openclaw-architecture.c4 — view with: npx likec4 serve <file>
|
|
13
|
+
*
|
|
14
|
+
* AWS Threat Composer: https://github.com/awslabs/threat-composer
|
|
15
|
+
*/
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import { assessWorkflow, generateLikeC4, likec4Filename } from "../index.js";
|
|
19
|
+
import { parseOpenClawConfig } from "../adapters/openclaw.js";
|
|
20
|
+
const OUTPUT_DIR = path.resolve(process.cwd(), "output");
|
|
21
|
+
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
|
22
|
+
async function main() {
|
|
23
|
+
// Parse the live OpenClaw installation
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = parseOpenClawConfig();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error(`\nOpenClaw not found: ${String(err)}\n`);
|
|
30
|
+
console.error("Install OpenClaw: https://docs.openclaw.ai/start/getting-started");
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
const { agents, handoffs, undeclaredSkills, resolvedConfigPath } = parsed;
|
|
34
|
+
const agent = agents[0];
|
|
35
|
+
console.log(`OpenClaw Security Assessment`);
|
|
36
|
+
console.log(`Config: ${resolvedConfigPath}`);
|
|
37
|
+
console.log(`Model: ${agent.model}`);
|
|
38
|
+
console.log(`Tools: ${agent.tools.length} (${agent.tools.filter((t) => t.dangerous).length} dangerous)`);
|
|
39
|
+
console.log(`Channels: ${agent.permissions.filter((p) => p.startsWith("read:")).length}`);
|
|
40
|
+
console.log(`Handoffs: ${handoffs.length}`);
|
|
41
|
+
if (undeclaredSkills.length > 0) {
|
|
42
|
+
console.warn(`\n⚠️ ${undeclaredSkills.length} skill(s) with no SKILL.md (UNDECLARED_CAPABILITY_RISK):`);
|
|
43
|
+
for (const s of undeclaredSkills)
|
|
44
|
+
console.warn(` - ${s}`);
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
// Run assessment (provider falls back to mock if no credentials)
|
|
48
|
+
const tcFormat = await assessWorkflow({
|
|
49
|
+
input: { type: "agents", agents, handoffs },
|
|
50
|
+
applicationName: "OpenClaw Personal AI Assistant",
|
|
51
|
+
});
|
|
52
|
+
// Write outputs
|
|
53
|
+
const tcFile = path.join(OUTPUT_DIR, "openclaw-threat-model.tc.json");
|
|
54
|
+
fs.writeFileSync(tcFile, JSON.stringify(tcFormat, null, 2));
|
|
55
|
+
const c4 = generateLikeC4({
|
|
56
|
+
agents,
|
|
57
|
+
handoffs,
|
|
58
|
+
applicationName: "OpenClaw Personal AI Assistant",
|
|
59
|
+
});
|
|
60
|
+
const c4File = path.join(OUTPUT_DIR, likec4Filename("OpenClaw Personal AI Assistant"));
|
|
61
|
+
fs.writeFileSync(c4File, c4);
|
|
62
|
+
const threats = tcFormat.threats?.length ?? 0;
|
|
63
|
+
const blockers = tcFormat.threats?.filter((t) => t.metadata?.some((m) => m.key === "deploymentBlocker" && m.value === "true")).length ?? 0;
|
|
64
|
+
console.log(`✓ Assessment complete`);
|
|
65
|
+
console.log(` Threats: ${threats}${blockers > 0 ? ` (${blockers} deployment blockers)` : ""}`);
|
|
66
|
+
console.log(` TC file: ${tcFile}`);
|
|
67
|
+
console.log(` C4 file: ${c4File}`);
|
|
68
|
+
console.log();
|
|
69
|
+
console.log("Open the threat model:");
|
|
70
|
+
console.log(" https://github.com/awslabs/threat-composer → Import file");
|
|
71
|
+
console.log();
|
|
72
|
+
console.log("View the architecture diagram:");
|
|
73
|
+
console.log(` npx likec4 serve ${c4File}`);
|
|
74
|
+
}
|
|
75
|
+
main().catch((err) => {
|
|
76
|
+
console.error(err);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=openclaw-assessment.js.map
|