Add institutional provenance and approval gates

This commit is contained in:
2026-08-01 20:57:26 +02:00
parent cec3d17bff
commit 2afdd38128
16 changed files with 2472 additions and 509 deletions
+43
View File
@@ -406,6 +406,16 @@ export type CampaignDeliveryOptions = {
version_id: string;
worker_queue_available: boolean;
postbox_available: boolean;
approval_gate: {
configured?: boolean;
available?: boolean;
approved?: boolean;
state?: string;
explanation?: string | null;
request_id?: string;
request_revision?: number;
subject_digest?: string;
};
synchronous_send: {
allowed?: boolean;
reason?: string | null;
@@ -420,6 +430,26 @@ export type CampaignDeliveryOptions = {
};
};
export type CampaignApprovalRequestPayload = {
title: string;
description?: string | null;
steps: Array<{
key: string;
label: string;
selectors: Array<{
kind: "account" | "group" | "role" | "function_assignment" | "any_account";
value: string;
}>;
required_approvals: number;
rejection_policy: "fail_fast" | "collect";
signature_required: boolean;
forbidden_evidence_roles: Array<"author" | "owner" | "validator" | "builder" | "reviewer">;
}>;
unique_actors_across_steps: boolean;
policy_refs: string[];
idempotency_key: string;
};
export type CampaignSendNowPayload = {
version_id?: string | null;
include_warnings?: boolean;
@@ -1148,6 +1178,19 @@ versionId?: string | null)
return apiFetch<CampaignDeliveryOptions>(settings, `/api/v1/campaigns/${campaignId}/delivery-options${query}`);
}
export async function requestCampaignApproval(
settings: ApiSettings,
campaignId: string,
versionId: string,
payload: CampaignApprovalRequestPayload)
: Promise<Record<string, unknown>> {
return apiFetch<Record<string, unknown>>(
settings,
`/api/v1/campaigns/${campaignId}/versions/${versionId}/approval-request`,
{ method: "POST", body: JSON.stringify(payload) }
);
}
export async function sendCampaignNow(
settings: ApiSettings,
campaignId: string,