@yiaany/ghostapi 0.1.6 → 0.1.8
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 +48 -2
- package/CONTRIBUTING.md +119 -117
- package/LICENSE +21 -21
- package/README.md +208 -185
- package/SECURITY.md +53 -37
- package/dist/actions/gateway.d.ts +179 -0
- package/dist/actions/gateway.js +514 -0
- package/dist/actions/gateway.js.map +1 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.js +2 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/ai/aiClient.js +4 -4
- package/dist/ai/aiClient.js.map +1 -1
- package/dist/ai/aiGenerator.d.ts +2 -2
- package/dist/ai/aiGenerator.js +21 -72
- package/dist/ai/aiGenerator.js.map +1 -1
- package/dist/ai/prompts.js +51 -51
- package/dist/ai/prompts.js.map +1 -1
- package/dist/approvals/approvalInbox.d.ts +150 -0
- package/dist/approvals/approvalInbox.js +412 -0
- package/dist/approvals/approvalInbox.js.map +1 -0
- package/dist/approvals/index.d.ts +2 -0
- package/dist/approvals/index.js +2 -0
- package/dist/approvals/index.js.map +1 -0
- package/dist/behavior/behaviorStore.d.ts +2 -0
- package/dist/behavior/behaviorStore.js +50 -46
- package/dist/behavior/behaviorStore.js.map +1 -1
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +58 -14
- package/dist/cache/index.js.map +1 -1
- package/dist/cli/index.js +438 -58
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/openUrl.d.ts +10 -0
- package/dist/cli/openUrl.js +31 -0
- package/dist/cli/openUrl.js.map +1 -0
- package/dist/cli/parser.d.ts +155 -0
- package/dist/cli/parser.js +504 -2
- package/dist/cli/parser.js.map +1 -1
- package/dist/config/dataPaths.d.ts +31 -0
- package/dist/config/dataPaths.js +45 -0
- package/dist/config/dataPaths.js.map +1 -0
- package/dist/config/localConfig.d.ts +1 -2
- package/dist/config/localConfig.js +27 -21
- package/dist/config/localConfig.js.map +1 -1
- package/dist/config/serverConfig.d.ts +2 -0
- package/dist/config/serverConfig.js +8 -1
- package/dist/config/serverConfig.js.map +1 -1
- package/dist/contracts/contract.d.ts +76 -0
- package/dist/contracts/contract.js +603 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/credentials/credentialBroker.d.ts +207 -0
- package/dist/credentials/credentialBroker.js +588 -0
- package/dist/credentials/credentialBroker.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/dashboard/app.js +685 -615
- package/dist/dashboard/index.html +13 -7
- package/dist/dashboard/styles.css +349 -349
- package/dist/egress/capabilities.d.ts +32 -0
- package/dist/egress/capabilities.js +165 -0
- package/dist/egress/capabilities.js.map +1 -0
- package/dist/egress/linuxBootstrap.d.ts +1 -0
- package/dist/egress/linuxBootstrap.js +121 -0
- package/dist/egress/linuxBootstrap.js.map +1 -0
- package/dist/egress/run.d.ts +18 -0
- package/dist/egress/run.js +305 -0
- package/dist/egress/run.js.map +1 -0
- package/dist/errors/errorEngine.d.ts +2 -2
- package/dist/errors/errorEngine.js +3 -40
- package/dist/errors/errorEngine.js.map +1 -1
- package/dist/evals/evals.d.ts +126 -0
- package/dist/evals/evals.js +466 -0
- package/dist/evals/evals.js.map +1 -0
- package/dist/evals/index.d.ts +2 -0
- package/dist/evals/index.js +2 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evidence/index.d.ts +2 -0
- package/dist/evidence/index.js +2 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/report.d.ts +143 -0
- package/dist/evidence/report.js +556 -0
- package/dist/evidence/report.js.map +1 -0
- package/dist/fault/faultLab.d.ts +5 -4
- package/dist/fault/faultLab.js +66 -24
- package/dist/fault/faultLab.js.map +1 -1
- package/dist/index.d.ts +46 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/dist/inventory/analysis.d.ts +12 -0
- package/dist/inventory/analysis.js +457 -0
- package/dist/inventory/analysis.js.map +1 -0
- package/dist/inventory/index.d.ts +5 -0
- package/dist/inventory/index.js +4 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory/inventoryController.d.ts +53 -0
- package/dist/inventory/inventoryController.js +1044 -0
- package/dist/inventory/inventoryController.js.map +1 -0
- package/dist/inventory/types.d.ts +579 -0
- package/dist/inventory/types.js +787 -0
- package/dist/inventory/types.js.map +1 -0
- package/dist/landing/assets/index-CxWsopzP.css +1 -0
- package/dist/landing/assets/index-DZlpyhqd.js +55 -0
- package/dist/landing/assets/index-Dk-Xezs3.js +55 -0
- package/dist/landing/index.html +15 -15
- package/dist/ledger/actionLedger.d.ts +125 -0
- package/dist/ledger/actionLedger.js +594 -0
- package/dist/ledger/actionLedger.js.map +1 -0
- package/dist/ledger/index.d.ts +2 -0
- package/dist/ledger/index.js +2 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/mcp/server.js +4 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy.d.ts +14 -0
- package/dist/policy/policy.js +282 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/policy/types.d.ts +52 -0
- package/dist/policy/types.js +2 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/productTelemetry/index.d.ts +16 -0
- package/dist/productTelemetry/index.js +142 -0
- package/dist/productTelemetry/index.js.map +1 -0
- package/dist/providers/conformance.d.ts +7 -0
- package/dist/providers/conformance.js +48 -0
- package/dist/providers/conformance.js.map +1 -0
- package/dist/providers/index.d.ts +4 -2
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/packs/resendPack.d.ts +2 -0
- package/dist/providers/packs/resendPack.js +147 -0
- package/dist/providers/packs/resendPack.js.map +1 -0
- package/dist/providers/packs/stripePack.d.ts +2 -0
- package/dist/providers/packs/stripePack.js +852 -0
- package/dist/providers/packs/stripePack.js.map +1 -0
- package/dist/providers/registry.d.ts +7 -3
- package/dist/providers/registry.js +55 -4
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/resend.js +2 -11
- package/dist/providers/resend.js.map +1 -1
- package/dist/providers/runtime.d.ts +8 -0
- package/dist/providers/runtime.js +48 -0
- package/dist/providers/runtime.js.map +1 -0
- package/dist/providers/stripeWebhook.d.ts +13 -0
- package/dist/providers/stripeWebhook.js +50 -0
- package/dist/providers/stripeWebhook.js.map +1 -0
- package/dist/providers/types.d.ts +153 -0
- package/dist/proxy/cacheKey.js +3 -3
- package/dist/proxy/cacheKey.js.map +1 -1
- package/dist/proxy/providerDetector.d.ts +2 -7
- package/dist/proxy/providerDetector.js +4 -4
- package/dist/proxy/providerDetector.js.map +1 -1
- package/dist/proxy/proxyHandler.js +116 -12
- package/dist/proxy/proxyHandler.js.map +1 -1
- package/dist/proxy/requestNormalizer.d.ts +0 -1
- package/dist/proxy/requestNormalizer.js +2 -5
- package/dist/proxy/requestNormalizer.js.map +1 -1
- package/dist/reliability/costGovernance.d.ts +175 -0
- package/dist/reliability/costGovernance.js +515 -0
- package/dist/reliability/costGovernance.js.map +1 -0
- package/dist/reliability/index.d.ts +8 -0
- package/dist/reliability/index.js +5 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/reconciliation.d.ts +157 -0
- package/dist/reliability/reconciliation.js +522 -0
- package/dist/reliability/reconciliation.js.map +1 -0
- package/dist/reliability/runtimeHealth.d.ts +60 -0
- package/dist/reliability/runtimeHealth.js +356 -0
- package/dist/reliability/runtimeHealth.js.map +1 -0
- package/dist/reliability/slo.d.ts +131 -0
- package/dist/reliability/slo.js +375 -0
- package/dist/reliability/slo.js.map +1 -0
- package/dist/report/safetyReport.js +7 -3
- package/dist/report/safetyReport.js.map +1 -1
- package/dist/safety/index.d.ts +2 -0
- package/dist/safety/index.js +2 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/safetyController.d.ts +187 -0
- package/dist/safety/safetyController.js +477 -0
- package/dist/safety/safetyController.js.map +1 -0
- package/dist/scenarios/scenarioBundle.d.ts +75 -0
- package/dist/scenarios/scenarioBundle.js +750 -0
- package/dist/scenarios/scenarioBundle.js.map +1 -0
- package/dist/scenarios/scenarioStore.d.ts +1 -0
- package/dist/scenarios/scenarioStore.js +47 -32
- package/dist/scenarios/scenarioStore.js.map +1 -1
- package/dist/security/headerSanitizer.d.ts +2 -0
- package/dist/security/headerSanitizer.js +36 -1
- package/dist/security/headerSanitizer.js.map +1 -1
- package/dist/security/secrets.js +24 -4
- package/dist/security/secrets.js.map +1 -1
- package/dist/server/accessControl.d.ts +5 -0
- package/dist/server/accessControl.js +100 -0
- package/dist/server/accessControl.js.map +1 -0
- package/dist/server/createServer.d.ts +0 -5
- package/dist/server/createServer.js +9 -29
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/eventsStore.d.ts +6 -1
- package/dist/server/eventsStore.js +83 -15
- package/dist/server/eventsStore.js.map +1 -1
- package/dist/server/routes.js +36 -10
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sse.d.ts +2 -1
- package/dist/server/sse.js +15 -3
- package/dist/server/sse.js.map +1 -1
- package/dist/setup/setupGenerator.js +53 -6
- package/dist/setup/setupGenerator.js.map +1 -1
- package/dist/state/stateStore.d.ts +5 -0
- package/dist/state/stateStore.js +48 -62
- package/dist/state/stateStore.js.map +1 -1
- package/dist/storage/fileStore.d.ts +10 -0
- package/dist/storage/fileStore.js +131 -0
- package/dist/storage/fileStore.js.map +1 -0
- package/dist/teamControl/controlPlane.d.ts +255 -0
- package/dist/teamControl/controlPlane.js +918 -0
- package/dist/teamControl/controlPlane.js.map +1 -0
- package/dist/teamControl/deployment.d.ts +33 -0
- package/dist/teamControl/deployment.js +67 -0
- package/dist/teamControl/deployment.js.map +1 -0
- package/dist/teamControl/index.d.ts +4 -0
- package/dist/teamControl/index.js +3 -0
- package/dist/teamControl/index.js.map +1 -0
- package/dist/tests/testGenerator.js +4 -1
- package/dist/tests/testGenerator.js.map +1 -1
- package/dist/trust/index.d.ts +2 -0
- package/dist/trust/index.js +2 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/trustLadder.d.ts +182 -0
- package/dist/trust/trustLadder.js +560 -0
- package/dist/trust/trustLadder.js.map +1 -0
- package/dist/worlds/index.d.ts +2 -0
- package/dist/worlds/index.js +2 -0
- package/dist/worlds/index.js.map +1 -0
- package/dist/worlds/worlds.d.ts +160 -0
- package/dist/worlds/worlds.js +491 -0
- package/dist/worlds/worlds.js.map +1 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/ci.md +49 -0
- package/docs/commercial/README.md +29 -0
- package/docs/commercial/data-inventory.md +36 -0
- package/docs/commercial/manual-invoicing.md +44 -0
- package/docs/commercial/metrics.md +51 -0
- package/docs/commercial/pricing.md +103 -0
- package/docs/commercial/privacy-policy-draft.md +41 -0
- package/docs/commercial/terms-topics-for-counsel.md +51 -0
- package/docs/design-partners/README.md +52 -0
- package/docs/design-partners/demo-narratives.md +33 -0
- package/docs/design-partners/design-partner-offer.md +39 -0
- package/docs/design-partners/discovery-questions.md +28 -0
- package/docs/design-partners/feedback-capture-template.md +48 -0
- package/docs/design-partners/icp-one-pager.md +43 -0
- package/docs/design-partners/onboarding-checklist.md +33 -0
- package/docs/design-partners/pilot-success-criteria.md +27 -0
- package/docs/design-partners/pricing-interview-script.md +18 -0
- package/docs/design-partners/telemetry-plan.md +48 -0
- package/docs/development/baseline.md +114 -0
- package/docs/development/onboarding-smoke.md +37 -0
- package/docs/development/verification-0.1.8.md +25 -0
- package/docs/enterprise-product-roadmap-ru.md +1879 -0
- package/docs/fundraising/README.md +87 -0
- package/docs/fundraising/data-room-checklist.md +72 -0
- package/docs/fundraising/demo-script.md +52 -0
- package/docs/fundraising/design-partners-50.md +74 -0
- package/docs/fundraising/launch-posts.md +37 -0
- package/docs/fundraising/metrics-and-evidence.md +30 -0
- package/docs/fundraising/roadmap-12-month.md +25 -0
- package/docs/fundraising/technical-due-diligence-index.md +37 -0
- package/docs/fundraising/yc-application.md +25 -0
- package/docs/github-actions.md +84 -0
- package/docs/hosted-pilot.md +111 -0
- package/docs/mcp.md +52 -50
- package/docs/operations/disaster-recovery-runbook.md +81 -0
- package/docs/operations/kill-switch-runbook.md +32 -0
- package/docs/policy.md +61 -0
- package/docs/providers/authoring-packs.md +175 -0
- package/docs/providers/stripe-core-pack.md +82 -0
- package/docs/release-checklist.md +83 -71
- package/docs/release-migration-and-rollback.md +63 -0
- package/docs/release-readiness.md +39 -0
- package/docs/security/action-gateway-threat-model.md +34 -0
- package/docs/security/action-ledger-incident-replay-threat-model.md +42 -0
- package/docs/security/approval-inbox-threat-model.md +35 -0
- package/docs/security/credential-broker-threat-model.md +52 -0
- package/docs/security/egress-threat-model.md +126 -0
- package/docs/security/inventory-threat-model.md +104 -0
- package/docs/security/kill-switch-budgets-threat-model.md +37 -0
- package/docs/security/reliability-threat-model.md +111 -0
- package/docs/security/trust-ladder-threat-model.md +33 -0
- package/docs/team-control-plane.md +72 -0
- package/docs/usage.md +571 -57
- package/examples/README.md +10 -0
- package/examples/agent-instructions/README.md +39 -39
- package/examples/ci-smoke/README.md +21 -0
- package/examples/ci-smoke/ghostapi.policy.yaml +22 -0
- package/examples/ci-smoke/package.json +9 -0
- package/examples/ci-smoke/production-egress.mjs +2 -0
- package/examples/ci-smoke/safe.mjs +17 -0
- package/examples/evals/README.md +24 -0
- package/examples/evals/retry-after.eval.json +52 -0
- package/examples/generic-rest/README.md +27 -27
- package/examples/github-fetch/README.md +35 -35
- package/examples/openai-streaming/README.md +16 -0
- package/examples/openai-streaming/streaming-tool-call.mjs +31 -0
- package/examples/policy/ghostapi.policy.yaml +27 -0
- package/examples/record-replay/README.md +19 -0
- package/examples/record-replay/replay-requests.json +22 -0
- package/examples/record-replay/stripe-checkout.har.json +30 -0
- package/examples/resend-node/README.md +22 -22
- package/examples/stripe-node/README.md +35 -29
- package/examples/stripe-node/checkout-flow.mjs +61 -0
- package/examples/twilio-node/README.md +21 -21
- package/examples/worlds/README.md +19 -0
- package/examples/worlds/subscription-recovery.mjs +12 -0
- package/package.json +26 -11
- package/dist/providers/stripe.d.ts +0 -2
- package/dist/providers/stripe.js +0 -15
- package/dist/providers/stripe.js.map +0 -1
- package/docs/assets/ghostapi-avatar.png +0 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { lstat, mkdir, readFile, readdir, rm } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { getDataPaths } from "../config/dataPaths.js";
|
|
6
|
+
import { detectEgressCapabilities } from "../egress/capabilities.js";
|
|
7
|
+
import { evaluatePolicy, loadPolicyFile } from "../policy/index.js";
|
|
8
|
+
import { sanitizeSecrets, sanitizeSecretString, isSecretFieldName } from "../security/secrets.js";
|
|
9
|
+
import { atomicWriteJson, ensurePrivateDirectory } from "../storage/fileStore.js";
|
|
10
|
+
import { diffContracts, loadContract } from "../contracts/index.js";
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const packageJson = require("../../package.json");
|
|
13
|
+
const MAX_EVENTS_FOR_REPORT = 1_000;
|
|
14
|
+
const MAX_JSONL_BYTES = 8 * 1024 * 1024;
|
|
15
|
+
const MAX_REPORT_BYTES = 512 * 1024;
|
|
16
|
+
const MAX_RUN_EVIDENCE_BYTES = 128 * 1024;
|
|
17
|
+
const MAX_REPORTS_RETAINED = 20;
|
|
18
|
+
const MAX_ATTEMPTS = 500;
|
|
19
|
+
const SENSITIVE_QUERY_KEYS = new Set(["api_key", "apikey", "access_token", "refresh_token", "token", "secret", "key", "client_secret", "password", "authorization", "cookie"]);
|
|
20
|
+
export class EvidenceReportError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "EvidenceReportError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function generateEvidenceReport(options = {}) {
|
|
27
|
+
const projectRoot = await realProjectRoot(options.projectRoot ?? process.cwd());
|
|
28
|
+
const run = await readRunEvidence(options.runPath, projectRoot);
|
|
29
|
+
const loadedPolicy = await loadPolicyFile(options.policyPath, projectRoot, options.policyPath !== undefined);
|
|
30
|
+
const events = await readPersistedEvents(run?.path);
|
|
31
|
+
const contractDiff = await loadContractDiff(options.contractBaselinePath, options.contractCandidatePath, projectRoot);
|
|
32
|
+
const report = buildEvidenceReport({
|
|
33
|
+
events,
|
|
34
|
+
policy: loadedPolicy?.policy,
|
|
35
|
+
policyHash: loadedPolicy?.hash ?? readString(run?.evidence.policy?.policyHash),
|
|
36
|
+
requiredScenarios: loadedPolicy?.policy.requiredScenarios ?? readStringArray(run?.evidence.policy?.requiredScenarios),
|
|
37
|
+
runEvidence: run?.evidence ?? null,
|
|
38
|
+
contractDiff,
|
|
39
|
+
generatedAt: options.generatedAt ?? new Date().toISOString(),
|
|
40
|
+
ghostApiVersion: options.ghostApiVersion ?? readPackageVersion()
|
|
41
|
+
});
|
|
42
|
+
const path = await writeEvidenceReport(report, projectRoot, options.outPath);
|
|
43
|
+
return { report, path };
|
|
44
|
+
}
|
|
45
|
+
export function buildEvidenceReport(input) {
|
|
46
|
+
const sanitizedEvents = input.events.slice(0, MAX_EVENTS_FOR_REPORT).map((event) => sanitizeEvent(event));
|
|
47
|
+
const capability = detectEgressCapabilities();
|
|
48
|
+
const runEvents = Array.isArray(input.runEvidence?.events) ? input.runEvidence.events : [];
|
|
49
|
+
const runStatus = readRunStatus(input.runEvidence?.status);
|
|
50
|
+
const runUsedNamespace = input.runEvidence?.backend === "linux-network-namespace" && runStatus === "finished";
|
|
51
|
+
const completedScenarios = detectScenarios(sanitizedEvents);
|
|
52
|
+
const requiredScenarios = uniqueSorted(input.requiredScenarios ?? []);
|
|
53
|
+
const providers = uniqueSorted(sanitizedEvents.map((event) => event.provider).filter(Boolean));
|
|
54
|
+
const secretCategories = new Set();
|
|
55
|
+
let secretMatches = 0;
|
|
56
|
+
for (const event of input.events) {
|
|
57
|
+
const result = detectSecretCategories(event);
|
|
58
|
+
for (const category of result.categories)
|
|
59
|
+
secretCategories.add(category);
|
|
60
|
+
secretMatches += result.matches;
|
|
61
|
+
}
|
|
62
|
+
const runOutputSecretMatches = readNonNegativeInteger(input.runEvidence?.output?.secretMatches) ?? 0;
|
|
63
|
+
secretMatches += runOutputSecretMatches;
|
|
64
|
+
const allowedAttempts = sanitizedEvents.map((event) => ({
|
|
65
|
+
provider: limitText(event.provider),
|
|
66
|
+
method: limitText(event.method),
|
|
67
|
+
path: sanitizePath(event.path),
|
|
68
|
+
statusCode: event.statusCode,
|
|
69
|
+
source: limitText(event.source)
|
|
70
|
+
})).slice(0, MAX_ATTEMPTS);
|
|
71
|
+
const failures = allowedAttempts.filter((attempt) => attempt.statusCode >= 400).map((attempt) => ({ provider: attempt.provider, method: attempt.method, path: attempt.path, statusCode: attempt.statusCode }));
|
|
72
|
+
const retryCount = sanitizedEvents.filter((event) => event.statusCode === 429 || hasRetryAfter(event)).length;
|
|
73
|
+
const productionAttempts = 0;
|
|
74
|
+
const contractDrift = input.contractDiff === undefined
|
|
75
|
+
? { breaking: 0, nonBreaking: 0, uncertain: 0 }
|
|
76
|
+
: { baselineHash: input.contractDiff.baselineHash, candidateHash: input.contractDiff.candidateHash, ...input.contractDiff.summary };
|
|
77
|
+
const findings = [];
|
|
78
|
+
const warnings = [];
|
|
79
|
+
if (sanitizedEvents.length < input.events.length)
|
|
80
|
+
warnings.push(`Event evidence was truncated to ${MAX_EVENTS_FOR_REPORT} events.`);
|
|
81
|
+
if (input.runEvidence === null)
|
|
82
|
+
warnings.push("Run evidence is missing; report cannot prove launcher lifecycle or blocked kernel egress attempts.");
|
|
83
|
+
if (readBoolean(input.runEvidence?.output?.timedOut))
|
|
84
|
+
warnings.push("Target exceeded the configured run timeout.");
|
|
85
|
+
if (readBoolean(input.runEvidence?.output?.limitExceeded))
|
|
86
|
+
warnings.push("Target exceeded the configured output limit.");
|
|
87
|
+
if (runUsedNamespace)
|
|
88
|
+
findings.push({ id: "enforcement.isolated", severity: "pass", message: "Run evidence reports a completed Linux namespace boundary." });
|
|
89
|
+
else
|
|
90
|
+
findings.push({ id: "enforcement.degraded", severity: "warning", message: "Egress enforcement is degraded or unavailable on this host." });
|
|
91
|
+
if (input.runEvidence?.status === "finished")
|
|
92
|
+
findings.push({ id: "run.finished", severity: "pass", message: "Run evidence reached finished status." });
|
|
93
|
+
else
|
|
94
|
+
findings.push({ id: "run.incomplete", severity: "warning", message: "Run evidence is absent or incomplete." });
|
|
95
|
+
for (const scenarioId of requiredScenarios) {
|
|
96
|
+
const decision = input.policy === undefined ? { allowed: completedScenarios.includes(scenarioId) } : evaluatePolicy(input.policy, { type: "scenario", scenarioId, completedScenarioIds: completedScenarios });
|
|
97
|
+
findings.push(decision.allowed
|
|
98
|
+
? { id: `scenario.${scenarioId}`, severity: "pass", message: `Required scenario completed: ${scenarioId}` }
|
|
99
|
+
: { id: `scenario.${scenarioId}`, severity: "fail", message: `Required scenario missing: ${scenarioId}` });
|
|
100
|
+
}
|
|
101
|
+
const reportDecision = input.policy === undefined ? { allowed: productionAttempts === 0 && secretMatches === 0 && contractDrift.breaking === 0 } : evaluatePolicy(input.policy, { type: "report", productionEgressAttempts: productionAttempts, forbiddenCredentialMatches: secretMatches, breakingContractChanges: contractDrift.breaking });
|
|
102
|
+
findings.push(reportDecision.allowed
|
|
103
|
+
? { id: "policy.report-thresholds", severity: "pass", message: "Policy report thresholds are satisfied." }
|
|
104
|
+
: { id: "policy.report-thresholds", severity: "fail", message: "Policy report thresholds are exceeded." });
|
|
105
|
+
if (secretMatches > 0)
|
|
106
|
+
findings.push({ id: "secrets.detected", severity: "fail", message: "Secret-shaped values were detected and summarized without raw values.", count: secretMatches });
|
|
107
|
+
if (input.contractDiff !== undefined) {
|
|
108
|
+
if (contractDrift.breaking > 0)
|
|
109
|
+
findings.push({ id: "contract-drift.breaking", severity: "fail", message: "Breaking contract drift was detected.", count: contractDrift.breaking });
|
|
110
|
+
if (contractDrift.uncertain > 0)
|
|
111
|
+
findings.push({ id: "contract-drift.uncertain", severity: "warning", message: "Contract changes need compatibility review because client tolerance is unknown.", count: contractDrift.uncertain });
|
|
112
|
+
}
|
|
113
|
+
if (failures.length > 0)
|
|
114
|
+
findings.push({ id: "provider.failures", severity: "warning", message: "Provider failures were observed.", count: failures.length });
|
|
115
|
+
const reportWithoutHash = {
|
|
116
|
+
schemaVersion: 1,
|
|
117
|
+
artifact: { generatedAt: input.generatedAt, logicalHash: "", canonicalization: "json-stable-sorted-keys-v1" },
|
|
118
|
+
run: {
|
|
119
|
+
id: readString(input.runEvidence?.runId) ?? "unknown",
|
|
120
|
+
status: runStatus,
|
|
121
|
+
startedAt: firstTimestamp(runEvents),
|
|
122
|
+
finishedAt: lastTimestamp(runEvents),
|
|
123
|
+
exitCode: lastExitCode(runEvents)
|
|
124
|
+
},
|
|
125
|
+
ghostapi: { version: input.ghostApiVersion ?? "unknown" },
|
|
126
|
+
enforcement: {
|
|
127
|
+
capability: capability.summary,
|
|
128
|
+
mode: input.runEvidence?.backend === "linux-network-namespace" ? "linux-network-namespace" : "proxy-guidance",
|
|
129
|
+
isolated: runUsedNamespace,
|
|
130
|
+
degraded: !runUsedNamespace
|
|
131
|
+
},
|
|
132
|
+
policy: { hash: input.policyHash, requiredScenarios },
|
|
133
|
+
coverage: { providers, scenarios: completedScenarios },
|
|
134
|
+
contractDrift,
|
|
135
|
+
egress: { allowedAttempts, blockedAttempts: [], productionAttempts },
|
|
136
|
+
secrets: { categories: [...secretCategories].sort(), matches: secretMatches },
|
|
137
|
+
retriesAndFailures: { retryCount, failureCount: failures.length, failures: failures.slice(0, MAX_ATTEMPTS) },
|
|
138
|
+
findings: findings.sort((left, right) => left.id.localeCompare(right.id)),
|
|
139
|
+
warnings: warnings.map(limitText).sort(),
|
|
140
|
+
summary: { passed: false, failCount: 0, warningCount: 0 }
|
|
141
|
+
};
|
|
142
|
+
const failCount = reportWithoutHash.findings.filter((finding) => finding.severity === "fail").length;
|
|
143
|
+
const warningCount = reportWithoutHash.findings.filter((finding) => finding.severity === "warning").length + reportWithoutHash.warnings.length;
|
|
144
|
+
reportWithoutHash.summary = { passed: failCount === 0, failCount, warningCount };
|
|
145
|
+
reportWithoutHash.artifact.logicalHash = hashLogicalReport(reportWithoutHash);
|
|
146
|
+
return reportWithoutHash;
|
|
147
|
+
}
|
|
148
|
+
export async function loadEvidenceReport(path, projectRoot = process.cwd()) {
|
|
149
|
+
const resolved = await resolveExistingReportPath(path, projectRoot);
|
|
150
|
+
const source = await readFile(resolved, "utf8");
|
|
151
|
+
if (Buffer.byteLength(source, "utf8") > MAX_REPORT_BYTES)
|
|
152
|
+
throw new EvidenceReportError(`Evidence report exceeds ${MAX_REPORT_BYTES} bytes.`);
|
|
153
|
+
let parsed;
|
|
154
|
+
try {
|
|
155
|
+
parsed = JSON.parse(source);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
throw new EvidenceReportError("Evidence report is not valid JSON.");
|
|
159
|
+
}
|
|
160
|
+
return validateEvidenceReport(parsed);
|
|
161
|
+
}
|
|
162
|
+
export function validateEvidenceReport(value) {
|
|
163
|
+
const report = normalizeEvidenceReport(value);
|
|
164
|
+
const expectedHash = hashLogicalReport(report);
|
|
165
|
+
if (report.artifact.logicalHash !== expectedHash)
|
|
166
|
+
throw new EvidenceReportError("Evidence report logical hash does not match its contents.");
|
|
167
|
+
return report;
|
|
168
|
+
}
|
|
169
|
+
export function formatEvidenceReport(report) {
|
|
170
|
+
const marker = report.summary.passed ? "PASS" : "FAIL";
|
|
171
|
+
return [
|
|
172
|
+
`GhostAPI evidence report: ${marker}`,
|
|
173
|
+
`Run: ${escapeTerminal(report.run.id)} (${escapeTerminal(report.run.status)})`,
|
|
174
|
+
`GhostAPI: ${escapeTerminal(report.ghostapi.version)}`,
|
|
175
|
+
`Enforcement: ${escapeTerminal(report.enforcement.mode)}${report.enforcement.degraded ? " (degraded)" : ""}`,
|
|
176
|
+
`Policy hash: ${escapeTerminal(report.policy.hash ?? "none")}`,
|
|
177
|
+
`Providers: ${report.coverage.providers.length > 0 ? report.coverage.providers.map(escapeTerminal).join(", ") : "none"}`,
|
|
178
|
+
`Scenarios: ${report.coverage.scenarios.length > 0 ? report.coverage.scenarios.map(escapeTerminal).join(", ") : "none"}`,
|
|
179
|
+
`Contract drift: ${(report.contractDrift ?? emptyContractDrift()).breaking} breaking, ${(report.contractDrift ?? emptyContractDrift()).nonBreaking} non-breaking, ${(report.contractDrift ?? emptyContractDrift()).uncertain} uncertain`,
|
|
180
|
+
`Allowed egress attempts: ${report.egress.allowedAttempts.length}`,
|
|
181
|
+
`Blocked egress attempts: ${report.egress.blockedAttempts.length}`,
|
|
182
|
+
`Production egress attempts: ${report.egress.productionAttempts}`,
|
|
183
|
+
`Secret categories: ${report.secrets.categories.length > 0 ? report.secrets.categories.map(escapeTerminal).join(", ") : "none"}`,
|
|
184
|
+
`Retries: ${report.retriesAndFailures.retryCount}`,
|
|
185
|
+
`Failures: ${report.retriesAndFailures.failureCount}`,
|
|
186
|
+
`Findings: ${report.summary.failCount} fail, ${report.summary.warningCount} warning`,
|
|
187
|
+
...report.findings.map((finding) => ` ${finding.severity.toUpperCase()} ${escapeTerminal(finding.id)}: ${escapeTerminal(finding.message)}`),
|
|
188
|
+
...report.warnings.map((warning) => ` WARNING evidence: ${escapeTerminal(warning)}`)
|
|
189
|
+
].join("\n");
|
|
190
|
+
}
|
|
191
|
+
export function compareEvidenceReports(left, right) {
|
|
192
|
+
const differences = [];
|
|
193
|
+
if (left.artifact.logicalHash !== right.artifact.logicalHash)
|
|
194
|
+
differences.push("logicalHash differs");
|
|
195
|
+
if (left.summary.passed !== right.summary.passed)
|
|
196
|
+
differences.push("summary.passed differs");
|
|
197
|
+
if (left.summary.failCount !== right.summary.failCount)
|
|
198
|
+
differences.push("summary.failCount differs");
|
|
199
|
+
if (left.egress.productionAttempts !== right.egress.productionAttempts)
|
|
200
|
+
differences.push("egress.productionAttempts differs");
|
|
201
|
+
if (left.secrets.matches !== right.secrets.matches)
|
|
202
|
+
differences.push("secrets.matches differs");
|
|
203
|
+
if (stableStringify(left.contractDrift ?? emptyContractDrift()) !== stableStringify(right.contractDrift ?? emptyContractDrift()))
|
|
204
|
+
differences.push("contractDrift differs");
|
|
205
|
+
if (stableStringify(left.coverage) !== stableStringify(right.coverage))
|
|
206
|
+
differences.push("coverage differs");
|
|
207
|
+
if (stableStringify(left.findings) !== stableStringify(right.findings))
|
|
208
|
+
differences.push("findings differ");
|
|
209
|
+
return { equal: differences.length === 0, leftHash: left.artifact.logicalHash, rightHash: right.artifact.logicalHash, differences };
|
|
210
|
+
}
|
|
211
|
+
export function formatEvidenceCompare(result) {
|
|
212
|
+
if (result.equal)
|
|
213
|
+
return `Evidence reports match: ${result.leftHash}`;
|
|
214
|
+
return [`Evidence reports differ:`, `Left: ${result.leftHash}`, `Right: ${result.rightHash}`, ...result.differences.map((difference) => ` - ${escapeTerminal(difference)}`)].join("\n");
|
|
215
|
+
}
|
|
216
|
+
async function writeEvidenceReport(report, projectRoot, outPath) {
|
|
217
|
+
const target = outPath === undefined ? join(getDataPaths().reports, `${report.run.id === "unknown" ? "latest" : report.run.id}.json`) : await resolveOutputPath(outPath, projectRoot);
|
|
218
|
+
await ensurePrivateDirectory(dirname(target));
|
|
219
|
+
await atomicWriteJson(target, report);
|
|
220
|
+
const source = await readFile(target, "utf8");
|
|
221
|
+
if (Buffer.byteLength(source, "utf8") > MAX_REPORT_BYTES) {
|
|
222
|
+
await rm(target, { force: true });
|
|
223
|
+
throw new EvidenceReportError(`Evidence report exceeds ${MAX_REPORT_BYTES} bytes.`);
|
|
224
|
+
}
|
|
225
|
+
await pruneReports();
|
|
226
|
+
return target;
|
|
227
|
+
}
|
|
228
|
+
async function readPersistedEvents(runEvidencePath) {
|
|
229
|
+
const eventsPath = runEvidencePath === undefined
|
|
230
|
+
? getDataPaths().events
|
|
231
|
+
: join(dirname(runEvidencePath), "runtime", "events.jsonl");
|
|
232
|
+
const paths = [eventsPath, `${eventsPath}.1`, `${eventsPath}.2`];
|
|
233
|
+
const events = [];
|
|
234
|
+
let bytes = 0;
|
|
235
|
+
for (const path of paths.reverse()) {
|
|
236
|
+
let source;
|
|
237
|
+
try {
|
|
238
|
+
const info = await lstat(path);
|
|
239
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
240
|
+
throw new EvidenceReportError("Event evidence must be a regular non-symlink file.");
|
|
241
|
+
source = await readFile(path, "utf8");
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
if (isErrorCode(error, "ENOENT"))
|
|
245
|
+
continue;
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
bytes += Buffer.byteLength(source, "utf8");
|
|
249
|
+
if (bytes > MAX_JSONL_BYTES)
|
|
250
|
+
throw new EvidenceReportError(`Event evidence exceeds ${MAX_JSONL_BYTES} bytes.`);
|
|
251
|
+
for (const line of source.split("\n")) {
|
|
252
|
+
if (line.trim() === "")
|
|
253
|
+
continue;
|
|
254
|
+
const parsed = JSON.parse(line);
|
|
255
|
+
events.push(parsed);
|
|
256
|
+
if (events.length >= MAX_EVENTS_FOR_REPORT)
|
|
257
|
+
return events;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return events;
|
|
261
|
+
}
|
|
262
|
+
async function readRunEvidence(runPath, projectRoot) {
|
|
263
|
+
const path = runPath ?? await findLatestRunEvidence();
|
|
264
|
+
if (path === undefined)
|
|
265
|
+
return null;
|
|
266
|
+
const resolved = runPath === undefined ? path : await resolveExistingReportPath(runPath, projectRoot);
|
|
267
|
+
const source = await readFile(resolved, "utf8");
|
|
268
|
+
if (Buffer.byteLength(source, "utf8") > MAX_RUN_EVIDENCE_BYTES)
|
|
269
|
+
throw new EvidenceReportError(`Run evidence exceeds ${MAX_RUN_EVIDENCE_BYTES} bytes.`);
|
|
270
|
+
try {
|
|
271
|
+
return { path: resolved, evidence: JSON.parse(source) };
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
throw new EvidenceReportError("Run evidence is not valid JSON.");
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async function loadContractDiff(baselinePath, candidatePath, projectRoot) {
|
|
278
|
+
if (baselinePath === undefined && candidatePath === undefined)
|
|
279
|
+
return undefined;
|
|
280
|
+
if (baselinePath === undefined || candidatePath === undefined)
|
|
281
|
+
throw new EvidenceReportError("Contract drift evidence requires both --contract-baseline and --contract-candidate.");
|
|
282
|
+
try {
|
|
283
|
+
const [baseline, candidate] = await Promise.all([loadContract(baselinePath, projectRoot), loadContract(candidatePath, projectRoot)]);
|
|
284
|
+
return diffContracts(baseline, candidate);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
throw new EvidenceReportError(error instanceof Error ? `Contract drift input is invalid: ${error.message}` : "Contract drift input is invalid.");
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async function findLatestRunEvidence() {
|
|
291
|
+
const runsDir = join(getDataPaths().root, "runs");
|
|
292
|
+
try {
|
|
293
|
+
const entries = await readdir(runsDir, { withFileTypes: true });
|
|
294
|
+
const candidates = [];
|
|
295
|
+
for (const entry of entries) {
|
|
296
|
+
if (!entry.isDirectory())
|
|
297
|
+
continue;
|
|
298
|
+
const evidencePath = join(runsDir, entry.name, "run.json");
|
|
299
|
+
const info = await lstat(evidencePath).catch(() => null);
|
|
300
|
+
if (info?.isFile())
|
|
301
|
+
candidates.push({ path: evidencePath, mtimeMs: info.mtimeMs });
|
|
302
|
+
}
|
|
303
|
+
return candidates.sort((left, right) => right.mtimeMs - left.mtimeMs)[0]?.path;
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
if (isErrorCode(error, "ENOENT"))
|
|
307
|
+
return undefined;
|
|
308
|
+
throw error;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async function pruneReports() {
|
|
312
|
+
try {
|
|
313
|
+
const entries = await readdir(getDataPaths().reports, { withFileTypes: true });
|
|
314
|
+
const reports = [];
|
|
315
|
+
for (const entry of entries) {
|
|
316
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
317
|
+
continue;
|
|
318
|
+
const path = join(getDataPaths().reports, entry.name);
|
|
319
|
+
const info = await lstat(path);
|
|
320
|
+
if (!info.isSymbolicLink())
|
|
321
|
+
reports.push({ path, mtimeMs: info.mtimeMs });
|
|
322
|
+
}
|
|
323
|
+
for (const report of reports.sort((left, right) => right.mtimeMs - left.mtimeMs).slice(MAX_REPORTS_RETAINED))
|
|
324
|
+
await rm(report.path, { force: true });
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (!isErrorCode(error, "ENOENT"))
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
async function resolveOutputPath(outPath, projectRoot) {
|
|
332
|
+
const target = isAbsolute(outPath) ? resolve(outPath) : resolve(projectRoot, outPath);
|
|
333
|
+
assertPathInsideAllowedRoots(projectRoot, target);
|
|
334
|
+
await mkdir(dirname(target), { recursive: true, mode: 0o700 });
|
|
335
|
+
const parent = await lstat(dirname(target));
|
|
336
|
+
if (!parent.isDirectory() || parent.isSymbolicLink())
|
|
337
|
+
throw new EvidenceReportError("Evidence output parent must be a real directory, not a symlink.");
|
|
338
|
+
const existing = await lstat(target).catch((error) => isErrorCode(error, "ENOENT") ? null : Promise.reject(error));
|
|
339
|
+
if (existing?.isSymbolicLink())
|
|
340
|
+
throw new EvidenceReportError("Evidence output path must not be a symlink.");
|
|
341
|
+
return target;
|
|
342
|
+
}
|
|
343
|
+
async function resolveExistingReportPath(path, projectRoot) {
|
|
344
|
+
const target = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);
|
|
345
|
+
assertPathInsideAllowedRoots(projectRoot, target);
|
|
346
|
+
const info = await lstat(target);
|
|
347
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
348
|
+
throw new EvidenceReportError("Evidence path must be a regular non-symlink file.");
|
|
349
|
+
return target;
|
|
350
|
+
}
|
|
351
|
+
function normalizeEvidenceReport(value) {
|
|
352
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
353
|
+
throw new EvidenceReportError("Evidence report must be an object.");
|
|
354
|
+
const report = value;
|
|
355
|
+
if (report.schemaVersion !== 1)
|
|
356
|
+
throw new EvidenceReportError("Unsupported evidence report schema version.");
|
|
357
|
+
if (typeof report.artifact?.logicalHash !== "string" || !/^[a-f0-9]{64}$/.test(report.artifact.logicalHash))
|
|
358
|
+
throw new EvidenceReportError("Evidence report is missing a valid logical hash.");
|
|
359
|
+
if (report.artifact.canonicalization !== "json-stable-sorted-keys-v1")
|
|
360
|
+
throw new EvidenceReportError("Unsupported evidence report canonicalization.");
|
|
361
|
+
if (typeof report.run?.id !== "string" || typeof report.summary?.passed !== "boolean" || !Array.isArray(report.findings))
|
|
362
|
+
throw new EvidenceReportError("Evidence report has an invalid schema.");
|
|
363
|
+
return report;
|
|
364
|
+
}
|
|
365
|
+
function sanitizeEvent(event) {
|
|
366
|
+
const sanitized = sanitizeSecrets(event);
|
|
367
|
+
return { ...sanitized, provider: limitText(sanitized.provider), method: limitText(sanitized.method), path: sanitizePath(sanitized.path), request: sanitizeSecrets(sanitized.request), response: sanitizeSecrets(sanitized.response) };
|
|
368
|
+
}
|
|
369
|
+
function sanitizePath(path) {
|
|
370
|
+
const sanitized = sanitizeSecretString(path);
|
|
371
|
+
const [pathname, query = ""] = sanitized.split("?", 2);
|
|
372
|
+
if (query === "")
|
|
373
|
+
return limitText(pathname ?? "");
|
|
374
|
+
const params = query.split("&").map((part) => {
|
|
375
|
+
const [key = "", value = ""] = part.split("=", 2);
|
|
376
|
+
return SENSITIVE_QUERY_KEYS.has(decodeURIComponentSafe(key).toLowerCase()) ? `${key}=***` : `${key}=${sanitizeSecretString(value)}`;
|
|
377
|
+
});
|
|
378
|
+
return limitText(`${pathname}?${params.join("&")}`);
|
|
379
|
+
}
|
|
380
|
+
function detectScenarios(events) {
|
|
381
|
+
const scenarios = new Set();
|
|
382
|
+
for (const event of events) {
|
|
383
|
+
collectScenarioStrings(event.request, scenarios);
|
|
384
|
+
collectScenarioStrings(event.response, scenarios);
|
|
385
|
+
}
|
|
386
|
+
return [...scenarios].sort();
|
|
387
|
+
}
|
|
388
|
+
function collectScenarioStrings(value, scenarios) {
|
|
389
|
+
if (Array.isArray(value)) {
|
|
390
|
+
for (const entry of value)
|
|
391
|
+
collectScenarioStrings(entry, scenarios);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (value !== null && typeof value === "object") {
|
|
395
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
396
|
+
if (key.toLowerCase() === "scenario" && typeof entry === "string" && /^[a-z0-9][a-z0-9._-]{0,127}$/.test(entry))
|
|
397
|
+
scenarios.add(entry);
|
|
398
|
+
collectScenarioStrings(entry, scenarios);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function detectSecretCategories(value) {
|
|
403
|
+
const categories = new Set();
|
|
404
|
+
let matches = 0;
|
|
405
|
+
const visit = (entry, key) => {
|
|
406
|
+
if (key !== undefined && isSecretFieldName(key)) {
|
|
407
|
+
categories.add(secretCategory(key));
|
|
408
|
+
if (containsSecretPattern(entry))
|
|
409
|
+
matches += 1;
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (typeof entry === "string") {
|
|
413
|
+
const before = categories.size;
|
|
414
|
+
if (/sk_live_[A-Za-z0-9_-]+/.test(entry))
|
|
415
|
+
categories.add("stripe-live-key");
|
|
416
|
+
if (/ghp_[A-Za-z0-9_]+|github_pat_[A-Za-z0-9_]+/.test(entry))
|
|
417
|
+
categories.add("github-token");
|
|
418
|
+
if (/Bearer\s+\S+/i.test(entry))
|
|
419
|
+
categories.add("bearer-token");
|
|
420
|
+
if (/SG\.[A-Za-z0-9_.-]+/.test(entry))
|
|
421
|
+
categories.add("sendgrid-token");
|
|
422
|
+
if (categories.size > before)
|
|
423
|
+
matches += 1;
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
if (Array.isArray(entry)) {
|
|
427
|
+
for (const item of entry)
|
|
428
|
+
visit(item, key);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (entry !== null && typeof entry === "object") {
|
|
432
|
+
for (const [childKey, child] of Object.entries(entry))
|
|
433
|
+
visit(child, childKey);
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
visit(value);
|
|
437
|
+
return { categories, matches };
|
|
438
|
+
}
|
|
439
|
+
function containsSecretPattern(value) {
|
|
440
|
+
if (typeof value === "string")
|
|
441
|
+
return /sk_live_[A-Za-z0-9_-]+|ghp_[A-Za-z0-9_]+|github_pat_[A-Za-z0-9_]+|Bearer\s+\S+|SG\.[A-Za-z0-9_.-]+/i.test(value);
|
|
442
|
+
if (Array.isArray(value))
|
|
443
|
+
return value.some(containsSecretPattern);
|
|
444
|
+
if (value !== null && typeof value === "object")
|
|
445
|
+
return Object.values(value).some(containsSecretPattern);
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
function hashLogicalReport(report) {
|
|
449
|
+
const logical = structuredClone(report);
|
|
450
|
+
logical.artifact.logicalHash = "";
|
|
451
|
+
logical.artifact.generatedAt = "";
|
|
452
|
+
return createHash("sha256").update(stableStringify(logical), "utf8").digest("hex");
|
|
453
|
+
}
|
|
454
|
+
function stableStringify(value) {
|
|
455
|
+
if (value === undefined)
|
|
456
|
+
return "null";
|
|
457
|
+
if (value === null || typeof value !== "object")
|
|
458
|
+
return JSON.stringify(value);
|
|
459
|
+
if (Array.isArray(value))
|
|
460
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
461
|
+
const entries = Object.entries(value).filter(([, entry]) => entry !== undefined).sort(([left], [right]) => left.localeCompare(right));
|
|
462
|
+
return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`).join(",")}}`;
|
|
463
|
+
}
|
|
464
|
+
function firstTimestamp(events) {
|
|
465
|
+
return events.map((event) => readString(event.timestamp)).filter((value) => value !== undefined).sort()[0];
|
|
466
|
+
}
|
|
467
|
+
function lastTimestamp(events) {
|
|
468
|
+
return events.map((event) => readString(event.timestamp)).filter((value) => value !== undefined).sort().at(-1);
|
|
469
|
+
}
|
|
470
|
+
function lastExitCode(events) {
|
|
471
|
+
return events.map((event) => event.exitCode).filter((value) => Number.isInteger(value)).at(-1);
|
|
472
|
+
}
|
|
473
|
+
function hasRetryAfter(event) {
|
|
474
|
+
return JSON.stringify(event.response).toLowerCase().includes("retry-after") || JSON.stringify(event.request).toLowerCase().includes("retry-after");
|
|
475
|
+
}
|
|
476
|
+
function readRunStatus(value) {
|
|
477
|
+
return value === "preparing" || value === "running" || value === "failed-to-start" || value === "finished" ? value : "unknown";
|
|
478
|
+
}
|
|
479
|
+
function readString(value) {
|
|
480
|
+
return typeof value === "string" && value.trim() !== "" ? limitText(sanitizeSecretString(value)) : undefined;
|
|
481
|
+
}
|
|
482
|
+
function readStringArray(value) {
|
|
483
|
+
return Array.isArray(value) ? uniqueSorted(value.filter((entry) => typeof entry === "string").map(limitText)) : [];
|
|
484
|
+
}
|
|
485
|
+
function readNonNegativeInteger(value) {
|
|
486
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
487
|
+
}
|
|
488
|
+
function readBoolean(value) {
|
|
489
|
+
return value === true;
|
|
490
|
+
}
|
|
491
|
+
function uniqueSorted(values) {
|
|
492
|
+
return [...new Set(values.map(limitText))].sort();
|
|
493
|
+
}
|
|
494
|
+
function emptyContractDrift() {
|
|
495
|
+
return { breaking: 0, nonBreaking: 0, uncertain: 0 };
|
|
496
|
+
}
|
|
497
|
+
function limitText(value) {
|
|
498
|
+
const sanitized = sanitizeSecretString(value).replace(/[\r\n\t]/g, " ");
|
|
499
|
+
return sanitized.length > 2_000 ? `${sanitized.slice(0, 2_000)}[truncated]` : sanitized;
|
|
500
|
+
}
|
|
501
|
+
function escapeTerminal(value) {
|
|
502
|
+
return value.replace(/[\u001B\u009B][[\]()#;?]*(?:(?:(?:[a-zA-Z\d]*(?:;[a-zA-Z\d]*)*)?\u0007)|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))/g, "").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
|
|
503
|
+
}
|
|
504
|
+
function secretCategory(key) {
|
|
505
|
+
const normalized = key.toLowerCase();
|
|
506
|
+
if (normalized.includes("cookie"))
|
|
507
|
+
return "cookie";
|
|
508
|
+
if (normalized.includes("authorization"))
|
|
509
|
+
return "authorization-header";
|
|
510
|
+
if (normalized.includes("api"))
|
|
511
|
+
return "api-key";
|
|
512
|
+
if (normalized.includes("password"))
|
|
513
|
+
return "password";
|
|
514
|
+
if (normalized.includes("token"))
|
|
515
|
+
return "token";
|
|
516
|
+
return "secret-field";
|
|
517
|
+
}
|
|
518
|
+
function readPackageVersion() {
|
|
519
|
+
return typeof packageJson.version === "string" ? packageJson.version : "unknown";
|
|
520
|
+
}
|
|
521
|
+
async function realProjectRoot(projectRoot) {
|
|
522
|
+
const root = resolve(projectRoot);
|
|
523
|
+
const info = await lstat(root);
|
|
524
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
525
|
+
throw new EvidenceReportError("Project root must be a real directory, not a symlink.");
|
|
526
|
+
return root;
|
|
527
|
+
}
|
|
528
|
+
function assertPathInside(root, target) {
|
|
529
|
+
const relativePath = relative(root, target);
|
|
530
|
+
if (relativePath === ".." || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath))
|
|
531
|
+
throw new EvidenceReportError("Evidence path traversal outside the project root is not allowed.");
|
|
532
|
+
if (basename(target).trim() === "")
|
|
533
|
+
throw new EvidenceReportError("Evidence path must include a file name.");
|
|
534
|
+
}
|
|
535
|
+
function assertPathInsideAllowedRoots(projectRoot, target) {
|
|
536
|
+
if (!isInside(projectRoot, target) && !isInside(getDataPaths().root, target))
|
|
537
|
+
throw new EvidenceReportError("Evidence path traversal outside the project root or GHOSTAPI_DATA_DIR is not allowed.");
|
|
538
|
+
if (basename(target).trim() === "")
|
|
539
|
+
throw new EvidenceReportError("Evidence path must include a file name.");
|
|
540
|
+
}
|
|
541
|
+
function isInside(root, target) {
|
|
542
|
+
const relativePath = relative(resolve(root), target);
|
|
543
|
+
return relativePath !== ".." && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath);
|
|
544
|
+
}
|
|
545
|
+
function decodeURIComponentSafe(value) {
|
|
546
|
+
try {
|
|
547
|
+
return decodeURIComponent(value);
|
|
548
|
+
}
|
|
549
|
+
catch {
|
|
550
|
+
return value;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
function isErrorCode(error, code) {
|
|
554
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/evidence/report.ts"],"names":[],"mappings":"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"}
|
package/dist/fault/faultLab.d.ts
CHANGED
|
@@ -20,8 +20,9 @@ export type FaultLabDecision = {
|
|
|
20
20
|
retryAfterSeconds: number;
|
|
21
21
|
body: unknown;
|
|
22
22
|
};
|
|
23
|
-
export declare function
|
|
24
|
-
export declare function
|
|
25
|
-
export declare function
|
|
26
|
-
export declare function
|
|
23
|
+
export declare function initializeFaultLab(): Promise<void>;
|
|
24
|
+
export declare function getFaultLabConfig(): Promise<FaultLabConfig>;
|
|
25
|
+
export declare function updateFaultLabConfig(input: unknown): Promise<FaultLabConfig>;
|
|
26
|
+
export declare function resetFaultLabForTests(): Promise<void>;
|
|
27
|
+
export declare function decideFault(provider: ProviderName, random?: () => number): Promise<FaultLabDecision>;
|
|
27
28
|
export declare function waitForFault(latencyMs: number): Promise<void>;
|