pidl

package module
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 29, 2026 License: MIT Imports: 9 Imported by: 0

README

PIDL

Go CI Go Lint Go SAST Go Report Card Docs Docs Visualization License

Protocol Interaction Description Language - A JSON-based DSL for describing protocol choreography that compiles to diagrams.

PIDL models protocols as directed interaction graphs between entities, enabling generation of sequence diagrams, data flow diagrams, and other visualizations. It's designed for protocols where the primary concern is "who talks to whom, in what order" rather than message schemas or transport details.

Features

  • 📋 JSON-based DSL for describing protocol flows
  • 🎨 Multiple output formats: PlantUML, Mermaid, Graphviz DOT, D2, SVG
  • 🎬 Animated SVG with CSS flow visualizations and moving dots
  • 🌐 Network boundary diagrams for trust zone visualization
  • 🎭 SVG templates: default, minimal, sketch, blueprint, dark, high-contrast
  • Accessibility: WCAG AA compliant high-contrast template
  • 📦 Phase boxes: Visual grouping of flows by phase with color-coded depth
  • 🔀 Alternative badges: ALT indicators on flows with alternative paths
  • Interactive SVG: Hover effects on participants, messages, and flow dots
  • 💫 Animation effects: Pulse and glow for error/warning/highlight presets
  • 📚 Built-in examples: OAuth 2.0, PKCE, OIDC, MCP, A2A
  • ⌨️ CLI tool for validation and diagram generation
  • 📦 Go library for programmatic use
  • 🔀 Conditional flows with condition field for when clauses
  • 🔄 Alternative paths with alternatives for error handling and branching
  • 📝 Annotations with typed notes (security, performance, deprecated, etc.)
  • 📊 Nested phases with parent hierarchy support
  • 🔄 State model with entity states and state transitions
  • 📈 State diagrams via Mermaid stateDiagram-v2 output
  • 🔐 Security annotations with requirements (token, encryption, mTLS, signature)
  • 🛡️ Trust levels for entity classification (trusted, semi_trusted, untrusted, authoritative)
  • 🎫 Token definitions with issuer, audience, and binding
  • 🔄 Protocol composition with imports and inheritance
  • ▶️ Protocol simulation with state tracking and execution traces
  • 🔍 Protocol comparison (diff) for change detection
  • 🐛 Interactive debugger for step-through protocol execution
  • 🛡️ Security analysis with 10 built-in attack surface detection rules

Installation

go install github.com/grokify/pidl/cmd/pidl@latest

Or clone and build:

git clone https://github.com/grokify/pidl.git
cd pidl
go build -o pidl ./cmd/pidl

Quick Start

List available examples
pidl examples
Generate a diagram from an example
# PlantUML sequence diagram
pidl generate oauth2_authorization_code

# Mermaid sequence diagram
pidl generate -f mermaid oauth2_pkce

# Graphviz DOT data flow diagram
pidl generate -f dot mcp_tool_invocation

# D2 sequence diagram
pidl generate -f d2 oauth2_pkce

# D2 data flow diagram
pidl generate -f d2-flow oauth2_pkce

# D2 architecture diagram
pidl generate -f d2-arch oauth2_pkce

# SVG sequence diagram
pidl generate -f svg oauth2_pkce

# Animated SVG with flow dots
pidl generate -f svg-animated --theme=dark oauth2_pkce

# SVG with template
pidl generate -f svg --template=sketch oauth2_pkce

# Network boundary diagram
pidl generate -f svg-network oauth2_pkce

# Mermaid state diagram (for entities with states)
pidl generate -f mermaid-state oauth2_with_states

# State diagram for specific entity
pidl generate -f mermaid-state --entity=client oauth2_with_states
Create a new protocol file
# Create from scratch
pidl init my-protocol.json

# Copy from an example
pidl init -from oauth2_authorization_code my-oauth.json
Validate protocol files
pidl validate my-protocol.json
pidl validate *.json

PIDL Format

A PIDL document is a JSON file with three main sections:

{
  "protocol": {
    "id": "my-protocol",
    "name": "My Protocol",
    "version": "1.0",
    "description": "A sample protocol",
    "category": "auth"
  },
  "entities": [
    {"id": "client", "name": "Client", "type": "client"},
    {"id": "server", "name": "Server", "type": "server"}
  ],
  "phases": [
    {"id": "main", "name": "Main Flow"},
    {"id": "error_handling", "name": "Error Handling", "parent": "main"}
  ],
  "flows": [
    {
      "from": "client",
      "to": "server",
      "action": "request",
      "label": "Request",
      "mode": "request",
      "phase": "main",
      "condition": "token_valid",
      "note": "Requires valid token",
      "annotations": [
        {"type": "security", "text": "Validate token signature"}
      ],
      "alternatives": [
        {
          "condition": "token_expired",
          "flows": [
            {"from": "server", "to": "client", "action": "refresh_required", "mode": "response"}
          ]
        }
      ]
    },
    {"from": "server", "to": "client", "action": "response", "label": "Response", "mode": "response", "phase": "main"}
  ]
}

Protocol Architecture

PIDL models protocols as directed graphs where nodes are entities/components and edges are interactions/relationships.

Nodes
Entity Types

Entity types are classified as client-side (initiators) or server-side (responders):

Type Classification Description
client Client Application or service initiating requests
user Client Human actor
browser Client User agent / web browser
agent Client AI/LLM agent
delegated_agent Client Agent receiving delegated tasks (A2A)
authorization_server Server Issues tokens and handles authentication
resource_server Server Hosts protected resources
identity_provider Server Authenticates users and issues identity assertions
service_provider Server Consumes identity assertions
server Server Generic server
tool_server Server Exposes tools via protocol (MCP)
tool Other Individual tool capability
other Other Custom entity type
Protocol Roles

Entities can implement protocol-specific roles:

Protocol Description Common Roles
oauth OAuth 2.0 / OIDC authorization_server, client, resource_server
scim SCIM Provisioning client, service_provider
spiffe SPIFFE Identity workload, spire_server, spire_agent
aauth Agent Authentication person_server, access_server, client
idjag ID-JAG Identity client, person_server, access_server
authzen AuthZEN Authorization pep, pdp, pip, pap
mcp Model Context Protocol client, server, tool
a2a Agent-to-Agent client_agent, remote_agent
Deployment Components (Logical Applications)

Components group entities into logical deployment units:

Component Type Description Example Products
idp Identity Provider Okta, Entra ID, Auth0
iga Identity Governance SailPoint, Saviynt
agent_provider AI Agent Platform Claude, ChatGPT, Gemini
person_server AAuth Person Server Identity verification service
access_server AAuth Access Server Token issuance service
pdp Policy Decision Point OPA, Cedar, Topaz
gateway API Gateway Kong, Apigee, AWS API Gateway
mcp_client MCP Client Claude Code, Cursor
mcp_server MCP Server Custom tool servers
resource_api Resource API Backend services
spire SPIFFE Runtime SPIRE Server/Agent
Edges

PIDL supports two types of edges: protocol flows (sequential actions) and trust relationships (static trust).

Protocol Flows (Sequential Actions)

Flows are ordered interactions between entities that define protocol choreography. They are the primary edge type and generate sequence diagrams.

Field Description
from Source entity ID
to Target entity ID
action Action identifier
mode Flow type: request, response, redirect, callback, event, tool_call, tool_result
phase Optional phase grouping
condition Optional conditional execution
alternatives Optional alternative paths
Protocols

Protocols define the interaction patterns between entities:

Protocol Full Name Specification
oauth OAuth 2.0 / OpenID Connect RFC 6749, RFC 6750, OIDC Core
scim System for Cross-domain Identity Management RFC 7643, RFC 7644
spiffe Secure Production Identity Framework SPIFFE/SPIRE
aauth Agent Authentication AAuth Spec
idjag Identity for Just-in-time Access Grant ID-JAG Spec
authzen Authorization API OpenID AuthZEN
mcp Model Context Protocol MCP Specification
a2a Agent-to-Agent Protocol A2A Specification
Trust Relationship Types

Trust relationships define how entities establish trust:

Type Description Direction
authenticates Verifies identity A authenticates B
validates Validates credentials/tokens A validates B's tokens
delegates Grants delegated authority A delegates to B
authorizes Grants access permissions A authorizes B
issues Creates credentials/tokens A issues tokens for B
trusts General trust relationship A trusts B
provisions Creates/manages accounts A provisions B
attests Provides identity attestation A attests B's identity
Credential Types

Credentials exchanged in trust relationships:

Credential Description Used By
x509_svid X.509 SVID certificate SPIFFE/SPIRE
jwt_svid JWT SVID token SPIFFE/SPIRE
jwt_assertion JWT assertion for client auth OAuth 2.0
access_token OAuth access token OAuth 2.0
id_token OIDC ID token OpenID Connect
aa_agent_jwt AAuth Agent JWT AAuth
aa_auth_jwt AAuth Authorization JWT AAuth
mtls Mutual TLS certificate mTLS
api_key API key Various
Diagram Outputs

