@yiaany/ghostapi 0.1.7 → 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 +42 -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 +27 -12
- 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,477 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { getDataPaths } from "../config/dataPaths.js";
|
|
5
|
+
import { sanitizeSecretString } from "../security/secrets.js";
|
|
6
|
+
import { atomicWriteJson, ensurePrivateDirectory, withFileLock } from "../storage/fileStore.js";
|
|
7
|
+
const SCHEMA_VERSION = 1;
|
|
8
|
+
const MAX_STORE_BYTES = 1024 * 1024;
|
|
9
|
+
const MAX_CONTROLS = 1_000;
|
|
10
|
+
const MAX_LEDGER = 10_000;
|
|
11
|
+
const MAX_QUEUE = 100;
|
|
12
|
+
const MAX_DEAD_LETTERS = 1_000;
|
|
13
|
+
const MAX_AUDIT = 10_000;
|
|
14
|
+
const DEFAULT_LEASE_TTL_MS = 60_000;
|
|
15
|
+
const KILL_SWITCH_ERROR_CODE = "SAFETY_KILL_SWITCH";
|
|
16
|
+
const IDENTIFIER = /^[a-z0-9][a-z0-9._-]{0,127}$/;
|
|
17
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
18
|
+
export const SAFETY_SCOPE_KINDS = ["global", "organization", "project", "environment", "agent", "workload", "provider", "operation", "risk_class"];
|
|
19
|
+
export class SafetyControllerError extends Error {
|
|
20
|
+
code;
|
|
21
|
+
constructor(message, code) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "SafetyControllerError";
|
|
24
|
+
if (code !== undefined)
|
|
25
|
+
this.code = code;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function createLocalSafetyController(options = {}) {
|
|
29
|
+
return new LocalSafetyController(options);
|
|
30
|
+
}
|
|
31
|
+
export class LocalSafetyController {
|
|
32
|
+
path;
|
|
33
|
+
now;
|
|
34
|
+
emergencyAuthorizer;
|
|
35
|
+
leaseTtlMs;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.path = options.path ?? getDataPaths().safetyController;
|
|
38
|
+
this.now = options.now ?? (() => new Date());
|
|
39
|
+
this.emergencyAuthorizer = options.emergencyAuthorizer ?? createDisabledSafetyEmergencyAuthorizer();
|
|
40
|
+
this.leaseTtlMs = options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS;
|
|
41
|
+
}
|
|
42
|
+
async configureBudget(input) {
|
|
43
|
+
const operator = await this.authorize(input.identity, "safety.configure");
|
|
44
|
+
const budget = validateBudget(input.budget);
|
|
45
|
+
return this.mutate((state, now) => {
|
|
46
|
+
const existing = state.budgets.find((candidate) => candidate.id === budget.id);
|
|
47
|
+
if (existing === undefined) {
|
|
48
|
+
if (state.budgets.length >= MAX_CONTROLS)
|
|
49
|
+
throw new SafetyControllerError("Safety budget limit was reached.");
|
|
50
|
+
state.budgets.push(budget);
|
|
51
|
+
}
|
|
52
|
+
else
|
|
53
|
+
Object.assign(existing, budget);
|
|
54
|
+
appendAudit(state, "budget.configured", budget.id, `configured ${scopeKey(budget.scope)}`, now, operator.principalId);
|
|
55
|
+
return clone(budget);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async configureCircuit(input) {
|
|
59
|
+
const operator = await this.authorize(input.identity, "safety.configure");
|
|
60
|
+
const circuit = validateCircuit(input.circuit);
|
|
61
|
+
return this.mutate((state, now) => {
|
|
62
|
+
const existing = state.circuits.find((candidate) => candidate.id === circuit.id);
|
|
63
|
+
if (existing === undefined) {
|
|
64
|
+
if (state.circuits.length >= MAX_CONTROLS)
|
|
65
|
+
throw new SafetyControllerError("Safety circuit limit was reached.");
|
|
66
|
+
state.circuits.push(circuit);
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
Object.assign(existing, circuit);
|
|
70
|
+
appendAudit(state, "circuit.configured", circuit.id, `configured ${scopeKey(circuit.scope)}`, now, operator.principalId);
|
|
71
|
+
return clone(circuit);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async stop(input) {
|
|
75
|
+
const operator = await this.authorize(input.identity, "safety.stop");
|
|
76
|
+
const scope = validateScope(input.scope);
|
|
77
|
+
const reason = text(input.reason, "Kill-switch reason", 200);
|
|
78
|
+
await this.mutate((state, now) => {
|
|
79
|
+
setSwitch(state, scope, true, reason, operator.principalId, now);
|
|
80
|
+
deadLetterMatchingQueued(state, scope, reason, now);
|
|
81
|
+
appendAudit(state, "kill_switch.stopped", scopeKey(scope), reason, now, operator.principalId);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async reenable(input) {
|
|
85
|
+
const operator = await this.authorize(input.identity, "safety.reenable");
|
|
86
|
+
const scope = validateScope(input.scope);
|
|
87
|
+
const reason = text(input.reason, "Kill-switch re-enable reason", 200);
|
|
88
|
+
await this.mutate((state, now) => {
|
|
89
|
+
const control = state.switches.find((candidate) => sameScope(candidate.scope, scope));
|
|
90
|
+
if (control === undefined || !control.enabled)
|
|
91
|
+
throw new SafetyControllerError("Kill switch is not active for this scope.");
|
|
92
|
+
control.enabled = false;
|
|
93
|
+
control.changedAt = now;
|
|
94
|
+
control.changedBy = operator.principalId;
|
|
95
|
+
control.reason = reason;
|
|
96
|
+
appendAudit(state, "kill_switch.reenabled", scopeKey(scope), reason, now, operator.principalId);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async admit(actionValue) {
|
|
100
|
+
const action = validateAction(actionValue);
|
|
101
|
+
const now = this.timestamp();
|
|
102
|
+
const key = ledgerKey(action);
|
|
103
|
+
const replay = await this.mutate((state, current) => {
|
|
104
|
+
pruneExpiredLeases(state, current, this.leaseTtlMs);
|
|
105
|
+
const sameIdempotency = state.ledger.find((candidate) => candidate.action.idempotencyKey === action.idempotencyKey);
|
|
106
|
+
if (sameIdempotency !== undefined && sameIdempotency.action.actionHash !== action.actionHash)
|
|
107
|
+
throw new SafetyControllerError("Safety idempotency key collides with a different action hash.");
|
|
108
|
+
const existing = state.ledger.find((candidate) => candidate.key === key);
|
|
109
|
+
if (existing !== undefined)
|
|
110
|
+
return true;
|
|
111
|
+
assertActionAllowed(state, action, current);
|
|
112
|
+
if (state.ledger.length >= MAX_LEDGER)
|
|
113
|
+
throw new SafetyControllerError("Safety ledger limit was reached.");
|
|
114
|
+
assertBudgets(state, action, current);
|
|
115
|
+
state.ledger.push({ key, action, status: "reserved", admittedAt: current });
|
|
116
|
+
appendAudit(state, "action.admitted", key, "budget reservation created", current);
|
|
117
|
+
return false;
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
replay,
|
|
121
|
+
assertActive: async () => {
|
|
122
|
+
if (replay)
|
|
123
|
+
return;
|
|
124
|
+
await this.mutate((state, current) => {
|
|
125
|
+
const entry = findLedger(state, key);
|
|
126
|
+
if (this.leaseExpired(entry, current))
|
|
127
|
+
throw new SafetyControllerError("Safety lease has expired.");
|
|
128
|
+
if (entry.status !== "reserved")
|
|
129
|
+
throw new SafetyControllerError("Safety lease is no longer active.");
|
|
130
|
+
assertActionAllowed(state, action, current);
|
|
131
|
+
appendAudit(state, "action.final_check", key, "kill switch, budgets, and circuits remain active", current);
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
commit: async (operation) => {
|
|
135
|
+
if (replay)
|
|
136
|
+
throw new SafetyControllerError("Safety replay lease cannot commit a side effect.");
|
|
137
|
+
await this.mutate((state, current) => {
|
|
138
|
+
const entry = findLedger(state, key);
|
|
139
|
+
if (this.leaseExpired(entry, current))
|
|
140
|
+
throw new SafetyControllerError("Safety lease has expired.");
|
|
141
|
+
if (entry.status !== "reserved")
|
|
142
|
+
throw new SafetyControllerError("Safety lease is no longer active.");
|
|
143
|
+
assertActionAllowed(state, action, current);
|
|
144
|
+
});
|
|
145
|
+
const result = await operation();
|
|
146
|
+
await this.mutate((state, current) => {
|
|
147
|
+
const entry = findLedger(state, key);
|
|
148
|
+
if (this.leaseExpired(entry, current))
|
|
149
|
+
throw new SafetyControllerError("Safety lease has expired.");
|
|
150
|
+
if (entry.status !== "reserved")
|
|
151
|
+
throw new SafetyControllerError("Safety lease is no longer active.");
|
|
152
|
+
appendAudit(state, "action.final_check", key, "kill switch, budgets, and circuits remained active through commit", current);
|
|
153
|
+
});
|
|
154
|
+
return result;
|
|
155
|
+
},
|
|
156
|
+
complete: async (outcomeValue) => {
|
|
157
|
+
if (replay)
|
|
158
|
+
return;
|
|
159
|
+
const outcome = validateOutcome(outcomeValue);
|
|
160
|
+
await this.mutate((state, current) => {
|
|
161
|
+
const entry = state.ledger.find((candidate) => candidate.key === key);
|
|
162
|
+
if (entry !== undefined) {
|
|
163
|
+
if (entry.status === "completed")
|
|
164
|
+
return;
|
|
165
|
+
if (entry.status !== "reserved")
|
|
166
|
+
throw new SafetyControllerError("Safety lease is no longer active.");
|
|
167
|
+
entry.status = "completed";
|
|
168
|
+
entry.completedAt = current;
|
|
169
|
+
entry.outcome = outcome;
|
|
170
|
+
}
|
|
171
|
+
appendAudit(state, outcome.success ? "action.completed" : "action.unknown", key, outcome.reason ?? (outcome.success ? "action completed" : "action outcome is unknown"), current);
|
|
172
|
+
if (entry !== undefined)
|
|
173
|
+
evaluateCircuits(state, entry.action, current);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async enqueue(actionValue) {
|
|
179
|
+
const action = validateAction(actionValue);
|
|
180
|
+
return this.mutate((state, now) => {
|
|
181
|
+
assertActionAllowed(state, action, now);
|
|
182
|
+
const existing = state.queue.find((item) => ledgerKey(item.action) === ledgerKey(action));
|
|
183
|
+
if (existing !== undefined)
|
|
184
|
+
return clone(existing);
|
|
185
|
+
if (state.queue.length >= MAX_QUEUE)
|
|
186
|
+
throw new SafetyControllerError("Safety queue is full; backpressure is active.");
|
|
187
|
+
const item = { id: `queue-${sha256(`${ledgerKey(action)}:${now}`).slice(0, 32)}`, action, queuedAt: now };
|
|
188
|
+
state.queue.push(item);
|
|
189
|
+
appendAudit(state, "queue.enqueued", item.id, "action is queued without execution", now);
|
|
190
|
+
return clone(item);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async dequeue() {
|
|
194
|
+
return this.mutate((state, now) => {
|
|
195
|
+
const item = state.queue.shift();
|
|
196
|
+
if (item === undefined)
|
|
197
|
+
return null;
|
|
198
|
+
try {
|
|
199
|
+
assertActionAllowed(state, item.action, now);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
const reason = error instanceof Error ? error.message : "Safety queue action is denied.";
|
|
203
|
+
addDeadLetter(state, item, reason, now);
|
|
204
|
+
appendAudit(state, "queue.dead_lettered", item.id, reason, now);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
appendAudit(state, "queue.dequeued", item.id, "dequeued for separate re-admission", now);
|
|
208
|
+
return clone(item);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async runScheduledGameDay(input) {
|
|
212
|
+
const action = validateAction(input.action);
|
|
213
|
+
const reason = text(input.reason, "Game-day reason", 200);
|
|
214
|
+
const globalScope = { kind: "global" };
|
|
215
|
+
const before = await this.read();
|
|
216
|
+
if (before.switches.some((control) => sameScope(control.scope, globalScope) && control.enabled))
|
|
217
|
+
throw new SafetyControllerError("Game-day test requires an inactive global kill switch.");
|
|
218
|
+
await this.stop({ identity: input.stopIdentity, scope: globalScope, reason: `${reason} stop drill` });
|
|
219
|
+
const stoppedAt = this.timestamp();
|
|
220
|
+
await this.admit(action).then(() => { throw new SafetyControllerError("Game-day kill switch did not block the action."); }, (error) => {
|
|
221
|
+
if (!(error instanceof SafetyControllerError) || error.code !== KILL_SWITCH_ERROR_CODE)
|
|
222
|
+
throw error;
|
|
223
|
+
});
|
|
224
|
+
await this.reenable({ identity: input.reenableIdentity, scope: globalScope, reason: `${reason} recovery drill` });
|
|
225
|
+
const reenabledAt = this.timestamp();
|
|
226
|
+
await this.mutate((state, now) => appendAudit(state, "game_day.passed", ledgerKey(action), reason, now));
|
|
227
|
+
return { passed: true, stoppedAt, reenabledAt };
|
|
228
|
+
}
|
|
229
|
+
async inspect() { return this.read(); }
|
|
230
|
+
async readStateForTesting() { return this.read(); }
|
|
231
|
+
async authorize(identity, permission) {
|
|
232
|
+
const operator = validateOperator(await this.emergencyAuthorizer.authenticate(identity));
|
|
233
|
+
if (!operator.permissions.includes(permission))
|
|
234
|
+
throw new SafetyControllerError(`Emergency operator lacks required permission: ${permission}.`);
|
|
235
|
+
return operator;
|
|
236
|
+
}
|
|
237
|
+
async read() {
|
|
238
|
+
await ensurePrivateDirectory(dirname(this.path));
|
|
239
|
+
const info = await lstat(this.path).catch((error) => isErrorCode(error, "ENOENT") ? null : Promise.reject(error));
|
|
240
|
+
if (info === null)
|
|
241
|
+
return emptyState();
|
|
242
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
243
|
+
throw new SafetyControllerError("Safety controller store must be a regular non-symlink file.");
|
|
244
|
+
const source = await readFile(this.path, "utf8");
|
|
245
|
+
if (Buffer.byteLength(source, "utf8") > MAX_STORE_BYTES)
|
|
246
|
+
throw new SafetyControllerError("Safety controller store exceeds its size limit.");
|
|
247
|
+
try {
|
|
248
|
+
return validateState(JSON.parse(source));
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (error instanceof SafetyControllerError)
|
|
252
|
+
throw error;
|
|
253
|
+
throw new SafetyControllerError("Safety controller store is not valid JSON.");
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async mutate(operation) {
|
|
257
|
+
return withFileLock(this.path, async () => {
|
|
258
|
+
const state = await this.read();
|
|
259
|
+
const result = operation(state, this.timestamp());
|
|
260
|
+
await atomicWriteJson(this.path, validateState(state));
|
|
261
|
+
return result;
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
timestamp() {
|
|
265
|
+
const value = this.now();
|
|
266
|
+
if (!(value instanceof Date) || !Number.isFinite(value.getTime()))
|
|
267
|
+
throw new SafetyControllerError("Safety controller clock is invalid.");
|
|
268
|
+
return value.toISOString();
|
|
269
|
+
}
|
|
270
|
+
leaseExpired(entry, now) {
|
|
271
|
+
return entry.status === "reserved" && Date.parse(now) - Date.parse(entry.admittedAt) > this.leaseTtlMs;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
export function createDisabledSafetyEmergencyAuthorizer() {
|
|
275
|
+
return { async authenticate() { throw new SafetyControllerError("Emergency authorization is not configured."); } };
|
|
276
|
+
}
|
|
277
|
+
export function createTestSafetyEmergencyAuthorizer() {
|
|
278
|
+
const issued = new WeakSet();
|
|
279
|
+
return {
|
|
280
|
+
authorizer: { async authenticate(identity) { if (identity === null || typeof identity !== "object" || !issued.has(identity))
|
|
281
|
+
throw new SafetyControllerError("Emergency operator identity is not authenticated."); return validateOperator(identity); } },
|
|
282
|
+
issue(input) { const operator = Object.freeze(validateOperator(input)); issued.add(operator); return operator; }
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function emptyState() { return { schemaVersion: 1, switches: [], budgets: [], circuits: [], ledger: [], queue: [], deadLetters: [], auditAnchor: sha256("ghostapi.safety.audit.v1"), audit: [] }; }
|
|
286
|
+
function validateState(value) {
|
|
287
|
+
const state = object(value, "Safety controller store must be an object.");
|
|
288
|
+
exactKeys(state, ["schemaVersion", "switches", "budgets", "circuits", "ledger", "queue", "deadLetters", "auditAnchor", "audit"], "Safety controller store");
|
|
289
|
+
if (state.schemaVersion !== SCHEMA_VERSION)
|
|
290
|
+
throw new SafetyControllerError("Unsupported safety controller schema version.");
|
|
291
|
+
const switches = array(state.switches, "Safety switches", MAX_CONTROLS).map(validateSwitch);
|
|
292
|
+
unique(switches.map((control) => scopeKey(control.scope)), "Safety switch scopes");
|
|
293
|
+
const budgets = array(state.budgets, "Safety budgets", MAX_CONTROLS).map(validateBudget);
|
|
294
|
+
unique(budgets.map((budget) => budget.id), "Safety budget ids");
|
|
295
|
+
const circuits = array(state.circuits, "Safety circuits", MAX_CONTROLS).map(validateCircuit);
|
|
296
|
+
unique(circuits.map((circuit) => circuit.id), "Safety circuit ids");
|
|
297
|
+
const ledger = array(state.ledger, "Safety ledger", MAX_LEDGER).map(validateLedger);
|
|
298
|
+
unique(ledger.map((entry) => entry.key), "Safety ledger keys");
|
|
299
|
+
unique(ledger.map((entry) => entry.action.idempotencyKey), "Safety ledger idempotency keys");
|
|
300
|
+
const queue = array(state.queue, "Safety queue", MAX_QUEUE).map(validateQueueItem);
|
|
301
|
+
unique(queue.map((entry) => entry.id), "Safety queue ids");
|
|
302
|
+
const deadLetters = array(state.deadLetters, "Safety dead-letter queue", MAX_DEAD_LETTERS).map(validateDeadLetter);
|
|
303
|
+
unique(deadLetters.map((entry) => entry.id), "Safety dead-letter ids");
|
|
304
|
+
const auditAnchor = hash(state.auditAnchor, "Safety audit anchor");
|
|
305
|
+
const audit = array(state.audit, "Safety audit", MAX_AUDIT).map(validateAudit);
|
|
306
|
+
validateAuditChain(auditAnchor, audit);
|
|
307
|
+
return { schemaVersion: 1, switches, budgets, circuits, ledger, queue, deadLetters, auditAnchor, audit };
|
|
308
|
+
}
|
|
309
|
+
function validateSwitch(value) { const control = object(value, "Safety switch is invalid."); exactKeys(control, ["scope", "enabled", "changedAt", "reason", "changedBy"], "Safety switch"); if (typeof control.enabled !== "boolean")
|
|
310
|
+
throw new SafetyControllerError("Safety switch enabled flag is invalid."); return { scope: validateScope(control.scope), enabled: control.enabled, changedAt: timestamp(control.changedAt, "Safety switch time"), reason: text(control.reason, "Safety switch reason", 200), changedBy: identifier(control.changedBy, "Safety switch operator") }; }
|
|
311
|
+
function validateBudget(value) {
|
|
312
|
+
const budget = object(value, "Safety budget is invalid.");
|
|
313
|
+
exactKeys(budget, ["id", "scope", "windowMs", "velocityWindowMs", "limits"], "Safety budget");
|
|
314
|
+
const limits = object(budget.limits, "Safety budget limits are invalid.");
|
|
315
|
+
exactKeys(limits, ["monetaryAmountMinor", "requests", "messages", "mutations", "deletes", "tokenCost", "concurrency", "velocity"], "Safety budget limits", ["monetaryAmountMinor", "requests", "messages", "mutations", "deletes", "tokenCost", "concurrency", "velocity"]);
|
|
316
|
+
const parsed = {};
|
|
317
|
+
for (const key of ["monetaryAmountMinor", "requests", "messages", "mutations", "deletes", "tokenCost", "concurrency", "velocity"])
|
|
318
|
+
if (limits[key] !== undefined)
|
|
319
|
+
parsed[key] = nonNegative(limits[key], `Safety budget ${key}`, Number.MAX_SAFE_INTEGER);
|
|
320
|
+
if (Object.keys(parsed).length === 0)
|
|
321
|
+
throw new SafetyControllerError("Safety budget requires at least one limit.");
|
|
322
|
+
return { id: identifier(budget.id, "Safety budget id"), scope: validateScope(budget.scope), windowMs: boundedMs(budget.windowMs, "Safety budget window"), velocityWindowMs: boundedMs(budget.velocityWindowMs, "Safety velocity window"), limits: parsed };
|
|
323
|
+
}
|
|
324
|
+
function validateCircuit(value) {
|
|
325
|
+
const circuit = object(value, "Safety circuit is invalid.");
|
|
326
|
+
exactKeys(circuit, ["id", "scope", "windowMs", "minimumSamples", "maxFailureRateBps", "maxPolicyViolations", "maxLatencyMs", "maxReconciliationMismatches", "state", "openedAt", "reason"], "Safety circuit", ["openedAt", "reason"]);
|
|
327
|
+
if (circuit.state !== "closed" && circuit.state !== "open")
|
|
328
|
+
throw new SafetyControllerError("Safety circuit state is invalid.");
|
|
329
|
+
const result = { id: identifier(circuit.id, "Safety circuit id"), scope: validateScope(circuit.scope), windowMs: boundedMs(circuit.windowMs, "Safety circuit window"), minimumSamples: positive(circuit.minimumSamples, "Safety circuit minimum samples", MAX_LEDGER), maxFailureRateBps: bps(circuit.maxFailureRateBps, "Safety circuit failure rate"), maxPolicyViolations: nonNegative(circuit.maxPolicyViolations, "Safety circuit policy violations", MAX_LEDGER), maxLatencyMs: nonNegative(circuit.maxLatencyMs, "Safety circuit latency", 24 * 60 * 60 * 1000), maxReconciliationMismatches: nonNegative(circuit.maxReconciliationMismatches, "Safety circuit reconciliation mismatches", MAX_LEDGER), state: circuit.state };
|
|
330
|
+
if (result.state === "open") {
|
|
331
|
+
if (circuit.openedAt === undefined || circuit.reason === undefined)
|
|
332
|
+
throw new SafetyControllerError("Open safety circuit requires audit metadata.");
|
|
333
|
+
result.openedAt = timestamp(circuit.openedAt, "Safety circuit open time");
|
|
334
|
+
result.reason = text(circuit.reason, "Safety circuit reason", 200);
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
function validateAction(value) {
|
|
339
|
+
const action = object(value, "Safety action is invalid.");
|
|
340
|
+
exactKeys(action, ["organizationId", "projectId", "environment", "actorId", "workloadId", "provider", "operation", "riskClass", "idempotencyKey", "actionHash", "costs"], "Safety action");
|
|
341
|
+
if (action.riskClass !== "read" && action.riskClass !== "write" && action.riskClass !== "money_movement" && action.riskClass !== "external_communication" && action.riskClass !== "delete" && action.riskClass !== "deploy")
|
|
342
|
+
throw new SafetyControllerError("Safety action risk class is invalid.");
|
|
343
|
+
const costs = object(action.costs, "Safety action costs are invalid.");
|
|
344
|
+
exactKeys(costs, ["monetaryAmountMinor", "requests", "messages", "mutations", "deletes", "tokenCost"], "Safety action costs");
|
|
345
|
+
return { organizationId: identifier(action.organizationId, "Safety organization id"), projectId: identifier(action.projectId, "Safety project id"), environment: identifier(action.environment, "Safety environment"), actorId: identifier(action.actorId, "Safety actor id"), workloadId: identifier(action.workloadId, "Safety workload id"), provider: identifier(action.provider, "Safety provider"), operation: identifier(action.operation, "Safety operation"), riskClass: action.riskClass, idempotencyKey: identifier(action.idempotencyKey, "Safety idempotency key"), actionHash: hash(action.actionHash, "Safety action hash"), costs: { monetaryAmountMinor: nonNegative(costs.monetaryAmountMinor, "Safety monetary amount", Number.MAX_SAFE_INTEGER), requests: nonNegative(costs.requests, "Safety request count", Number.MAX_SAFE_INTEGER), messages: nonNegative(costs.messages, "Safety message count", Number.MAX_SAFE_INTEGER), mutations: nonNegative(costs.mutations, "Safety mutation count", Number.MAX_SAFE_INTEGER), deletes: nonNegative(costs.deletes, "Safety delete count", Number.MAX_SAFE_INTEGER), tokenCost: nonNegative(costs.tokenCost, "Safety token cost", Number.MAX_SAFE_INTEGER) } };
|
|
346
|
+
}
|
|
347
|
+
function validateScope(value) { const scope = object(value, "Safety scope is invalid."); exactKeys(scope, ["kind", "id"], "Safety scope", ["id"]); if (!SAFETY_SCOPE_KINDS.includes(scope.kind))
|
|
348
|
+
throw new SafetyControllerError("Safety scope kind is invalid."); if (scope.kind === "global") {
|
|
349
|
+
if (scope.id !== undefined)
|
|
350
|
+
throw new SafetyControllerError("Global safety scope cannot have an id.");
|
|
351
|
+
return { kind: "global" };
|
|
352
|
+
} if (scope.id === undefined)
|
|
353
|
+
throw new SafetyControllerError("Scoped safety control requires an id."); return { kind: scope.kind, id: identifier(scope.id, "Safety scope id") }; }
|
|
354
|
+
function validateOperator(value) { const operator = object(value, "Emergency operator is invalid."); exactKeys(operator, ["id", "principalId", "permissions"], "Emergency operator"); const permissions = array(operator.permissions, "Emergency operator permissions", 8).map((permission) => { if (permission !== "safety.stop" && permission !== "safety.reenable" && permission !== "safety.configure" && permission !== "safety.inspect")
|
|
355
|
+
throw new SafetyControllerError("Emergency operator permission is invalid."); return permission; }); unique(permissions, "Emergency operator permissions"); return { id: identifier(operator.id, "Emergency operator id"), principalId: identifier(operator.principalId, "Emergency operator principal id"), permissions }; }
|
|
356
|
+
function validateLedger(value) { const entry = object(value, "Safety ledger entry is invalid."); exactKeys(entry, ["key", "action", "status", "admittedAt", "completedAt", "outcome"], "Safety ledger entry", ["completedAt", "outcome"]); if (entry.status !== "reserved" && entry.status !== "completed")
|
|
357
|
+
throw new SafetyControllerError("Safety ledger status is invalid."); const action = validateAction(entry.action); const completedAt = entry.completedAt === undefined ? undefined : timestamp(entry.completedAt, "Safety completion time"); const outcome = entry.outcome === undefined ? undefined : validateOutcome(entry.outcome); if (entry.status === "completed" && (completedAt === undefined || outcome === undefined))
|
|
358
|
+
throw new SafetyControllerError("Completed safety ledger entry is invalid."); if (entry.status === "reserved" && (completedAt !== undefined || outcome !== undefined))
|
|
359
|
+
throw new SafetyControllerError("Reserved safety ledger entry is invalid."); const key = text(entry.key, "Safety ledger key", 300); if (key !== ledgerKey(action))
|
|
360
|
+
throw new SafetyControllerError("Safety ledger key does not match its action."); return { key, action, status: entry.status, admittedAt: timestamp(entry.admittedAt, "Safety admission time"), ...(completedAt === undefined ? {} : { completedAt }), ...(outcome === undefined ? {} : { outcome }) }; }
|
|
361
|
+
function validateOutcome(value) { const outcome = object(value, "Safety action outcome is invalid."); exactKeys(outcome, ["success", "policyViolation", "reconciliationMismatch", "latencyMs", "reason"], "Safety action outcome", ["policyViolation", "reconciliationMismatch", "reason"]); if (typeof outcome.success !== "boolean" || (outcome.policyViolation !== undefined && typeof outcome.policyViolation !== "boolean") || (outcome.reconciliationMismatch !== undefined && typeof outcome.reconciliationMismatch !== "boolean"))
|
|
362
|
+
throw new SafetyControllerError("Safety action outcome flags are invalid."); return { success: outcome.success, policyViolation: outcome.policyViolation ?? false, reconciliationMismatch: outcome.reconciliationMismatch ?? false, latencyMs: nonNegative(outcome.latencyMs, "Safety action latency", 24 * 60 * 60 * 1000), ...(outcome.reason === undefined ? {} : { reason: text(outcome.reason, "Safety action outcome reason", 200) }) }; }
|
|
363
|
+
function validateQueueItem(value) { const item = object(value, "Safety queue item is invalid."); exactKeys(item, ["id", "action", "queuedAt"], "Safety queue item"); return { id: identifier(item.id, "Safety queue id"), action: validateAction(item.action), queuedAt: timestamp(item.queuedAt, "Safety queue time") }; }
|
|
364
|
+
function validateDeadLetter(value) { const item = object(value, "Safety dead-letter item is invalid."); exactKeys(item, ["id", "action", "queuedAt", "reason", "deadLetteredAt"], "Safety dead-letter item"); return { id: identifier(item.id, "Safety queue id"), action: validateAction(item.action), queuedAt: timestamp(item.queuedAt, "Safety queue time"), reason: text(item.reason, "Safety dead-letter reason", 200), deadLetteredAt: timestamp(item.deadLetteredAt, "Safety dead-letter time") }; }
|
|
365
|
+
function validateAudit(value) { const record = object(value, "Safety audit record is invalid."); exactKeys(record, ["sequence", "event", "subject", "reason", "actorPrincipalId", "timestamp", "previousHash", "recordHash"], "Safety audit record", ["actorPrincipalId"]); const base = { sequence: positive(record.sequence, "Safety audit sequence", MAX_AUDIT), event: text(record.event, "Safety audit event", 80), subject: text(record.subject, "Safety audit subject", 300), reason: text(record.reason, "Safety audit reason", 200), ...(record.actorPrincipalId === undefined ? {} : { actorPrincipalId: identifier(record.actorPrincipalId, "Safety audit actor") }), timestamp: timestamp(record.timestamp, "Safety audit time"), previousHash: hash(record.previousHash, "Safety audit previous hash") }; if (hash(record.recordHash, "Safety audit record hash") !== sha256(canonical(base)))
|
|
366
|
+
throw new SafetyControllerError("Safety audit record hash is invalid."); return { ...base, recordHash: record.recordHash }; }
|
|
367
|
+
function validateAuditChain(anchor, audit) { let previous = anchor; let sequence = 1; for (const record of audit) {
|
|
368
|
+
if (record.sequence !== sequence || record.previousHash !== previous)
|
|
369
|
+
throw new SafetyControllerError("Safety audit chain is invalid.");
|
|
370
|
+
previous = record.recordHash;
|
|
371
|
+
sequence += 1;
|
|
372
|
+
} }
|
|
373
|
+
function setSwitch(state, scope, enabled, reason, principalId, now) { const existing = state.switches.find((candidate) => sameScope(candidate.scope, scope)); if (existing === undefined) {
|
|
374
|
+
if (state.switches.length >= MAX_CONTROLS)
|
|
375
|
+
throw new SafetyControllerError("Safety switch limit was reached.");
|
|
376
|
+
state.switches.push({ scope, enabled, reason, changedBy: principalId, changedAt: now });
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
existing.enabled = enabled;
|
|
380
|
+
existing.reason = reason;
|
|
381
|
+
existing.changedBy = principalId;
|
|
382
|
+
existing.changedAt = now;
|
|
383
|
+
} }
|
|
384
|
+
function assertActionAllowed(state, action, now) { const stopped = state.switches.find((control) => control.enabled && scopeMatches(control.scope, action)); if (stopped !== undefined)
|
|
385
|
+
throw new SafetyControllerError(`Kill switch is active for ${scopeKey(stopped.scope)}.`, KILL_SWITCH_ERROR_CODE); const circuit = state.circuits.find((candidate) => candidate.state === "open" && scopeMatches(candidate.scope, action)); if (circuit !== undefined)
|
|
386
|
+
throw new SafetyControllerError(`Safety circuit breaker is open: ${circuit.id}.`); for (const circuitCandidate of state.circuits)
|
|
387
|
+
if (circuitCandidate.state === "closed" && scopeMatches(circuitCandidate.scope, action))
|
|
388
|
+
evaluateCircuit(state, circuitCandidate, now); const opened = state.circuits.find((candidate) => candidate.state === "open" && scopeMatches(candidate.scope, action)); if (opened !== undefined)
|
|
389
|
+
throw new SafetyControllerError(`Safety circuit breaker is open: ${opened.id}.`); }
|
|
390
|
+
function assertBudgets(state, action, now) { for (const budget of state.budgets) {
|
|
391
|
+
if (!scopeMatches(budget.scope, action))
|
|
392
|
+
continue;
|
|
393
|
+
const windowEntries = state.ledger.filter((entry) => scopeMatches(budget.scope, entry.action) && Date.parse(entry.admittedAt) >= Date.parse(now) - budget.windowMs);
|
|
394
|
+
const velocityEntries = state.ledger.filter((entry) => scopeMatches(budget.scope, entry.action) && Date.parse(entry.admittedAt) >= Date.parse(now) - budget.velocityWindowMs);
|
|
395
|
+
const totals = sumCosts(windowEntries.map((entry) => entry.action.costs));
|
|
396
|
+
const velocity = sumCosts(velocityEntries.map((entry) => entry.action.costs)).requests;
|
|
397
|
+
const concurrent = windowEntries.filter((entry) => entry.status === "reserved").length;
|
|
398
|
+
for (const key of ["monetaryAmountMinor", "requests", "messages", "mutations", "deletes", "tokenCost"])
|
|
399
|
+
if (budget.limits[key] !== undefined && totals[key] + action.costs[key] > budget.limits[key])
|
|
400
|
+
throw new SafetyControllerError(`Safety budget exceeded: ${budget.id} ${key}.`);
|
|
401
|
+
if (budget.limits.concurrency !== undefined && concurrent + 1 > budget.limits.concurrency)
|
|
402
|
+
throw new SafetyControllerError(`Safety budget exceeded: ${budget.id} concurrency.`);
|
|
403
|
+
if (budget.limits.velocity !== undefined && velocity + action.costs.requests > budget.limits.velocity)
|
|
404
|
+
throw new SafetyControllerError(`Safety velocity limit exceeded: ${budget.id}.`);
|
|
405
|
+
} }
|
|
406
|
+
function evaluateCircuits(state, action, now) { for (const circuit of state.circuits)
|
|
407
|
+
if (circuit.state === "closed" && scopeMatches(circuit.scope, action))
|
|
408
|
+
evaluateCircuit(state, circuit, now); }
|
|
409
|
+
function evaluateCircuit(state, circuit, now) { const entries = state.ledger.filter((entry) => entry.status === "completed" && entry.completedAt !== undefined && entry.outcome !== undefined && scopeMatches(circuit.scope, entry.action) && Date.parse(entry.completedAt) >= Date.parse(now) - circuit.windowMs); if (entries.length < circuit.minimumSamples)
|
|
410
|
+
return; const failures = entries.filter((entry) => !entry.outcome.success).length; const violations = entries.filter((entry) => entry.outcome.policyViolation).length; const mismatches = entries.filter((entry) => entry.outcome.reconciliationMismatch).length; const latencyExceeded = entries.some((entry) => entry.outcome.latencyMs > circuit.maxLatencyMs); const reason = rateBps(failures, entries.length) > circuit.maxFailureRateBps ? "failure rate exceeded" : violations > circuit.maxPolicyViolations ? "policy violation threshold exceeded" : mismatches > circuit.maxReconciliationMismatches ? "reconciliation mismatch threshold exceeded" : latencyExceeded ? "latency threshold exceeded" : undefined; if (reason !== undefined) {
|
|
411
|
+
circuit.state = "open";
|
|
412
|
+
circuit.openedAt = now;
|
|
413
|
+
circuit.reason = reason;
|
|
414
|
+
appendAudit(state, "circuit.opened", circuit.id, reason, now);
|
|
415
|
+
} }
|
|
416
|
+
function deadLetterMatchingQueued(state, scope, reason, now) { const remaining = []; for (const item of state.queue) {
|
|
417
|
+
if (scopeMatches(scope, item.action)) {
|
|
418
|
+
addDeadLetter(state, item, `kill switch: ${reason}`, now);
|
|
419
|
+
appendAudit(state, "queue.dead_lettered", item.id, "kill switch stopped queued action", now);
|
|
420
|
+
}
|
|
421
|
+
else
|
|
422
|
+
remaining.push(item);
|
|
423
|
+
} state.queue = remaining; }
|
|
424
|
+
function addDeadLetter(state, item, reason, now) { if (state.deadLetters.length >= MAX_DEAD_LETTERS)
|
|
425
|
+
state.deadLetters.shift(); state.deadLetters.push({ ...item, reason: text(reason, "Safety dead-letter reason", 200), deadLetteredAt: now }); }
|
|
426
|
+
function pruneExpiredLeases(state, now, leaseTtlMs) { const cutoff = Date.parse(now) - leaseTtlMs; state.ledger = state.ledger.filter((entry) => entry.status === "completed" || Date.parse(entry.admittedAt) >= cutoff); }
|
|
427
|
+
function findLedger(state, key) { const entry = state.ledger.find((candidate) => candidate.key === key); if (entry === undefined)
|
|
428
|
+
throw new SafetyControllerError("Safety lease was not found."); return entry; }
|
|
429
|
+
function scopeMatches(scope, action) { return scope.kind === "global" || scope.id === scopeValue(scope.kind, action); }
|
|
430
|
+
function scopeValue(kind, action) { switch (kind) {
|
|
431
|
+
case "organization": return action.organizationId;
|
|
432
|
+
case "project": return action.projectId;
|
|
433
|
+
case "environment": return action.environment;
|
|
434
|
+
case "agent": return action.actorId;
|
|
435
|
+
case "workload": return action.workloadId;
|
|
436
|
+
case "provider": return action.provider;
|
|
437
|
+
case "operation": return action.operation;
|
|
438
|
+
case "risk_class": return action.riskClass;
|
|
439
|
+
} }
|
|
440
|
+
function scopeKey(scope) { return scope.kind === "global" ? "global" : `${scope.kind}:${scope.id}`; }
|
|
441
|
+
function sameScope(left, right) { return left.kind === right.kind && left.id === right.id; }
|
|
442
|
+
function ledgerKey(action) { return `${action.idempotencyKey}:${action.actionHash}`; }
|
|
443
|
+
function sumCosts(values) { return values.reduce((total, value) => ({ monetaryAmountMinor: total.monetaryAmountMinor + value.monetaryAmountMinor, requests: total.requests + value.requests, messages: total.messages + value.messages, mutations: total.mutations + value.mutations, deletes: total.deletes + value.deletes, tokenCost: total.tokenCost + value.tokenCost }), { monetaryAmountMinor: 0, requests: 0, messages: 0, mutations: 0, deletes: 0, tokenCost: 0 }); }
|
|
444
|
+
function appendAudit(state, event, subject, reason, timestampValue, actorPrincipalId) { if (state.audit.length >= MAX_AUDIT)
|
|
445
|
+
throw new SafetyControllerError("Safety audit limit was reached."); const previousHash = state.audit.at(-1)?.recordHash ?? state.auditAnchor; const base = { sequence: state.audit.length + 1, event: text(event, "Safety audit event", 80), subject: text(subject, "Safety audit subject", 300), reason: text(reason, "Safety audit reason", 200), ...(actorPrincipalId === undefined ? {} : { actorPrincipalId: identifier(actorPrincipalId, "Safety audit actor") }), timestamp: timestampValue, previousHash }; state.audit.push({ ...base, recordHash: sha256(canonical(base)) }); }
|
|
446
|
+
function boundedMs(value, label) { return positive(value, label, 30 * 24 * 60 * 60 * 1000); }
|
|
447
|
+
function positive(value, label, max) { if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > max)
|
|
448
|
+
throw new SafetyControllerError(`${label} is invalid.`); return value; }
|
|
449
|
+
function nonNegative(value, label, max) { if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > max)
|
|
450
|
+
throw new SafetyControllerError(`${label} is invalid.`); return value; }
|
|
451
|
+
function bps(value, label) { return nonNegative(value, label, 10_000); }
|
|
452
|
+
function rateBps(count, total) { return total === 0 ? 0 : Math.floor((count * 10_000) / total); }
|
|
453
|
+
function identifier(value, label) { if (typeof value !== "string" || !IDENTIFIER.test(value) || sanitizeSecretString(value) !== value)
|
|
454
|
+
throw new SafetyControllerError(`${label} must be a safe identifier.`); return value; }
|
|
455
|
+
function hash(value, label) { if (typeof value !== "string" || !HASH.test(value))
|
|
456
|
+
throw new SafetyControllerError(`${label} must be a SHA-256 hash.`); return value; }
|
|
457
|
+
function timestamp(value, label) { if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value) || !Number.isFinite(Date.parse(value)))
|
|
458
|
+
throw new SafetyControllerError(`${label} must be an ISO UTC timestamp.`); return value; }
|
|
459
|
+
function text(value, label, max) { if (typeof value !== "string" || value.trim() === "" || value.length > max || /[\u0000-\u001f]/.test(value) || sanitizeSecretString(value) !== value)
|
|
460
|
+
throw new SafetyControllerError(`${label} is invalid.`); return value.trim(); }
|
|
461
|
+
function object(value, message) { if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
462
|
+
throw new SafetyControllerError(message); return value; }
|
|
463
|
+
function array(value, label, max) { if (!Array.isArray(value) || value.length > max)
|
|
464
|
+
throw new SafetyControllerError(`${label} is invalid.`); return value; }
|
|
465
|
+
function exactKeys(value, keys, label, optional = []) { for (const key of Object.keys(value))
|
|
466
|
+
if (!keys.includes(key) || (value[key] === undefined && !optional.includes(key)))
|
|
467
|
+
throw new SafetyControllerError(`${label} contains unsupported field: ${key}`); }
|
|
468
|
+
function unique(values, label) { if (new Set(values).size !== values.length)
|
|
469
|
+
throw new SafetyControllerError(`${label} must be unique.`); }
|
|
470
|
+
function canonical(value) { if (value === null || typeof value === "boolean" || typeof value === "string" || typeof value === "number")
|
|
471
|
+
return JSON.stringify(value); if (Array.isArray(value))
|
|
472
|
+
return `[${value.map(canonical).join(",")}]`; if (typeof value === "object")
|
|
473
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`; throw new SafetyControllerError("Safety data must be JSON."); }
|
|
474
|
+
function sha256(value) { return createHash("sha256").update(value, "utf8").digest("hex"); }
|
|
475
|
+
function clone(value) { return structuredClone(value); }
|
|
476
|
+
function isErrorCode(error, code) { return error instanceof Error && "code" in error && error.code === code; }
|
|
477
|
+
//# sourceMappingURL=safetyController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safetyController.js","sourceRoot":"","sources":["../../src/safety/safetyController.ts"],"names":[],"mappings":"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"}
|