///|
/// Semantic operations are the complete public modeling surface. There is no
/// ExecuteScript, Python, shell, eval, or arbitrary-code constructor.
pub(all) enum SemanticOperation {
  CreateModel(name~ : String, units~ : String, coordinate_frame~ : String)
  CreateBox(
    object_id~ : String,
    width_mm~ : Int,
    depth_mm~ : Int,
    height_mm~ : Int
  )
  CreateCylinder(
    object_id~ : String,
    radius_mm~ : Int,
    height_mm~ : Int,
    sides~ : Int
  )
  SetTransform(object_id~ : String, x_mm~ : Int, y_mm~ : Int, z_mm~ : Int)
  AssignMaterial(object_id~ : String, material_id~ : String)
  BooleanSubtract(target_id~ : String, cutter_id~ : String)
  ValidateScene
  ExportRepresentation(
    representation~ : RepresentationKind,
    output_path~ : String
  )
} derive(Debug, Eq, ToJson)

///|
pub(all) struct AdapterRequest {
  project_id : String
  session_id : String
  model_id : String
  request_id : String
  idempotency_key : String
  expected_parent_digest : String
  workspace_root : String
  deadline_ms : Int
  authority : AuthorityClass
  operation : SemanticOperation
}

///|
pub(all) enum AdapterOutcome {
  Applied
  IdempotentNoOp
  Rejected
} derive(Debug, Eq, ToJson)

///|
/// The responsibility result is computed before backend execution. It makes
/// ownership and claim ceilings inspectable without starting Blender or any
/// other adapter process.
pub(all) struct RequestResponsibility {
  owner_product : String
  disposition : String
  claim_ceiling : String
  reasons : Array[String]
} derive(Debug, Eq, ToJson)

///|
pub(all) struct AdapterReceipt {
  request_id : String
  idempotency_key : String
  outcome : AdapterOutcome
  before_digest : String
  after_digest : String
  changed_objects : Array[String]
  warnings : Array[String]
  evidence : ValidationEvidence
} derive(Debug, Eq, ToJson)

///|
pub(all) suberror AdapterError {
  InvalidIdentity(String)
  InvalidDeadline(Int)
  AuthorityExceeded(AuthorityClass)
  WorkspaceBoundaryViolation(String)
  StaleParent(expected~ : String, actual~ : String)
  ConflictingIdempotencyKey(String)
  UnsupportedTransportMethod(String)
  InvalidOperation(String)
} derive(Debug, Eq)