PIDL generates multiple diagram types from the same protocol definition:

Diagram Type Format Source Data Description
Sequence Diagram plantuml, mermaid, d2, svg, svg-animated Flows Shows ordered interactions between entities
Data Flow Diagram dot, d2-flow Flows Shows data movement between entities
Architecture Diagram d2-arch Entities, Flows Shows system architecture
Network Diagram svg-network Entities, Trust Levels Shows network boundaries and trust zones
State Diagram mermaid-state Entity States, Flows Shows entity state machines
Component Diagram (planned) Components Shows logical deployment units
Trust Diagram (planned) Trust Relations Shows trust relationships between entities
Diagram Generation
# Sequence diagrams (from flows)
pidl generate -f plantuml protocol.json    # PlantUML
pidl generate -f mermaid protocol.json     # Mermaid
pidl generate -f svg protocol.json         # SVG
pidl generate -f svg-animated protocol.json # Animated SVG

# Data flow diagrams (from flows)
pidl generate -f dot protocol.json         # Graphviz DOT
pidl generate -f d2-flow protocol.json     # D2 flow

# Architecture diagrams (from entities + flows)
pidl generate -f d2-arch protocol.json     # D2 architecture

# Network diagrams (from entities + trust levels)
pidl generate -f svg-network protocol.json # Network boundaries

# State diagrams (from entity states + flow mutations)
pidl generate -f mermaid-state protocol.json           # All entities
pidl generate -f mermaid-state --entity=client protocol.json  # Single entity
Flow Modes
Mode Description Arrow Style
request Synchronous request Solid ->
response Synchronous response Dashed -->
redirect HTTP redirect Solid with annotation
callback Callback/webhook Solid with annotation
interactive Human interaction Solid
event Asynchronous event Dashed
tool_call Tool invocation (MCP) Solid with annotation
tool_result Tool result (MCP) Dashed with annotation
Flow Extensions
Field Description
condition Conditional execution clause (renders as opt block)
note Visible note displayed on diagram
annotations Array of typed annotations for tooling
alternatives Alternative paths (renders as alt/else blocks)
Annotation Types
Type Description
security Security-related notes
performance Performance considerations
deprecated Deprecated functionality
info General information
warning Warning messages
error Error conditions
Nested Phases

Phases support hierarchical nesting via the parent field:

{
  "phases": [
    {"id": "auth", "name": "Authentication"},
    {"id": "mfa", "name": "Multi-Factor Auth", "parent": "auth"},
    {"id": "token", "name": "Token Exchange", "parent": "auth"}
  ]
}
Entity States

Entities can define states to track their lifecycle:

{
  "entities": [
    {
      "id": "client",
      "name": "Client",
      "type": "client",
      "states": [
        {"id": "idle", "name": "Idle", "initial": true},
        {"id": "authenticated", "name": "Authenticated"},
        {"id": "error", "name": "Error", "final": true}
      ]
    }
  ]
}
Field Description
id Unique state identifier within the entity
name Human-readable display name
description Optional state description
initial Marks this as the initial state (at most one per entity)
final Marks this as a terminal/final state
State Mutations

Flows can trigger state changes via the sets field:

{
  "flows": [
    {
      "from": "client",
      "to": "server",
      "action": "login",
      "sets": [
        {"entity": "client", "from": "idle", "to": "authenticated"}
      ]
    }
  ]
}
Field Description
entity Entity ID whose state changes
to Target state ID (required)
from Optional required prior state (for validation)
Trust Levels

Entities can be assigned trust levels to indicate their security posture:

{
  "entities": [
    {
      "id": "client",
      "name": "Client",
      "type": "client",
      "trust_level": "semi_trusted"
    }
  ]
}
Trust Level Description
trusted Fully trusted internal systems
semi_trusted Partially trusted (DMZ, partners)
untrusted External/public systems
authoritative Source of truth (IdPs, CAs)

Trust levels are used by svg-network format to automatically infer network boundaries.

Security Requirements

Flows can specify security requirements:

{
  "flows": [
    {
      "from": "client",
      "to": "server",
      "action": "api_request",
      "security": {
        "requires": ["token", "encryption"],
        "token": "access_token",
        "confidential": true,
        "description": "Bearer token required"
      }
    }
  ]
}
Requirement Description
token Requires a bearer or bound token
signature Requires message signing
encryption Requires message encryption
mtls Requires mutual TLS authentication
mac Requires message authentication code
Token Definitions

Protocols can define token types used in flows:

{
  "metadata": {
    "tokens": [
      {
        "id": "access_token",
        "name": "Access Token",
        "type": "jwt",
        "issuer": "auth_server",
        "audience": "resource_server",
        "binding": "bearer"
      }
    ]
  }
}
Field Description
id Unique token identifier
name Human-readable display name
type Token format: jwt, opaque, saml, api_key
issuer Entity ID that issues this token
audience Entity ID that consumes this token
binding Token binding: bearer, mtls, dpop

CLI Reference

pidl <command> [options] [arguments]

Commands:
  validate   Validate PIDL JSON files
  generate   Generate diagrams from PIDL files
  examples   List or show built-in examples
  init       Create a new PIDL file from template
  simulate   Run protocol simulation with state tracking
  diff       Compare two protocols and show differences
  debug      Interactive step-through protocol debugger
  analyze    Security analysis with attack surface detection
  resolve    Resolve protocol imports and inheritance
  version    Print version information
  help       Show help message
validate
pidl validate [options] <file> [file...]

Options:
  -q    Quiet mode (only show errors)
generate
pidl generate [options] <file>

Options:
  -f string         Output format (default "plantuml")
  -o string         Output file (default: stdout)
  --template        SVG template: default, minimal, sketch, blueprint, dark, high-contrast
  --template-dir    Path to custom SVG template directory
  --theme           SVG theme: light, dark, auto
  --boundary        Network boundary override (repeatable)
  --entity          Entity ID to filter (for mermaid-state format)
  --show-security   Show security annotations on flows (default true)
  --show-trust      Show trust levels and infer boundaries from trust (default true)

Formats:

Format Description
plantuml PlantUML sequence diagram
mermaid Mermaid sequence diagram
mermaid-state Mermaid state diagram (requires entity states)
dot Graphviz DOT data flow diagram
d2 D2 sequence diagram
d2-flow D2 data flow diagram
d2-arch D2 architecture diagram
svg SVG sequence diagram
svg-animated Animated SVG with flow dots
svg-network Network boundary diagram
examples
pidl examples [options] [name]

Options:
  -json   Show example JSON content
init
pidl init [options] <filename>

Options:
  -name string   Protocol name
  -from string   Initialize from example
simulate
pidl simulate [options] <file>

Options:
  -steps int           Maximum steps to execute (0 = all)
  -v                   Verbose output with each step
  -json                Output trace as JSON
  --trace-format       Trace output format: text, json, svg, mermaid
  --trace-output       Write trace to file
  --show-states        Show entity states in trace
  --show-timings       Show timing information
diff
pidl diff [options] <base-file> <new-file>

Options:
  -f, --format         Output format: text, json, markdown (default: text)
  -o, --output         Output file (default: stdout)
  --ignore-metadata    Ignore metadata differences
  -q, --quiet          Summary only
debug
pidl debug <file>

Interactive Commands:
  step, s              Execute next flow
  continue, c          Run until breakpoint/completion
  break <idx> [cond]   Set breakpoint at flow index
  delete <idx>         Remove breakpoint
  breakpoints          List all breakpoints
  inspect              Show current state
  inspect entity <id>  Show entity details and state
  inspect flow <idx>   Show flow details
  list                 List flows with position marker
  set <entity> <state> Set entity state
  reset                Restart execution
  quit, q              Exit debugger
analyze
pidl analyze [options] <file>

Options:
  -f, --format         Output format: text, json, markdown (default: text)
  -o, --output         Output file (default: stdout)
  --min-severity       Minimum severity: critical, high, medium, low, info
  --category           Filter by category (repeatable)
  --fail-on            Exit with code 1 if risks at this severity
  -q, --quiet          Summary only

Built-in security rules:

Rule Severity Description
SEC001 High Trust boundary violation (untrusted to trusted without security)
SEC002 High Missing encryption on confidential flow
SEC003 Medium Unbound bearer token (no mTLS/DPoP binding)
SEC004 High Missing authentication on external flow
SEC005 Medium JWT without defined audience
SEC006 Medium Token transmitted in redirect
SEC007 Medium Missing mTLS on sensitive flow
SEC008 Low Entity without defined trust level
SEC009 Medium Sensitive data in redirect parameters
SEC010 Medium Weak authentication method

