audrey 1.1.2 → 1.2.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/CHANGELOG.md +101 -0
- package/README.md +39 -12
- package/dist/mcp-server/codex-hooks-probe.d.ts +22 -0
- package/dist/mcp-server/codex-hooks-probe.d.ts.map +1 -0
- package/dist/mcp-server/codex-hooks-probe.js +160 -0
- package/dist/mcp-server/codex-hooks-probe.js.map +1 -0
- package/dist/mcp-server/config.d.ts +26 -2
- package/dist/mcp-server/config.d.ts.map +1 -1
- package/dist/mcp-server/config.js +52 -20
- package/dist/mcp-server/config.js.map +1 -1
- package/dist/mcp-server/hooks.d.ts +28 -0
- package/dist/mcp-server/hooks.d.ts.map +1 -1
- package/dist/mcp-server/hooks.js +91 -2
- package/dist/mcp-server/hooks.js.map +1 -1
- package/dist/mcp-server/index.d.ts +242 -2
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +806 -240
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/mcp-server/tool-schemas.d.ts +32 -2
- package/dist/mcp-server/tool-schemas.d.ts.map +1 -1
- package/dist/mcp-server/tool-schemas.js +55 -0
- package/dist/mcp-server/tool-schemas.js.map +1 -1
- package/dist/src/audrey.d.ts +14 -2
- package/dist/src/audrey.d.ts.map +1 -1
- package/dist/src/audrey.js +152 -28
- package/dist/src/audrey.js.map +1 -1
- package/dist/src/autopilot.d.ts +22 -0
- package/dist/src/autopilot.d.ts.map +1 -1
- package/dist/src/autopilot.js +271 -50
- package/dist/src/autopilot.js.map +1 -1
- package/dist/src/capsule.d.ts +23 -0
- package/dist/src/capsule.d.ts.map +1 -1
- package/dist/src/capsule.js +56 -11
- package/dist/src/capsule.js.map +1 -1
- package/dist/src/confidence.d.ts +9 -1
- package/dist/src/confidence.d.ts.map +1 -1
- package/dist/src/confidence.js +16 -2
- package/dist/src/confidence.js.map +1 -1
- package/dist/src/consolidate.d.ts +4 -0
- package/dist/src/consolidate.d.ts.map +1 -1
- package/dist/src/consolidate.js +206 -34
- package/dist/src/consolidate.js.map +1 -1
- package/dist/src/controller.d.ts +17 -1
- package/dist/src/controller.d.ts.map +1 -1
- package/dist/src/controller.js +244 -128
- package/dist/src/controller.js.map +1 -1
- package/dist/src/db.d.ts.map +1 -1
- package/dist/src/db.js +233 -56
- package/dist/src/db.js.map +1 -1
- package/dist/src/encode.d.ts +2 -1
- package/dist/src/encode.d.ts.map +1 -1
- package/dist/src/encode.js +41 -4
- package/dist/src/encode.js.map +1 -1
- package/dist/src/events.d.ts +48 -1
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +160 -62
- package/dist/src/events.js.map +1 -1
- package/dist/src/export.d.ts.map +1 -1
- package/dist/src/export.js +4 -4
- package/dist/src/export.js.map +1 -1
- package/dist/src/grounding.d.ts +111 -0
- package/dist/src/grounding.d.ts.map +1 -0
- package/dist/src/grounding.js +259 -0
- package/dist/src/grounding.js.map +1 -0
- package/dist/src/hybrid-recall.d.ts +16 -7
- package/dist/src/hybrid-recall.d.ts.map +1 -1
- package/dist/src/hybrid-recall.js +22 -11
- package/dist/src/hybrid-recall.js.map +1 -1
- package/dist/src/import.d.ts +10 -0
- package/dist/src/import.d.ts.map +1 -1
- package/dist/src/import.js +122 -22
- package/dist/src/import.js.map +1 -1
- package/dist/src/llm.d.ts.map +1 -1
- package/dist/src/llm.js +16 -0
- package/dist/src/llm.js.map +1 -1
- package/dist/src/preflight.d.ts.map +1 -1
- package/dist/src/preflight.js +89 -47
- package/dist/src/preflight.js.map +1 -1
- package/dist/src/project.d.ts +4 -1
- package/dist/src/project.d.ts.map +1 -1
- package/dist/src/project.js +65 -5
- package/dist/src/project.js.map +1 -1
- package/dist/src/recall.d.ts.map +1 -1
- package/dist/src/recall.js +138 -13
- package/dist/src/recall.js.map +1 -1
- package/dist/src/redact.d.ts +1 -1
- package/dist/src/redact.d.ts.map +1 -1
- package/dist/src/redact.js +185 -5
- package/dist/src/redact.js.map +1 -1
- package/dist/src/routes.d.ts.map +1 -1
- package/dist/src/routes.js +91 -18
- package/dist/src/routes.js.map +1 -1
- package/dist/src/trust.d.ts +35 -0
- package/dist/src/trust.d.ts.map +1 -0
- package/dist/src/trust.js +77 -0
- package/dist/src/trust.js.map +1 -0
- package/dist/src/types.d.ts +24 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -38
- package/benchmarks/adapter-kit.mjs +0 -20
- package/benchmarks/adapter-self-test.mjs +0 -170
- package/benchmarks/adapters/example-allow.mjs +0 -31
- package/benchmarks/adapters/mem0-platform.mjs +0 -274
- package/benchmarks/adapters/registry.json +0 -51
- package/benchmarks/adapters/zep-cloud.mjs +0 -304
- package/benchmarks/baselines.js +0 -174
- package/benchmarks/build-leaderboard.mjs +0 -183
- package/benchmarks/cases.js +0 -549
- package/benchmarks/create-conformance-card.mjs +0 -148
- package/benchmarks/create-submission-bundle.mjs +0 -190
- package/benchmarks/dry-run-external-adapters.mjs +0 -177
- package/benchmarks/guardbench.js +0 -1265
- package/benchmarks/output/adapter-self-test/guardbench-adapter-self-test.json +0 -50
- package/benchmarks/output/external/guardbench-external-dry-run.json +0 -69
- package/benchmarks/output/external/guardbench-external-evidence.json +0 -56
- package/benchmarks/output/guardbench-conformance-card.json +0 -63
- package/benchmarks/output/guardbench-manifest.json +0 -414
- package/benchmarks/output/guardbench-raw.json +0 -1279
- package/benchmarks/output/guardbench-summary.json +0 -2123
- package/benchmarks/output/leaderboard/guardbench-leaderboard.json +0 -93
- package/benchmarks/output/leaderboard/guardbench-leaderboard.md +0 -7
- package/benchmarks/output/submission-bundle/guardbench-conformance-card.json +0 -63
- package/benchmarks/output/submission-bundle/guardbench-manifest.json +0 -414
- package/benchmarks/output/submission-bundle/guardbench-raw.json +0 -1279
- package/benchmarks/output/submission-bundle/guardbench-summary.json +0 -2123
- package/benchmarks/output/submission-bundle/schemas/guardbench-adapter-registry.schema.json +0 -69
- package/benchmarks/output/submission-bundle/schemas/guardbench-adapter-self-test.schema.json +0 -156
- package/benchmarks/output/submission-bundle/schemas/guardbench-conformance-card.schema.json +0 -184
- package/benchmarks/output/submission-bundle/schemas/guardbench-external-dry-run.schema.json +0 -74
- package/benchmarks/output/submission-bundle/schemas/guardbench-external-evidence.schema.json +0 -108
- package/benchmarks/output/submission-bundle/schemas/guardbench-external-run.schema.json +0 -160
- package/benchmarks/output/submission-bundle/schemas/guardbench-leaderboard.schema.json +0 -179
- package/benchmarks/output/submission-bundle/schemas/guardbench-manifest.schema.json +0 -213
- package/benchmarks/output/submission-bundle/schemas/guardbench-publication-verification.schema.json +0 -47
- package/benchmarks/output/submission-bundle/schemas/guardbench-raw.schema.json +0 -184
- package/benchmarks/output/submission-bundle/schemas/guardbench-submission-manifest.schema.json +0 -151
- package/benchmarks/output/submission-bundle/schemas/guardbench-summary.schema.json +0 -249
- package/benchmarks/output/submission-bundle/submission-manifest.json +0 -131
- package/benchmarks/output/submission-bundle/validation-report.json +0 -31
- package/benchmarks/output/summary.json +0 -2354
- package/benchmarks/perf-snapshot.js +0 -307
- package/benchmarks/perf.bench.js +0 -169
- package/benchmarks/public-paths.mjs +0 -97
- package/benchmarks/reference-results.js +0 -75
- package/benchmarks/report.js +0 -280
- package/benchmarks/run-external-guardbench.mjs +0 -303
- package/benchmarks/run.js +0 -735
- package/benchmarks/schemas/guardbench-adapter-registry.schema.json +0 -69
- package/benchmarks/schemas/guardbench-adapter-self-test.schema.json +0 -156
- package/benchmarks/schemas/guardbench-conformance-card.schema.json +0 -184
- package/benchmarks/schemas/guardbench-external-dry-run.schema.json +0 -74
- package/benchmarks/schemas/guardbench-external-evidence.schema.json +0 -108
- package/benchmarks/schemas/guardbench-external-run.schema.json +0 -160
- package/benchmarks/schemas/guardbench-leaderboard.schema.json +0 -179
- package/benchmarks/schemas/guardbench-manifest.schema.json +0 -213
- package/benchmarks/schemas/guardbench-publication-verification.schema.json +0 -47
- package/benchmarks/schemas/guardbench-raw.schema.json +0 -184
- package/benchmarks/schemas/guardbench-submission-manifest.schema.json +0 -151
- package/benchmarks/schemas/guardbench-summary.schema.json +0 -249
- package/benchmarks/snapshots/perf-0.22.2.json +0 -123
- package/benchmarks/snapshots/perf-0.23.0.json +0 -123
- package/benchmarks/validate-adapter-module.mjs +0 -107
- package/benchmarks/validate-adapter-registry.mjs +0 -145
- package/benchmarks/validate-adapter-self-test.mjs +0 -96
- package/benchmarks/validate-guardbench-artifacts.mjs +0 -400
- package/benchmarks/verify-external-evidence.mjs +0 -351
- package/benchmarks/verify-publication-artifacts.mjs +0 -309
- package/benchmarks/verify-submission-bundle.mjs +0 -172
- package/docs/AUDREY_PAPER_OUTLINE.md +0 -178
- package/docs/MEMORY_BENCHMARKING.md +0 -59
- package/docs/PRODUCTION_BACKLOG.md +0 -321
- package/docs/assets/audrey-feature-grid.jpg +0 -0
- package/docs/assets/audrey-logo.svg +0 -45
- package/docs/assets/audrey-wordmark.png +0 -0
- package/docs/paper/00-master.md +0 -48
- package/docs/paper/01-introduction.md +0 -27
- package/docs/paper/02-related-work.md +0 -47
- package/docs/paper/03-problem-definition.md +0 -108
- package/docs/paper/04-design.md +0 -164
- package/docs/paper/05-guardbench-spec.md +0 -412
- package/docs/paper/06-implementation.md +0 -115
- package/docs/paper/07-evaluation.md +0 -168
- package/docs/paper/08-discussion-limitations.md +0 -61
- package/docs/paper/09-conclusion.md +0 -11
- package/docs/paper/SUBMISSION_README.md +0 -162
- package/docs/paper/appendix-a-demo-transcript.md +0 -114
- package/docs/paper/arxiv-compile-report.schema.json +0 -116
- package/docs/paper/arxiv-source.schema.json +0 -61
- package/docs/paper/audrey-paper-v1.md +0 -1108
- package/docs/paper/browser-launch-plan.json +0 -209
- package/docs/paper/browser-launch-plan.schema.json +0 -100
- package/docs/paper/browser-launch-results.json +0 -86
- package/docs/paper/browser-launch-results.schema.json +0 -66
- package/docs/paper/claim-register.json +0 -138
- package/docs/paper/claim-register.schema.json +0 -81
- package/docs/paper/evidence-ledger.md +0 -103
- package/docs/paper/output/arxiv/README-arxiv.txt +0 -8
- package/docs/paper/output/arxiv/arxiv-manifest.json +0 -41
- package/docs/paper/output/arxiv/main.tex +0 -951
- package/docs/paper/output/arxiv/references.bib +0 -222
- package/docs/paper/output/arxiv-compile-report.json +0 -24
- package/docs/paper/output/submission-bundle/LICENSE +0 -21
- package/docs/paper/output/submission-bundle/README.md +0 -440
- package/docs/paper/output/submission-bundle/benchmarks/output/adapter-self-test/guardbench-adapter-self-test.json +0 -50
- package/docs/paper/output/submission-bundle/benchmarks/output/external/guardbench-external-dry-run.json +0 -69
- package/docs/paper/output/submission-bundle/benchmarks/output/external/guardbench-external-evidence.json +0 -56
- package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-conformance-card.json +0 -63
- package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-manifest.json +0 -414
- package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-raw.json +0 -1279
- package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-summary.json +0 -2123
- package/docs/paper/output/submission-bundle/benchmarks/output/leaderboard/guardbench-leaderboard.json +0 -93
- package/docs/paper/output/submission-bundle/benchmarks/output/leaderboard/guardbench-leaderboard.md +0 -7
- package/docs/paper/output/submission-bundle/benchmarks/output/submission-bundle/submission-manifest.json +0 -131
- package/docs/paper/output/submission-bundle/benchmarks/output/submission-bundle/validation-report.json +0 -31
- package/docs/paper/output/submission-bundle/benchmarks/output/summary.json +0 -2354
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-adapter-registry.schema.json +0 -69
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-adapter-self-test.schema.json +0 -156
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-conformance-card.schema.json +0 -184
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-dry-run.schema.json +0 -74
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-evidence.schema.json +0 -108
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-run.schema.json +0 -160
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-leaderboard.schema.json +0 -179
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-manifest.schema.json +0 -213
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-publication-verification.schema.json +0 -47
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-raw.schema.json +0 -184
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-submission-manifest.schema.json +0 -151
- package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-summary.schema.json +0 -249
- package/docs/paper/output/submission-bundle/docs/AUDREY_PAPER_OUTLINE.md +0 -178
- package/docs/paper/output/submission-bundle/docs/paper/00-master.md +0 -48
- package/docs/paper/output/submission-bundle/docs/paper/01-introduction.md +0 -27
- package/docs/paper/output/submission-bundle/docs/paper/02-related-work.md +0 -47
- package/docs/paper/output/submission-bundle/docs/paper/03-problem-definition.md +0 -108
- package/docs/paper/output/submission-bundle/docs/paper/04-design.md +0 -164
- package/docs/paper/output/submission-bundle/docs/paper/05-guardbench-spec.md +0 -412
- package/docs/paper/output/submission-bundle/docs/paper/06-implementation.md +0 -115
- package/docs/paper/output/submission-bundle/docs/paper/07-evaluation.md +0 -168
- package/docs/paper/output/submission-bundle/docs/paper/08-discussion-limitations.md +0 -61
- package/docs/paper/output/submission-bundle/docs/paper/09-conclusion.md +0 -11
- package/docs/paper/output/submission-bundle/docs/paper/SUBMISSION_README.md +0 -162
- package/docs/paper/output/submission-bundle/docs/paper/appendix-a-demo-transcript.md +0 -114
- package/docs/paper/output/submission-bundle/docs/paper/arxiv-compile-report.schema.json +0 -116
- package/docs/paper/output/submission-bundle/docs/paper/arxiv-source.schema.json +0 -61
- package/docs/paper/output/submission-bundle/docs/paper/audrey-paper-v1.md +0 -1108
- package/docs/paper/output/submission-bundle/docs/paper/browser-launch-plan.json +0 -209
- package/docs/paper/output/submission-bundle/docs/paper/browser-launch-plan.schema.json +0 -100
- package/docs/paper/output/submission-bundle/docs/paper/browser-launch-results.json +0 -86
- package/docs/paper/output/submission-bundle/docs/paper/browser-launch-results.schema.json +0 -66
- package/docs/paper/output/submission-bundle/docs/paper/claim-register.json +0 -138
- package/docs/paper/output/submission-bundle/docs/paper/claim-register.schema.json +0 -81
- package/docs/paper/output/submission-bundle/docs/paper/evidence-ledger.md +0 -103
- package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/README-arxiv.txt +0 -8
- package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/arxiv-manifest.json +0 -41
- package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/main.tex +0 -951
- package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/references.bib +0 -222
- package/docs/paper/output/submission-bundle/docs/paper/output/arxiv-compile-report.json +0 -24
- package/docs/paper/output/submission-bundle/docs/paper/paper-submission-bundle.schema.json +0 -70
- package/docs/paper/output/submission-bundle/docs/paper/publication-pack.json +0 -81
- package/docs/paper/output/submission-bundle/docs/paper/publication-pack.schema.json +0 -60
- package/docs/paper/output/submission-bundle/docs/paper/references.bib +0 -222
- package/docs/paper/output/submission-bundle/package.json +0 -235
- package/docs/paper/output/submission-bundle/paper-submission-manifest.json +0 -379
- package/docs/paper/paper-submission-bundle.schema.json +0 -70
- package/docs/paper/publication-pack.json +0 -81
- package/docs/paper/publication-pack.schema.json +0 -60
- package/docs/paper/references.bib +0 -222
- package/scripts/audit-release-completion.mjs +0 -440
- package/scripts/create-arxiv-source.mjs +0 -368
- package/scripts/create-paper-submission-bundle.mjs +0 -214
- package/scripts/finalize-release.mjs +0 -601
- package/scripts/prepare-release-cut.mjs +0 -277
- package/scripts/publish-release-bundle.mjs +0 -252
- package/scripts/publish-release-github-api.mjs +0 -494
- package/scripts/run-vitest.mjs +0 -34
- package/scripts/smoke-cli.js +0 -92
- package/scripts/sync-paper-artifacts.mjs +0 -112
- package/scripts/verify-arxiv-compile.mjs +0 -476
- package/scripts/verify-arxiv-source.mjs +0 -224
- package/scripts/verify-browser-launch-plan.mjs +0 -254
- package/scripts/verify-browser-launch-results.mjs +0 -303
- package/scripts/verify-paper-artifacts.mjs +0 -798
- package/scripts/verify-paper-claims.mjs +0 -254
- package/scripts/verify-paper-submission-bundle.mjs +0 -218
- package/scripts/verify-publication-pack.mjs +0 -210
- package/scripts/verify-python-package.py +0 -201
- package/scripts/verify-release-readiness.mjs +0 -920
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join, resolve } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { validateAdapterRegistry } from './validate-adapter-registry.mjs';
|
|
5
|
-
import { validateGuardBenchArtifacts, validateSchema } from './validate-guardbench-artifacts.mjs';
|
|
6
|
-
import { publicPath } from './public-paths.mjs';
|
|
7
|
-
|
|
8
|
-
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
9
|
-
const DEFAULT_REGISTRY = 'benchmarks/adapters/registry.json';
|
|
10
|
-
const DEFAULT_REGISTRY_SCHEMA = 'benchmarks/schemas/guardbench-adapter-registry.schema.json';
|
|
11
|
-
const DEFAULT_EXTERNAL_RUN_SCHEMA = 'benchmarks/schemas/guardbench-external-run.schema.json';
|
|
12
|
-
const DEFAULT_EVIDENCE_SCHEMA = 'benchmarks/schemas/guardbench-external-evidence.schema.json';
|
|
13
|
-
const DEFAULT_OUT_ROOT = 'benchmarks/output/external';
|
|
14
|
-
const DEFAULT_REPORT = 'benchmarks/output/external/guardbench-external-evidence.json';
|
|
15
|
-
const PENDING_METADATA_STATUSES = new Set(['blocked', 'dry-run-missing-env', 'dry-run-ready']);
|
|
16
|
-
|
|
17
|
-
function fromRoot(path) {
|
|
18
|
-
return resolve(ROOT, path);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function readJson(path) {
|
|
22
|
-
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function writeJson(path, value) {
|
|
26
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
27
|
-
writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function parseExternalEvidenceArgs(argv = process.argv.slice(2)) {
|
|
31
|
-
const args = {
|
|
32
|
-
registry: DEFAULT_REGISTRY,
|
|
33
|
-
registrySchema: DEFAULT_REGISTRY_SCHEMA,
|
|
34
|
-
externalRunSchema: DEFAULT_EXTERNAL_RUN_SCHEMA,
|
|
35
|
-
evidenceSchema: DEFAULT_EVIDENCE_SCHEMA,
|
|
36
|
-
outRoot: DEFAULT_OUT_ROOT,
|
|
37
|
-
report: DEFAULT_REPORT,
|
|
38
|
-
adapters: [],
|
|
39
|
-
allowPending: false,
|
|
40
|
-
json: false,
|
|
41
|
-
write: true,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
for (let i = 0; i < argv.length; i++) {
|
|
45
|
-
const token = argv[i];
|
|
46
|
-
if (token === '--registry' && argv[i + 1]) args.registry = argv[++i];
|
|
47
|
-
else if (token === '--registry-schema' && argv[i + 1]) args.registrySchema = argv[++i];
|
|
48
|
-
else if (token === '--external-run-schema' && argv[i + 1]) args.externalRunSchema = argv[++i];
|
|
49
|
-
else if (token === '--evidence-schema' && argv[i + 1]) args.evidenceSchema = argv[++i];
|
|
50
|
-
else if (token === '--out-root' && argv[i + 1]) args.outRoot = argv[++i];
|
|
51
|
-
else if (token === '--report' && argv[i + 1]) args.report = argv[++i];
|
|
52
|
-
else if (token === '--adapter' && argv[i + 1]) args.adapters.push(argv[++i]);
|
|
53
|
-
else if (token === '--allow-pending') args.allowPending = true;
|
|
54
|
-
else if (token === '--json') args.json = true;
|
|
55
|
-
else if (token === '--no-write') args.write = false;
|
|
56
|
-
else if (token === '--help' || token === '-h') args.help = true;
|
|
57
|
-
else throw new Error(`Unknown argument: ${token}`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return args;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function usage() {
|
|
64
|
-
return `Usage: node benchmarks/verify-external-evidence.mjs [options]
|
|
65
|
-
|
|
66
|
-
Options:
|
|
67
|
-
--registry <path> GuardBench adapter registry. Default: ${DEFAULT_REGISTRY}.
|
|
68
|
-
--out-root <path> External evidence root. Default: ${DEFAULT_OUT_ROOT}.
|
|
69
|
-
--report <path> Output report path. Default: ${DEFAULT_REPORT}.
|
|
70
|
-
--adapter <id> Limit verification to one adapter id. May repeat.
|
|
71
|
-
--allow-pending Treat missing, blocked, or dry-run-only evidence as pending.
|
|
72
|
-
--json Print the machine-readable evidence report.
|
|
73
|
-
--no-write Do not write the evidence report.
|
|
74
|
-
`;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function credentialLeaks(text, requiredEnv, env) {
|
|
78
|
-
const leaks = [];
|
|
79
|
-
for (const name of requiredEnv) {
|
|
80
|
-
const value = env[name];
|
|
81
|
-
if (typeof value === 'string' && value.length >= 8 && text.includes(value)) {
|
|
82
|
-
leaks.push(name);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return leaks;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function pendingRow(
|
|
89
|
-
target,
|
|
90
|
-
outDir,
|
|
91
|
-
metadataPath,
|
|
92
|
-
allowPending,
|
|
93
|
-
reason,
|
|
94
|
-
metadata = null,
|
|
95
|
-
extraFailures = [],
|
|
96
|
-
secretLeakCount = 0,
|
|
97
|
-
) {
|
|
98
|
-
return {
|
|
99
|
-
id: target.id,
|
|
100
|
-
name: target.name,
|
|
101
|
-
path: target.path,
|
|
102
|
-
credentialMode: target.credentialMode,
|
|
103
|
-
requiredEnv: target.requiredEnv,
|
|
104
|
-
outDir: publicPath(outDir),
|
|
105
|
-
metadataPath: publicPath(metadataPath),
|
|
106
|
-
status: 'pending',
|
|
107
|
-
evidenceKind: metadata?.dryRun ? 'dry-run' : reason === 'missing' ? 'missing' : 'blocked',
|
|
108
|
-
metadataStatus: metadata?.status ?? null,
|
|
109
|
-
dryRun: metadata?.dryRun ?? null,
|
|
110
|
-
missingEnv: metadata?.missingEnv ?? target.requiredEnv,
|
|
111
|
-
artifactValidationOk: null,
|
|
112
|
-
adapterConformanceOk: null,
|
|
113
|
-
secretLeakCount,
|
|
114
|
-
failures: allowPending
|
|
115
|
-
? extraFailures
|
|
116
|
-
: [
|
|
117
|
-
...extraFailures,
|
|
118
|
-
reason === 'missing'
|
|
119
|
-
? `Missing external run metadata: ${metadataPath}`
|
|
120
|
-
: `External evidence is pending for ${target.id}: ${metadata?.status ?? reason}`,
|
|
121
|
-
],
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function verifyLiveMetadata(target, outDir, metadataPath, metadata, metadataText, schemas, env) {
|
|
126
|
-
const failures = [];
|
|
127
|
-
const schemaErrors = validateSchema(metadata, schemas.externalRun, 'guardbench-externalRun');
|
|
128
|
-
failures.push(...schemaErrors);
|
|
129
|
-
|
|
130
|
-
const artifactValidation = validateGuardBenchArtifacts({ dir: outDir });
|
|
131
|
-
if (!artifactValidation.ok) {
|
|
132
|
-
failures.push(...artifactValidation.failures.map(failure => `artifact validation: ${failure}`));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (metadata.adapter !== target.id)
|
|
136
|
-
failures.push(`metadata adapter ${metadata.adapter} does not match registry id ${target.id}`);
|
|
137
|
-
if (metadata.dryRun !== false) failures.push('metadata must come from a live run, not a dry run');
|
|
138
|
-
if (metadata.status !== 'passed')
|
|
139
|
-
failures.push(`metadata status must be passed, got ${metadata.status}`);
|
|
140
|
-
if (metadata.exitCode !== 0)
|
|
141
|
-
failures.push(`metadata exitCode must be 0, got ${metadata.exitCode}`);
|
|
142
|
-
if ((metadata.missingEnv ?? []).length !== 0)
|
|
143
|
-
failures.push(
|
|
144
|
-
`metadata still reports missing runtime env: ${(metadata.missingEnv ?? []).join(', ')}`,
|
|
145
|
-
);
|
|
146
|
-
for (const name of target.requiredEnv) {
|
|
147
|
-
if (!(metadata.requiredEnv ?? []).includes(name))
|
|
148
|
-
failures.push(`metadata requiredEnv missing ${name}`);
|
|
149
|
-
}
|
|
150
|
-
if (metadata.artifactValidation?.ok !== true)
|
|
151
|
-
failures.push('metadata artifactValidation.ok must be true');
|
|
152
|
-
if (metadata.adapterConformance?.ok !== true)
|
|
153
|
-
failures.push('metadata adapterConformance.ok must be true');
|
|
154
|
-
if (!metadata.artifactHashes) failures.push('metadata missing artifactHashes');
|
|
155
|
-
|
|
156
|
-
const leakedEnv = credentialLeaks(metadataText, target.requiredEnv, env);
|
|
157
|
-
failures.push(...leakedEnv.map(name => `metadata leaks runtime credential value for ${name}`));
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
id: target.id,
|
|
161
|
-
name: target.name,
|
|
162
|
-
path: target.path,
|
|
163
|
-
credentialMode: target.credentialMode,
|
|
164
|
-
requiredEnv: target.requiredEnv,
|
|
165
|
-
outDir: publicPath(outDir),
|
|
166
|
-
metadataPath: publicPath(metadataPath),
|
|
167
|
-
status: failures.length === 0 ? 'verified' : 'failed',
|
|
168
|
-
evidenceKind: 'live',
|
|
169
|
-
metadataStatus: metadata.status ?? null,
|
|
170
|
-
dryRun: metadata.dryRun ?? null,
|
|
171
|
-
missingEnv: metadata.missingEnv ?? [],
|
|
172
|
-
artifactValidationOk: artifactValidation.ok,
|
|
173
|
-
adapterConformanceOk: metadata.adapterConformance?.ok ?? null,
|
|
174
|
-
secretLeakCount: leakedEnv.length,
|
|
175
|
-
failures,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function verifyTarget(target, options, schemas) {
|
|
180
|
-
const outDir = resolve(options.outRoot, target.id);
|
|
181
|
-
const metadataPath = join(outDir, 'external-run-metadata.json');
|
|
182
|
-
|
|
183
|
-
if (!existsSync(metadataPath)) {
|
|
184
|
-
return pendingRow(target, outDir, metadataPath, options.allowPending, 'missing');
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
let metadata = null;
|
|
188
|
-
let metadataText = '';
|
|
189
|
-
const parseFailures = [];
|
|
190
|
-
try {
|
|
191
|
-
metadataText = readFileSync(metadataPath, 'utf-8');
|
|
192
|
-
metadata = JSON.parse(metadataText);
|
|
193
|
-
} catch (error) {
|
|
194
|
-
parseFailures.push(error.message);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (!metadata) {
|
|
198
|
-
return {
|
|
199
|
-
id: target.id,
|
|
200
|
-
name: target.name,
|
|
201
|
-
path: target.path,
|
|
202
|
-
credentialMode: target.credentialMode,
|
|
203
|
-
requiredEnv: target.requiredEnv,
|
|
204
|
-
outDir: publicPath(outDir),
|
|
205
|
-
metadataPath: publicPath(metadataPath),
|
|
206
|
-
status: 'failed',
|
|
207
|
-
evidenceKind: 'missing',
|
|
208
|
-
metadataStatus: null,
|
|
209
|
-
dryRun: null,
|
|
210
|
-
missingEnv: target.requiredEnv,
|
|
211
|
-
artifactValidationOk: null,
|
|
212
|
-
adapterConformanceOk: null,
|
|
213
|
-
secretLeakCount: 0,
|
|
214
|
-
failures: parseFailures,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const metadataSchemaFailures = validateSchema(
|
|
219
|
-
metadata,
|
|
220
|
-
schemas.externalRun,
|
|
221
|
-
'guardbench-externalRun',
|
|
222
|
-
);
|
|
223
|
-
const leakedEnv = credentialLeaks(metadataText, target.requiredEnv, options.env);
|
|
224
|
-
const metadataFailures = [
|
|
225
|
-
...metadataSchemaFailures,
|
|
226
|
-
...leakedEnv.map(name => `metadata leaks runtime credential value for ${name}`),
|
|
227
|
-
];
|
|
228
|
-
|
|
229
|
-
if (metadata.dryRun === true || PENDING_METADATA_STATUSES.has(metadata.status)) {
|
|
230
|
-
return pendingRow(
|
|
231
|
-
target,
|
|
232
|
-
outDir,
|
|
233
|
-
metadataPath,
|
|
234
|
-
options.allowPending,
|
|
235
|
-
metadata.status ?? 'pending',
|
|
236
|
-
metadata,
|
|
237
|
-
metadataFailures,
|
|
238
|
-
leakedEnv.length,
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return verifyLiveMetadata(
|
|
243
|
-
target,
|
|
244
|
-
outDir,
|
|
245
|
-
metadataPath,
|
|
246
|
-
metadata,
|
|
247
|
-
metadataText,
|
|
248
|
-
schemas,
|
|
249
|
-
options.env,
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function externalTargetsFromRegistry(registry, adapterIds) {
|
|
254
|
-
const selected = new Set(adapterIds ?? []);
|
|
255
|
-
return (registry.adapters ?? [])
|
|
256
|
-
.filter(adapter => adapter.credentialMode === 'runtime-env')
|
|
257
|
-
.filter(adapter => selected.size === 0 || selected.has(adapter.id));
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export function validateExternalEvidenceReport(report, options = {}) {
|
|
261
|
-
const schema = readJson(fromRoot(options.schema ?? DEFAULT_EVIDENCE_SCHEMA));
|
|
262
|
-
return validateSchema(report, schema, 'guardbench-external-evidence');
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
export async function verifyExternalGuardBenchEvidence(options = {}) {
|
|
266
|
-
const registryPath = fromRoot(options.registry ?? DEFAULT_REGISTRY);
|
|
267
|
-
const registrySchemaPath = fromRoot(options.registrySchema ?? DEFAULT_REGISTRY_SCHEMA);
|
|
268
|
-
const outRoot = fromRoot(options.outRoot ?? DEFAULT_OUT_ROOT);
|
|
269
|
-
const allowPending = options.allowPending === true;
|
|
270
|
-
const registry = options.targets ? null : readJson(registryPath);
|
|
271
|
-
const registryValidation = options.targets
|
|
272
|
-
? { ok: true, failures: [] }
|
|
273
|
-
: await validateAdapterRegistry({ registry: registryPath, schema: registrySchemaPath });
|
|
274
|
-
const targets = options.targets ?? externalTargetsFromRegistry(registry, options.adapters);
|
|
275
|
-
const schemas = {
|
|
276
|
-
externalRun: readJson(fromRoot(options.externalRunSchema ?? DEFAULT_EXTERNAL_RUN_SCHEMA)),
|
|
277
|
-
};
|
|
278
|
-
const rows = targets.map(target =>
|
|
279
|
-
verifyTarget(
|
|
280
|
-
target,
|
|
281
|
-
{
|
|
282
|
-
outRoot,
|
|
283
|
-
allowPending,
|
|
284
|
-
env: options.env ?? process.env,
|
|
285
|
-
},
|
|
286
|
-
schemas,
|
|
287
|
-
),
|
|
288
|
-
);
|
|
289
|
-
const unknownAdapters = (options.adapters ?? []).filter(
|
|
290
|
-
id => !targets.some(target => target.id === id),
|
|
291
|
-
);
|
|
292
|
-
const failures = [
|
|
293
|
-
...registryValidation.failures.map(failure => `registry: ${failure}`),
|
|
294
|
-
...unknownAdapters.map(id => `Unknown runtime-env adapter id: ${id}`),
|
|
295
|
-
...rows.flatMap(row => row.failures.map(failure => `${row.id}: ${failure}`)),
|
|
296
|
-
];
|
|
297
|
-
const report = {
|
|
298
|
-
schemaVersion: '1.0.0',
|
|
299
|
-
suite: 'GuardBench external evidence verification',
|
|
300
|
-
generatedAt: new Date().toISOString(),
|
|
301
|
-
ok: failures.length === 0,
|
|
302
|
-
allowPending,
|
|
303
|
-
registry: options.targets ? 'inline-targets' : publicPath(registryPath),
|
|
304
|
-
outRoot: publicPath(outRoot),
|
|
305
|
-
adapters: rows,
|
|
306
|
-
failures,
|
|
307
|
-
};
|
|
308
|
-
const schemaFailures = validateExternalEvidenceReport(report, {
|
|
309
|
-
schema: options.evidenceSchema ?? DEFAULT_EVIDENCE_SCHEMA,
|
|
310
|
-
});
|
|
311
|
-
if (schemaFailures.length > 0) {
|
|
312
|
-
throw new Error(
|
|
313
|
-
`GuardBench external evidence schema validation failed: ${schemaFailures.join('; ')}`,
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
if (options.write !== false) {
|
|
317
|
-
writeJson(fromRoot(options.report ?? DEFAULT_REPORT), report);
|
|
318
|
-
}
|
|
319
|
-
return report;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
async function main() {
|
|
323
|
-
const args = parseExternalEvidenceArgs();
|
|
324
|
-
if (args.help) {
|
|
325
|
-
console.log(usage());
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
const report = await verifyExternalGuardBenchEvidence(args);
|
|
330
|
-
if (args.json) {
|
|
331
|
-
console.log(JSON.stringify(report, null, 2));
|
|
332
|
-
} else if (report.ok) {
|
|
333
|
-
const verified = report.adapters.filter(adapter => adapter.status === 'verified').length;
|
|
334
|
-
const pending = report.adapters.filter(adapter => adapter.status === 'pending').length;
|
|
335
|
-
console.log(
|
|
336
|
-
`GuardBench external evidence verification passed: ${verified} verified, ${pending} pending`,
|
|
337
|
-
);
|
|
338
|
-
} else {
|
|
339
|
-
console.error('GuardBench external evidence verification failed:');
|
|
340
|
-
for (const failure of report.failures) console.error(`- ${failure}`);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (!report.ok) process.exit(1);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
347
|
-
main().catch(error => {
|
|
348
|
-
console.error(error.stack ?? error.message);
|
|
349
|
-
process.exit(1);
|
|
350
|
-
});
|
|
351
|
-
}
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join, resolve } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { validateAdapterRegistry } from './validate-adapter-registry.mjs';
|
|
5
|
-
import { validateAdapterModuleFile } from './validate-adapter-module.mjs';
|
|
6
|
-
import { validateAdapterSelfTestFile } from './validate-adapter-self-test.mjs';
|
|
7
|
-
import { validateExternalAdapterDryRunMatrix } from './dry-run-external-adapters.mjs';
|
|
8
|
-
import { validateExternalEvidenceReport } from './verify-external-evidence.mjs';
|
|
9
|
-
import { validateGuardBenchArtifacts, validateSchema } from './validate-guardbench-artifacts.mjs';
|
|
10
|
-
import { verifyGuardBenchSubmissionBundle } from './verify-submission-bundle.mjs';
|
|
11
|
-
import { containsLocalPath, findLocalPathLeaks, publicPath, walkFiles } from './public-paths.mjs';
|
|
12
|
-
|
|
13
|
-
const DEFAULT_ADAPTER = 'benchmarks/adapters/example-allow.mjs';
|
|
14
|
-
const DEFAULT_ARTIFACTS_DIR = 'benchmarks/output';
|
|
15
|
-
const DEFAULT_BUNDLE_DIR = 'benchmarks/output/submission-bundle';
|
|
16
|
-
const DEFAULT_EXTERNAL_DRY_RUN = 'benchmarks/output/external/guardbench-external-dry-run.json';
|
|
17
|
-
const DEFAULT_EXTERNAL_EVIDENCE = 'benchmarks/output/external/guardbench-external-evidence.json';
|
|
18
|
-
const DEFAULT_LEADERBOARD = 'benchmarks/output/leaderboard/guardbench-leaderboard.json';
|
|
19
|
-
const DEFAULT_SCHEMA = 'benchmarks/schemas/guardbench-publication-verification.schema.json';
|
|
20
|
-
|
|
21
|
-
export function parsePublicationVerifierArgs(argv = process.argv.slice(2)) {
|
|
22
|
-
const args = {
|
|
23
|
-
adapter: DEFAULT_ADAPTER,
|
|
24
|
-
artifactsDir: DEFAULT_ARTIFACTS_DIR,
|
|
25
|
-
bundleDir: DEFAULT_BUNDLE_DIR,
|
|
26
|
-
externalDryRun: DEFAULT_EXTERNAL_DRY_RUN,
|
|
27
|
-
externalEvidence: DEFAULT_EXTERNAL_EVIDENCE,
|
|
28
|
-
leaderboard: DEFAULT_LEADERBOARD,
|
|
29
|
-
json: false,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
for (let i = 0; i < argv.length; i++) {
|
|
33
|
-
const token = argv[i];
|
|
34
|
-
if (token === '--adapter' && argv[i + 1]) args.adapter = argv[++i];
|
|
35
|
-
else if ((token === '--artifacts-dir' || token === '--dir') && argv[i + 1])
|
|
36
|
-
args.artifactsDir = argv[++i];
|
|
37
|
-
else if ((token === '--bundle-dir' || token === '--bundle') && argv[i + 1])
|
|
38
|
-
args.bundleDir = argv[++i];
|
|
39
|
-
else if (token === '--external-dry-run' && argv[i + 1]) args.externalDryRun = argv[++i];
|
|
40
|
-
else if (token === '--external-evidence' && argv[i + 1]) args.externalEvidence = argv[++i];
|
|
41
|
-
else if (token === '--leaderboard' && argv[i + 1]) args.leaderboard = argv[++i];
|
|
42
|
-
else if (token === '--json') args.json = true;
|
|
43
|
-
else if (token === '--help' || token === '-h') args.help = true;
|
|
44
|
-
else throw new Error(`Unknown argument: ${token}`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return args;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function usage() {
|
|
51
|
-
return `Usage: node benchmarks/verify-publication-artifacts.mjs [options]
|
|
52
|
-
|
|
53
|
-
Options:
|
|
54
|
-
--adapter <path> Default adapter module. Default: ${DEFAULT_ADAPTER}.
|
|
55
|
-
--artifacts-dir <path> GuardBench output artifact directory. Default: ${DEFAULT_ARTIFACTS_DIR}.
|
|
56
|
-
--bundle-dir <path> GuardBench submission bundle. Default: ${DEFAULT_BUNDLE_DIR}.
|
|
57
|
-
--external-dry-run <path> GuardBench external adapter dry-run matrix. Default: ${DEFAULT_EXTERNAL_DRY_RUN}.
|
|
58
|
-
--external-evidence <path> GuardBench external live-evidence verification report. Default: ${DEFAULT_EXTERNAL_EVIDENCE}.
|
|
59
|
-
--leaderboard <path> GuardBench leaderboard JSON. Default: ${DEFAULT_LEADERBOARD}.
|
|
60
|
-
--json Print the machine-readable verification report.
|
|
61
|
-
`;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function readJson(path) {
|
|
65
|
-
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function checkLeaderboard(path) {
|
|
69
|
-
const leaderboardPath = resolve(path);
|
|
70
|
-
const failures = [];
|
|
71
|
-
let leaderboard = null;
|
|
72
|
-
|
|
73
|
-
if (!existsSync(leaderboardPath)) {
|
|
74
|
-
failures.push(`Missing GuardBench leaderboard: ${leaderboardPath}`);
|
|
75
|
-
} else {
|
|
76
|
-
try {
|
|
77
|
-
leaderboard = readJson(leaderboardPath);
|
|
78
|
-
const schema = readJson('benchmarks/schemas/guardbench-leaderboard.schema.json');
|
|
79
|
-
failures.push(...validateSchema(leaderboard, schema, 'guardbench-leaderboard'));
|
|
80
|
-
if (!leaderboard.rows?.some(row => row.verification?.ok === true)) {
|
|
81
|
-
failures.push('GuardBench leaderboard has no verified rows');
|
|
82
|
-
}
|
|
83
|
-
} catch (error) {
|
|
84
|
-
failures.push(error.message);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
ok: failures.length === 0,
|
|
90
|
-
path: publicPath(leaderboardPath),
|
|
91
|
-
rows: leaderboard?.rows?.length ?? 0,
|
|
92
|
-
failures,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function checkExternalDryRun(path) {
|
|
97
|
-
const matrixPath = resolve(path);
|
|
98
|
-
const failures = [];
|
|
99
|
-
let matrix = null;
|
|
100
|
-
|
|
101
|
-
if (!existsSync(matrixPath)) {
|
|
102
|
-
failures.push(`Missing GuardBench external adapter dry-run matrix: ${matrixPath}`);
|
|
103
|
-
} else {
|
|
104
|
-
try {
|
|
105
|
-
matrix = readJson(matrixPath);
|
|
106
|
-
failures.push(...validateExternalAdapterDryRunMatrix(matrix));
|
|
107
|
-
if (!matrix.adapters?.some(row => row.id === 'mem0-platform')) {
|
|
108
|
-
failures.push('GuardBench external adapter dry-run matrix has no mem0-platform row');
|
|
109
|
-
}
|
|
110
|
-
if (!matrix.adapters?.some(row => row.id === 'zep-cloud')) {
|
|
111
|
-
failures.push('GuardBench external adapter dry-run matrix has no zep-cloud row');
|
|
112
|
-
}
|
|
113
|
-
} catch (error) {
|
|
114
|
-
failures.push(error.message);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
ok: failures.length === 0,
|
|
120
|
-
path: publicPath(matrixPath),
|
|
121
|
-
adapters: matrix?.adapters?.length ?? 0,
|
|
122
|
-
missingEnv: matrix?.adapters?.flatMap(row => row.missingEnv ?? []) ?? [],
|
|
123
|
-
failures,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function checkExternalEvidence(path) {
|
|
128
|
-
const reportPath = resolve(path);
|
|
129
|
-
const failures = [];
|
|
130
|
-
let evidence = null;
|
|
131
|
-
|
|
132
|
-
if (!existsSync(reportPath)) {
|
|
133
|
-
failures.push(`Missing GuardBench external evidence report: ${reportPath}`);
|
|
134
|
-
} else {
|
|
135
|
-
try {
|
|
136
|
-
evidence = readJson(reportPath);
|
|
137
|
-
failures.push(...validateExternalEvidenceReport(evidence));
|
|
138
|
-
if (evidence.ok !== true) {
|
|
139
|
-
failures.push('GuardBench external evidence report is not ok');
|
|
140
|
-
}
|
|
141
|
-
if (!evidence.adapters?.some(row => row.id === 'mem0-platform')) {
|
|
142
|
-
failures.push('GuardBench external evidence report has no mem0-platform row');
|
|
143
|
-
}
|
|
144
|
-
if (!evidence.adapters?.some(row => row.id === 'zep-cloud')) {
|
|
145
|
-
failures.push('GuardBench external evidence report has no zep-cloud row');
|
|
146
|
-
}
|
|
147
|
-
} catch (error) {
|
|
148
|
-
failures.push(error.message);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
ok: failures.length === 0,
|
|
154
|
-
path: publicPath(reportPath),
|
|
155
|
-
adapters: evidence?.adapters?.length ?? 0,
|
|
156
|
-
verified: evidence?.adapters?.filter(row => row.status === 'verified').length ?? 0,
|
|
157
|
-
pending: evidence?.adapters?.filter(row => row.status === 'pending').length ?? 0,
|
|
158
|
-
failures,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function scanTextFile(path) {
|
|
163
|
-
try {
|
|
164
|
-
return containsLocalPath(readFileSync(path, 'utf-8'));
|
|
165
|
-
} catch {
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function checkLocalPathLeaks(options = {}) {
|
|
171
|
-
const failures = [];
|
|
172
|
-
const artifactsDir = resolve(options.artifactsDir ?? DEFAULT_ARTIFACTS_DIR);
|
|
173
|
-
const bundleDir = resolve(options.bundleDir ?? DEFAULT_BUNDLE_DIR);
|
|
174
|
-
const files = [
|
|
175
|
-
join(artifactsDir, 'guardbench-manifest.json'),
|
|
176
|
-
join(artifactsDir, 'guardbench-summary.json'),
|
|
177
|
-
join(artifactsDir, 'guardbench-raw.json'),
|
|
178
|
-
join(artifactsDir, 'guardbench-conformance-card.json'),
|
|
179
|
-
join(artifactsDir, 'adapter-self-test', 'guardbench-adapter-self-test.json'),
|
|
180
|
-
resolve(options.externalDryRun ?? DEFAULT_EXTERNAL_DRY_RUN),
|
|
181
|
-
resolve(options.externalEvidence ?? DEFAULT_EXTERNAL_EVIDENCE),
|
|
182
|
-
resolve(options.leaderboard ?? DEFAULT_LEADERBOARD),
|
|
183
|
-
];
|
|
184
|
-
|
|
185
|
-
for (const path of files) {
|
|
186
|
-
if (existsSync(path) && scanTextFile(path)) {
|
|
187
|
-
failures.push(`${publicPath(path)} contains a local absolute path`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
if (existsSync(bundleDir)) {
|
|
191
|
-
for (const file of walkFiles(bundleDir)) {
|
|
192
|
-
const path = join(bundleDir, file);
|
|
193
|
-
if (scanTextFile(path)) failures.push(`${publicPath(path)} contains a local absolute path`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
ok: failures.length === 0,
|
|
199
|
-
filesChecked: files.filter(path => existsSync(path)).map(path => publicPath(path)),
|
|
200
|
-
bundleDir: publicPath(bundleDir),
|
|
201
|
-
failures,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export function validatePublicationVerificationReport(report, options = {}) {
|
|
206
|
-
const schema = readJson(options.schema ?? DEFAULT_SCHEMA);
|
|
207
|
-
return validateSchema(report, schema, 'guardbench-publication-verification');
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export async function verifyGuardBenchPublicationArtifacts(options = {}) {
|
|
211
|
-
const registry = await validateAdapterRegistry();
|
|
212
|
-
const adapterModule = await validateAdapterModuleFile({
|
|
213
|
-
adapter: options.adapter ?? DEFAULT_ADAPTER,
|
|
214
|
-
});
|
|
215
|
-
const selfTest = validateAdapterSelfTestFile({
|
|
216
|
-
report: join(
|
|
217
|
-
resolve(options.artifactsDir ?? DEFAULT_ARTIFACTS_DIR),
|
|
218
|
-
'adapter-self-test',
|
|
219
|
-
'guardbench-adapter-self-test.json',
|
|
220
|
-
),
|
|
221
|
-
});
|
|
222
|
-
const artifacts = validateGuardBenchArtifacts({
|
|
223
|
-
dir: options.artifactsDir ?? DEFAULT_ARTIFACTS_DIR,
|
|
224
|
-
});
|
|
225
|
-
const bundle = verifyGuardBenchSubmissionBundle({ dir: options.bundleDir ?? DEFAULT_BUNDLE_DIR });
|
|
226
|
-
const externalDryRun = checkExternalDryRun(options.externalDryRun ?? DEFAULT_EXTERNAL_DRY_RUN);
|
|
227
|
-
const externalEvidence = checkExternalEvidence(
|
|
228
|
-
options.externalEvidence ?? DEFAULT_EXTERNAL_EVIDENCE,
|
|
229
|
-
);
|
|
230
|
-
const leaderboard = checkLeaderboard(options.leaderboard ?? DEFAULT_LEADERBOARD);
|
|
231
|
-
const localPaths = checkLocalPathLeaks(options);
|
|
232
|
-
const checks = {
|
|
233
|
-
registry,
|
|
234
|
-
adapterModule,
|
|
235
|
-
selfTest,
|
|
236
|
-
artifacts,
|
|
237
|
-
bundle,
|
|
238
|
-
externalDryRun,
|
|
239
|
-
externalEvidence,
|
|
240
|
-
leaderboard,
|
|
241
|
-
localPaths,
|
|
242
|
-
};
|
|
243
|
-
const failures = Object.entries(checks).flatMap(([name, report]) =>
|
|
244
|
-
(report.failures ?? []).map(failure => `${name}: ${failure}`),
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
const report = {
|
|
248
|
-
schemaVersion: '1.0.0',
|
|
249
|
-
suite: 'GuardBench publication artifact verification',
|
|
250
|
-
generatedAt: new Date().toISOString(),
|
|
251
|
-
ok: failures.length === 0,
|
|
252
|
-
checks,
|
|
253
|
-
failures,
|
|
254
|
-
};
|
|
255
|
-
const reportLocalPathLeaks = findLocalPathLeaks({ checks });
|
|
256
|
-
if (reportLocalPathLeaks.length > 0) {
|
|
257
|
-
failures.push(
|
|
258
|
-
...reportLocalPathLeaks.map(
|
|
259
|
-
leak => `publication report contains local absolute path: ${leak}`,
|
|
260
|
-
),
|
|
261
|
-
);
|
|
262
|
-
report.ok = false;
|
|
263
|
-
report.failures = failures;
|
|
264
|
-
}
|
|
265
|
-
const schemaFailures = validatePublicationVerificationReport(report);
|
|
266
|
-
if (schemaFailures.length > 0) {
|
|
267
|
-
throw new Error(
|
|
268
|
-
`GuardBench publication verification schema validation failed: ${schemaFailures.join('; ')}`,
|
|
269
|
-
);
|
|
270
|
-
}
|
|
271
|
-
return report;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
async function main() {
|
|
275
|
-
const args = parsePublicationVerifierArgs();
|
|
276
|
-
if (args.help) {
|
|
277
|
-
console.log(usage());
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const report = await verifyGuardBenchPublicationArtifacts(args);
|
|
282
|
-
if (args.json) {
|
|
283
|
-
console.log(JSON.stringify(report, null, 2));
|
|
284
|
-
} else if (report.ok) {
|
|
285
|
-
console.log('GuardBench publication artifact verification passed.');
|
|
286
|
-
console.log(`Registry adapters: ${report.checks.registry.adapters.length}`);
|
|
287
|
-
console.log(`Submission bundle files: ${report.checks.bundle.files.length}`);
|
|
288
|
-
console.log(`External dry-run adapters: ${report.checks.externalDryRun.adapters}`);
|
|
289
|
-
console.log(
|
|
290
|
-
`External live evidence: ${report.checks.externalEvidence.verified} verified, ${report.checks.externalEvidence.pending} pending`,
|
|
291
|
-
);
|
|
292
|
-
console.log(`Leaderboard rows: ${report.checks.leaderboard.rows}`);
|
|
293
|
-
console.log(
|
|
294
|
-
`Local path sweep: ${report.checks.localPaths.filesChecked.length} files plus bundle`,
|
|
295
|
-
);
|
|
296
|
-
} else {
|
|
297
|
-
console.error('GuardBench publication artifact verification failed:');
|
|
298
|
-
for (const failure of report.failures) console.error(`- ${failure}`);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
if (!report.ok) process.exit(1);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
305
|
-
main().catch(error => {
|
|
306
|
-
console.error(error.stack ?? error.message);
|
|
307
|
-
process.exit(1);
|
|
308
|
-
});
|
|
309
|
-
}
|