agentskeptic 3.3.3 → 3.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/dist/cli/lockOrchestration.test.js +3 -0
- package/dist/cli/lockOrchestration.test.js.map +1 -1
- package/dist/cli.js +195 -18
- package/dist/cli.js.map +1 -1
- package/dist/cliArgv.d.ts +6 -0
- package/dist/cliArgv.d.ts.map +1 -1
- package/dist/cliArgv.js +9 -0
- package/dist/cliArgv.js.map +1 -1
- package/dist/cliExecutionFinalize.d.ts +43 -0
- package/dist/cliExecutionFinalize.d.ts.map +1 -0
- package/dist/cliExecutionFinalize.js +149 -0
- package/dist/cliExecutionFinalize.js.map +1 -0
- package/dist/cliOperationalCodes.d.ts +4 -0
- package/dist/cliOperationalCodes.d.ts.map +1 -1
- package/dist/cliOperationalCodes.js +4 -0
- package/dist/cliOperationalCodes.js.map +1 -1
- package/dist/decisionEvidenceBundle/completeness.d.ts +26 -0
- package/dist/decisionEvidenceBundle/completeness.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/completeness.js +36 -0
- package/dist/decisionEvidenceBundle/completeness.js.map +1 -0
- package/dist/decisionEvidenceBundle/constants.d.ts +9 -0
- package/dist/decisionEvidenceBundle/constants.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/constants.js +9 -0
- package/dist/decisionEvidenceBundle/constants.js.map +1 -0
- package/dist/decisionEvidenceBundle/exitCode.d.ts +4 -0
- package/dist/decisionEvidenceBundle/exitCode.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/exitCode.js +9 -0
- package/dist/decisionEvidenceBundle/exitCode.js.map +1 -0
- package/dist/decisionEvidenceBundle/index.d.ts +6 -0
- package/dist/decisionEvidenceBundle/index.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/index.js +6 -0
- package/dist/decisionEvidenceBundle/index.js.map +1 -0
- package/dist/decisionEvidenceBundle/validateDecisionEvidenceBundle.d.ts +24 -0
- package/dist/decisionEvidenceBundle/validateDecisionEvidenceBundle.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/validateDecisionEvidenceBundle.js +162 -0
- package/dist/decisionEvidenceBundle/validateDecisionEvidenceBundle.js.map +1 -0
- package/dist/decisionEvidenceBundle/writeDecisionEvidenceBundle.d.ts +21 -0
- package/dist/decisionEvidenceBundle/writeDecisionEvidenceBundle.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle/writeDecisionEvidenceBundle.js +88 -0
- package/dist/decisionEvidenceBundle/writeDecisionEvidenceBundle.js.map +1 -0
- package/dist/decisionEvidenceBundle.test.d.ts +2 -0
- package/dist/decisionEvidenceBundle.test.d.ts.map +1 -0
- package/dist/decisionEvidenceBundle.test.js +59 -0
- package/dist/decisionEvidenceBundle.test.js.map +1 -0
- package/dist/decisionEvidenceHumanLayer.d.ts +23 -0
- package/dist/decisionEvidenceHumanLayer.d.ts.map +1 -0
- package/dist/decisionEvidenceHumanLayer.js +23 -0
- package/dist/decisionEvidenceHumanLayer.js.map +1 -0
- package/dist/enforceCli.d.ts.map +1 -1
- package/dist/enforceCli.js +22 -3
- package/dist/enforceCli.js.map +1 -1
- package/dist/enforceStateful.d.ts.map +1 -1
- package/dist/enforceStateful.js +150 -97
- package/dist/enforceStateful.js.map +1 -1
- package/dist/execution-identity.v1.json +14 -0
- package/dist/executionIdentityVerifyCli.d.ts +7 -0
- package/dist/executionIdentityVerifyCli.d.ts.map +1 -0
- package/dist/executionIdentityVerifyCli.js +84 -0
- package/dist/executionIdentityVerifyCli.js.map +1 -0
- package/dist/mergeGateReceiptFinalize.d.ts +16 -0
- package/dist/mergeGateReceiptFinalize.d.ts.map +1 -0
- package/dist/mergeGateReceiptFinalize.js +40 -0
- package/dist/mergeGateReceiptFinalize.js.map +1 -0
- package/dist/operationalDisposition.d.ts +32 -0
- package/dist/operationalDisposition.d.ts.map +1 -1
- package/dist/operationalDisposition.js +32 -0
- package/dist/operationalDisposition.js.map +1 -1
- package/dist/publicDistribution.generated.d.ts +1 -1
- package/dist/publicDistribution.generated.js +1 -1
- package/dist/schemaLoad.d.ts +1 -1
- package/dist/schemaLoad.d.ts.map +1 -1
- package/dist/schemaLoad.js +12 -0
- package/dist/schemaLoad.js.map +1 -1
- package/dist/standardVerifyWorkflowCli.d.ts +2 -0
- package/dist/standardVerifyWorkflowCli.d.ts.map +1 -1
- package/dist/standardVerifyWorkflowCli.js +5 -2
- package/dist/standardVerifyWorkflowCli.js.map +1 -1
- package/dist/verificationReceipt.d.ts +44 -0
- package/dist/verificationReceipt.d.ts.map +1 -0
- package/dist/verificationReceipt.js +131 -0
- package/dist/verificationReceipt.js.map +1 -0
- package/dist/verify/batchVerifyTelemetrySubcommand.d.ts.map +1 -1
- package/dist/verify/batchVerifyTelemetrySubcommand.js +115 -17
- package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
- package/package.json +6 -4
- package/schemas/agentskeptic-error-codes.json +28 -0
- package/schemas/ci/verification-truth.manifest.json +30 -1
- package/schemas/ci/verification-truth.manifest.schema.json +6 -1
- package/schemas/decision-bundle-validation-v1.schema.json +50 -0
- package/schemas/decision-evidence-attestation-v1.schema.json +19 -0
- package/schemas/decision-evidence-bundle-manifest-v1.schema.json +51 -0
- package/schemas/decision-evidence-exit-v1.schema.json +13 -0
- package/schemas/decision-evidence-human-layer-v1.schema.json +27 -0
- package/schemas/decision-evidence-next-action-v1.schema.json +14 -0
- package/schemas/execution-identity-v1.schema.json +36 -0
- package/schemas/openapi-commercial-v1.yaml +1 -1
- package/schemas/verification-receipt-v1.schema.json +108 -0
- package/scripts/emit-primary-marketing.cjs +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateDecisionEvidenceBundle.js","sourceRoot":"","sources":["../../src/decisionEvidenceBundle/validateDecisionEvidenceBundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { OutcomeCertificateV1 } from "../outcomeCertificate.js";
|
|
2
|
+
import { type DecisionEvidenceCompleteness } from "./completeness.js";
|
|
3
|
+
export type WriteDecisionEvidenceBundleOptions = {
|
|
4
|
+
outDir: string;
|
|
5
|
+
certificate: OutcomeCertificateV1;
|
|
6
|
+
noHumanReport: boolean;
|
|
7
|
+
runId?: string;
|
|
8
|
+
producer?: {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
};
|
|
12
|
+
/** Validated against decision-evidence-attestation-v1 when present. */
|
|
13
|
+
attestation?: unknown;
|
|
14
|
+
/** Validated against decision-evidence-next-action-v1 when present. */
|
|
15
|
+
nextAction?: unknown;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Writes Decision Evidence Bundle: outcome-certificate, exit, human-layer, optional attestation/next-action, manifest last.
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeDecisionEvidenceBundle(options: WriteDecisionEvidenceBundleOptions): DecisionEvidenceCompleteness;
|
|
21
|
+
//# sourceMappingURL=writeDecisionEvidenceBundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeDecisionEvidenceBundle.d.ts","sourceRoot":"","sources":["../../src/decisionEvidenceBundle/writeDecisionEvidenceBundle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAOrE,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,mBAAmB,CAAC;AAW3B,MAAM,MAAM,kCAAkC,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAYF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kCAAkC,GAAG,4BAA4B,CA8ErH"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { atomicWriteUtf8File } from "../quickVerify/atomicWrite.js";
|
|
5
|
+
import { loadSchemaValidator } from "../schemaLoad.js";
|
|
6
|
+
import { TruthLayerError } from "../truthLayerError.js";
|
|
7
|
+
import { CLI_OPERATIONAL_CODES, formatOperationalMessage } from "../failureCatalog.js";
|
|
8
|
+
import { buildHumanLayerFileJson } from "../decisionEvidenceHumanLayer.js";
|
|
9
|
+
import { DECISION_EVIDENCE_FILES } from "./constants.js";
|
|
10
|
+
import { exitCodeFromOutcomeCertificate } from "./exitCode.js";
|
|
11
|
+
import { computeCompletenessFromParts, } from "./completeness.js";
|
|
12
|
+
function readPackageIdentity() {
|
|
13
|
+
const pkgPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
14
|
+
const raw = readFileSync(pkgPath, "utf8");
|
|
15
|
+
const pkg = JSON.parse(raw);
|
|
16
|
+
const name = typeof pkg.name === "string" && pkg.name.length > 0 ? pkg.name : "agentskeptic";
|
|
17
|
+
const version = typeof pkg.version === "string" && pkg.version.length > 0 ? pkg.version : "0.0.0";
|
|
18
|
+
return { name, version };
|
|
19
|
+
}
|
|
20
|
+
function validateOptional(schemaName, label, value) {
|
|
21
|
+
const v = loadSchemaValidator(schemaName);
|
|
22
|
+
if (!v(value)) {
|
|
23
|
+
throw new TruthLayerError(CLI_OPERATIONAL_CODES.CLI_USAGE, formatOperationalMessage(`${label}: ${JSON.stringify(v.errors ?? [])}`));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Writes Decision Evidence Bundle: outcome-certificate, exit, human-layer, optional attestation/next-action, manifest last.
|
|
28
|
+
*/
|
|
29
|
+
export function writeDecisionEvidenceBundle(options) {
|
|
30
|
+
const resolved = path.resolve(options.outDir);
|
|
31
|
+
mkdirSync(resolved, { recursive: true });
|
|
32
|
+
const validateCert = loadSchemaValidator("outcome-certificate-v1");
|
|
33
|
+
if (!validateCert(options.certificate)) {
|
|
34
|
+
throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, formatOperationalMessage(`writeDecisionEvidenceBundle: certificate invalid ${JSON.stringify(validateCert.errors ?? [])}`));
|
|
35
|
+
}
|
|
36
|
+
if (options.attestation !== undefined) {
|
|
37
|
+
validateOptional("decision-evidence-attestation-v1", "decision attestation", options.attestation);
|
|
38
|
+
}
|
|
39
|
+
if (options.nextAction !== undefined) {
|
|
40
|
+
validateOptional("decision-evidence-next-action-v1", "decision next-action", options.nextAction);
|
|
41
|
+
}
|
|
42
|
+
const outcomeUtf8 = `${JSON.stringify(options.certificate)}\n`;
|
|
43
|
+
const exitPayload = {
|
|
44
|
+
schemaVersion: 1,
|
|
45
|
+
exitCode: exitCodeFromOutcomeCertificate(options.certificate),
|
|
46
|
+
cliConvention: "outcome_certificate_v1",
|
|
47
|
+
};
|
|
48
|
+
validateOptional("decision-evidence-exit-v1", "exit", exitPayload);
|
|
49
|
+
const exitUtf8 = `${JSON.stringify(exitPayload)}\n`;
|
|
50
|
+
const humanLayer = buildHumanLayerFileJson(options.certificate, options.noHumanReport);
|
|
51
|
+
validateOptional("decision-evidence-human-layer-v1", "human-layer", humanLayer);
|
|
52
|
+
const humanUtf8 = `${JSON.stringify(humanLayer)}\n`;
|
|
53
|
+
const producer = options.producer ?? readPackageIdentity();
|
|
54
|
+
const a4Present = options.attestation !== undefined;
|
|
55
|
+
const a5Present = options.nextAction !== undefined;
|
|
56
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.outcomeCertificate), outcomeUtf8);
|
|
57
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.exit), exitUtf8);
|
|
58
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.humanLayer), humanUtf8);
|
|
59
|
+
if (options.attestation !== undefined) {
|
|
60
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.attestation), `${JSON.stringify(options.attestation)}\n`);
|
|
61
|
+
}
|
|
62
|
+
if (options.nextAction !== undefined) {
|
|
63
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.nextAction), `${JSON.stringify(options.nextAction)}\n`);
|
|
64
|
+
}
|
|
65
|
+
const computed = computeCompletenessFromParts({
|
|
66
|
+
certificateValid: true,
|
|
67
|
+
coreFilesPresent: true,
|
|
68
|
+
certificate: options.certificate,
|
|
69
|
+
a4Present,
|
|
70
|
+
a5Present,
|
|
71
|
+
});
|
|
72
|
+
const manifestPayload = {
|
|
73
|
+
schemaVersion: 1,
|
|
74
|
+
bundleKind: "decision_evidence",
|
|
75
|
+
producer,
|
|
76
|
+
createdAt: new Date().toISOString(),
|
|
77
|
+
workflowId: options.certificate.workflowId,
|
|
78
|
+
...(options.runId !== undefined ? { runId: options.runId } : {}),
|
|
79
|
+
completeness: {
|
|
80
|
+
status: computed.status,
|
|
81
|
+
artifacts: computed.artifacts,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
validateOptional("decision-evidence-bundle-manifest-v1", "manifest", manifestPayload);
|
|
85
|
+
atomicWriteUtf8File(path.join(resolved, DECISION_EVIDENCE_FILES.manifest), `${JSON.stringify(manifestPayload)}\n`);
|
|
86
|
+
return computed;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=writeDecisionEvidenceBundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeDecisionEvidenceBundle.js","sourceRoot":"","sources":["../../src/decisionEvidenceBundle/writeDecisionEvidenceBundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionEvidenceBundle.test.d.ts","sourceRoot":"","sources":["../src/decisionEvidenceBundle.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mkdirSync, rmSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { writeDecisionEvidenceBundle } from "./decisionEvidenceBundle/writeDecisionEvidenceBundle.js";
|
|
5
|
+
import { formatValidationStdout, validateDecisionEvidenceBundle, } from "./decisionEvidenceBundle/validateDecisionEvidenceBundle.js";
|
|
6
|
+
function minimalCertificate(stateRelation) {
|
|
7
|
+
return {
|
|
8
|
+
schemaVersion: 1,
|
|
9
|
+
workflowId: "wf_test",
|
|
10
|
+
runKind: "contract_sql",
|
|
11
|
+
stateRelation,
|
|
12
|
+
highStakesReliance: stateRelation === "matches_expectations" ? "permitted" : "prohibited",
|
|
13
|
+
relianceRationale: "r",
|
|
14
|
+
intentSummary: "s",
|
|
15
|
+
explanation: { headline: "h", details: [] },
|
|
16
|
+
steps: [],
|
|
17
|
+
humanReport: "human",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe("decisionEvidenceBundle", () => {
|
|
21
|
+
it("validate fails partial when A5 required and missing", () => {
|
|
22
|
+
const dir = path.join(process.cwd(), `tmp-de-bundle-${Date.now()}`);
|
|
23
|
+
mkdirSync(dir, { recursive: true });
|
|
24
|
+
try {
|
|
25
|
+
writeDecisionEvidenceBundle({
|
|
26
|
+
outDir: dir,
|
|
27
|
+
certificate: minimalCertificate("does_not_match"),
|
|
28
|
+
noHumanReport: false,
|
|
29
|
+
runId: "run-1",
|
|
30
|
+
});
|
|
31
|
+
const line = validateDecisionEvidenceBundle(dir);
|
|
32
|
+
expect(line.status).toBe("partial");
|
|
33
|
+
expect(line.errors.some((e) => e.code === "A5_REQUIRED_MISSING")).toBe(true);
|
|
34
|
+
expect(JSON.parse(formatValidationStdout(line)).schemaVersion).toBe(1);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
rmSync(dir, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
it("validate complete for matches_expectations without next-action", () => {
|
|
41
|
+
const dir = path.join(process.cwd(), `tmp-de-bundle-${Date.now()}`);
|
|
42
|
+
mkdirSync(dir, { recursive: true });
|
|
43
|
+
try {
|
|
44
|
+
writeDecisionEvidenceBundle({
|
|
45
|
+
outDir: dir,
|
|
46
|
+
certificate: minimalCertificate("matches_expectations"),
|
|
47
|
+
noHumanReport: false,
|
|
48
|
+
runId: "run-2",
|
|
49
|
+
});
|
|
50
|
+
const line = validateDecisionEvidenceBundle(dir);
|
|
51
|
+
expect(line.status).toBe("complete");
|
|
52
|
+
expect(line.errors).toHaveLength(0);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
rmSync(dir, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=decisionEvidenceBundle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionEvidenceBundle.test.js","sourceRoot":"","sources":["../src/decisionEvidenceBundle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { OutcomeCertificateV1 } from "./outcomeCertificate.js";
|
|
2
|
+
export type HumanLayerFileV1 = {
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
kind: "report";
|
|
5
|
+
text: string;
|
|
6
|
+
} | {
|
|
7
|
+
schemaVersion: 1;
|
|
8
|
+
kind: "suppressed";
|
|
9
|
+
reason: "no_human_report";
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Canonical JSON for human-layer.json (A3).
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildHumanLayerFileJson(certificate: OutcomeCertificateV1, noHumanReport: boolean): HumanLayerFileV1;
|
|
15
|
+
/**
|
|
16
|
+
* Batch/contract verify: stderr bytes used with `process.stderr.write`. Ends with newline after footer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatContractVerifyStderrForStderrWrite(certificate: OutcomeCertificateV1): string;
|
|
19
|
+
/**
|
|
20
|
+
* Batch/contract verify: single line passed to `console.error` / `stderrLine` (no trailing newline after footer block; Node adds one).
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatContractVerifyStderrForStderrLine(certificate: OutcomeCertificateV1): string;
|
|
23
|
+
//# sourceMappingURL=decisionEvidenceHumanLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionEvidenceHumanLayer.d.ts","sourceRoot":"","sources":["../src/decisionEvidenceHumanLayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GACxB;IAAE,aAAa,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,aAAa,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAExE;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,oBAAoB,EACjC,aAAa,EAAE,OAAO,GACrB,gBAAgB,CAKlB;AAED;;GAEG;AACH,wBAAgB,wCAAwC,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,CAElG;AAED;;GAEG;AACH,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,CAEjG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { formatDistributionFooter } from "./distributionFooter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical JSON for human-layer.json (A3).
|
|
4
|
+
*/
|
|
5
|
+
export function buildHumanLayerFileJson(certificate, noHumanReport) {
|
|
6
|
+
if (noHumanReport) {
|
|
7
|
+
return { schemaVersion: 1, kind: "suppressed", reason: "no_human_report" };
|
|
8
|
+
}
|
|
9
|
+
return { schemaVersion: 1, kind: "report", text: certificate.humanReport };
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Batch/contract verify: stderr bytes used with `process.stderr.write`. Ends with newline after footer.
|
|
13
|
+
*/
|
|
14
|
+
export function formatContractVerifyStderrForStderrWrite(certificate) {
|
|
15
|
+
return `${certificate.humanReport}\n${formatDistributionFooter()}\n`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Batch/contract verify: single line passed to `console.error` / `stderrLine` (no trailing newline after footer block; Node adds one).
|
|
19
|
+
*/
|
|
20
|
+
export function formatContractVerifyStderrForStderrLine(certificate) {
|
|
21
|
+
return `${certificate.humanReport}\n${formatDistributionFooter()}`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=decisionEvidenceHumanLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionEvidenceHumanLayer.js","sourceRoot":"","sources":["../src/decisionEvidenceHumanLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAiC,EACjC,aAAsB;IAEtB,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wCAAwC,CAAC,WAAiC;IACxF,OAAO,GAAG,WAAW,CAAC,WAAW,KAAK,wBAAwB,EAAE,IAAI,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uCAAuC,CAAC,WAAiC;IACvF,OAAO,GAAG,WAAW,CAAC,WAAW,KAAK,wBAAwB,EAAE,EAAE,CAAC;AACrE,CAAC"}
|
package/dist/enforceCli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforceCli.d.ts","sourceRoot":"","sources":["../src/enforceCli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enforceCli.d.ts","sourceRoot":"","sources":["../src/enforceCli.ts"],"names":[],"mappings":"AAUA,wFAAwF;AACxF,eAAO,MAAM,wBAAwB,wXACkV,CAAC;AAuBxX,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC9D"}
|
package/dist/enforceCli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CLI_OPERATIONAL_CODES, cliErrorEnvelope, formatOperationalMessage, } from "./failureCatalog.js";
|
|
2
2
|
import { TruthLayerError } from "./truthLayerError.js";
|
|
3
3
|
import { LICENSE_PREFLIGHT_ENABLED } from "./generated/commercialBuildFlags.js";
|
|
4
|
+
import { exitAfterEnforceCliReceipt } from "./cliExecutionFinalize.js";
|
|
4
5
|
import { runStatefulEnforce } from "./enforceStateful.js";
|
|
5
6
|
/** User-facing message for OSS builds when `enforce` is invoked; exported for tests. */
|
|
6
7
|
export const ENFORCE_OSS_GATE_MESSAGE = "The OSS build cannot run agentskeptic enforce (CI lock gating). Install the published npm package agentskeptic, set AGENTSKEPTIC_API_KEY (legacy WORKFLOW_VERIFIER_API_KEY accepted), and point COMMERCIAL_LICENSE_API_BASE_URL at your license server; or run npm run build:commercial with COMMERCIAL_LICENSE_API_BASE_URL set. Policy: docs/commercial-enforce-gate-normative.md";
|
|
@@ -30,7 +31,13 @@ export async function runEnforce(args) {
|
|
|
30
31
|
}
|
|
31
32
|
if (!LICENSE_PREFLIGHT_ENABLED) {
|
|
32
33
|
writeCliError(CLI_OPERATIONAL_CODES.ENFORCE_REQUIRES_COMMERCIAL_BUILD, ENFORCE_OSS_GATE_MESSAGE);
|
|
33
|
-
|
|
34
|
+
exitAfterEnforceCliReceipt({
|
|
35
|
+
parsedBatch: null,
|
|
36
|
+
quick: null,
|
|
37
|
+
exitCode: 3,
|
|
38
|
+
operationalCode: CLI_OPERATIONAL_CODES.ENFORCE_REQUIRES_COMMERCIAL_BUILD,
|
|
39
|
+
certificate: null,
|
|
40
|
+
});
|
|
34
41
|
}
|
|
35
42
|
try {
|
|
36
43
|
await runStatefulEnforce(args);
|
|
@@ -38,11 +45,23 @@ export async function runEnforce(args) {
|
|
|
38
45
|
catch (e) {
|
|
39
46
|
if (e instanceof TruthLayerError) {
|
|
40
47
|
writeCliError(e.code, e.message);
|
|
41
|
-
|
|
48
|
+
exitAfterEnforceCliReceipt({
|
|
49
|
+
parsedBatch: null,
|
|
50
|
+
quick: null,
|
|
51
|
+
exitCode: 3,
|
|
52
|
+
operationalCode: e.code,
|
|
53
|
+
certificate: null,
|
|
54
|
+
});
|
|
42
55
|
}
|
|
43
56
|
const msg = e instanceof Error ? e.message : String(e);
|
|
44
57
|
writeCliError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, formatOperationalMessage(msg));
|
|
45
|
-
|
|
58
|
+
exitAfterEnforceCliReceipt({
|
|
59
|
+
parsedBatch: null,
|
|
60
|
+
quick: null,
|
|
61
|
+
exitCode: 3,
|
|
62
|
+
operationalCode: CLI_OPERATIONAL_CODES.INTERNAL_ERROR,
|
|
63
|
+
certificate: null,
|
|
64
|
+
});
|
|
46
65
|
}
|
|
47
66
|
}
|
|
48
67
|
//# sourceMappingURL=enforceCli.js.map
|
package/dist/enforceCli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforceCli.js","sourceRoot":"","sources":["../src/enforceCli.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GACnC,qXAAqX,CAAC;AAExX,SAAS,aAAa,CAAC,IAAY,EAAE,OAAe;IAClD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;;;;;;;;;4CAamC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC/B,aAAa,CAAC,qBAAqB,CAAC,iCAAiC,EAAE,wBAAwB,CAAC,CAAC;QACjG,
|
|
1
|
+
{"version":3,"file":"enforceCli.js","sourceRoot":"","sources":["../src/enforceCli.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GACnC,qXAAqX,CAAC;AAExX,SAAS,aAAa,CAAC,IAAY,EAAE,OAAe;IAClD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;;;;;;;;;4CAamC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC/B,aAAa,CAAC,qBAAqB,CAAC,iCAAiC,EAAE,wBAAwB,CAAC,CAAC;QACjG,0BAA0B,CAAC;YACzB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,qBAAqB,CAAC,iCAAiC;YACxE,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,eAAe,EAAE,CAAC;YACjC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YACjC,0BAA0B,CAAC;gBACzB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,CAAC;gBACX,eAAe,EAAE,CAAC,CAAC,IAAI;gBACvB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,aAAa,CAAC,qBAAqB,CAAC,cAAc,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;QACnF,0BAA0B,CAAC;YACzB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,qBAAqB,CAAC,cAAc;YACrD,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforceStateful.d.ts","sourceRoot":"","sources":["../src/enforceStateful.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enforceStateful.d.ts","sourceRoot":"","sources":["../src/enforceStateful.ts"],"names":[],"mappings":"AAgEA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JtE"}
|
package/dist/enforceStateful.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { CLI_OPERATIONAL_CODES } from "./cliOperationalCodes.js";
|
|
3
2
|
import { parseBatchVerifyCliArgs, parseQuickCliArgs } from "./cliArgv.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { CLI_OPERATIONAL_CODES } from "./cliOperationalCodes.js";
|
|
4
|
+
import { exitAfterEnforceCliReceipt } from "./cliExecutionFinalize.js";
|
|
5
|
+
import { cliErrorEnvelope, formatOperationalMessage } from "./failureCatalog.js";
|
|
6
|
+
import { canonicalCertificateSha256, materialTruthSha256 } from "./governanceEvidence.js";
|
|
7
|
+
import { buildOutcomeCertificateFromQuickReport, buildOutcomeCertificateFromWorkflowResult, } from "./outcomeCertificate.js";
|
|
7
8
|
import { stableStringify } from "./jsonStableStringify.js";
|
|
8
9
|
import { runLicensePreflightIfNeeded } from "./commercial/licensePreflight.js";
|
|
9
|
-
import {
|
|
10
|
-
import { postEnforcementJson } from "./sdk/transport.js";
|
|
11
|
-
import { buildOutcomeCertificateFromQuickReport, buildOutcomeCertificateFromWorkflowResult } from "./outcomeCertificate.js";
|
|
10
|
+
import { verifyWorkflow } from "./pipeline.js";
|
|
12
11
|
import { runQuickVerifyToValidatedReport } from "./quickVerify/runQuickVerify.js";
|
|
13
|
-
import {
|
|
12
|
+
import { postEnforcementJson } from "./sdk/transport.js";
|
|
13
|
+
import { runBatchVerifyToValidatedResult } from "./standardVerifyWorkflowCli.js";
|
|
14
|
+
import { TruthLayerError } from "./truthLayerError.js";
|
|
14
15
|
function parseEnforceMode(args) {
|
|
15
16
|
const hasCreate = args.includes("--create-baseline");
|
|
16
17
|
const hasAccept = args.includes("--accept-drift");
|
|
@@ -27,8 +28,7 @@ function stripEnforceModeArgs(args) {
|
|
|
27
28
|
return args.filter((a) => a !== "--create-baseline" && a !== "--accept-drift");
|
|
28
29
|
}
|
|
29
30
|
function apiKeyOrThrow() {
|
|
30
|
-
const apiKey = process.env.AGENTSKEPTIC_API_KEY?.trim() ||
|
|
31
|
-
process.env.WORKFLOW_VERIFIER_API_KEY?.trim();
|
|
31
|
+
const apiKey = process.env.AGENTSKEPTIC_API_KEY?.trim() || process.env.WORKFLOW_VERIFIER_API_KEY?.trim();
|
|
32
32
|
if (!apiKey) {
|
|
33
33
|
throw new TruthLayerError(CLI_OPERATIONAL_CODES.LICENSE_KEY_MISSING, "Commercial agentskeptic enforce requires AGENTSKEPTIC_API_KEY.");
|
|
34
34
|
}
|
|
@@ -38,96 +38,149 @@ async function postEnforcementState(path, payload) {
|
|
|
38
38
|
const apiKey = apiKeyOrThrow();
|
|
39
39
|
return postEnforcementJson({ path, payload, apiKey });
|
|
40
40
|
}
|
|
41
|
+
function writeOperationalErr(code, message) {
|
|
42
|
+
console.error(cliErrorEnvelope(code, formatOperationalMessage(message)));
|
|
43
|
+
}
|
|
41
44
|
export async function runStatefulEnforce(args) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
45
|
+
let parsedBatch = null;
|
|
46
|
+
let pq = null;
|
|
47
|
+
let certificate = null;
|
|
48
|
+
try {
|
|
49
|
+
const mode = parseEnforceMode(args);
|
|
50
|
+
const stripped = stripEnforceModeArgs(args);
|
|
51
|
+
const isQuick = stripped.includes("--input") ||
|
|
52
|
+
stripped.includes("--export-registry") ||
|
|
53
|
+
stripped.includes("--emit-events");
|
|
54
|
+
const runId = process.env.AGENTSKEPTIC_RUN_ID?.trim() ||
|
|
55
|
+
process.env.WORKFLOW_VERIFIER_RUN_ID?.trim() ||
|
|
56
|
+
randomUUID();
|
|
57
|
+
await runLicensePreflightIfNeeded("enforce", { runId, xRequestId: randomUUID() });
|
|
58
|
+
let terminalStatus;
|
|
59
|
+
let workflowId;
|
|
60
|
+
if (isQuick) {
|
|
61
|
+
const q = parseQuickCliArgs(stripped);
|
|
62
|
+
pq = q;
|
|
63
|
+
const out = await runQuickVerifyToValidatedReport({
|
|
64
|
+
inputUtf8: q.inputPath === "-"
|
|
65
|
+
? await new Promise((resolve, reject) => {
|
|
66
|
+
let s = "";
|
|
67
|
+
process.stdin.setEncoding("utf8");
|
|
68
|
+
process.stdin.on("data", (d) => {
|
|
69
|
+
s += d;
|
|
70
|
+
});
|
|
71
|
+
process.stdin.on("end", () => resolve(s));
|
|
72
|
+
process.stdin.on("error", reject);
|
|
73
|
+
})
|
|
74
|
+
: await import("node:fs/promises").then((m) => m.readFile(q.inputPath, "utf8")),
|
|
75
|
+
postgresUrl: q.postgresUrl ?? undefined,
|
|
76
|
+
sqlitePath: q.dbPath ?? undefined,
|
|
77
|
+
});
|
|
78
|
+
workflowId = q.workflowIdQuick;
|
|
79
|
+
certificate = buildOutcomeCertificateFromQuickReport({
|
|
80
|
+
report: out.report,
|
|
81
|
+
workflowId: q.workflowIdQuick,
|
|
82
|
+
humanReportOptions: {
|
|
83
|
+
workflowId: q.workflowIdQuick,
|
|
84
|
+
eventsPath: q.emitEventsPath ?? undefined,
|
|
85
|
+
registryPath: q.exportPath,
|
|
86
|
+
dbFlag: q.dbPath ?? undefined,
|
|
87
|
+
postgresUrl: q.postgresUrl !== undefined,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
terminalStatus =
|
|
91
|
+
out.report.verdict === "pass" ? "complete"
|
|
92
|
+
: out.report.verdict === "fail" ? "inconsistent"
|
|
93
|
+
: "incomplete";
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const parsed = parseBatchVerifyCliArgs(stripped);
|
|
97
|
+
parsedBatch = parsed;
|
|
98
|
+
const wf = await runBatchVerifyToValidatedResult(() => verifyWorkflow({
|
|
99
|
+
workflowId: parsed.workflowId,
|
|
100
|
+
eventsPath: parsed.eventsPath,
|
|
101
|
+
registryPath: parsed.registryPath,
|
|
102
|
+
database: parsed.database,
|
|
103
|
+
verificationPolicy: parsed.verificationPolicy,
|
|
104
|
+
truthReport: parsed.noHumanReport ? () => { } : (report) => process.stderr.write(`${report}\n`),
|
|
105
|
+
}));
|
|
106
|
+
workflowId = parsed.workflowId;
|
|
107
|
+
certificate = buildOutcomeCertificateFromWorkflowResult(wf, "contract_sql");
|
|
108
|
+
terminalStatus =
|
|
109
|
+
wf.status === "complete" ? "complete"
|
|
110
|
+
: wf.status === "inconsistent" ? "inconsistent"
|
|
111
|
+
: "incomplete";
|
|
112
|
+
}
|
|
113
|
+
const payload = {
|
|
114
|
+
schema_version: 2,
|
|
115
|
+
run_id: runId,
|
|
116
|
+
workflow_id: workflowId,
|
|
117
|
+
outcome_certificate_v1: certificate,
|
|
118
|
+
material_truth_sha256: materialTruthSha256(certificate),
|
|
119
|
+
certificate_sha256: canonicalCertificateSha256(certificate),
|
|
120
|
+
};
|
|
121
|
+
const route = mode === "create-baseline" ? "/api/v1/enforcement/baselines"
|
|
122
|
+
: mode === "accept-drift" ? "/api/v1/enforcement/accept"
|
|
123
|
+
: "/api/v1/enforcement/check";
|
|
124
|
+
const stateRes = await postEnforcementState(route, payload);
|
|
125
|
+
if (!stateRes.ok) {
|
|
126
|
+
const detail = typeof stateRes.body === "object" && stateRes.body !== null && "detail" in stateRes.body
|
|
127
|
+
? String(stateRes.body.detail ?? `HTTP ${stateRes.status}`)
|
|
128
|
+
: `HTTP ${stateRes.status}`;
|
|
129
|
+
throw new TruthLayerError(CLI_OPERATIONAL_CODES.LICENSE_DENIED, `${detail}${stateRes.requestId ? ` [x-request-id=${stateRes.requestId}]` : ""}`);
|
|
130
|
+
}
|
|
131
|
+
const status = typeof stateRes.body === "object" && stateRes.body !== null && "status" in stateRes.body
|
|
132
|
+
? String(stateRes.body.status ?? "ok")
|
|
133
|
+
: "ok";
|
|
134
|
+
process.stdout.write(`${stableStringify({ schemaVersion: 1, enforce: stateRes.body })}\n`);
|
|
135
|
+
if (status === "drift") {
|
|
136
|
+
console.error(cliErrorEnvelope(CLI_OPERATIONAL_CODES.VERIFICATION_OUTPUT_LOCK_MISMATCH, "Drift detected."));
|
|
137
|
+
exitAfterEnforceCliReceipt({
|
|
138
|
+
parsedBatch,
|
|
139
|
+
quick: pq,
|
|
140
|
+
exitCode: 4,
|
|
141
|
+
operationalCode: null,
|
|
142
|
+
certificate,
|
|
143
|
+
enforceExitKindDrift: true,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (terminalStatus === "complete") {
|
|
147
|
+
exitAfterEnforceCliReceipt({
|
|
148
|
+
parsedBatch,
|
|
149
|
+
quick: pq,
|
|
150
|
+
exitCode: 0,
|
|
151
|
+
operationalCode: null,
|
|
152
|
+
certificate,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (terminalStatus === "inconsistent") {
|
|
156
|
+
exitAfterEnforceCliReceipt({
|
|
157
|
+
parsedBatch,
|
|
158
|
+
quick: pq,
|
|
159
|
+
exitCode: 1,
|
|
160
|
+
operationalCode: null,
|
|
161
|
+
certificate,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
exitAfterEnforceCliReceipt({
|
|
165
|
+
parsedBatch,
|
|
166
|
+
quick: pq,
|
|
167
|
+
exitCode: 2,
|
|
168
|
+
operationalCode: null,
|
|
169
|
+
certificate,
|
|
78
170
|
});
|
|
79
|
-
terminalStatus =
|
|
80
|
-
out.report.verdict === "pass" ? "complete"
|
|
81
|
-
: out.report.verdict === "fail" ? "inconsistent"
|
|
82
|
-
: "incomplete";
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
const parsed = parseBatchVerifyCliArgs(stripped);
|
|
86
|
-
const wf = await runBatchVerifyToValidatedResult(() => verifyWorkflow({
|
|
87
|
-
workflowId: parsed.workflowId,
|
|
88
|
-
eventsPath: parsed.eventsPath,
|
|
89
|
-
registryPath: parsed.registryPath,
|
|
90
|
-
database: parsed.database,
|
|
91
|
-
verificationPolicy: parsed.verificationPolicy,
|
|
92
|
-
truthReport: parsed.noHumanReport ? () => { } : (report) => process.stderr.write(`${report}\n`),
|
|
93
|
-
}));
|
|
94
|
-
workflowId = parsed.workflowId;
|
|
95
|
-
certificate = buildOutcomeCertificateFromWorkflowResult(wf, "contract_sql");
|
|
96
|
-
terminalStatus =
|
|
97
|
-
wf.status === "complete" ? "complete"
|
|
98
|
-
: wf.status === "inconsistent" ? "inconsistent"
|
|
99
|
-
: "incomplete";
|
|
100
|
-
}
|
|
101
|
-
const payload = {
|
|
102
|
-
schema_version: 2,
|
|
103
|
-
run_id: runId,
|
|
104
|
-
workflow_id: workflowId,
|
|
105
|
-
outcome_certificate_v1: certificate,
|
|
106
|
-
material_truth_sha256: materialTruthSha256(certificate),
|
|
107
|
-
certificate_sha256: canonicalCertificateSha256(certificate),
|
|
108
|
-
};
|
|
109
|
-
const route = mode === "create-baseline" ? "/api/v1/enforcement/baselines"
|
|
110
|
-
: mode === "accept-drift" ? "/api/v1/enforcement/accept"
|
|
111
|
-
: "/api/v1/enforcement/check";
|
|
112
|
-
const stateRes = await postEnforcementState(route, payload);
|
|
113
|
-
if (!stateRes.ok) {
|
|
114
|
-
const detail = typeof stateRes.body === "object" && stateRes.body !== null && "detail" in stateRes.body
|
|
115
|
-
? String(stateRes.body.detail ?? `HTTP ${stateRes.status}`)
|
|
116
|
-
: `HTTP ${stateRes.status}`;
|
|
117
|
-
throw new TruthLayerError(CLI_OPERATIONAL_CODES.LICENSE_DENIED, `${detail}${stateRes.requestId ? ` [x-request-id=${stateRes.requestId}]` : ""}`);
|
|
118
171
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
172
|
+
catch (e) {
|
|
173
|
+
if (e instanceof TruthLayerError) {
|
|
174
|
+
writeOperationalErr(e.code, e.message);
|
|
175
|
+
exitAfterEnforceCliReceipt({
|
|
176
|
+
parsedBatch,
|
|
177
|
+
quick: pq,
|
|
178
|
+
exitCode: 3,
|
|
179
|
+
operationalCode: e.code,
|
|
180
|
+
certificate,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
throw e;
|
|
126
184
|
}
|
|
127
|
-
if (terminalStatus === "complete")
|
|
128
|
-
process.exit(0);
|
|
129
|
-
if (terminalStatus === "inconsistent")
|
|
130
|
-
process.exit(1);
|
|
131
|
-
process.exit(2);
|
|
132
185
|
}
|
|
133
186
|
//# sourceMappingURL=enforceStateful.js.map
|