Go Library

import (
    "github.com/grokify/pidl"
    "github.com/grokify/pidl/render"
    "github.com/grokify/pidl/examples"
    "github.com/grokify/pidl/analyze"
)

// Parse a PIDL file
p, err := pidl.ParseFile("protocol.json")

// Validate
if errs := p.Validate(); errs.HasErrors() {
    log.Fatal(errs)
}

// Generate PlantUML
diagram, err := render.RenderString(render.FormatPlantUML, p)

// Use built-in examples
names := examples.List()
oauth, err := examples.GetProtocol("oauth2_authorization_code")

// Create a new protocol
p := pidl.NewMinimalProtocol("my-protocol", "My Protocol")
pidl.WriteProtocolFile("output.json", p)

// Compare two protocols
diff := pidl.Compare(base, updated, pidl.DiffOptions{})
fmt.Println(diff.String())

// Run protocol simulation
executor := pidl.NewExecutor(p)
trace, err := executor.Execute()
fmt.Println(trace.String())

// Interactive debugging
session := pidl.NewDebugSession(p)
session.SetBreakpoint(2, "")
step, _ := session.Step()
state := session.Inspect()

// Security analysis
analysis := analyze.Analyze(p, analyze.DefaultAnalysisOptions())
fmt.Println(analysis.String())
if analysis.HasRisksAtOrAbove(analyze.SeverityHigh) {
    // handle high-severity risks
}

Built-in Examples

Example Protocol
oauth2_authorization_code OAuth 2.0 Authorization Code Flow
oauth2_pkce OAuth 2.0 with PKCE
oauth2_with_states OAuth 2.0 with State Tracking
oauth2_with_security OAuth 2.0 with Security Annotations
oidc_authentication OpenID Connect Authentication
mcp_tool_invocation MCP Tool Invocation
a2a_agent_delegation A2A Agent Delegation

Target Protocols

PIDL is designed for describing:

  • Authentication/Authorization: OAuth 2.0, OpenID Connect, SAML
  • Agent Protocols: MCP (Model Context Protocol), A2A (Agent-to-Agent)
  • API Flows: Multi-party API choreography

Documentation

License

MIT License - see LICENSE for details.

Documentation

Overview

Package pidl provides types and utilities for the Protocol Interaction Description Language. PIDL is a JSON-based DSL for describing protocol choreography that compiles to diagrams.

Index

Constants

View Source
const (
	ProtocolOAuth   = "oauth"
	ProtocolSCIM    = "scim"
	ProtocolSPIFFE  = "spiffe"
	ProtocolAAuth   = "aauth"
	ProtocolIDJAG   = "idjag"
	ProtocolAuthZEN = "authzen"
	ProtocolMCP     = "mcp"
	ProtocolA2A     = "a2a"
)

Protocol identifier constants.

View Source
const (
	ComponentTypeIdP           = "idp"
	ComponentTypeIGA           = "iga"
	ComponentTypeAgentProvider = "agent_provider"
	ComponentTypePersonServer  = "person_server"
	ComponentTypeAccessServer  = "access_server"
	ComponentTypePDP           = "pdp"
	ComponentTypeGateway       = "gateway"
	ComponentTypeMCPClient     = "mcp_client"
	ComponentTypeMCPServer     = "mcp_server"
	ComponentTypeResourceAPI   = "resource_api"
	ComponentTypeSPIRE         = "spire"
)

Component type constants.

View Source
const (
	TrustTypeAuthenticates = "authenticates"
	TrustTypeValidates     = "validates"
	TrustTypeDelegates     = "delegates"
	TrustTypeAuthorizes    = "authorizes"
	TrustTypeIssues        = "issues"
	TrustTypeTrusts        = "trusts"
	TrustTypeProvisions    = "provisions"
	TrustTypeAttests       = "attests"
)

Trust relationship type constants.

View Source
const (
	CredentialX509SVID     = "x509_svid"
	CredentialJWTSVID      = "jwt_svid"
	CredentialJWTAssertion = "jwt_assertion"
	CredentialAccessToken  = "access_token"
	CredentialIDToken      = "id_token"
	CredentialAAAgentJWT   = "aa_agent_jwt"
	CredentialAAAuthJWT    = "aa_auth_jwt"
	CredentialMTLS         = "mtls"
	CredentialAPIKey       = "api_key"
)

Credential type constants.

Variables

This section is empty.

Functions

func IsValidAnnotationType added in v0.2.0

func IsValidAnnotationType(t AnnotationType) bool

IsValidAnnotationType checks if the annotation type is valid.

func IsValidCategory added in v0.4.0

func IsValidCategory(c Category) bool

IsValidCategory checks if the category is valid.

func IsValidComponentType added in v0.4.0

func IsValidComponentType(t string) bool

IsValidComponentType checks if the component type is a known type.

func IsValidCredential added in v0.4.0

func IsValidCredential(c string) bool

IsValidCredential checks if the credential type is a known type.

func IsValidEntityType added in v0.4.0

func IsValidEntityType(t EntityType) bool

IsValidEntityType checks if the entity type is valid.

func IsValidFlowMode added in v0.4.0

func IsValidFlowMode(m FlowMode) bool

IsValidFlowMode checks if the flow mode is valid.

func IsValidProtocol added in v0.4.0

func IsValidProtocol(protocol string) bool

IsValidProtocol checks if the protocol identifier is a known protocol.

func IsValidSecurityRequirement added in v0.4.0

func IsValidSecurityRequirement(r SecurityRequirement) bool

IsValidSecurityRequirement checks if the security requirement is valid.

func IsValidTrustLevel added in v0.4.0

func IsValidTrustLevel(t TrustLevel) bool

IsValidTrustLevel checks if the trust level is valid.

func IsValidTrustRelationType added in v0.4.0

func IsValidTrustRelationType(t string) bool

IsValidTrustRelationType checks if the trust relation type is a known type.

func SanitizeID

func SanitizeID(s string) string

SanitizeID converts a string to a valid PIDL ID (lowercase, alphanumeric, underscores/hyphens).

func TitleCase

func TitleCase(s string) string

TitleCase converts a string to title case (first letter of each word capitalized).

func ValidateFile

func ValidateFile(filename string) (*Protocol, ValidationErrors, error)

ValidateFile parses and validates a PIDL file, returning any validation errors.

Types

type Alternative added in v0.2.0

type Alternative struct {
	// Condition describes when this alternative is taken.
	Condition string `json:"condition"`

	// Flows are the steps in this alternative path.
	Flows []Flow `json:"flows"`

	// Description provides additional context.
	Description string `json:"description,omitempty"`
}

Alternative represents an alternative path in the flow.

type AnimationPreset added in v0.3.0

type AnimationPreset string

AnimationPreset represents a semantic animation preset.

const (
	// AnimationPresetRequest is the default for outgoing requests.
	AnimationPresetRequest AnimationPreset = "request"
	// AnimationPresetResponse is for return values (gray, dashed).
	AnimationPresetResponse AnimationPreset = "response"
	// AnimationPresetSuccess indicates successful operations (green).
	AnimationPresetSuccess AnimationPreset = "success"
	// AnimationPresetError indicates errors/failures (red, pulsing).
	AnimationPresetError AnimationPreset = "error"
	// AnimationPresetWarning indicates warnings (orange, pulsing).
	AnimationPresetWarning AnimationPreset = "warning"
	// AnimationPresetHighlight emphasizes critical paths (yellow, larger dot).
	AnimationPresetHighlight AnimationPreset = "highlight"
	// AnimationPresetNone disables animation (static arrow).
	AnimationPresetNone AnimationPreset = "none"
)

type Annotation added in v0.2.0

type Annotation struct {
	// Type categorizes the annotation.
	Type AnnotationType `json:"type"`

	// Text is the annotation message.
	Text string `json:"text"`

	// Details provides additional context.
	Details string `json:"details,omitempty"`
}

Annotation represents a typed annotation on a flow.

type AnnotationType added in v0.2.0

type AnnotationType string

AnnotationType represents the type of annotation.

const (
	AnnotationTypeSecurity    AnnotationType = "security"
	AnnotationTypePerformance AnnotationType = "performance"
	AnnotationTypeDeprecated  AnnotationType = "deprecated"
	AnnotationTypeInfo        AnnotationType = "info"
	AnnotationTypeWarning     AnnotationType = "warning"
	AnnotationTypeError       AnnotationType = "error"
)

type Breakpoint added in v0.4.0

type Breakpoint struct {
	// FlowIndex is the flow index where the breakpoint is set.
	FlowIndex int

	// Condition is an optional condition expression (evaluated by ConditionEvaluator).
	Condition string

	// Enabled indicates if the breakpoint is active.
	Enabled bool

	// HitCount tracks how many times this breakpoint was hit.
	HitCount int
}

Breakpoint represents a debug breakpoint.

