Skip to main content
Version: v0.10.13

Package Layering

PEAC Protocol enforces a strict layering model across its packages. Dependencies flow downward only -- a package may only import from packages in layers below it. This rule is enforced by dep-cruiser in CI.

Layer diagram

Layer Architecture
Layer 6  @peac/sdk-js                                         Consumer SDK
---------------------------------------------------------------
Layer 5 @peac/server | @peac/cli | @peac/mcp-server Applications
---------------------------------------------------------------
Layer 4 @peac/rails-* | @peac/mappings-* | @peac/adapter-*
@peac/capture-core | @peac/capture-node Adapters
---------------------------------------------------------------
Layer 3.5 @peac/middleware-core | @peac/middleware-express Middleware
---------------------------------------------------------------
Layer 3 @peac/protocol | @peac/control High-level APIs
---------------------------------------------------------------
Layer 2 @peac/crypto Signing
---------------------------------------------------------------
Layer 1 @peac/schema Validation
---------------------------------------------------------------
Layer 0 @peac/kernel Foundation

Layer descriptions

Layer 0 -- Kernel

Package: @peac/kernel Dependencies: None (zero external dependencies)

  • TypeScript type definitions for the entire protocol
  • Constants -- error codes, status values, wire format identifiers
  • Registry data -- attestation types, extension keys
  • Generated from normative JSON specifications in specs/kernel/

Layer 1 -- Schema

Package: @peac/schema Dependencies: @peac/kernel, zod

  • Zod schemas for receipts, policies, and extensions
  • Runtime validation functions
  • Schema-derived TypeScript types

Layer 2 -- Crypto

Package: @peac/crypto Dependencies: @peac/schema, @noble/ed25519 v3

  • Ed25519 signing (signAsync) and verification (verifyAsync)
  • Key generation (generateSigningKey, getPublicKeyAsync)
  • JWKS management and key resolution
  • Pure JavaScript -- no native modules required

Layer 3 -- Protocol and Control

Package: @peac/protocol Dependencies: @peac/crypto, @peac/schema

  • issueReceipt() -- high-level receipt issuance
  • verifyReceipt() -- high-level receipt verification with 12 checks
  • createEvidenceBundle() -- .peac.tar.gz bundle creation
  • Receipt decoding, inspection, and claim extraction

Package: @peac/control Dependencies: @peac/schema

  • Policy parsing and evaluation
  • Purpose-based access control
  • Access control rule engine

Layer 3.5 -- Middleware

Package: @peac/middleware-core Framework-agnostic middleware logic for receipt issuance and verification.

Package: @peac/middleware-express Express.js adapter that wraps middleware-core.

Layer 4 -- Adapters

Rail adapters, protocol mappings, and platform adapters. All vendor-specific code lives here.

PackageDescription
@peac/rails-x402Coinbase x402 payment evidence
@peac/rails-stripeStripe PaymentIntent and CryptoPaymentIntent
@peac/rails-razorpayRazorpay UPI, cards, netbanking
@peac/rails-cardVisa, Mastercard, Amex card networks
@peac/mappings-mcpMCP tool call metadata
@peac/mappings-acpACP agent-to-agent interactions
@peac/adapter-openclawOpenClaw activate + keygen
@peac/capture-coreCore capture logic (spool, dedupe)
@peac/capture-nodeNode.js durable stores (FileSpoolStore, FileDedupeIndex)

Layer 5 -- Applications

Full applications built on the protocol stack:

PackageDescription
@peac/serverHTTP server for receipt issuance and verification
@peac/cliCommand-line tools (peac-keygen, peac verify)
@peac/mcp-serverMCP server with 5 tools (verify, inspect, decode, issue, bundle)

Layer 6 -- Consumer SDK

Package: @peac/sdk-js

High-level consumer SDK that re-exports the most common functions from the protocol stack. Use this when you want a single import for common operations.

Import rules

Downward-only rule

A package may only import from packages in lower layers. Importing from a higher layer is a build error caught by dep-cruiser in CI.

For example, @peac/crypto (Layer 2) can import from @peac/schema (Layer 1) and @peac/kernel (Layer 0), but it cannot import from @peac/protocol (Layer 3).

  • No circular dependencies -- enforced by dep-cruiser in CI
  • Vendor neutrality -- core packages (Layers 0--3) contain no vendor-specific code
  • Vendor code in Layer 4 -- all vendor-specific logic lives in adapters, mappings, and rails packages