import { computed, handler, NAME, pattern, Stream, type TrustedActionWriteWithIntegrity, UI, type VNode, Writable, } from "commonfabric"; export const TRUSTED_REDACTED_RELEASE_SURFACE = "TrustedRedactedReleaseSurface"; export const TRUSTED_REDACTION_RENDERED_EVIDENCE = "TrustedRedactionRenderedEvidence"; const RELEASE_REDACTED_CONTENT_ACTION = "TrustedReleaseRedactedContent"; export const releaseTrustedRedactedContent = handler< void, { redactionLabel: Writable; sourceText: Writable; releasedRedactedContent: Writable; } >((_, { redactionLabel, sourceText, releasedRedactedContent }) => { const label = redactionLabel.get().trim() || "content"; const redacted = sourceText.get().trim() .replace(/\b\d{3}-\d{2}-\d{4}\b/g, "[redacted-id]") .replace(/secret/gi, "[redacted-secret]"); releasedRedactedContent.set( redacted ? `Released redacted ${label}: ${redacted}` : "", ); }); export interface TrustedRedactedReleaseSurfaceInput { redactionLabel: Writable; sourceText: Writable; releasedRedactedContent: Writable; } export interface TrustedRedactedReleaseSurfaceOutput { [NAME]: string; [UI]: VNode; releasedRedactedContent: TrustedActionWriteWithIntegrity< string, typeof releaseTrustedRedactedContent, typeof RELEASE_REDACTED_CONTENT_ACTION, typeof TRUSTED_REDACTED_RELEASE_SURFACE, [ typeof TRUSTED_REDACTED_RELEASE_SURFACE, typeof TRUSTED_REDACTION_RENDERED_EVIDENCE, ] >; releaseRedactedContent: Stream; } export const TrustedRedactedReleaseSurface = pattern< TrustedRedactedReleaseSurfaceInput, TrustedRedactedReleaseSurfaceOutput >(({ redactionLabel, sourceText, releasedRedactedContent }) => { const releaseRedactedContent = releaseTrustedRedactedContent({ redactionLabel, sourceText, releasedRedactedContent, }); return { [NAME]: computed(() => "Trusted Redacted Release Surface"), [UI]: ( Trusted redacted release Render the source and release only a redacted derivative. {TRUSTED_REDACTION_RENDERED_EVIDENCE} Release label Source text Release redacted content Released redacted content
{releasedRedactedContent}
), releasedRedactedContent, releaseRedactedContent, }; });