type Category

type Category string

Category represents the protocol category.

const (
	CategoryAuth         Category = "auth"
	CategoryAgent        Category = "agent"
	CategoryMessaging    Category = "messaging"
	CategoryProvisioning Category = "provisioning"
	CategoryOther        Category = "other"
)

type DebugSession added in v0.4.0

type DebugSession struct {
	// Executor runs the protocol.
	Executor *Executor

	// Context holds the execution state.
	Context *ExecutionContext

	// Breakpoints maps flow indices to breakpoints.
	Breakpoints map[int]*Breakpoint

	// Watchpoints maps entity IDs to watched state patterns.
	Watchpoints map[string]string
	// contains filtered or unexported fields
}

DebugSession provides interactive debugging of protocol execution.

func NewDebugSession added in v0.4.0

func NewDebugSession(p *Protocol) *DebugSession

NewDebugSession creates a new debug session for a protocol.

func (*DebugSession) Continue added in v0.4.0

func (d *DebugSession) Continue() (*ExecutionStep, error)

Continue runs until a breakpoint is hit or execution completes. Returns the step where it stopped (breakpoint or final step).

func (*DebugSession) EnableBreakpoint added in v0.4.0

func (d *DebugSession) EnableBreakpoint(flowIndex int, enabled bool) error

EnableBreakpoint enables or disables a breakpoint.

func (*DebugSession) FormatFlowList added in v0.4.0

func (d *DebugSession) FormatFlowList() string

FormatFlowList returns a formatted string of all flows.

func (*DebugSession) Inspect added in v0.4.0

func (d *DebugSession) Inspect() *DebugState

Inspect returns the current debug state.

func (*DebugSession) InspectEntity added in v0.4.0

func (d *DebugSession) InspectEntity(id string) (*Entity, string, error)

InspectEntity returns the entity and its current state.

func (*DebugSession) InspectFlow added in v0.4.0

func (d *DebugSession) InspectFlow(index int) (*Flow, error)

InspectFlow returns a flow by index.

func (*DebugSession) ListBreakpoints added in v0.4.0

func (d *DebugSession) ListBreakpoints() []*Breakpoint

ListBreakpoints returns all breakpoints.

func (*DebugSession) ListFlows added in v0.4.0

func (d *DebugSession) ListFlows() []FlowListItem

ListFlows returns all flows with their status.

func (*DebugSession) Protocol added in v0.4.0

func (d *DebugSession) Protocol() *Protocol

Protocol returns the protocol being debugged.

func (*DebugSession) RemoveBreakpoint added in v0.4.0

func (d *DebugSession) RemoveBreakpoint(flowIndex int) error

RemoveBreakpoint removes a breakpoint at the specified flow index.

func (*DebugSession) Reset added in v0.4.0

func (d *DebugSession) Reset()

Reset restarts the debug session from the beginning.

func (*DebugSession) SetBreakpoint added in v0.4.0

func (d *DebugSession) SetBreakpoint(flowIndex int, condition string) error

SetBreakpoint sets a breakpoint at the specified flow index.

func (*DebugSession) SetEntityState added in v0.4.0

func (d *DebugSession) SetEntityState(entityID, stateID string) error

SetEntityState manually sets an entity's state.

func (*DebugSession) Step added in v0.4.0

func (d *DebugSession) Step() (*ExecutionStep, error)

Step executes the next flow and returns the step details. Returns nil when execution is complete.

func (*DebugSession) Trace added in v0.4.0

func (d *DebugSession) Trace() *ExecutionTrace

Trace returns the current execution trace.

type DebugState added in v0.4.0

type DebugState struct {
	// FlowIndex is the current position in the protocol.
	FlowIndex int

	// StepsExecuted is the number of steps executed so far.
	StepsExecuted int

	// CurrentFlow is the next flow to be executed (nil if complete).
	CurrentFlow *Flow

	// EntityStates maps entity IDs to their current states.
	EntityStates map[string]string

	// IsCompleted indicates if execution has finished.
	IsCompleted bool

	// AtBreakpoint indicates if execution stopped at a breakpoint.
	AtBreakpoint bool

	// Error holds any execution error.
	Error error
}

DebugState represents the current state of a debug session.

func (*DebugState) String added in v0.4.0

func (d *DebugState) String() string

DebugStateString returns a human-readable representation of the debug state.

type DeploymentComponent added in v0.4.0

type DeploymentComponent struct {
	// ID is the unique identifier for this component.
	ID string `json:"id"`
	// Name is the human-readable display name.
	Name string `json:"name"`
	// Type classifies the component (e.g., "idp", "iga", "gateway", "mcp_client").
	Type string `json:"type"`
	// Description provides additional context.
	Description string `json:"description,omitempty"`
	// Entities lists the entity IDs contained in this component.
	Entities []string `json:"entities,omitempty"`
	// Implements lists the protocol roles this component implements.
	Implements []ProtocolRole `json:"implements,omitempty"`
	// Examples lists real-world products that represent this component type.
	Examples []string `json:"examples,omitempty"`
}

DeploymentComponent defines a logical deployment component that groups entities.

type DiffCategory added in v0.4.0

type DiffCategory string

DiffCategory represents the category of a diff item.

const (
	DiffCategoryEntity   DiffCategory = "entity"
	DiffCategoryFlow     DiffCategory = "flow"
	DiffCategoryPhase    DiffCategory = "phase"
	DiffCategoryMetadata DiffCategory = "metadata"
)

type DiffItem added in v0.4.0

type DiffItem struct {
	// Type indicates whether the item was added, removed, or modified.
	Type DiffType `json:"type"`

	// Category classifies what was changed.
	Category DiffCategory `json:"category"`

	// Path identifies the location of the change (e.g., "entities[0]", "flows[2].action").
	Path string `json:"path"`

	// OldValue is the value before the change (nil for additions).
	OldValue interface{} `json:"old_value,omitempty"`

	// NewValue is the value after the change (nil for removals).
	NewValue interface{} `json:"new_value,omitempty"`

	// Summary is a human-readable description of the change.
	Summary string `json:"summary"`
}

DiffItem represents a single difference between two protocols.

type DiffOptions added in v0.4.0

type DiffOptions struct {
	// IgnoreMetadata skips metadata comparison.
	IgnoreMetadata bool

	// IgnoreDescriptions skips description field comparisons.
	IgnoreDescriptions bool

	// DeepFlowCompare enables detailed flow field comparison.
	DeepFlowCompare bool
}

DiffOptions controls comparison behavior.

func DefaultDiffOptions added in v0.4.0

func DefaultDiffOptions() DiffOptions

DefaultDiffOptions returns default comparison options.

type DiffSummary added in v0.4.0

type DiffSummary struct {
	// TotalChanges is the total number of differences.
	TotalChanges int `json:"total_changes"`

	// Added counts items that were added.
	Added int `json:"added"`

	// Removed counts items that were removed.
	Removed int `json:"removed"`

	// Modified counts items that were modified.
	Modified int `json:"modified"`

	// ByCategory breaks down changes by category.
	ByCategory map[DiffCategory]int `json:"by_category"`
}

DiffSummary provides counts of changes by category.

type DiffType added in v0.4.0

type DiffType string

DiffType represents the type of difference.

const (
	// DiffTypeAdded indicates an element was added.
	DiffTypeAdded DiffType = "added"
	// DiffTypeRemoved indicates an element was removed.
	DiffTypeRemoved DiffType = "removed"
	// DiffTypeModified indicates an element was modified.
	DiffTypeModified DiffType = "modified"
)

type Entity

type Entity struct {
	// ID is the unique identifier used in flow references.
	ID string `json:"id"`

	// Name is the human-readable display name.
	Name string `json:"name"`

	// Type classifies the entity.
	Type EntityType `json:"type"`

	// Description of the entity's role.
	Description string `json:"description,omitempty"`

	// TrustLevel classifies the trust level of this entity.
	TrustLevel TrustLevel `json:"trust_level,omitempty"`

	// Metadata contains additional entity properties for rendering.
	Metadata *EntityMetadata `json:"metadata,omitempty"`

	// States defines the possible states for this entity.
	States []EntityState `json:"states,omitempty"`

	// ProtocolRoles defines the protocol-specific roles this entity implements.
	ProtocolRoles []ProtocolRole `json:"protocol_roles,omitempty"`
}

Entity represents a participant in the protocol.

func (Entity) HasProtocolRoles added in v0.4.0

func (e Entity) HasProtocolRoles() bool

HasProtocolRoles returns true if the entity has protocol roles defined.

func (Entity) HasRole added in v0.4.0

func (e Entity) HasRole(protocol, role string) bool

HasRole checks if the entity has a specific protocol role.

func (Entity) HasStates added in v0.4.0

func (e Entity) HasStates() bool

HasStates returns true if the entity has any states defined.

