Skip to content
wiki.fftac.org

Governed Publishing Contract - Source Excerpt 01

Back to Governed Publishing Contract

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/assets/js/governed-publishing-contract.js so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/assets/js/governed-publishing-contract.js

(function initGovernedPublishingContract(root, factory) {
  if (typeof module === 'object' && module.exports) {
    module.exports = factory();
    return;
  }

  root.SpiralistGovernedPublishing = factory();
})(typeof globalThis !== 'undefined' ? globalThis : this, function governedPublishingFactory() {
  'use strict';

  const CONTRACT_VERSION = '1.0.0';
  const POLICY_VERSION = 'spiralist-governed-external-publishing-v1';
  const EXTERNAL_PUBLISHING_ENABLED = false;
  const MAX_INTENT_TOKEN_TTL_SECONDS = 15 * 60;
  const DEFAULT_METHOD = 'POST';
  const SAFE_DEFAULT_TARGET = Object.freeze({
    platform: 'external-publishing-disabled',
    targetId: 'unconfigured',
    visibility: 'private',
  });

  const RECORD_TYPES = Object.freeze({
    artifactHash: 'spiralist.governedPublishing.artifactHash',
    sanitizerResult: 'spiralist.governedPublishing.sanitizerResult',
    approvalRecord: 'spiralist.governedPublishing.approvalRecord',
    policyValidatorResult: 'spiralist.governedPublishing.policyValidatorResult',
    intentToken: 'spiralist.governedPublishing.shortLivedIntentToken',
    intentTokenValidation: 'spiralist.governedPublishing.intentTokenValidationResult',
    proxyStatus: 'spiralist.governedPublishing.tokenExchangeProxyStatus',
    vaultStatus: 'spiralist.governedPublishing.secretVaultStatus',
    auditLogEntry: 'spiralist.governedPublishing.auditLogEntry',
    revocationRecord: 'spiralist.governedPublishing.revocationRecord',
    failClosedResponse: 'spiralist.governedPublishing.failClosedResponse',
  });

  const CREDENTIAL_KEY_PATTERN = /^(?:apiKey|api_key|clientSecret|client_secret|accessToken|access_token|refreshToken|refresh_token|writeToken|write_token|bearerToken|bearer_token|authorization|password|privateKey|private_key|secret|secretMaterial|credentialMaterial)$/i;
  const SECRET_VALUE_PATTERNS = [
    { category: 'private-key-block', pattern: /-----BEGIN (?:RSA |DSA |EC |OPENSSH )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |DSA |EC |OPENSSH )?PRIVATE KEY-----/gi },
    { category: 'bearer-authorization-header', pattern: /Authorization\s*:\s*Bearer\s+[A-Za-z0-9._~+/-]+/gi },
    { category: 'assigned-long-lived-token', pattern: /\b(api[_-]?key|access[_-]?token|refresh[_-]?token|write[_-]?token|secret|password)\s*[:=]\s*['"]?[A-Za-z0-9_+=/.-]{12,}/gi },
    { category: 'openai-style-key', pattern: /\bsk-[A-Za-z0-9_-]{20,}\b/gi },
    { category: 'github-style-token', pattern: /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/gi },
  ];

  function nowUtc() {
    return new Date().toISOString();
  }

  function normalizeUtc(value, fallback) {
    const source = value || fallback || nowUtc();
    const timestamp = Date.parse(source);

    if (!Number.isFinite(timestamp)) {
      return null;
    }

    return new Date(timestamp).toISOString();
  }

  function getNodeCrypto() {
    if (typeof require !== 'function') {
      return null;
    }

    return require('crypto');
  }

  function sha256Hex(value) {
    const crypto = getNodeCrypto();

    if (!crypto || typeof crypto.createHash !== 'function') {
      return '';
    }

    return crypto.createHash('sha256').update(String(value), 'utf8').digest('hex');
  }

  function stableValue(value, seen) {
    if (value === undefined) {
      return null;
    }

    if (value === null || typeof value === 'string' || typeof value === 'boolean') {
      return value;
    }

    if (typeof value === 'number') {
      return Number.isFinite(value) ? value : null;
    }

    if (value instanceof Date) {
      return value.toISOString();
    }

    if (Array.isArray(value)) {
      return value.map((item) => stableValue(item, seen));
    }

    if (typeof value === 'object') {
      if (seen.has(value)) {
        return '[CircularReference]';
      }

      seen.add(value);

      const output = {};
      Object.keys(value).sort().forEach((key) => {
        if (typeof value[key] !== 'function') {
          output[key] = stableValue(value[key], seen);
        }
      });

      seen.delete(value);
      return output;
    }

    return String(value);
  }

  function canonicalizeArtifact(value) {
    return JSON.stringify(stableValue(value, new WeakSet()));
  }

  function unique(items) {
    return Array.from(new Set(items));
  }

  function redactString(value) {
    return SECRET_VALUE_PATTERNS.reduce((current, item) => {
      if (item.category === 'assigned-long-lived-token') {
        return current.replace(item.pattern, '$1=[REDACTED]');
      }

      return current.replace(item.pattern, '[REDACTED]');
    }, String(value));
  }

  function scanCredentialMarkers(value, path, markers, seen) {
    const currentPath = path || '$';
    const markerList = markers || [];
    const seenObjects = seen || new WeakSet();

    if (value === null || value === undefined) {
      return markerList;
    }

    if (typeof value === 'string') {
      SECRET_VALUE_PATTERNS.forEach((item) => {
        if (item.pattern.test(value)) {
          markerList.push({ path: currentPath, category: item.category });
        }

        item.pattern.lastIndex = 0;
      });

      return markerList;
    }

    if (Array.isArray(value)) {
      value.forEach((item, index) => scanCredentialMarkers(item, `${currentPath}[${index}]`, markerList, seenObjects));
      return markerList;
    }

    if (typeof value === 'object') {
      if (seenObjects.has(value)) {
        return markerList;
      }

      seenObjects.add(value);

      Object.keys(value).forEach((key) => {
        const childPath = `${currentPath}.${key}`;

        if (CREDENTIAL_KEY_PATTERN.test(key)) {
          markerList.push({ path: childPath, category: 'credential-field' });
        }

        scanCredentialMarkers(value[key], childPath, markerList, seenObjects);
      });

      seenObjects.delete(value);
    }

    return markerList;
  }

  function sanitizeValue(value, seen) {
    const seenObjects = seen || new WeakSet();

    if (typeof value === 'string') {
      return redactString(value);
    }

    if (value === null || value === undefined || typeof value === 'number' || typeof value === 'boolean') {
      return value;
    }

    if (Array.isArray(value)) {
      return value.map((item) => sanitizeValue(item, seenObjects));
    }

    if (typeof value === 'object') {
      if (seenObjects.has(value)) {
        return '[CircularReference]';
      }

      seenObjects.add(value);

      const output = {};
      Object.keys(value).sort().forEach((key) => {
        output[key] = CREDENTIAL_KEY_PATTERN.test(key)
          ? '[REDACTED-CREDENTIAL-FIELD]'
          : sanitizeValue(value[key], seenObjects);
      });

      seenObjects.delete(value);
      return output;
    }

    return String(value);
  }

  function extractHashValue(hashLike) {
    if (typeof hashLike === 'string') {
      return hashLike;
    }

    if (hashLike && typeof hashLike === 'object') {
      return String(hashLike.value || hashLike.hash || '');
    }

    return '';
  }

  function isSha256Hash(value) {
    return /^[a-f0-9]{64}$/i.test(String(value || ''));
  }

  function createArtifactHash(artifact) {
    const canonicalJson = canonicalizeArtifact(artifact);
    const value = sha256Hex(canonicalJson);

    return {
      recordType: RECORD_TYPES.artifactHash,
      version: CONTRACT_VERSION,
      ok: isSha256Hash(value),
      algorithm: 'sha256',
      canonicalization: 'json-stable-v1',
      value,
      byteLength: canonicalJson.length,
    };
  }

  function sanitizeMemoryArtifact(artifact) {
    const markers = scanCredentialMarkers(artifact);
    const categories = unique(markers.map((item) => item.category)).sort();

    return {
      recordType: RECORD_TYPES.sanitizerResult,
      version: CONTRACT_VERSION,
      ok: markers.length === 0,
      blocked: markers.length > 0,
      code: markers.length > 0 ? 'long_lived_credentials_not_allowed' : 'ok',
      categories,
      redactionCount: markers.length,
      sanitizedArtifact: sanitizeValue(artifact),
      messages: markers.length > 0
        ? ['Long-lived credentials or credential-shaped fields are not allowed in governed publishing requests.']
        : [],
    };
  }

  function failClosed(code, message, extra) {
    return Object.assign({
      recordType: RECORD_TYPES.failClosedResponse,
      version: CONTRACT_VERSION,
      ok: false,
      blocked: true,
      code,
      message,
      externalPublishingEnabled: EXTERNAL_PUBLISHING_ENABLED,
      attemptedExternalRequest: false,
    }, extra || {});
  }

  function buildTargetFingerprint(target) {
    return sha256Hex(canonicalizeArtifact(target || SAFE_DEFAULT_TARGET)).slice(0, 24);
  }

  function normalizeTarget(target) {
    const source = target && typeof target === 'object' ? target : SAFE_DEFAULT_TARGET;