function cmd::export::_full() {
  local no_config="${1:-false}" no_peers="${2:-false}"

  local sections=()

  # Config
  if ! $no_config; then
    local config_json="{}"
    [[ -f "$(ctx::config_file)" ]] && config_json=$(cmd::export::_compact_json "$(ctx::config_file)")
    sections+=("\"config\":${config_json}")
  fi

  # Peers
  if ! $no_peers; then
    local -a peer_jsons=()
    for conf in "$(ctx::clients)"/*.conf; do
      [[ -f "$conf" ]] || continue
      local pname
      pname=$(basename "$conf" .conf)
      local peer_export
      peer_export=$(cmd::export::_peer_data "$pname")
      [[ -n "$peer_export" ]] && peer_jsons+=("$peer_export")
    done
    local peers_array
    peers_array=$(printf '%s\n' "${peer_jsons[@]:-}" | paste -sd ',' -)
    sections+=("\"peers\":[${peers_array:-}]")
  fi

  # Rules — raw JSON files
  local -a rule_jsons=()
  for rule_file in "$(ctx::rules)"/*.rule "$(ctx::rules)/base"/*.rule; do
    [[ -f "$rule_file" ]] || continue
    rule_jsons+=("$(cmd::export::_compact_json "$rule_file")")
  done
  local rules_array
  rules_array=$(printf '%s\n' "${rule_jsons[@]:-}" | paste -sd ',' -)
  sections+=("\"rules\":[${rules_array:-}]")

  # Identities
  local -a id_jsons=()
  for id_file in "$(ctx::identities)"/*.identity; do
    [[ -f "$id_file" ]] || continue
    id_jsons+=("$(cmd::export::_compact_json "$id_file")")
  done
  local ids_array
  ids_array=$(printf '%s\n' "${id_jsons[@]:-}" | paste -sd ',' -)
  sections+=("\"identities\":[${ids_array:-}]")

  # Groups
  local -a grp_jsons=()
  for grp_file in "$(ctx::groups)"/*.group; do
    [[ -f "$grp_file" ]] || continue
    grp_jsons+=("$(cmd::export::_compact_json "$grp_file")")
  done
  local grps_array
  grps_array=$(printf '%s\n' "${grp_jsons[@]:-}" | paste -sd ',' -)
  sections+=("\"groups\":[${grps_array:-}]")

  # Flat JSON files
  [[ -f "$(ctx::policies)" ]] && sections+=("\"policies\":$(cat "$(ctx::policies)")")
  [[ -f "$(ctx::subnets)" ]]  && sections+=("\"subnets\":$(cat "$(ctx::subnets)")")
  [[ -f "$(ctx::net)" ]]      && sections+=("\"services\":$(cat "$(ctx::net)")")
  [[ -f "$(ctx::hosts)" ]]    && sections+=("\"hosts\":$(cat "$(ctx::hosts)")")

  local data
  data=$(printf '%s\n' "${sections[@]}" | paste -sd ',' -)
  cmd::export::_envelope "full" "{${data}}"
}