func (Entity) InitialState added in v0.4.0

func (e Entity) InitialState() *EntityState

InitialState returns the initial state, or nil if none is marked as initial.

func (Entity) RolesByProtocol added in v0.4.0

func (e Entity) RolesByProtocol(protocol string) []ProtocolRole

RolesByProtocol returns all roles for a specific protocol.

func (Entity) StateByID added in v0.4.0

func (e Entity) StateByID(id string) *EntityState

StateByID returns the state with the given ID, or nil if not found.

func (Entity) StateIDs added in v0.4.0

func (e Entity) StateIDs() []string

StateIDs returns a slice of all state IDs for this entity.

type EntityMetadata added in v0.3.0

type EntityMetadata struct {
	// Network is the network boundary this entity belongs to.
	Network string `json:"network,omitempty"`
	// ServiceType classifies the service (e.g., "api", "database", "gateway").
	ServiceType string `json:"type,omitempty"`
}

EntityMetadata contains additional entity properties.

type EntityState added in v0.4.0

type EntityState struct {
	// ID is the unique identifier for this state within the entity.
	ID string `json:"id"`

	// Name is the human-readable display name.
	Name string `json:"name,omitempty"`

	// Description provides additional context.
	Description string `json:"description,omitempty"`

	// Initial marks this as the initial state.
	Initial bool `json:"initial,omitempty"`

	// Final marks this as a terminal/final state.
	Final bool `json:"final,omitempty"`
}

EntityState represents a possible state for an entity.

type EntityType

type EntityType string

EntityType represents the type of an entity.

const (
	EntityTypeClient              EntityType = "client"
	EntityTypeAuthorizationServer EntityType = "authorization_server"
	EntityTypeResourceServer      EntityType = "resource_server"
	EntityTypeUser                EntityType = "user"
	EntityTypeBrowser             EntityType = "browser"
	EntityTypeAgent               EntityType = "agent"
	EntityTypeToolServer          EntityType = "tool_server"
	EntityTypeTool                EntityType = "tool"
	EntityTypeDelegatedAgent      EntityType = "delegated_agent"
	EntityTypeIdentityProvider    EntityType = "identity_provider"
	EntityTypeServiceProvider     EntityType = "service_provider"
	EntityTypeServer              EntityType = "server"
	EntityTypeOther               EntityType = "other"
)

type ExecutionContext added in v0.4.0

type ExecutionContext struct {
	// Protocol being executed.
	Protocol *Protocol

	// EntityStates maps entity ID to current state ID.
	EntityStates map[string]string

	// FlowIndex is the current position in the protocol's flows.
	FlowIndex int

	// Trace records execution history.
	Trace *ExecutionTrace

	// EventQueue holds pending events for event-driven execution.
	EventQueue []ExecutionEvent

	// Completed indicates execution has finished.
	Completed bool

	// Error holds any execution error.
	Error error
}

ExecutionContext holds the runtime state of a protocol execution.

func (*ExecutionContext) CurrentFlow added in v0.4.0

func (ctx *ExecutionContext) CurrentFlow() *Flow

CurrentFlow returns the next flow to be executed, or nil if complete.

func (*ExecutionContext) GetEntityState added in v0.4.0

func (ctx *ExecutionContext) GetEntityState(entityID string) string

GetEntityState returns the current state of an entity.

func (*ExecutionContext) Progress added in v0.4.0

func (ctx *ExecutionContext) Progress() float64

Progress returns execution progress as a percentage (0-100).

func (*ExecutionContext) SetEntityState added in v0.4.0

func (ctx *ExecutionContext) SetEntityState(entityID, stateID string)

SetEntityState manually sets an entity's state.

type ExecutionEvent added in v0.4.0

type ExecutionEvent struct {
	// Type categorizes the event.
	Type string `json:"type"`

	// FlowIndex references a specific flow (if applicable).
	FlowIndex int `json:"flow_index,omitempty"`

	// EntityID references a specific entity (if applicable).
	EntityID string `json:"entity_id,omitempty"`

	// Data holds event-specific payload.
	Data map[string]interface{} `json:"data,omitempty"`
}

ExecutionEvent represents a pending event in the queue.

type ExecutionStep added in v0.4.0

type ExecutionStep struct {
	// StepNumber is the 1-based step counter.
	StepNumber int `json:"step_number"`

	// FlowIndex is the index in Protocol.Flows.
	FlowIndex int `json:"flow_index"`

	// Timestamp when this step executed.
	Timestamp time.Time `json:"timestamp"`

	// From is the source entity ID.
	From string `json:"from"`

	// To is the target entity ID.
	To string `json:"to"`

	// Action is the flow action.
	Action string `json:"action"`

	// Label is the flow display label.
	Label string `json:"label,omitempty"`

	// Mode is the flow mode.
	Mode FlowMode `json:"mode,omitempty"`

	// Phase is the phase ID.
	Phase string `json:"phase,omitempty"`

	// Condition is the flow's condition (if any).
	Condition string `json:"condition,omitempty"`

	// ConditionMet indicates if condition was satisfied (for conditional flows).
	ConditionMet *bool `json:"condition_met,omitempty"`

	// StateChanges records state mutations from this step.
	StateChanges []StateChange `json:"state_changes,omitempty"`

	// Skipped indicates this flow was skipped (condition not met).
	Skipped bool `json:"skipped,omitempty"`

	// SkipReason explains why flow was skipped.
	SkipReason string `json:"skip_reason,omitempty"`
}

ExecutionStep records a single flow execution.

type ExecutionTrace added in v0.4.0

type ExecutionTrace struct {
	// ProtocolID identifies the executed protocol.
	ProtocolID string `json:"protocol_id"`

	// ProtocolName is the human-readable protocol name.
	ProtocolName string `json:"protocol_name"`

	// StartTime when execution began.
	StartTime time.Time `json:"start_time"`

	// EndTime when execution completed.
	EndTime time.Time `json:"end_time,omitempty"`

	// Steps records each executed flow.
	Steps []ExecutionStep `json:"steps"`

	// InitialStates captures entity states at start.
	InitialStates map[string]string `json:"initial_states,omitempty"`

	// FinalStates captures entity states at end.
	FinalStates map[string]string `json:"final_states,omitempty"`

	// Completed indicates if execution ran to completion.
	Completed bool `json:"completed"`

	// Error message if execution failed.
	Error string `json:"error,omitempty"`
}

ExecutionTrace records the complete execution history.

func (*ExecutionTrace) Duration added in v0.4.0

func (t *ExecutionTrace) Duration() time.Duration

Duration returns the execution duration so far.

func (*ExecutionTrace) SkippedCount added in v0.4.0

func (t *ExecutionTrace) SkippedCount() int

SkippedCount returns the number of skipped steps.

func (*ExecutionTrace) StateChangeCount added in v0.4.0

func (t *ExecutionTrace) StateChangeCount() int

StateChangeCount returns the total number of state changes.

func (*ExecutionTrace) StepCount added in v0.4.0

func (t *ExecutionTrace) StepCount() int

StepCount returns the number of executed steps.

func (*ExecutionTrace) ToJSON added in v0.4.0

func (t *ExecutionTrace) ToJSON() ([]byte, error)

ToJSON returns the trace as JSON bytes.

type Executor added in v0.4.0

type Executor struct {
	// Protocol to execute.
	Protocol *Protocol

	// ConditionEvaluator is called to evaluate flow conditions.
	// If nil, all conditions are assumed to be met.
	ConditionEvaluator func(ctx *ExecutionContext, flow *Flow) bool
}

Executor runs protocol simulations.

func NewExecutor added in v0.4.0

func NewExecutor(p *Protocol) *Executor

NewExecutor creates an Executor for the given protocol.

func (*Executor) NewContext added in v0.4.0

func (e *Executor) NewContext() *ExecutionContext

NewContext creates a fresh execution context with initial states.

func (*Executor) Reset added in v0.4.0

func (e *Executor) Reset(ctx *ExecutionContext)

Reset restarts execution from the beginning.

func (*Executor) Run added in v0.4.0

func (e *Executor) Run(ctx *ExecutionContext) (*ExecutionTrace, error)

Run executes all flows to completion.

func (*Executor) RunN added in v0.4.0

func (e *Executor) RunN(ctx *ExecutionContext, n int) (*ExecutionTrace, error)

RunN executes up to n steps.

func (*Executor) Step added in v0.4.0

func (e *Executor) Step(ctx *ExecutionContext) (*ExecutionStep, error)

Step executes the next flow and returns the step details. Returns nil when execution is complete.

type FileValidationResult

type FileValidationResult struct {
	Filename string
	Protocol *Protocol
	Errors   ValidationErrors
	ParseErr error
}

FileValidationResult contains the result of validating a single file.

func ValidateFiles

func ValidateFiles(filenames []string) []FileValidationResult

