@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
|
+
/**
|
|
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 * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { randomBytes } from "node:crypto";
|
|
13
|
+
// ── Path helpers ──────────────────────────────────────────────────────────────
|
|
14
|
+
function slugify(name) {
|
|
15
|
+
return name
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
18
|
+
.replace(/^-+|-+$/g, "")
|
|
19
|
+
.slice(0, 64) || "default";
|
|
20
|
+
}
|
|
21
|
+
function historyDir(baseDir, applicationName) {
|
|
22
|
+
return path.join(baseDir, ".canopy-history", slugify(applicationName));
|
|
23
|
+
}
|
|
24
|
+
function baselineFilename(timestamp) {
|
|
25
|
+
// Replace colons so the filename is valid on Windows too
|
|
26
|
+
return `${timestamp.replace(/:/g, "-")}.json`;
|
|
27
|
+
}
|
|
28
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Save a baseline snapshot.
|
|
31
|
+
*
|
|
32
|
+
* @param baseline The snapshot to persist.
|
|
33
|
+
* @param baseDir Directory under which .canopy-history/ is created (typically the output dir).
|
|
34
|
+
*/
|
|
35
|
+
export function saveBaseline(baseline, baseDir) {
|
|
36
|
+
const dir = historyDir(baseDir, baseline.applicationName);
|
|
37
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
38
|
+
const filePath = path.join(dir, baselineFilename(baseline.timestamp));
|
|
39
|
+
fs.writeFileSync(filePath, JSON.stringify(baseline, null, 2));
|
|
40
|
+
return filePath;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load the N most recent baselines for an application, newest first.
|
|
44
|
+
* Returns an empty array if none exist.
|
|
45
|
+
*/
|
|
46
|
+
export function loadRecentBaselines(baseDir, applicationName, n = 2) {
|
|
47
|
+
const dir = historyDir(baseDir, applicationName);
|
|
48
|
+
if (!fs.existsSync(dir))
|
|
49
|
+
return [];
|
|
50
|
+
const files = fs
|
|
51
|
+
.readdirSync(dir)
|
|
52
|
+
.filter((f) => f.endsWith(".json"))
|
|
53
|
+
.sort()
|
|
54
|
+
.reverse()
|
|
55
|
+
.slice(0, n);
|
|
56
|
+
return files.flatMap((f) => {
|
|
57
|
+
try {
|
|
58
|
+
return [JSON.parse(fs.readFileSync(path.join(dir, f), "utf8"))];
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build an AssessmentBaseline from the data produced by an assessment run.
|
|
67
|
+
*
|
|
68
|
+
* @param applicationName Name of the system assessed.
|
|
69
|
+
* @param agents Agent summaries (id + name).
|
|
70
|
+
* @param severities Flat severity map from the assembler (severityKey → SeverityLabel).
|
|
71
|
+
* @param tcJsonPath Optional relative path to the .tc.json written this run.
|
|
72
|
+
*/
|
|
73
|
+
export function buildBaseline(applicationName, agents, severities, tcJsonPath) {
|
|
74
|
+
const counts = {
|
|
75
|
+
Critical: 0, High: 0, Medium: 0, Low: 0, None: 0,
|
|
76
|
+
};
|
|
77
|
+
const severitiesRecord = {};
|
|
78
|
+
for (const [key, sev] of severities) {
|
|
79
|
+
severitiesRecord[key] = sev;
|
|
80
|
+
counts[sev] = (counts[sev] ?? 0) + 1;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
runId: randomBytes(4).toString("hex"),
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
applicationName,
|
|
86
|
+
agents,
|
|
87
|
+
severities: severitiesRecord,
|
|
88
|
+
counts,
|
|
89
|
+
tcJsonPath,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/baseline/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Messages Batches — fire-and-forget model.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic batch jobs expire after 24 hours. The API mirrors the Bedrock pattern:
|
|
5
|
+
*
|
|
6
|
+
* submitAnthropicBatch() — builds requests, submits via beta.messages.batches.create,
|
|
7
|
+
* returns immediately with an AnthropicBatchHandle.
|
|
8
|
+
*
|
|
9
|
+
* fetchAnthropicBatch() — given a handle, checks processing_status and, when ended,
|
|
10
|
+
* streams + parses results into MetricAssessmentResponse[].
|
|
11
|
+
* Returns { ready: false } while still processing.
|
|
12
|
+
*
|
|
13
|
+
* Reference: https://docs.anthropic.com/en/docs/build-with-claude/message-batches
|
|
14
|
+
*
|
|
15
|
+
* Required: ANTHROPIC_API_KEY env var (or apiKey in config).
|
|
16
|
+
*/
|
|
17
|
+
import type { AnthropicBatchConfig } from "./providers/anthropic.js";
|
|
18
|
+
import type { AgentDefinition, MetricAssessmentResponse } from "../aivss/types.js";
|
|
19
|
+
export interface AnthropicBatchHandle {
|
|
20
|
+
provider: "anthropic";
|
|
21
|
+
batchId: string;
|
|
22
|
+
model: string;
|
|
23
|
+
submittedAt: string;
|
|
24
|
+
requestCount: number;
|
|
25
|
+
}
|
|
26
|
+
export interface AnthropicSubmitOptions {
|
|
27
|
+
agents: AgentDefinition[];
|
|
28
|
+
config?: AnthropicBatchConfig;
|
|
29
|
+
}
|
|
30
|
+
export declare function submitAnthropicBatch(options: AnthropicSubmitOptions): Promise<AnthropicBatchHandle>;
|
|
31
|
+
export interface AnthropicFetchOptions {
|
|
32
|
+
handle: AnthropicBatchHandle;
|
|
33
|
+
apiKey?: string;
|
|
34
|
+
}
|
|
35
|
+
export type AnthropicFetchStatus = {
|
|
36
|
+
ready: false;
|
|
37
|
+
status: string;
|
|
38
|
+
counts?: {
|
|
39
|
+
processing: number;
|
|
40
|
+
succeeded: number;
|
|
41
|
+
errored: number;
|
|
42
|
+
};
|
|
43
|
+
} | {
|
|
44
|
+
ready: true;
|
|
45
|
+
responses: MetricAssessmentResponse[];
|
|
46
|
+
errorCount: number;
|
|
47
|
+
status: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function fetchAnthropicBatch(options: AnthropicFetchOptions): Promise<AnthropicFetchStatus>;
|
|
50
|
+
//# sourceMappingURL=anthropic-batch-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-batch-runner.d.ts","sourceRoot":"","sources":["../../src/batch/anthropic-batch-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAOnF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+BzG;AAID,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACrG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,wBAAwB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CvG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Messages Batches — fire-and-forget model.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic batch jobs expire after 24 hours. The API mirrors the Bedrock pattern:
|
|
5
|
+
*
|
|
6
|
+
* submitAnthropicBatch() — builds requests, submits via beta.messages.batches.create,
|
|
7
|
+
* returns immediately with an AnthropicBatchHandle.
|
|
8
|
+
*
|
|
9
|
+
* fetchAnthropicBatch() — given a handle, checks processing_status and, when ended,
|
|
10
|
+
* streams + parses results into MetricAssessmentResponse[].
|
|
11
|
+
* Returns { ready: false } while still processing.
|
|
12
|
+
*
|
|
13
|
+
* Reference: https://docs.anthropic.com/en/docs/build-with-claude/message-batches
|
|
14
|
+
*
|
|
15
|
+
* Required: ANTHROPIC_API_KEY env var (or apiKey in config).
|
|
16
|
+
*/
|
|
17
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
18
|
+
import { buildBatchRequests } from "../aivss/batch/batch-builder.js";
|
|
19
|
+
import { parseMetricResponse } from "./response-parser.js";
|
|
20
|
+
const DEFAULT_MODEL = "claude-haiku-4-5-20251001";
|
|
21
|
+
const DEFAULT_MAX_TOKENS = 2048;
|
|
22
|
+
export async function submitAnthropicBatch(options) {
|
|
23
|
+
const { agents, config = {} } = options;
|
|
24
|
+
const model = config.model ?? DEFAULT_MODEL;
|
|
25
|
+
const maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
26
|
+
const client = new Anthropic({ apiKey: config.apiKey });
|
|
27
|
+
const requests = await buildBatchRequests({
|
|
28
|
+
agents, useKnowledgeBase: false, model, maxTokens, temperature: 0,
|
|
29
|
+
});
|
|
30
|
+
if (requests.length === 0)
|
|
31
|
+
throw new Error("buildBatchRequests returned 0 requests");
|
|
32
|
+
const batch = await client.beta.messages.batches.create({
|
|
33
|
+
requests: requests.map((req) => ({
|
|
34
|
+
custom_id: req.custom_id,
|
|
35
|
+
params: {
|
|
36
|
+
model,
|
|
37
|
+
max_tokens: maxTokens,
|
|
38
|
+
temperature: 0,
|
|
39
|
+
system: req.params.system,
|
|
40
|
+
messages: req.params.messages,
|
|
41
|
+
},
|
|
42
|
+
})),
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
provider: "anthropic",
|
|
46
|
+
batchId: batch.id,
|
|
47
|
+
model,
|
|
48
|
+
submittedAt: new Date().toISOString(),
|
|
49
|
+
requestCount: requests.length,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function fetchAnthropicBatch(options) {
|
|
53
|
+
const { handle, apiKey } = options;
|
|
54
|
+
const client = new Anthropic({ apiKey });
|
|
55
|
+
const status = await client.beta.messages.batches.retrieve(handle.batchId);
|
|
56
|
+
if (status.processing_status !== "ended") {
|
|
57
|
+
return {
|
|
58
|
+
ready: false,
|
|
59
|
+
status: status.processing_status,
|
|
60
|
+
counts: {
|
|
61
|
+
processing: status.request_counts.processing,
|
|
62
|
+
succeeded: status.request_counts.succeeded,
|
|
63
|
+
errored: status.request_counts.errored,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const responses = [];
|
|
68
|
+
let errorCount = 0;
|
|
69
|
+
for await (const result of await client.beta.messages.batches.results(handle.batchId)) {
|
|
70
|
+
if (result.result.type === "succeeded") {
|
|
71
|
+
const content = result.result.message.content[0];
|
|
72
|
+
const text = content?.type === "text" ? content.text : "";
|
|
73
|
+
responses.push(parseMetricResponse(result.custom_id, text));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
errorCount++;
|
|
77
|
+
const parts = result.custom_id.split("-");
|
|
78
|
+
const rawMetric = parts[parts.length - 1] ?? "CS";
|
|
79
|
+
responses.push({
|
|
80
|
+
metricCode: rawMetric,
|
|
81
|
+
agentId: parts.length > 1 ? parts.slice(0, -1).join("-") : undefined,
|
|
82
|
+
subCategoryScores: {},
|
|
83
|
+
findings: [`[batch-error] ${result.result.type} for ${result.custom_id}`],
|
|
84
|
+
deploymentBlocker: false,
|
|
85
|
+
atlasTechniques: [],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { ready: true, responses, errorCount, status: status.processing_status };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=anthropic-batch-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-batch-runner.js","sourceRoot":"","sources":["../../src/batch/anthropic-batch-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAClD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAmBhC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAA+B;IACxE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;QACxC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;KAClE,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAErF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACtD,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE;gBACN,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;gBACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAoC;aAC1D;SACF,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,KAAK;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY,EAAE,QAAQ,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA8B;IACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,MAAM,CAAC,iBAAiB,KAAK,OAAO,EAAE,CAAC;QACzC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM,CAAC,iBAAiB;YAChC,MAAM,EAAE;gBACN,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU;gBAC5C,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS;gBAC1C,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO;aACvC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAA+B,EAAE,CAAC;IACjD,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACtF,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC;gBACb,UAAU,EAAE,SAAmD;gBAC/D,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,iBAAiB,EAAE,EAAE;gBACrB,QAAQ,EAAE,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,SAAS,EAAE,CAAC;gBACzE,iBAAiB,EAAE,KAAK;gBACxB,eAAe,EAAE,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bedrock Batch Inference for Canopy — fire-and-forget model.
|
|
3
|
+
*
|
|
4
|
+
* Bedrock batch jobs can queue for up to 24 hours. The API reflects this:
|
|
5
|
+
*
|
|
6
|
+
* submitBedrockBatch() — uploads JSONL, submits job, returns immediately with a
|
|
7
|
+
* BatchJobHandle (jobArn + metadata needed to collect later).
|
|
8
|
+
*
|
|
9
|
+
* fetchBedrockBatch() — given a BatchJobHandle, checks job status and, when
|
|
10
|
+
* complete, downloads + parses output into MetricAssessmentResponse[].
|
|
11
|
+
* Throws if the job is not yet in a terminal state.
|
|
12
|
+
*
|
|
13
|
+
* runBedrockBatch() — retained for programmatic callers that want the blocking
|
|
14
|
+
* submit+poll+collect flow (e.g. CI pipelines with long timeouts).
|
|
15
|
+
* Not used by the CLI.
|
|
16
|
+
*
|
|
17
|
+
* Nova 2 Lite batch requires a cross-region inference profile — there is no
|
|
18
|
+
* single-region batch support for this model. Default model ID: "us.amazon.nova-2-lite-v1:0"
|
|
19
|
+
*
|
|
20
|
+
* Required IAM permissions on roleArn:
|
|
21
|
+
* - bedrock:CreateModelInvocationJob
|
|
22
|
+
* - bedrock:GetModelInvocationJob
|
|
23
|
+
* - s3:PutObject on s3Bucket/{s3Prefix}/input/*
|
|
24
|
+
* - s3:GetObject on s3Bucket/{s3Prefix}/output/*
|
|
25
|
+
* - s3:ListBucket on s3Bucket
|
|
26
|
+
*
|
|
27
|
+
* Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference.html
|
|
28
|
+
*/
|
|
29
|
+
import type { BedrockBatchConfig } from "./types.js";
|
|
30
|
+
import type { AgentDefinition, MetricAssessmentResponse } from "../aivss/types.js";
|
|
31
|
+
/**
|
|
32
|
+
* Serialisable reference to a submitted batch job.
|
|
33
|
+
* Persist this (e.g. `canopy batch-submit --save-handle handle.json`)
|
|
34
|
+
* and pass it back to `fetchBedrockBatch` when the job finishes.
|
|
35
|
+
*/
|
|
36
|
+
export interface BatchJobHandle {
|
|
37
|
+
provider: "bedrock";
|
|
38
|
+
jobArn: string;
|
|
39
|
+
jobName: string;
|
|
40
|
+
s3Bucket: string;
|
|
41
|
+
outputPrefix: string;
|
|
42
|
+
region: string;
|
|
43
|
+
submittedAt: string;
|
|
44
|
+
}
|
|
45
|
+
export interface SubmitOptions {
|
|
46
|
+
agents: AgentDefinition[];
|
|
47
|
+
config: BedrockBatchConfig;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Submit a Bedrock batch job and return immediately with a handle.
|
|
51
|
+
* Does not wait for completion. Persist the handle and call fetchBedrockBatch later.
|
|
52
|
+
*/
|
|
53
|
+
export declare function submitBedrockBatch(options: SubmitOptions): Promise<BatchJobHandle>;
|
|
54
|
+
export interface FetchOptions {
|
|
55
|
+
handle: BatchJobHandle;
|
|
56
|
+
}
|
|
57
|
+
export type FetchStatus = {
|
|
58
|
+
ready: false;
|
|
59
|
+
status: string;
|
|
60
|
+
} | {
|
|
61
|
+
ready: true;
|
|
62
|
+
responses: MetricAssessmentResponse[];
|
|
63
|
+
errorCount: number;
|
|
64
|
+
status: string;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Check a submitted batch job and collect results if it has completed.
|
|
68
|
+
* Returns `{ ready: false }` when the job is still running — safe to call repeatedly.
|
|
69
|
+
* Throws only on unrecoverable errors (Failed/Stopped/Expired).
|
|
70
|
+
*/
|
|
71
|
+
export declare function fetchBedrockBatch(options: FetchOptions): Promise<FetchStatus>;
|
|
72
|
+
export interface BatchRunOptions {
|
|
73
|
+
agents: AgentDefinition[];
|
|
74
|
+
config: BedrockBatchConfig;
|
|
75
|
+
onProgress?: (status: string, jobArn: string) => void;
|
|
76
|
+
}
|
|
77
|
+
export interface BatchRunResult {
|
|
78
|
+
jobArn: string;
|
|
79
|
+
jobName: string;
|
|
80
|
+
status: string;
|
|
81
|
+
responses: MetricAssessmentResponse[];
|
|
82
|
+
errorCount: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Submit + poll + collect in one blocking call. For CI or scripts where
|
|
86
|
+
* the caller can afford to wait. Uses the same submit/fetch primitives internally.
|
|
87
|
+
*/
|
|
88
|
+
export declare function runBedrockBatch(options: BatchRunOptions): Promise<BatchRunResult>;
|
|
89
|
+
export type { BedrockBatchConfig } from "./types.js";
|
|
90
|
+
//# sourceMappingURL=bedrock-batch-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock-batch-runner.d.ts","sourceRoot":"","sources":["../../src/batch/bedrock-batch-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAiBH,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAgB,MAAM,mBAAmB,CAAC;AAiHjG;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAmCxF;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,wBAAwB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBnF;AAID,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBvF;AAED,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bedrock Batch Inference for Canopy — fire-and-forget model.
|
|
3
|
+
*
|
|
4
|
+
* Bedrock batch jobs can queue for up to 24 hours. The API reflects this:
|
|
5
|
+
*
|
|
6
|
+
* submitBedrockBatch() — uploads JSONL, submits job, returns immediately with a
|
|
7
|
+
* BatchJobHandle (jobArn + metadata needed to collect later).
|
|
8
|
+
*
|
|
9
|
+
* fetchBedrockBatch() — given a BatchJobHandle, checks job status and, when
|
|
10
|
+
* complete, downloads + parses output into MetricAssessmentResponse[].
|
|
11
|
+
* Throws if the job is not yet in a terminal state.
|
|
12
|
+
*
|
|
13
|
+
* runBedrockBatch() — retained for programmatic callers that want the blocking
|
|
14
|
+
* submit+poll+collect flow (e.g. CI pipelines with long timeouts).
|
|
15
|
+
* Not used by the CLI.
|
|
16
|
+
*
|
|
17
|
+
* Nova 2 Lite batch requires a cross-region inference profile — there is no
|
|
18
|
+
* single-region batch support for this model. Default model ID: "us.amazon.nova-2-lite-v1:0"
|
|
19
|
+
*
|
|
20
|
+
* Required IAM permissions on roleArn:
|
|
21
|
+
* - bedrock:CreateModelInvocationJob
|
|
22
|
+
* - bedrock:GetModelInvocationJob
|
|
23
|
+
* - s3:PutObject on s3Bucket/{s3Prefix}/input/*
|
|
24
|
+
* - s3:GetObject on s3Bucket/{s3Prefix}/output/*
|
|
25
|
+
* - s3:ListBucket on s3Bucket
|
|
26
|
+
*
|
|
27
|
+
* Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference.html
|
|
28
|
+
*/
|
|
29
|
+
import { BedrockClient, CreateModelInvocationJobCommand, GetModelInvocationJobCommand, } from "@aws-sdk/client-bedrock";
|
|
30
|
+
import { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsV2Command, } from "@aws-sdk/client-s3";
|
|
31
|
+
import { buildBatchRequests } from "../aivss/batch/batch-builder.js";
|
|
32
|
+
import { parseBatchOutputRecords } from "./response-parser.js";
|
|
33
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
34
|
+
const DEFAULT_MODEL_ID = "us.amazon.nova-2-lite-v1:0";
|
|
35
|
+
const DEFAULT_REGION = "us-east-1";
|
|
36
|
+
const DEFAULT_MAX_TOKENS = 2048;
|
|
37
|
+
const DEFAULT_POLL_INTERVAL_MS = 30000;
|
|
38
|
+
const DEFAULT_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
|
|
39
|
+
const DEFAULT_S3_PREFIX = "canopy-batch";
|
|
40
|
+
const TERMINAL_STATES = new Set([
|
|
41
|
+
"Completed",
|
|
42
|
+
"Failed",
|
|
43
|
+
"Stopped",
|
|
44
|
+
"Expired",
|
|
45
|
+
"PartiallyCompleted",
|
|
46
|
+
]);
|
|
47
|
+
// ── JSONL builders ───────────────────────────────────────────────────────────
|
|
48
|
+
function batchRequestToNovaBody(req, maxTokens) {
|
|
49
|
+
return {
|
|
50
|
+
system: [{ text: req.params.system }],
|
|
51
|
+
messages: req.params.messages.map((m) => ({
|
|
52
|
+
role: m.role,
|
|
53
|
+
content: [{ text: m.content }],
|
|
54
|
+
})),
|
|
55
|
+
inferenceConfig: {
|
|
56
|
+
maxTokens,
|
|
57
|
+
temperature: req.params.temperature ?? 0,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function buildInputJsonl(requests, maxTokens) {
|
|
62
|
+
return requests
|
|
63
|
+
.map((req) => JSON.stringify({
|
|
64
|
+
recordId: req.custom_id,
|
|
65
|
+
modelInput: batchRequestToNovaBody(req, maxTokens),
|
|
66
|
+
}))
|
|
67
|
+
.join("\n");
|
|
68
|
+
}
|
|
69
|
+
// ── S3 helpers ───────────────────────────────────────────────────────────────
|
|
70
|
+
async function uploadToS3(s3, bucket, key, body) {
|
|
71
|
+
await s3.send(new PutObjectCommand({ Bucket: bucket, Key: key, Body: body, ContentType: "application/x-ndjson" }));
|
|
72
|
+
}
|
|
73
|
+
async function downloadFromS3(s3, bucket, key) {
|
|
74
|
+
const resp = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
|
|
75
|
+
if (!resp.Body)
|
|
76
|
+
throw new Error(`S3 GetObject returned empty body for s3://${bucket}/${key}`);
|
|
77
|
+
const chunks = [];
|
|
78
|
+
for await (const chunk of resp.Body)
|
|
79
|
+
chunks.push(chunk);
|
|
80
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
81
|
+
}
|
|
82
|
+
async function findOutputKey(s3, bucket, outputPrefix) {
|
|
83
|
+
const resp = await s3.send(new ListObjectsV2Command({ Bucket: bucket, Prefix: outputPrefix }));
|
|
84
|
+
const obj = (resp.Contents ?? []).find((o) => o.Key?.endsWith(".jsonl"));
|
|
85
|
+
if (!obj?.Key) {
|
|
86
|
+
throw new Error(`No output .jsonl found under s3://${bucket}/${outputPrefix}. ` +
|
|
87
|
+
`Objects found: ${(resp.Contents ?? []).map((o) => o.Key).join(", ")}`);
|
|
88
|
+
}
|
|
89
|
+
return obj.Key;
|
|
90
|
+
}
|
|
91
|
+
// ── Polling (used only by the blocking runBedrockBatch) ──────────────────────
|
|
92
|
+
function sleep(ms) {
|
|
93
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
94
|
+
}
|
|
95
|
+
async function pollUntilComplete(bedrock, jobArn, pollIntervalMs, timeoutMs, onPoll) {
|
|
96
|
+
const deadline = Date.now() + timeoutMs;
|
|
97
|
+
while (Date.now() < deadline) {
|
|
98
|
+
const resp = await bedrock.send(new GetModelInvocationJobCommand({ jobIdentifier: jobArn }));
|
|
99
|
+
const status = resp.status;
|
|
100
|
+
const outputUri = resp.outputDataConfig?.s3OutputDataConfig?.s3Uri ?? "";
|
|
101
|
+
onPoll?.(status);
|
|
102
|
+
if (TERMINAL_STATES.has(status))
|
|
103
|
+
return { status, outputUri };
|
|
104
|
+
await sleep(pollIntervalMs);
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Bedrock batch job ${jobArn} did not complete within ${timeoutMs / 1000}s`);
|
|
107
|
+
}
|
|
108
|
+
function parseOutputJsonl(raw) {
|
|
109
|
+
return raw
|
|
110
|
+
.split("\n")
|
|
111
|
+
.map((l) => l.trim())
|
|
112
|
+
.filter(Boolean)
|
|
113
|
+
.map((l) => {
|
|
114
|
+
try {
|
|
115
|
+
return JSON.parse(l);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return { recordId: "parse-error", errorCode: "ParseError", errorMessage: l.slice(0, 200) };
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Submit a Bedrock batch job and return immediately with a handle.
|
|
124
|
+
* Does not wait for completion. Persist the handle and call fetchBedrockBatch later.
|
|
125
|
+
*/
|
|
126
|
+
export async function submitBedrockBatch(options) {
|
|
127
|
+
const { agents, config } = options;
|
|
128
|
+
const region = config.region ?? DEFAULT_REGION;
|
|
129
|
+
const modelId = config.modelId ?? DEFAULT_MODEL_ID;
|
|
130
|
+
const maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
131
|
+
const s3Prefix = config.s3Prefix ?? DEFAULT_S3_PREFIX;
|
|
132
|
+
const bedrock = new BedrockClient({ region });
|
|
133
|
+
const s3 = new S3Client({ region });
|
|
134
|
+
const requests = await buildBatchRequests({
|
|
135
|
+
agents, useKnowledgeBase: false, model: modelId, maxTokens, temperature: 0,
|
|
136
|
+
});
|
|
137
|
+
if (requests.length === 0)
|
|
138
|
+
throw new Error("buildBatchRequests returned 0 requests");
|
|
139
|
+
const jobName = `canopy-${Date.now()}`;
|
|
140
|
+
const inputKey = `${s3Prefix}/input/${jobName}.jsonl`;
|
|
141
|
+
const outputPrefix = `${s3Prefix}/output/${jobName}/`;
|
|
142
|
+
await uploadToS3(s3, config.s3Bucket, inputKey, buildInputJsonl(requests, maxTokens));
|
|
143
|
+
const createResp = await bedrock.send(new CreateModelInvocationJobCommand({
|
|
144
|
+
jobName,
|
|
145
|
+
modelId,
|
|
146
|
+
roleArn: config.roleArn,
|
|
147
|
+
inputDataConfig: { s3InputDataConfig: { s3Uri: `s3://${config.s3Bucket}/${s3Prefix}/input/`, s3InputFormat: "JSONL" } },
|
|
148
|
+
outputDataConfig: { s3OutputDataConfig: { s3Uri: `s3://${config.s3Bucket}/${outputPrefix}` } },
|
|
149
|
+
}));
|
|
150
|
+
const jobArn = createResp.jobArn;
|
|
151
|
+
if (!jobArn)
|
|
152
|
+
throw new Error("CreateModelInvocationJob returned no jobArn");
|
|
153
|
+
return { provider: "bedrock", jobArn, jobName, s3Bucket: config.s3Bucket, outputPrefix, region, submittedAt: new Date().toISOString() };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check a submitted batch job and collect results if it has completed.
|
|
157
|
+
* Returns `{ ready: false }` when the job is still running — safe to call repeatedly.
|
|
158
|
+
* Throws only on unrecoverable errors (Failed/Stopped/Expired).
|
|
159
|
+
*/
|
|
160
|
+
export async function fetchBedrockBatch(options) {
|
|
161
|
+
const { handle } = options;
|
|
162
|
+
const bedrock = new BedrockClient({ region: handle.region });
|
|
163
|
+
const s3 = new S3Client({ region: handle.region });
|
|
164
|
+
const resp = await bedrock.send(new GetModelInvocationJobCommand({ jobIdentifier: handle.jobArn }));
|
|
165
|
+
const status = resp.status;
|
|
166
|
+
if (!TERMINAL_STATES.has(status))
|
|
167
|
+
return { ready: false, status };
|
|
168
|
+
if (status === "Failed" || status === "Stopped" || status === "Expired") {
|
|
169
|
+
throw new Error(`Bedrock batch job ended with status: ${status} (arn: ${handle.jobArn})`);
|
|
170
|
+
}
|
|
171
|
+
const outputKey = await findOutputKey(s3, handle.s3Bucket, handle.outputPrefix);
|
|
172
|
+
const raw = await downloadFromS3(s3, handle.s3Bucket, outputKey);
|
|
173
|
+
const records = parseOutputJsonl(raw);
|
|
174
|
+
const errorCount = records.filter((r) => !!r.errorCode).length;
|
|
175
|
+
const responses = parseBatchOutputRecords(records);
|
|
176
|
+
return { ready: true, responses, errorCount, status };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Submit + poll + collect in one blocking call. For CI or scripts where
|
|
180
|
+
* the caller can afford to wait. Uses the same submit/fetch primitives internally.
|
|
181
|
+
*/
|
|
182
|
+
export async function runBedrockBatch(options) {
|
|
183
|
+
const { agents, config, onProgress } = options;
|
|
184
|
+
const region = config.region ?? DEFAULT_REGION;
|
|
185
|
+
const pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
186
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
187
|
+
const handle = await submitBedrockBatch({ agents, config });
|
|
188
|
+
onProgress?.("Submitted", handle.jobArn);
|
|
189
|
+
const bedrock = new BedrockClient({ region });
|
|
190
|
+
const { status } = await pollUntilComplete(bedrock, handle.jobArn, pollIntervalMs, timeoutMs, (s) => onProgress?.(s, handle.jobArn));
|
|
191
|
+
if (status === "Failed" || status === "Stopped" || status === "Expired") {
|
|
192
|
+
throw new Error(`Bedrock batch job ${handle.jobArn} ended with status: ${status}`);
|
|
193
|
+
}
|
|
194
|
+
const result = await fetchBedrockBatch({ handle });
|
|
195
|
+
if (!result.ready)
|
|
196
|
+
throw new Error("fetchBedrockBatch returned not-ready after terminal state");
|
|
197
|
+
return { jobArn: handle.jobArn, jobName: handle.jobName, status, responses: result.responses, errorCount: result.errorCount };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=bedrock-batch-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock-batch-runner.js","sourceRoot":"","sources":["../../src/batch/bedrock-batch-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Messages Batches BatchProvider implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses the Anthropic Messages Batches API to run all AIVSS metric assessments
|
|
5
|
+
* asynchronously. Reuses the existing `buildBatchRequests()` prompt builder
|
|
6
|
+
* (already Anthropic-formatted) and submits via `beta.messages.batches`.
|
|
7
|
+
*
|
|
8
|
+
* Batches typically complete in minutes to hours. This provider polls at
|
|
9
|
+
* configurable intervals (default 60s) until `processing_status === "ended"`.
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://docs.anthropic.com/en/docs/build-with-claude/message-batches
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const provider = createBatchProvider({
|
|
15
|
+
* type: "anthropic",
|
|
16
|
+
* model: "claude-haiku-4-5-20251001",
|
|
17
|
+
* });
|
|
18
|
+
* const result = await assessWorkflow({ ..., batchProvider: provider });
|
|
19
|
+
*/
|
|
20
|
+
import type { BatchProvider, BatchProviderOptions } from "../types.js";
|
|
21
|
+
import type { AgentDefinition, MetricAssessmentResponse } from "../../aivss/types.js";
|
|
22
|
+
export interface AnthropicBatchConfig {
|
|
23
|
+
/**
|
|
24
|
+
* Anthropic API key. Defaults to ANTHROPIC_API_KEY env var.
|
|
25
|
+
*/
|
|
26
|
+
apiKey?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Model for batch inference.
|
|
29
|
+
* Default: "claude-haiku-4-5-20251001" (fastest/cheapest at batch scale).
|
|
30
|
+
*/
|
|
31
|
+
model?: string;
|
|
32
|
+
/** Max tokens per completion. Default: 2048. */
|
|
33
|
+
maxTokens?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Poll interval in milliseconds.
|
|
36
|
+
* Default: 60_000 (60s) — Anthropic Batch SLA is minutes, not seconds.
|
|
37
|
+
*/
|
|
38
|
+
pollIntervalMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Max total wait time. Default: 24 * 60 * 60 * 1000 (24h).
|
|
41
|
+
* Anthropic Batch jobs expire after 24h if not retrieved.
|
|
42
|
+
*/
|
|
43
|
+
timeoutMs?: number;
|
|
44
|
+
}
|
|
45
|
+
export declare class AnthropicBatchProvider implements BatchProvider {
|
|
46
|
+
readonly name = "anthropic-batch";
|
|
47
|
+
private readonly model;
|
|
48
|
+
private readonly maxTokens;
|
|
49
|
+
private readonly pollIntervalMs;
|
|
50
|
+
private readonly timeoutMs;
|
|
51
|
+
private readonly client;
|
|
52
|
+
constructor(config?: AnthropicBatchConfig);
|
|
53
|
+
runBatch(agents: AgentDefinition[], options: BatchProviderOptions): Promise<MetricAssessmentResponse[]>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/batch/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAItF,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,QAAQ,CAAC,IAAI,qBAAqB;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,MAAM,GAAE,oBAAyB;IAQvC,QAAQ,CACZ,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,wBAAwB,EAAE,CAAC;CA8EvC"}
|