@yiaany/ghostapi 0.1.7 → 0.1.9
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 -181
- 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 +42 -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
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { actionApprovalHash, actionHash, createLocalActionGateway, createSyntheticActionAdapter, validateActionApproval, validateActionEnvelope } from "../actions/index.js";
|
|
5
|
+
import { getDataPaths } from "../config/dataPaths.js";
|
|
6
|
+
import { sanitizeSecretString } from "../security/secrets.js";
|
|
7
|
+
import { atomicWriteJson, ensurePrivateDirectory, withFileLock } from "../storage/fileStore.js";
|
|
8
|
+
const SCHEMA_VERSION = 1;
|
|
9
|
+
const MAX_STORE_BYTES = 1024 * 1024;
|
|
10
|
+
const MAX_REQUESTS = 1_000;
|
|
11
|
+
const MAX_DECISIONS = 4;
|
|
12
|
+
const MAX_AUDIT = 10_000;
|
|
13
|
+
const IDENTIFIER = /^[a-z0-9][a-z0-9._-]{0,127}$/;
|
|
14
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
15
|
+
export class ApprovalInboxError extends Error {
|
|
16
|
+
constructor(message) { super(message); this.name = "ApprovalInboxError"; }
|
|
17
|
+
}
|
|
18
|
+
export function createLocalApprovalInbox(options) {
|
|
19
|
+
return new LocalApprovalInbox(options);
|
|
20
|
+
}
|
|
21
|
+
export function createApprovalInboxExecutionFlow(options) {
|
|
22
|
+
return new LocalApprovalInbox(options);
|
|
23
|
+
}
|
|
24
|
+
export class LocalApprovalInbox {
|
|
25
|
+
path;
|
|
26
|
+
now;
|
|
27
|
+
approverVerifier;
|
|
28
|
+
approvalSigner;
|
|
29
|
+
actionGateway;
|
|
30
|
+
onExecutionCheckpoint;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.path = options.path ?? getDataPaths().approvals;
|
|
33
|
+
this.now = options.now ?? (() => new Date());
|
|
34
|
+
this.approverVerifier = options.approverVerifier;
|
|
35
|
+
this.approvalSigner = options.approvalSigner;
|
|
36
|
+
this.onExecutionCheckpoint = options.testing?.onExecutionCheckpoint;
|
|
37
|
+
const inboxVerifier = {
|
|
38
|
+
verify: async (action, approvalValue, context) => {
|
|
39
|
+
const verified = await options.approvalVerifier.verify(action, approvalValue, context);
|
|
40
|
+
const approval = validateActionApproval(approvalValue);
|
|
41
|
+
const state = await this.read();
|
|
42
|
+
const request = state.requests.find((candidate) => candidate.id === approval.approvalId);
|
|
43
|
+
const active = request?.status === "executing" || (request?.status === "executed" && request.executionReceiptHash !== undefined);
|
|
44
|
+
if (request === undefined || !active || request.consumedAt === undefined || request.artifact === undefined || request.actionHash !== actionHash(action) || actionApprovalHash(request.artifact) !== actionApprovalHash(approval))
|
|
45
|
+
throw new ApprovalInboxError("Approval inbox provenance is not active for execution.");
|
|
46
|
+
return { ...verified, approvalInboxRequestId: request.id };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
this.actionGateway = createLocalActionGateway({ ...options.actionGatewayOptions, now: this.now, approvalVerifier: inboxVerifier });
|
|
50
|
+
}
|
|
51
|
+
async request(actionValue, policyValue, contextValue) {
|
|
52
|
+
const action = validateActionEnvelope(actionValue);
|
|
53
|
+
const policy = validatePolicy(policyValue);
|
|
54
|
+
const context = validateContext(contextValue);
|
|
55
|
+
const now = this.timestamp();
|
|
56
|
+
if (Date.parse(action.expiresAt) <= Date.parse(now))
|
|
57
|
+
throw new ApprovalInboxError("Action has expired.");
|
|
58
|
+
await createSyntheticActionAdapter().plan(action);
|
|
59
|
+
await createSyntheticActionAdapter().simulate(action);
|
|
60
|
+
return this.mutate((state, timestamp) => {
|
|
61
|
+
refresh(state, timestamp);
|
|
62
|
+
const actionDigest = actionHash(action);
|
|
63
|
+
const existing = state.requests.find((request) => request.actionHash === actionDigest && request.status !== "superseded");
|
|
64
|
+
if (existing !== undefined)
|
|
65
|
+
return clone(existing);
|
|
66
|
+
const decision = evaluate(policy, action, context, state.requests, timestamp);
|
|
67
|
+
if (!decision.allowed)
|
|
68
|
+
throw new ApprovalInboxError(`Approval policy denies this action: ${decision.reasons.join("; ")}`);
|
|
69
|
+
const expiresAt = new Date(Math.min(Date.parse(action.expiresAt), Date.parse(timestamp) + policy.approvalTtlMs)).toISOString();
|
|
70
|
+
const request = {
|
|
71
|
+
id: identifier(`approval-${randomUUID().replace(/-/g, "")}`, "Approval request id"), action, actionHash: actionDigest, risk: classify(action), context,
|
|
72
|
+
policy: { id: policy.id, version: policy.version, hash: policyHash(policy), requiredApprovals: decision.requiredApprovals },
|
|
73
|
+
display: display(action, context, decision.reasons), status: "pending", createdAt: timestamp, expiresAt,
|
|
74
|
+
escalationAt: new Date(Date.parse(timestamp) + policy.escalationTimeoutMs).toISOString(), decisions: []
|
|
75
|
+
};
|
|
76
|
+
state.requests.push(request);
|
|
77
|
+
appendAudit(state, "request.created", request, action.actor.id, timestamp);
|
|
78
|
+
return clone(request);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async approve(requestIdValue, identity) {
|
|
82
|
+
const approver = await this.approverVerifier.authenticate(identity);
|
|
83
|
+
const requestId = identifier(requestIdValue, "Approval request id");
|
|
84
|
+
return this.mutate(async (state, now) => {
|
|
85
|
+
refresh(state, now);
|
|
86
|
+
const request = findRequest(state, requestId);
|
|
87
|
+
requirePending(request);
|
|
88
|
+
assertIndependent(request, approver);
|
|
89
|
+
if (request.decisions.some((decision) => decision.kind === "approve" && (decision.approverId === approver.id || decision.principalId === approver.principalId || decision.independenceKey === approver.independenceKey)))
|
|
90
|
+
throw new ApprovalInboxError("An independent approver can approve this action only once.");
|
|
91
|
+
const decision = { id: identifier(`decision-${randomUUID().replace(/-/g, "")}`, "Approval decision id"), kind: "approve", approverId: approver.id, principalId: approver.principalId, independenceKey: approver.independenceKey, decidedAt: now };
|
|
92
|
+
request.decisions.push(decision);
|
|
93
|
+
appendAudit(state, "request.approved", request, approver.id, now);
|
|
94
|
+
if (request.decisions.filter((entry) => entry.kind === "approve").length >= request.policy.requiredApprovals) {
|
|
95
|
+
request.status = "approved";
|
|
96
|
+
request.artifact = await createArtifact(request, now, this.approvalSigner);
|
|
97
|
+
appendAudit(state, "artifact.issued", request, "approval-inbox", now);
|
|
98
|
+
}
|
|
99
|
+
return clone(request);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async reject(requestIdValue, identity, reasonValue) {
|
|
103
|
+
return this.decideTerminal(requestIdValue, identity, reasonValue, "reject");
|
|
104
|
+
}
|
|
105
|
+
async revoke(requestIdValue, identity, reasonValue) {
|
|
106
|
+
return this.decideTerminal(requestIdValue, identity, reasonValue, "revoke");
|
|
107
|
+
}
|
|
108
|
+
async editAndResubmit(requestIdValue, identity, replacementAction, policy, context) {
|
|
109
|
+
const approver = await this.approverVerifier.authenticate(identity);
|
|
110
|
+
const requestId = identifier(requestIdValue, "Approval request id");
|
|
111
|
+
const old = await this.mutate((state, now) => {
|
|
112
|
+
refresh(state, now);
|
|
113
|
+
const request = findRequest(state, requestId);
|
|
114
|
+
if (request.status === "executing" || request.status === "executed" || request.consumedAt !== undefined)
|
|
115
|
+
throw new ApprovalInboxError("Executed or executing approvals cannot be edited.");
|
|
116
|
+
request.status = "superseded";
|
|
117
|
+
appendAudit(state, "request.superseded", request, approver.id, now);
|
|
118
|
+
return clone(request);
|
|
119
|
+
});
|
|
120
|
+
const next = await this.request(replacementAction, policy, context);
|
|
121
|
+
if (next.actionHash === old.actionHash)
|
|
122
|
+
throw new ApprovalInboxError("Edit-and-resubmit requires changed normalized action arguments.");
|
|
123
|
+
return this.mutate((state) => {
|
|
124
|
+
const request = findRequest(state, next.id);
|
|
125
|
+
request.supersedesRequestId = old.id;
|
|
126
|
+
return clone(request);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async execute(requestIdValue, identity, actionPolicy, policyValue) {
|
|
130
|
+
const requestId = identifier(requestIdValue, "Approval request id");
|
|
131
|
+
const policy = validatePolicy(policyValue);
|
|
132
|
+
return withFileLock(this.path, async () => {
|
|
133
|
+
const state = await this.read();
|
|
134
|
+
const now = this.timestamp();
|
|
135
|
+
refresh(state, now);
|
|
136
|
+
const request = findRequest(state, requestId);
|
|
137
|
+
if ((request.status !== "approved" && request.status !== "executing" && request.status !== "executed") || request.artifact === undefined)
|
|
138
|
+
throw new ApprovalInboxError("Approval is not active for execution.");
|
|
139
|
+
if (request.policy.id !== policy.id || request.policy.version !== policy.version || request.policy.hash !== policyHash(policy))
|
|
140
|
+
throw new ApprovalInboxError("Approval policy changed after approval.");
|
|
141
|
+
const decision = evaluate(policy, request.action, request.context, state.requests, now, request.id);
|
|
142
|
+
if (!decision.allowed || decision.requiredApprovals !== request.policy.requiredApprovals)
|
|
143
|
+
throw new ApprovalInboxError("Current approval policy no longer authorizes execution.");
|
|
144
|
+
if (identity.actorId !== request.action.actor.id || identity.workloadId !== request.action.actor.workloadId)
|
|
145
|
+
throw new ApprovalInboxError("Execution identity does not match the approved action.");
|
|
146
|
+
if (request.status === "executed") {
|
|
147
|
+
const receipt = await this.actionGateway.execute(request.action, identity, actionPolicy);
|
|
148
|
+
if (receipt.status !== "verified" || receipt.receiptHash !== request.executionReceiptHash)
|
|
149
|
+
throw new ApprovalInboxError("Executed approval does not match its durable action receipt.");
|
|
150
|
+
return receipt;
|
|
151
|
+
}
|
|
152
|
+
if (request.status === "approved") {
|
|
153
|
+
if (request.consumedAt !== undefined)
|
|
154
|
+
throw new ApprovalInboxError("Approval consumption state is invalid.");
|
|
155
|
+
request.consumedAt = now;
|
|
156
|
+
request.status = "executing";
|
|
157
|
+
appendAudit(state, "artifact.consumed", request, identity.actorId, now);
|
|
158
|
+
await this.write(state);
|
|
159
|
+
}
|
|
160
|
+
else if (request.consumedAt === undefined) {
|
|
161
|
+
throw new ApprovalInboxError("Approval consumption state is invalid.");
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
await this.onExecutionCheckpoint?.("inbox-executing");
|
|
165
|
+
await this.actionGateway.submit(request.action, request.artifact, actionPolicy);
|
|
166
|
+
await this.onExecutionCheckpoint?.("gateway-submitted");
|
|
167
|
+
const receipt = await this.actionGateway.execute(request.action, identity, actionPolicy);
|
|
168
|
+
await this.onExecutionCheckpoint?.("gateway-verified");
|
|
169
|
+
request.status = "executed";
|
|
170
|
+
request.executionReceiptHash = receipt.receiptHash;
|
|
171
|
+
appendAudit(state, "execution.verified", request, identity.actorId, this.timestamp(), receipt.receiptHash);
|
|
172
|
+
await this.write(state);
|
|
173
|
+
return receipt;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
const failedReceipt = await this.latestDurableFailedReceipt(request.action.actionId);
|
|
177
|
+
if (failedReceipt !== undefined) {
|
|
178
|
+
request.status = "execution_failed";
|
|
179
|
+
appendAudit(state, "execution.failed", request, identity.actorId, this.timestamp(), failedReceipt.receiptHash);
|
|
180
|
+
await this.write(state);
|
|
181
|
+
}
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async get(requestIdValue) {
|
|
187
|
+
const requestId = identifier(requestIdValue, "Approval request id");
|
|
188
|
+
return this.mutate((state, now) => { refresh(state, now); return clone(findRequest(state, requestId)); });
|
|
189
|
+
}
|
|
190
|
+
async list(status) {
|
|
191
|
+
return this.mutate((state, now) => { refresh(state, now); return state.requests.filter((request) => status === undefined || request.status === status).map(clone); });
|
|
192
|
+
}
|
|
193
|
+
async readStateForTesting() { return this.read(); }
|
|
194
|
+
async decideTerminal(requestIdValue, identity, reasonValue, kind) {
|
|
195
|
+
const approver = await this.approverVerifier.authenticate(identity);
|
|
196
|
+
const requestId = identifier(requestIdValue, "Approval request id");
|
|
197
|
+
const reason = text(reasonValue, "Approval decision reason", 200);
|
|
198
|
+
return this.mutate((state, now) => {
|
|
199
|
+
refresh(state, now);
|
|
200
|
+
const request = findRequest(state, requestId);
|
|
201
|
+
if (request.status === "executing" || request.status === "executed" || request.status === "execution_failed")
|
|
202
|
+
throw new ApprovalInboxError("Execution has already started; approval cannot be revoked.");
|
|
203
|
+
if (request.status !== "pending" && request.status !== "approved")
|
|
204
|
+
throw new ApprovalInboxError("Approval is not active.");
|
|
205
|
+
const decision = { id: identifier(`decision-${randomUUID().replace(/-/g, "")}`, "Approval decision id"), kind, approverId: approver.id, principalId: approver.principalId, independenceKey: approver.independenceKey, reason, decidedAt: now };
|
|
206
|
+
request.decisions.push(decision);
|
|
207
|
+
request.status = kind === "reject" ? "rejected" : "revoked";
|
|
208
|
+
appendAudit(state, kind === "reject" ? "request.rejected" : "request.revoked", request, approver.id, now);
|
|
209
|
+
return clone(request);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
async read() {
|
|
213
|
+
await ensurePrivateDirectory(dirname(this.path));
|
|
214
|
+
const info = await lstat(this.path).catch((error) => isErrorCode(error, "ENOENT") ? null : Promise.reject(error));
|
|
215
|
+
if (info === null)
|
|
216
|
+
return emptyState();
|
|
217
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
218
|
+
throw new ApprovalInboxError("Approval inbox store must be a regular non-symlink file.");
|
|
219
|
+
const source = await readFile(this.path, "utf8");
|
|
220
|
+
if (Buffer.byteLength(source, "utf8") > MAX_STORE_BYTES)
|
|
221
|
+
throw new ApprovalInboxError("Approval inbox store exceeds its size limit.");
|
|
222
|
+
try {
|
|
223
|
+
return validateState(JSON.parse(source));
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (error instanceof ApprovalInboxError)
|
|
227
|
+
throw error;
|
|
228
|
+
throw new ApprovalInboxError("Approval inbox store is not valid JSON.");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async mutate(operation) {
|
|
232
|
+
return withFileLock(this.path, async () => { const state = await this.read(); const result = await operation(state, this.timestamp()); await this.write(state); return result; });
|
|
233
|
+
}
|
|
234
|
+
async write(state) { await atomicWriteJson(this.path, validateState(state)); }
|
|
235
|
+
async latestDurableFailedReceipt(actionId) {
|
|
236
|
+
try {
|
|
237
|
+
const record = await this.actionGateway.inspect(actionId);
|
|
238
|
+
return [...record.receipts].reverse().find((receipt) => receipt.status === "failed");
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
timestamp() { const value = this.now(); if (!(value instanceof Date) || !Number.isFinite(value.getTime()))
|
|
245
|
+
throw new ApprovalInboxError("Approval inbox clock is invalid."); return value.toISOString(); }
|
|
246
|
+
}
|
|
247
|
+
export function createTestApprovalApproverVerifier() {
|
|
248
|
+
const issued = new WeakSet();
|
|
249
|
+
return {
|
|
250
|
+
verifier: { async authenticate(identity) { if (identity === null || typeof identity !== "object" || !issued.has(identity))
|
|
251
|
+
throw new ApprovalInboxError("Approver identity is not authenticated."); return validateApprover(identity); } },
|
|
252
|
+
issue(input) { const result = Object.freeze(validateApprover({ ...input, principalId: input.principalId ?? input.id })); issued.add(result); return result; }
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
export function approvalPolicyHash(value) { return policyHash(validatePolicy(value)); }
|
|
256
|
+
function emptyState() { return { schemaVersion: 1, requests: [], auditAnchor: sha256("ghostapi.approval.audit.v1"), audit: [] }; }
|
|
257
|
+
function validateState(value) {
|
|
258
|
+
const state = object(value, "Approval inbox store must be an object.");
|
|
259
|
+
exactKeys(state, ["schemaVersion", "requests", "auditAnchor", "audit"], "Approval inbox store");
|
|
260
|
+
if (state.schemaVersion !== 1)
|
|
261
|
+
throw new ApprovalInboxError("Unsupported approval inbox schema version.");
|
|
262
|
+
const requests = array(state.requests, "Approval requests", MAX_REQUESTS).map(validateRequest);
|
|
263
|
+
unique(requests.map((request) => request.id), "Approval request ids");
|
|
264
|
+
unique(requests.map((request) => request.actionHash), "Approval action hashes");
|
|
265
|
+
const anchor = hash(state.auditAnchor, "Approval audit anchor");
|
|
266
|
+
const audit = array(state.audit, "Approval audit", MAX_AUDIT).map(validateAudit);
|
|
267
|
+
validateAuditChain(anchor, audit);
|
|
268
|
+
return { schemaVersion: 1, requests, auditAnchor: anchor, audit };
|
|
269
|
+
}
|
|
270
|
+
function validateRequest(value) {
|
|
271
|
+
const request = object(value, "Approval request is invalid.");
|
|
272
|
+
exactKeys(request, ["id", "action", "actionHash", "risk", "context", "policy", "display", "status", "createdAt", "expiresAt", "escalationAt", "decisions", "artifact", "consumedAt", "executionReceiptHash", "supersedesRequestId"], "Approval request", ["artifact", "consumedAt", "executionReceiptHash", "supersedesRequestId"]);
|
|
273
|
+
const action = validateActionEnvelope(request.action);
|
|
274
|
+
const actionDigest = hash(request.actionHash, "Approval action hash");
|
|
275
|
+
if (actionHash(action) !== actionDigest || classify(action) !== risk(request.risk))
|
|
276
|
+
throw new ApprovalInboxError("Approval request action is invalid.");
|
|
277
|
+
const context = validateContext(request.context);
|
|
278
|
+
const policy = policyRecord(request.policy);
|
|
279
|
+
const displayValue = displayRecord(request.display, action, context);
|
|
280
|
+
const decisions = array(request.decisions, "Approval decisions", MAX_DECISIONS).map(validateDecision);
|
|
281
|
+
const createdAt = timestamp(request.createdAt, "Approval creation time");
|
|
282
|
+
const expiresAt = timestamp(request.expiresAt, "Approval expiry");
|
|
283
|
+
const escalationAt = timestamp(request.escalationAt, "Approval escalation time");
|
|
284
|
+
if (!validStatus(request.status) || Date.parse(expiresAt) <= Date.parse(createdAt) || Date.parse(escalationAt) > Date.parse(expiresAt))
|
|
285
|
+
throw new ApprovalInboxError("Approval request lifecycle is invalid.");
|
|
286
|
+
const artifact = request.artifact === undefined ? undefined : validateArtifact(request.artifact, actionDigest);
|
|
287
|
+
if ((request.status === "approved" || request.status === "executing" || request.status === "executed" || request.status === "execution_failed") && artifact === undefined)
|
|
288
|
+
throw new ApprovalInboxError("Approved requests require an approval artifact.");
|
|
289
|
+
const consumedAt = request.consumedAt === undefined ? undefined : timestamp(request.consumedAt, "Approval consumption time");
|
|
290
|
+
if ((request.status === "executing" || request.status === "executed" || request.status === "execution_failed") && consumedAt === undefined)
|
|
291
|
+
throw new ApprovalInboxError("Executed approvals require consumption metadata.");
|
|
292
|
+
const executionReceiptHash = request.executionReceiptHash === undefined ? undefined : hash(request.executionReceiptHash, "Approval execution receipt hash");
|
|
293
|
+
if (request.status === "executed" && executionReceiptHash === undefined)
|
|
294
|
+
throw new ApprovalInboxError("Executed approvals require an action receipt hash.");
|
|
295
|
+
return { id: identifier(request.id, "Approval request id"), action, actionHash: actionDigest, risk: risk(request.risk), context, policy, display: displayValue, status: request.status, createdAt, expiresAt, escalationAt, decisions, ...(artifact === undefined ? {} : { artifact }), ...(consumedAt === undefined ? {} : { consumedAt }), ...(executionReceiptHash === undefined ? {} : { executionReceiptHash }), ...(request.supersedesRequestId === undefined ? {} : { supersedesRequestId: identifier(request.supersedesRequestId, "Superseded approval request id") }) };
|
|
296
|
+
}
|
|
297
|
+
function validateAudit(value) {
|
|
298
|
+
const record = object(value, "Approval audit record is invalid.");
|
|
299
|
+
exactKeys(record, ["sequence", "event", "requestId", "actionHash", "actionReceiptHash", "actorId", "timestamp", "previousHash", "recordHash"], "Approval audit record", ["actionReceiptHash"]);
|
|
300
|
+
const base = { sequence: positive(record.sequence, "Approval audit sequence"), event: text(record.event, "Approval audit event", 80), requestId: identifier(record.requestId, "Approval audit request id"), actionHash: hash(record.actionHash, "Approval audit action hash"), ...(record.actionReceiptHash === undefined ? {} : { actionReceiptHash: hash(record.actionReceiptHash, "Approval audit receipt hash") }), actorId: identifier(record.actorId, "Approval audit actor id"), timestamp: timestamp(record.timestamp, "Approval audit timestamp"), previousHash: hash(record.previousHash, "Approval audit previous hash") };
|
|
301
|
+
if (hash(record.recordHash, "Approval audit record hash") !== sha256(canonical(base)))
|
|
302
|
+
throw new ApprovalInboxError("Approval audit record hash is invalid.");
|
|
303
|
+
return { ...base, recordHash: record.recordHash };
|
|
304
|
+
}
|
|
305
|
+
function validateAuditChain(anchor, audit) { let previous = anchor; let sequence = 1; for (const record of audit) {
|
|
306
|
+
if (record.sequence !== sequence || record.previousHash !== previous)
|
|
307
|
+
throw new ApprovalInboxError("Approval audit chain is invalid.");
|
|
308
|
+
previous = record.recordHash;
|
|
309
|
+
sequence += 1;
|
|
310
|
+
} }
|
|
311
|
+
function validatePolicy(value) {
|
|
312
|
+
const policy = object(value, "Approval policy is invalid.");
|
|
313
|
+
exactKeys(policy, ["schemaVersion", "kind", "id", "version", "allowedEnvironments", "allowedActors", "allowedResources", "maxAmountMinor", "minimumConfidence", "criticalRisks", "velocity", "approvalTtlMs", "escalationTimeoutMs"], "Approval policy", ["allowedActors", "allowedResources", "maxAmountMinor"]);
|
|
314
|
+
if (policy.schemaVersion !== 1 || policy.kind !== "ghostapi.approval-policy")
|
|
315
|
+
throw new ApprovalInboxError("Unsupported approval policy schema.");
|
|
316
|
+
const velocity = object(policy.velocity, "Approval velocity policy is invalid.");
|
|
317
|
+
exactKeys(velocity, ["maxActions", "windowMs"], "Approval velocity policy");
|
|
318
|
+
const result = { schemaVersion: 1, kind: "ghostapi.approval-policy", id: identifier(policy.id, "Approval policy id"), version: positive(policy.version, "Approval policy version"), allowedEnvironments: identifiers(policy.allowedEnvironments, "Approval allowed environments"), ...(policy.allowedActors === undefined ? {} : { allowedActors: identifiers(policy.allowedActors, "Approval allowed actors") }), ...(policy.allowedResources === undefined ? {} : { allowedResources: identifiers(policy.allowedResources, "Approval allowed resources") }), ...(policy.maxAmountMinor === undefined ? {} : { maxAmountMinor: nonNegative(policy.maxAmountMinor, "Approval max amount") }), minimumConfidence: percentage(policy.minimumConfidence, "Approval minimum confidence"), criticalRisks: risks(policy.criticalRisks), velocity: { maxActions: positive(velocity.maxActions, "Approval velocity maximum"), windowMs: boundedMs(velocity.windowMs, "Approval velocity window") }, approvalTtlMs: boundedMs(policy.approvalTtlMs, "Approval TTL"), escalationTimeoutMs: boundedMs(policy.escalationTimeoutMs, "Approval escalation timeout") };
|
|
319
|
+
if (result.escalationTimeoutMs > result.approvalTtlMs)
|
|
320
|
+
throw new ApprovalInboxError("Approval escalation timeout cannot exceed approval TTL.");
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
function evaluate(policy, action, context, history, now, currentId) {
|
|
324
|
+
const reasons = [];
|
|
325
|
+
const actionRisk = classify(action);
|
|
326
|
+
if (!policy.allowedEnvironments.includes(action.project.environment))
|
|
327
|
+
reasons.push("environment is not approved");
|
|
328
|
+
if (policy.allowedActors !== undefined && !policy.allowedActors.includes(action.actor.id))
|
|
329
|
+
reasons.push("actor is not approved");
|
|
330
|
+
if (policy.allowedResources !== undefined && !policy.allowedResources.includes(action.resource.id))
|
|
331
|
+
reasons.push("resource is not approved");
|
|
332
|
+
if (policy.maxAmountMinor !== undefined && (context.amountMinor === undefined || context.amountMinor > policy.maxAmountMinor))
|
|
333
|
+
reasons.push("amount is missing or exceeds the policy limit");
|
|
334
|
+
const cutoff = Date.parse(now) - policy.velocity.windowMs;
|
|
335
|
+
if (history.filter((request) => request.id !== currentId && request.action.actor.id === action.actor.id && Date.parse(request.createdAt) >= cutoff && request.status !== "superseded").length >= policy.velocity.maxActions)
|
|
336
|
+
reasons.push("action velocity limit was reached");
|
|
337
|
+
const requiredApprovals = policy.criticalRisks.includes(actionRisk) || context.confidence < policy.minimumConfidence ? 2 : 1;
|
|
338
|
+
reasons.push(requiredApprovals === 2 ? "independent two-person approval is required" : "independent human approval is required");
|
|
339
|
+
return { allowed: reasons.length === 1, requiredApprovals, reasons };
|
|
340
|
+
}
|
|
341
|
+
function display(action, context, policyReason) { return { intent: "Update a local synthetic subscription failure workflow.", target: `${action.resource.type}/${action.resource.id}`, normalizedArgumentDiff: { before: {}, after: clone(action.arguments) }, expectedSideEffects: [...action.expectedSideEffects], reversibility: action.reversibility, impact: { amountMinor: context.amountMinor ?? null, amountKnown: context.amountMinor !== undefined, irreversible: action.reversibility === "none" }, policyReason, evidenceHash: action.evidence.hash, simulation: { status: "passed", summary: "Synthetic adapter preflight found the local target world." } }; }
|
|
342
|
+
function displayRecord(value, action, context) { const candidate = object(value, "Approval display is invalid."); exactKeys(candidate, ["intent", "target", "normalizedArgumentDiff", "expectedSideEffects", "reversibility", "impact", "policyReason", "evidenceHash", "simulation"], "Approval display"); const generated = display(action, context, array(candidate.policyReason, "Approval policy reason", 16).map((item) => text(item, "Approval policy reason", 200))); if (canonical(candidate) !== canonical(generated))
|
|
343
|
+
throw new ApprovalInboxError("Approval display does not match normalized action data."); return generated; }
|
|
344
|
+
async function createArtifact(request, now, signer) { return signer.issue({ schemaVersion: 1, kind: "ghostapi.action-approval", approvalId: request.id, actionHash: request.actionHash, approvedBy: "approval-inbox", approvedAt: now, expiresAt: request.expiresAt, nonce: `inbox-${request.actionHash.slice(0, 32)}` }); }
|
|
345
|
+
function validateArtifact(value, actionDigest) { const artifact = object(value, "Approval artifact is invalid."); exactKeys(artifact, ["schemaVersion", "kind", "approvalId", "actionHash", "approvedBy", "approvedAt", "expiresAt", "nonce", "provenance"], "Approval artifact"); if (artifact.schemaVersion !== 1 || artifact.kind !== "ghostapi.action-approval" || artifact.actionHash !== actionDigest || artifact.approvedBy !== "approval-inbox")
|
|
346
|
+
throw new ApprovalInboxError("Approval artifact is invalid."); const provenance = object(artifact.provenance, "Approval artifact provenance is invalid."); exactKeys(provenance, ["kind", "keyId", "signature"], "Approval artifact provenance"); if (provenance.kind !== "ghostapi.ed25519-signature" || typeof provenance.signature !== "string" || !/^[A-Za-z0-9_-]{86}$/.test(provenance.signature))
|
|
347
|
+
throw new ApprovalInboxError("Approval artifact provenance is invalid."); return { schemaVersion: 1, kind: "ghostapi.action-approval", approvalId: identifier(artifact.approvalId, "Approval artifact id"), actionHash: actionDigest, approvedBy: "approval-inbox", approvedAt: timestamp(artifact.approvedAt, "Approval artifact issue time"), expiresAt: timestamp(artifact.expiresAt, "Approval artifact expiry"), nonce: identifier(artifact.nonce, "Approval artifact nonce"), provenance: { kind: "ghostapi.ed25519-signature", keyId: identifier(provenance.keyId, "Approval artifact key id"), signature: provenance.signature } }; }
|
|
348
|
+
function policyRecord(value) { const policy = object(value, "Approval policy record is invalid."); exactKeys(policy, ["id", "version", "hash", "requiredApprovals"], "Approval policy record"); const requiredApprovals = policy.requiredApprovals; if (requiredApprovals !== 1 && requiredApprovals !== 2)
|
|
349
|
+
throw new ApprovalInboxError("Approval requirement is invalid."); return { id: identifier(policy.id, "Approval policy id"), version: positive(policy.version, "Approval policy version"), hash: hash(policy.hash, "Approval policy hash"), requiredApprovals }; }
|
|
350
|
+
function validateContext(value) { const context = object(value, "Approval context is invalid."); exactKeys(context, ["confidence", "amountMinor"], "Approval context", ["amountMinor"]); return { confidence: percentage(context.confidence, "Approval confidence"), ...(context.amountMinor === undefined ? {} : { amountMinor: nonNegative(context.amountMinor, "Approval amount") }) }; }
|
|
351
|
+
function validateApprover(value) { const approver = object(value, "Approver identity is invalid."); exactKeys(approver, ["id", "principalId", "independenceKey"], "Approver identity"); return { id: identifier(approver.id, "Approver id"), principalId: identifier(approver.principalId, "Approver principal id"), independenceKey: identifier(approver.independenceKey, "Approver independence key") }; }
|
|
352
|
+
function validateDecision(value) { const decision = object(value, "Approval decision is invalid."); exactKeys(decision, ["id", "kind", "approverId", "principalId", "independenceKey", "reason", "decidedAt"], "Approval decision", ["reason"]); if (decision.kind !== "approve" && decision.kind !== "reject" && decision.kind !== "revoke")
|
|
353
|
+
throw new ApprovalInboxError("Approval decision kind is invalid."); return { id: identifier(decision.id, "Approval decision id"), kind: decision.kind, approverId: identifier(decision.approverId, "Approver id"), principalId: identifier(decision.principalId, "Approver principal id"), independenceKey: identifier(decision.independenceKey, "Approver independence key"), ...(decision.reason === undefined ? {} : { reason: text(decision.reason, "Approval decision reason", 200) }), decidedAt: timestamp(decision.decidedAt, "Approval decision time") }; }
|
|
354
|
+
function appendAudit(state, event, request, actorId, timestampValue, actionReceiptHash) { const previous = state.audit.at(-1)?.recordHash ?? state.auditAnchor; const base = { sequence: state.audit.length + 1, event, requestId: request.id, actionHash: request.actionHash, ...(actionReceiptHash === undefined ? {} : { actionReceiptHash }), actorId: identifier(actorId, "Approval audit actor id"), timestamp: timestampValue, previousHash: previous }; state.audit.push({ ...base, recordHash: sha256(canonical(base)) }); }
|
|
355
|
+
function refresh(state, now) { for (const request of state.requests) {
|
|
356
|
+
if (request.status === "pending" && Date.parse(now) >= Date.parse(request.escalationAt)) {
|
|
357
|
+
request.status = "timed_out";
|
|
358
|
+
appendAudit(state, "request.timed_out", request, "approval-inbox", now);
|
|
359
|
+
}
|
|
360
|
+
else if ((request.status === "pending" || request.status === "approved") && Date.parse(now) >= Date.parse(request.expiresAt)) {
|
|
361
|
+
request.status = "expired";
|
|
362
|
+
appendAudit(state, "request.expired", request, "approval-inbox", now);
|
|
363
|
+
}
|
|
364
|
+
} }
|
|
365
|
+
function classify(action) { if (action.provider === "ghostapi-synthetic" && action.operation === "synthetic.subscription_failure")
|
|
366
|
+
return "update"; throw new ApprovalInboxError("No approval risk taxonomy rule exists for this action."); }
|
|
367
|
+
function risk(value) { if (value !== "read" && value !== "create" && value !== "update" && value !== "communicate" && value !== "money_movement" && value !== "delete" && value !== "permission_change" && value !== "deployment")
|
|
368
|
+
throw new ApprovalInboxError("Approval risk is invalid."); return value; }
|
|
369
|
+
function risks(value) { const parsed = array(value, "Approval critical risks", 8).map(risk); unique(parsed, "Approval critical risks"); return parsed.sort(); }
|
|
370
|
+
function requirePending(request) { if (request.status !== "pending")
|
|
371
|
+
throw new ApprovalInboxError("Approval is not pending."); }
|
|
372
|
+
function assertIndependent(request, approver) { if (approver.id === request.action.actor.id || approver.principalId === request.action.actor.id || approver.principalId === request.action.actor.workloadId || approver.independenceKey === request.action.actor.id || approver.independenceKey === request.action.actor.workloadId)
|
|
373
|
+
throw new ApprovalInboxError("Action workload cannot approve its own action."); }
|
|
374
|
+
function findRequest(state, requestId) { const request = state.requests.find((candidate) => candidate.id === requestId); if (request === undefined)
|
|
375
|
+
throw new ApprovalInboxError("Approval request was not found."); return request; }
|
|
376
|
+
function validStatus(value) { return value === "pending" || value === "approved" || value === "rejected" || value === "revoked" || value === "timed_out" || value === "expired" || value === "executing" || value === "executed" || value === "execution_failed" || value === "superseded"; }
|
|
377
|
+
function policyHash(policy) { return sha256(canonical(policy)); }
|
|
378
|
+
function canonical(value) { if (value === null || typeof value === "boolean" || typeof value === "string" || typeof value === "number")
|
|
379
|
+
return JSON.stringify(value); if (Array.isArray(value))
|
|
380
|
+
return `[${value.map(canonical).join(",")}]`; if (typeof value === "object")
|
|
381
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`; throw new ApprovalInboxError("Approval data must be JSON."); }
|
|
382
|
+
function sha256(value) { return createHash("sha256").update(value, "utf8").digest("hex"); }
|
|
383
|
+
function identifier(value, label) { if (typeof value !== "string" || !IDENTIFIER.test(value) || sanitizeSecretString(value) !== value)
|
|
384
|
+
throw new ApprovalInboxError(`${label} must be a safe identifier.`); return value; }
|
|
385
|
+
function hash(value, label) { if (typeof value !== "string" || !HASH.test(value))
|
|
386
|
+
throw new ApprovalInboxError(`${label} must be a SHA-256 hash.`); return value; }
|
|
387
|
+
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)))
|
|
388
|
+
throw new ApprovalInboxError(`${label} must be an ISO UTC timestamp.`); return value; }
|
|
389
|
+
function positive(value, label) { if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > 100_000)
|
|
390
|
+
throw new ApprovalInboxError(`${label} is invalid.`); return value; }
|
|
391
|
+
function nonNegative(value, label) { if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > Number.MAX_SAFE_INTEGER)
|
|
392
|
+
throw new ApprovalInboxError(`${label} is invalid.`); return value; }
|
|
393
|
+
function percentage(value, label) { if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > 100)
|
|
394
|
+
throw new ApprovalInboxError(`${label} must be an integer from 0 to 100.`); return value; }
|
|
395
|
+
function boundedMs(value, label) { if (typeof value !== "number" || !Number.isInteger(value) || value < 1_000 || value > 24 * 60 * 60 * 1000)
|
|
396
|
+
throw new ApprovalInboxError(`${label} is invalid.`); return value; }
|
|
397
|
+
function text(value, label, max) { if (typeof value !== "string" || value.trim() === "" || value.length > max || /[\u0000-\u001f]/.test(value) || sanitizeSecretString(value) !== value)
|
|
398
|
+
throw new ApprovalInboxError(`${label} is invalid.`); return value.trim(); }
|
|
399
|
+
function identifiers(value, label) { const result = array(value, label, 100).map((entry) => identifier(entry, label)); if (result.length === 0)
|
|
400
|
+
throw new ApprovalInboxError(`${label} must not be empty.`); unique(result, label); return result.sort(); }
|
|
401
|
+
function object(value, message) { if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
402
|
+
throw new ApprovalInboxError(message); return value; }
|
|
403
|
+
function array(value, label, max) { if (!Array.isArray(value) || value.length > max)
|
|
404
|
+
throw new ApprovalInboxError(`${label} is invalid.`); return value; }
|
|
405
|
+
function exactKeys(value, keys, label, optional = []) { for (const key of Object.keys(value))
|
|
406
|
+
if (!keys.includes(key) || (value[key] === undefined && !optional.includes(key)))
|
|
407
|
+
throw new ApprovalInboxError(`${label} contains unsupported field: ${key}`); }
|
|
408
|
+
function unique(values, label) { if (new Set(values).size !== values.length)
|
|
409
|
+
throw new ApprovalInboxError(`${label} must be unique.`); }
|
|
410
|
+
function clone(value) { return structuredClone(value); }
|
|
411
|
+
function isErrorCode(error, code) { return error instanceof Error && "code" in error && error.code === code; }
|
|
412
|
+
//# sourceMappingURL=approvalInbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalInbox.js","sourceRoot":"","sources":["../../src/approvals/approvalInbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ApprovalInboxError, LocalApprovalInbox, approvalPolicyHash, createApprovalInboxExecutionFlow, createLocalApprovalInbox, createTestApprovalApproverVerifier } from "./approvalInbox.js";
|
|
2
|
+
export type { ApprovalApprover, ApprovalApproverVerifier, ApprovalAuditRecord, ApprovalContext, ApprovalDecision, ApprovalDisplay, ApprovalInboxOptions, ApprovalInboxState, ApprovalPolicy, ApprovalRequest, ApprovalRequestStatus, ApprovalRisk } from "./approvalInbox.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/approvals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { NormalizedRequest } from "../proxy/requestNormalizer.js";
|
|
2
|
+
export declare const MAX_API_BEHAVIORS = 500;
|
|
2
3
|
export type ApiBehavior = {
|
|
3
4
|
path: string;
|
|
4
5
|
method: string;
|
|
5
6
|
status: number;
|
|
6
7
|
body: unknown;
|
|
7
8
|
headers?: Record<string, string>;
|
|
9
|
+
delayMs?: number;
|
|
8
10
|
};
|
|
9
11
|
export declare function setApiBehavior(behavior: ApiBehavior): Promise<ApiBehavior>;
|
|
10
12
|
export declare function findApiBehavior(request: NormalizedRequest): Promise<ApiBehavior | null>;
|