ValidateFiles validates multiple PIDL files, returning results for each.

func (FileValidationResult) IsValid

func (r FileValidationResult) IsValid() bool

IsValid returns true if the file parsed and validated successfully.

type Flow

type Flow struct {
	// From is the source entity ID.
	From string `json:"from"`

	// To is the target entity ID.
	To string `json:"to"`

	// Action identifies the action being performed.
	Action string `json:"action"`

	// Label is the display label (defaults to Action).
	Label string `json:"label,omitempty"`

	// Mode is the interaction mode.
	Mode FlowMode `json:"mode,omitempty"`

	// Phase is the phase ID this flow belongs to.
	Phase string `json:"phase,omitempty"`

	// Description provides additional details.
	Description string `json:"description,omitempty"`

	// Sequence provides explicit ordering.
	Sequence int `json:"sequence,omitempty"`

	// Condition specifies when this flow is executed (e.g., "token_valid", "error").
	Condition string `json:"condition,omitempty"`

	// Note is a visible annotation displayed on the diagram.
	Note string `json:"note,omitempty"`

	// Annotations are typed annotations for tooling and documentation.
	Annotations []Annotation `json:"annotations,omitempty"`

	// Alternatives are alternative paths from this flow point.
	Alternatives []Alternative `json:"alternatives,omitempty"`

	// Animation configures animation for this flow in animated SVG output.
	// Can be a string (preset name) or FlowAnimation object.
	Animation *FlowAnimation `json:"animation,omitempty"`

	// Sets defines state mutations that occur when this flow executes.
	Sets []StateMutation `json:"sets,omitempty"`

	// Security specifies security requirements for this flow.
	Security *FlowSecurity `json:"security,omitempty"`
}

Flow represents an interaction between two entities.

func (Flow) DisplayLabel

func (f Flow) DisplayLabel() string

DisplayLabel returns the label for display, falling back to Action if Label is empty.

func (Flow) EffectiveMode

func (f Flow) EffectiveMode() FlowMode

EffectiveMode returns the flow mode, defaulting to FlowModeRequest if empty.

func (Flow) HasAlternatives added in v0.2.0

func (f Flow) HasAlternatives() bool

HasAlternatives returns true if the flow has alternative paths.

func (Flow) HasAnnotations added in v0.2.0

func (f Flow) HasAnnotations() bool

HasAnnotations returns true if the flow has annotations.

func (Flow) HasCondition added in v0.2.0

func (f Flow) HasCondition() bool

HasCondition returns true if the flow has a condition.

func (Flow) HasNote added in v0.2.0

func (f Flow) HasNote() bool

HasNote returns true if the flow has a note.

func (Flow) HasSecurity added in v0.4.0

func (f Flow) HasSecurity() bool

HasSecurity returns true if the flow has security requirements.

func (Flow) HasStateMutations added in v0.4.0

func (f Flow) HasStateMutations() bool

HasStateMutations returns true if the flow has any state mutations.

func (Flow) RequiresEncryption added in v0.4.0

func (f Flow) RequiresEncryption() bool

RequiresEncryption returns true if the flow requires encryption.

func (Flow) RequiresToken added in v0.4.0

func (f Flow) RequiresToken() bool

RequiresToken returns true if the flow requires a token.

type FlowAnimation added in v0.3.0

type FlowAnimation struct {
	// Enabled controls whether this flow is animated. Defaults to true.
	Enabled *bool `json:"enabled,omitempty"`

	// Preset is a semantic preset name (request, success, error, warning, highlight, none).
	Preset AnimationPreset `json:"preset,omitempty"`

	// Duration is the animation cycle duration (e.g., "2s", "1.5s").
	Duration string `json:"duration,omitempty"`

	// Delay is the animation start delay (e.g., "0.5s").
	Delay string `json:"delay,omitempty"`

	// DotColor is the animated dot fill color.
	DotColor string `json:"dot_color,omitempty"`

	// DotSize is the animated dot radius in pixels.
	DotSize int `json:"dot_size,omitempty"`

	// Pulse adds a pulsing effect (useful for errors/warnings).
	Pulse bool `json:"pulse,omitempty"`

	// Easing is the CSS easing function (linear, ease-in-out, etc.).
	Easing string `json:"easing,omitempty"`
}

FlowAnimation configures animation for a flow in animated SVG output.

func (*FlowAnimation) EffectiveDotColor added in v0.3.0

func (f *FlowAnimation) EffectiveDotColor(defaultColor string) string

EffectiveDotColor returns the dot color, applying preset defaults.

func (*FlowAnimation) EffectiveDotSize added in v0.3.0

func (f *FlowAnimation) EffectiveDotSize(defaultSize int) int

EffectiveDotSize returns the dot size, applying preset defaults.

func (*FlowAnimation) IsAnimationEnabled added in v0.3.0

func (f *FlowAnimation) IsAnimationEnabled() bool

IsAnimationEnabled returns whether animation is enabled for this flow.

func (*FlowAnimation) ShouldGlow added in v0.4.0

func (f *FlowAnimation) ShouldGlow() bool

ShouldGlow returns whether the dot should have a glow effect.

func (*FlowAnimation) ShouldPulse added in v0.3.0

func (f *FlowAnimation) ShouldPulse() bool

ShouldPulse returns whether the dot should pulse.

type FlowListItem added in v0.4.0

type FlowListItem struct {
	Index         int
	Flow          *Flow
	IsCurrent     bool
	HasBreakpoint bool
	IsExecuted    bool
}

FlowListItem represents a flow for listing purposes.

type FlowMode

type FlowMode string

FlowMode represents the type of interaction.

const (
	FlowModeRequest     FlowMode = "request"
	FlowModeResponse    FlowMode = "response"
	FlowModeRedirect    FlowMode = "redirect"
	FlowModeCallback    FlowMode = "callback"
	FlowModeInteractive FlowMode = "interactive"
	FlowModeEvent       FlowMode = "event"
	FlowModeToolCall    FlowMode = "tool_call"
	FlowModeToolResult  FlowMode = "tool_result"
)

type FlowSecurity added in v0.4.0

type FlowSecurity struct {
	// Requires lists security mechanisms required for this flow.
	Requires []SecurityRequirement `json:"requires,omitempty"`
	// Token is the token definition ID used for this flow.
	Token string `json:"token,omitempty"`
	// Confidential indicates if the flow carries sensitive data.
	Confidential bool `json:"confidential,omitempty"`
	// Description provides additional security context.
	Description string `json:"description,omitempty"`
}

FlowSecurity describes security requirements for a flow.

type NetworkConfig added in v0.3.0

type NetworkConfig struct {
	// Name is the display name for the boundary.
	Name string `json:"name,omitempty"`
	// Style is the visual style: trusted, dmz, external, cloud.
	Style string `json:"style,omitempty"`
	// Entities explicitly lists entity IDs in this boundary.
	Entities []string `json:"entities,omitempty"`
	// Description provides tooltip/hover text.
	Description string `json:"description,omitempty"`
	// Color overrides the default boundary color.
	Color string `json:"color,omitempty"`
}

NetworkConfig defines a network boundary.

type NetworkLayoutConfig added in v0.3.0

type NetworkLayoutConfig struct {
	// Direction is the layout direction: horizontal or vertical.
	Direction string `json:"direction,omitempty"`
	// Order specifies the boundary ordering.
	Order []string `json:"order,omitempty"`
}

NetworkLayoutConfig configures network diagram layout.

type Phase

type Phase struct {
	// ID is the unique identifier.
	ID string `json:"id"`

	// Name is the human-readable name.
	Name string `json:"name"`

	// Description of the phase.
	Description string `json:"description,omitempty"`

	// Parent is the ID of the parent phase for nested phases.
	Parent string `json:"parent,omitempty"`
}

Phase represents a logical grouping of flows.

type Protocol

type Protocol struct {
	// ProtocolMeta contains metadata about the protocol.
	ProtocolMeta ProtocolMeta `json:"protocol"`

	// Extends specifies a base protocol to extend.
	Extends *ProtocolExtends `json:"extends,omitempty"`

	// Imports specifies other protocol files to import from.
	Imports []ProtocolImport `json:"imports,omitempty"`

	// Entities are the participants in the protocol (systems, actors, services).
	Entities []Entity `json:"entities"`

	// Phases provide optional logical grouping of flows.
	Phases []Phase `json:"phases,omitempty"`

	// Flows are the interactions between entities.
	Flows []Flow `json:"flows"`

	// Metadata contains additional protocol-level configuration.
	Metadata *ProtocolMetadata `json:"metadata,omitempty"`
	// contains filtered or unexported fields
}

Protocol represents a complete PIDL document describing a protocol's choreography.

func MustParse

func MustParse(data []byte) *Protocol

MustParse parses PIDL JSON data and panics on error. Use only in tests or initialization code.

func MustParseFile

func MustParseFile(filename string) *Protocol

MustParseFile reads and parses a PIDL JSON file, panicking on error. Use only in tests or initialization code.

func NewMinimalProtocol

func NewMinimalProtocol(id, name string) *Protocol

NewMinimalProtocol creates a minimal valid protocol scaffold.

func Parse

func Parse(data []byte) (*Protocol, error)

Parse parses PIDL JSON data into a Protocol.

func ParseFile

func ParseFile(filename string) (*Protocol, error)

ParseFile reads and parses a PIDL JSON file.

func ParseReader

func ParseReader(r io.Reader) (*Protocol, error)

ParseReader parses PIDL JSON from an io.Reader.

func (*Protocol) AllComponentTypes added in v0.4.0

func (p *Protocol) AllComponentTypes() []string

AllComponentTypes returns a unique list of all component types. Returns an empty slice if no components exist or Metadata is nil.

func (*Protocol) AllProtocols added in v0.4.0

func (p *Protocol) AllProtocols() []string

AllProtocols returns a unique list of all protocols referenced in entity roles. Returns an empty slice if no protocols are found.

func (*Protocol) AllTrustRelationTypes added in v0.4.0

func (p *Protocol) AllTrustRelationTypes() []string

AllTrustRelationTypes returns a unique list of all trust relation types. Returns an empty slice if no trust relations exist or Metadata is nil.

func (*Protocol) ChildPhases added in v0.2.0

func (p *Protocol) ChildPhases(parentID string) []Phase

ChildPhases returns phases that have the given parent ID.

func (*Protocol) ComponentByID added in v0.4.0

func (p *Protocol) ComponentByID(id string) *DeploymentComponent

ComponentByID returns the component with the given ID, or nil if not found.

func (*Protocol) ComponentForEntity added in v0.4.0

func (p *Protocol) ComponentForEntity(entityID string) *DeploymentComponent

ComponentForEntity returns the component that contains an entity, or nil if not found.

func (*Protocol) ComponentsByType added in v0.4.0

func (p *Protocol) ComponentsByType(componentType string) []DeploymentComponent

ComponentsByType returns all components of a given type. Returns an empty slice if no components match or Metadata is nil.

func (*Protocol) EntitiesByProtocol added in v0.4.0

func (p *Protocol) EntitiesByProtocol(protocol string) []Entity

EntitiesByProtocol returns all entities that implement a role for a specific protocol.

func (*Protocol) EntitiesByRole added in v0.4.0

func (p *Protocol) EntitiesByRole(protocol, role string) []Entity

EntitiesByRole returns all entities that implement a specific protocol role.

func (*Protocol) EntitiesInComponent added in v0.4.0

func (p *Protocol) EntitiesInComponent(componentID string) []Entity

EntitiesInComponent returns all entities that belong to a component. Returns an empty slice if the component is not found.

func (*Protocol) EntitiesWithProtocolRoles added in v0.4.0

func (p *Protocol) EntitiesWithProtocolRoles() []Entity

EntitiesWithProtocolRoles returns all entities that have protocol roles defined.

func (*Protocol) EntitiesWithStates added in v0.4.0

func (p *Protocol) EntitiesWithStates() []Entity

EntitiesWithStates returns all entities that have states defined.

func (*Protocol) EntityByID

func (p *Protocol) EntityByID(id string) *Entity

EntityByID returns the entity with the given ID, or nil if not found.

func (*Protocol) EntityIDs

func (p *Protocol) EntityIDs() []string

EntityIDs returns a slice of all entity IDs.

func (*Protocol) FlowsByPhase

func (p *Protocol) FlowsByPhase(phaseID string) []Flow

FlowsByPhase returns all flows belonging to the given phase.

func (*Protocol) IsResolved added in v0.4.0

func (p *Protocol) IsResolved() bool

IsResolved returns true if the protocol has been resolved.

func (*Protocol) IsValid

func (p *Protocol) IsValid() bool

IsValid returns true if the Protocol passes validation.

func (*Protocol) NeedsResolution added in v0.4.0

func (p *Protocol) NeedsResolution() bool

NeedsResolution returns true if the protocol has imports or extends that need resolution.

func (*Protocol) PhaseByID

func (p *Protocol) PhaseByID(id string) *Phase

PhaseByID returns the phase with the given ID, or nil if not found.

func (*Protocol) PhaseDepth added in v0.2.0

func (p *Protocol) PhaseDepth(phaseID string) int

PhaseDepth returns the nesting depth of a phase (0 for root phases).

func (*Protocol) PhaseIDs

func (p *Protocol) PhaseIDs() []string

PhaseIDs returns a slice of all phase IDs.

func (*Protocol) Resolve added in v0.4.0

func (p *Protocol) Resolve(opts ResolveOptions) (*Protocol, error)

Resolve resolves all imports and extends in the protocol, returning a new fully-resolved Protocol. The original is not modified.

func (*Protocol) RootPhases added in v0.2.0

func (p *Protocol) RootPhases() []Phase

RootPhases returns phases that have no parent (top-level phases).

func (*Protocol) StateTransitions added in v0.4.0

func (p *Protocol) StateTransitions() []StateTransition

StateTransitions extracts all state transitions from the protocol's flows.

func (*Protocol) StateTransitionsForEntity added in v0.4.0

func (p *Protocol) StateTransitionsForEntity(entityID string) []StateTransition

StateTransitionsForEntity returns state transitions for a specific entity.

func (*Protocol) ToJSON

func (p *Protocol) ToJSON() ([]byte, error)

ToJSON serializes a Protocol to JSON with indentation.

func (*Protocol) ToJSONCompact

func (p *Protocol) ToJSONCompact() ([]byte, error)

ToJSONCompact serializes a Protocol to compact JSON.

func (*Protocol) TokenByID added in v0.4.0

func (p *Protocol) TokenByID(id string) *TokenDefinition

TokenByID returns the token definition with the given ID, or nil if not found.

func (*Protocol) TrustRelationByID added in v0.4.0

func (p *Protocol) TrustRelationByID(id string) *TrustRelationship

TrustRelationByID returns the trust relation with the given ID, or nil if not found.

func (*Protocol) TrustRelationsByType added in v0.4.0

func (p *Protocol) TrustRelationsByType(relType string) []TrustRelationship

TrustRelationsByType returns all trust relations of a given type. Returns an empty slice if no relations match or Metadata is nil.

func (*Protocol) TrustRelationsFrom added in v0.4.0

func (p *Protocol) TrustRelationsFrom(id string) []TrustRelationship

TrustRelationsFrom returns all trust relations originating from an entity or component. Returns an empty slice if no relations match or Metadata is nil.

func (*Protocol) TrustRelationsTo added in v0.4.0

func (p *Protocol) TrustRelationsTo(id string) []TrustRelationship

TrustRelationsTo returns all trust relations targeting an entity or component. Returns an empty slice if no relations match or Metadata is nil.

func (*Protocol) Validate

func (p *Protocol) Validate() ValidationErrors

Validate checks the Protocol for errors and returns all found issues.

func (*Protocol) WriteFile

func (p *Protocol) WriteFile(filename string) error

WriteFile writes the Protocol to a file as JSON. It creates any necessary parent directories.

type ProtocolDiff added in v0.4.0

type ProtocolDiff struct {
	// BaseProtocolID is the ID of the base protocol.
	BaseProtocolID string `json:"base_protocol_id"`

	// NewProtocolID is the ID of the new protocol.
	NewProtocolID string `json:"new_protocol_id"`

	// Items contains all differences found.
	Items []DiffItem `json:"items"`

	// Summary provides aggregate statistics.
	Summary DiffSummary `json:"summary"`
}

ProtocolDiff contains the complete comparison result.

func Compare added in v0.4.0

func Compare(base, new *Protocol, opts DiffOptions) *ProtocolDiff

Compare compares two protocols and returns the differences.

func (*ProtocolDiff) HasChanges added in v0.4.0

func (d *ProtocolDiff) HasChanges() bool

HasChanges returns true if there are any differences.

func (*ProtocolDiff) String added in v0.4.0

func (d *ProtocolDiff) String() string

String returns a human-readable text representation of the diff.

func (*ProtocolDiff) ToJSON added in v0.4.0

func (d *ProtocolDiff) ToJSON() ([]byte, error)

ToJSON returns the diff as JSON bytes.

func (*ProtocolDiff) ToMarkdown added in v0.4.0

func (d *ProtocolDiff) ToMarkdown() string

ToMarkdown returns a markdown representation of the diff.

type ProtocolExtends added in v0.4.0

type ProtocolExtends struct {
	// Path is the file path to the base protocol (relative to current file).
	Path string `json:"path"`

	// ExcludeEntities lists entity IDs from the base to exclude.
	ExcludeEntities []string `json:"exclude_entities,omitempty"`

	// ExcludePhases lists phase IDs from the base to exclude.
	ExcludePhases []string `json:"exclude_phases,omitempty"`

	// ExcludeFlows lists flow indices from the base to exclude.
	ExcludeFlows []int `json:"exclude_flows,omitempty"`
}

ProtocolExtends specifies a base protocol to extend.

type ProtocolImport added in v0.4.0

type ProtocolImport struct {
	// Path is the file path to import (relative to current file).
	Path string `json:"path"`

	// Alias prefixes imported IDs to avoid collisions (e.g., "oauth_").
	Alias string `json:"alias,omitempty"`

	// Entities lists specific entity IDs to import (empty = all).
	Entities []string `json:"entities,omitempty"`

	// Phases lists specific phase IDs to import (empty = none unless entities need them).
	Phases []string `json:"phases,omitempty"`

	// IncludeFlows imports flows between the specified entities.
	IncludeFlows bool `json:"include_flows,omitempty"`
}

ProtocolImport specifies another protocol file to import from.

type ProtocolMeta

type ProtocolMeta struct {
	// ID is the unique identifier for the protocol.
	ID string `json:"id"`

	// Name is the human-readable name.
	Name string `json:"name"`

	// Version of this protocol description.
	Version string `json:"version,omitempty"`

	// Description provides a brief summary.
	Description string `json:"description,omitempty"`

	// Category classifies the protocol type.
	Category Category `json:"category,omitempty"`

	// References links to relevant specifications.
	References []Reference `json:"references,omitempty"`
}

ProtocolMeta contains metadata about a protocol.

type ProtocolMetadata added in v0.3.0

type ProtocolMetadata struct {
	// Networks defines network boundary configurations.
	Networks map[string]*NetworkConfig `json:"networks,omitempty"`
	// NetworkLayout configures network diagram layout.
	NetworkLayout *NetworkLayoutConfig `json:"network_layout,omitempty"`
	// Tokens defines token types used in the protocol.
	Tokens []TokenDefinition `json:"tokens,omitempty"`
	// Components defines logical deployment components.
	Components []DeploymentComponent `json:"components,omitempty"`
	// TrustRelations defines trust relationships between entities or components.
	TrustRelations []TrustRelationship `json:"trust_relations,omitempty"`
}

ProtocolMetadata contains additional protocol-level configuration.

type ProtocolRole added in v0.4.0

type ProtocolRole struct {
	// Protocol is the protocol identifier (e.g., "oauth", "scim", "aauth", "authzen", "mcp", "a2a", "spiffe").
	Protocol string `json:"protocol"`
	// Role is the role within that protocol (e.g., "authorization_server", "client", "pep", "pdp").
	Role string `json:"role"`
	// Variant is an optional sub-role or variant (e.g., "person_server" vs "access_server" for AAuth).
	Variant string `json:"variant,omitempty"`
	// Description provides additional context.
	Description string `json:"description,omitempty"`
}

ProtocolRole defines a protocol-specific role that an entity implements.

type Reference

type Reference struct {
	// Name of the reference (e.g., "RFC 6749").
	Name string `json:"name"`

	// URL to the reference.
	URL string `json:"url"`
}

Reference links to external documentation.

type ResolveOptions added in v0.4.0

type ResolveOptions struct {
	// BasePath is the directory to resolve relative paths from.
	BasePath string

	// MaxDepth limits import nesting depth (default: 10).
	MaxDepth int
}

ResolveOptions configures protocol resolution behavior.

func DefaultResolveOptions added in v0.4.0

func DefaultResolveOptions() ResolveOptions

DefaultResolveOptions returns default resolution options.

type SecurityRequirement added in v0.4.0

type SecurityRequirement string

SecurityRequirement represents a security mechanism required for a flow.

const (
	// SecurityRequirementToken requires a bearer or bound token.
	SecurityRequirementToken SecurityRequirement = "token"
	// SecurityRequirementSignature requires message signing.
	SecurityRequirementSignature SecurityRequirement = "signature"
	// SecurityRequirementEncryption requires message encryption.
	SecurityRequirementEncryption SecurityRequirement = "encryption"
	// SecurityRequirementMTLS requires mutual TLS authentication.
	SecurityRequirementMTLS SecurityRequirement = "mtls"
	// SecurityRequirementMAC requires message authentication code.
	SecurityRequirementMAC SecurityRequirement = "mac"
)

type StateChange added in v0.4.0

type StateChange struct {
	// Entity is the entity ID.
	Entity string `json:"entity"`

	// FromState is the prior state (empty if not tracked).
	FromState string `json:"from_state,omitempty"`

	// ToState is the new state.
	ToState string `json:"to_state"`
}

StateChange records a single state mutation.

type StateMutation added in v0.4.0

type StateMutation struct {
	// Entity is the ID of the entity whose state changes.
	Entity string `json:"entity"`

	// To is the target state ID.
	To string `json:"to"`

	// From is the optional required prior state (for validation).
	From string `json:"from,omitempty"`
}

StateMutation represents a state change for an entity triggered by a flow.

type StateTransition added in v0.4.0

type StateTransition struct {
	// EntityID is the entity undergoing the state change.
	EntityID string
	// FromState is the prior state (empty if not specified).
	FromState string
	// ToState is the target state.
	ToState string
	// FlowAction is the action that triggers this transition.
	FlowAction string
	// FlowLabel is the display label for the triggering flow.
	FlowLabel string
}

StateTransition represents a state transition extracted from flows.

type TokenDefinition added in v0.4.0

type TokenDefinition struct {
	// ID is the unique identifier for this token definition.
	ID string `json:"id"`
	// Name is the human-readable display name.
	Name string `json:"name,omitempty"`
	// Type is the token type: jwt, opaque, saml, api_key.
	Type string `json:"type,omitempty"`
	// Issuer is the entity ID that issues this token.
	Issuer string `json:"issuer,omitempty"`
	// Audience is the entity ID that consumes this token.
	Audience string `json:"audience,omitempty"`
	// Binding is the token binding method: bearer, mtls, dpop.
	Binding string `json:"binding,omitempty"`
	// Description provides additional context.
	Description string `json:"description,omitempty"`
}

TokenDefinition describes a token type used in the protocol.

type TrustLevel added in v0.4.0

type TrustLevel string

TrustLevel represents the trust classification of an entity.

const (
	// TrustLevelTrusted is for fully trusted internal systems.
	TrustLevelTrusted TrustLevel = "trusted"
	// TrustLevelSemiTrusted is for partially trusted systems (DMZ, partners).
	TrustLevelSemiTrusted TrustLevel = "semi_trusted"
	// TrustLevelUntrusted is for external/public systems.
	TrustLevelUntrusted TrustLevel = "untrusted"
	// TrustLevelAuthoritative is for sources of truth (IdPs, CAs).
	TrustLevelAuthoritative TrustLevel = "authoritative"
)

type TrustRelationship added in v0.4.0

type TrustRelationship struct {
	// ID is an optional unique identifier for this relationship.
	ID string `json:"id,omitempty"`
	// From is the source entity or component ID.
	From string `json:"from"`
	// To is the target entity or component ID.
	To string `json:"to"`
	// Type is the relationship type (e.g., "authenticates", "validates", "delegates").
	Type string `json:"type"`
	// Credentials lists what credentials are exchanged in this relationship.
	Credentials []string `json:"credentials,omitempty"`
	// Mutual indicates if this is a bidirectional trust (e.g., mTLS).
	Mutual bool `json:"mutual,omitempty"`
	// Description provides additional context.
	Description string `json:"description,omitempty"`
}

TrustRelationship defines a trust relationship between entities or components.

type ValidationError

type ValidationError struct {
	Field   string
	Message string
}

ValidationError represents a validation error with context.

func (ValidationError) Error

func (e ValidationError) Error() string

type ValidationErrors

type ValidationErrors []ValidationError

ValidationErrors is a collection of validation errors.

func (ValidationErrors) Error

func (e ValidationErrors) Error() string

func (ValidationErrors) HasErrors

func (e ValidationErrors) HasErrors() bool

HasErrors returns true if there are any validation errors.

Directories

Path Synopsis
Package analyze provides security analysis for PIDL protocols.
Package analyze provides security analysis for PIDL protocols.
cmd
pidl command
Command pidl is the CLI tool for the Protocol Interaction Description Language.
Command pidl is the CLI tool for the Protocol Interaction Description Language.
Package examples provides embedded PIDL example protocols.
Package examples provides embedded PIDL example protocols.
Package render provides diagram renderers for PIDL protocols.
Package render provides diagram renderers for PIDL protocols.
svg
Package svg provides SVG rendering utilities for PIDL protocols.
Package svg provides SVG rendering utilities for PIDL protocols.
Package schema provides the embedded PIDL JSON Schema.
Package schema provides the embedded PIDL JSON Schema.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL