sig
  module Command :
    sig
      type t = { host : Ketrew_pure.Host.t; action : Ketrew_pure.Program.t; }
      val shell :
        ?host:Ketrew_pure.Host.t -> string -> Ketrew_pure.Target.Command.t
      val program :
        ?host:Ketrew_pure.Host.t ->
        Ketrew_pure.Program.t -> Ketrew_pure.Target.Command.t
      val get_host : Ketrew_pure.Target.Command.t -> Ketrew_pure.Host.t
      val log : Ketrew_pure.Target.Command.t -> Internal_pervasives.Log.t
      val markup :
        Ketrew_pure.Target.Command.t -> Internal_pervasives.Display_markup.t
      val to_string_hum : Ketrew_pure.Target.Command.t -> string
    end
  module Volume :
    sig
      type structure =
          [ `Directory of string * Ketrew_pure.Target.Volume.structure list
          | `File of string ]
      type t = {
        host : Ketrew_pure.Host.t;
        root : Ketrew_pure.Path.t;
        structure : Ketrew_pure.Target.Volume.structure;
      }
      val create :
        host:Ketrew_pure.Host.t ->
        root:Ketrew_pure.Path.t ->
        Ketrew_pure.Target.Volume.structure -> Ketrew_pure.Target.Volume.t
      val file : string -> Ketrew_pure.Target.Volume.structure
      val dir :
        string ->
        Ketrew_pure.Target.Volume.structure list ->
        Ketrew_pure.Target.Volume.structure
      val all_paths : Ketrew_pure.Target.Volume.t -> Ketrew_pure.Path.t list
      val log_structure :
        Ketrew_pure.Target.Volume.structure -> Internal_pervasives.Log.t
      val log : Ketrew_pure.Target.Volume.t -> Internal_pervasives.Log.t
      val markup :
        Ketrew_pure.Target.Volume.t -> Internal_pervasives.Display_markup.t
      val to_string_hum : Ketrew_pure.Target.Volume.t -> string
    end
  module Build_process :
    sig
      type t = [ `Long_running of string * string | `No_operation ]
      val nop : Ketrew_pure.Target.Build_process.t
    end
  type id = Internal_pervasives.Unique_id.t
  module Condition :
    sig
      type t =
          [ `And of Ketrew_pure.Target.Condition.t list
          | `Command_returns of Ketrew_pure.Target.Command.t * int
          | `Never
          | `Satisfied
          | `Volume_exists of Ketrew_pure.Target.Volume.t
          | `Volume_size_bigger_than of Ketrew_pure.Target.Volume.t * int ]
      val log : Ketrew_pure.Target.Condition.t -> Internal_pervasives.Log.t
      val to_string_hum : Ketrew_pure.Target.Condition.t -> string
      val markup :
        Ketrew_pure.Target.Condition.t ->
        Internal_pervasives.Display_markup.t
    end
  module Equivalence : sig type t = [ `None | `Same_active_condition ] end
  module State :
    sig
      type t
      type simple = [ `Activable | `Failed | `In_progress | `Successful ]
      val simple_to_yojson :
        Ketrew_pure.Target.State.simple -> Yojson.Safe.json
      val simple_of_yojson :
        Yojson.Safe.json ->
        [ `Error of string | `Ok of Ketrew_pure.Target.State.simple ]
      val simplify :
        Ketrew_pure.Target.State.t -> Ketrew_pure.Target.State.simple
      val name : Ketrew_pure.Target.State.t -> string
      type summary =
          [ `Time of Internal_pervasives.Time.t ] *
          [ `Log of string option ] * [ `Info of string list ]
      val summary :
        Ketrew_pure.Target.State.t -> Ketrew_pure.Target.State.summary
      val log :
        ?depth:int -> Ketrew_pure.Target.State.t -> Internal_pervasives.Log.t
      val passive_time :
        Ketrew_pure.Target.State.t -> Internal_pervasives.Time.t
      val finished_time :
        Ketrew_pure.Target.State.t -> Internal_pervasives.Time.t option
      module Is :
        sig
          val building : Ketrew_pure.Target.State.t -> bool
          val tried_to_start : Ketrew_pure.Target.State.t -> bool
          val started_running : Ketrew_pure.Target.State.t -> bool
          val starting : Ketrew_pure.Target.State.t -> bool
          val still_building : Ketrew_pure.Target.State.t -> bool
          val still_running : Ketrew_pure.Target.State.t -> bool
          val ran_successfully : Ketrew_pure.Target.State.t -> bool
          val successfully_did_nothing : Ketrew_pure.Target.State.t -> bool
          val active : Ketrew_pure.Target.State.t -> bool
          val verified_success : Ketrew_pure.Target.State.t -> bool
          val already_done : Ketrew_pure.Target.State.t -> bool
          val dependencies_failed : Ketrew_pure.Target.State.t -> bool
          val failed_running : Ketrew_pure.Target.State.t -> bool
          val failed_to_kill : Ketrew_pure.Target.State.t -> bool
          val failed_to_start : Ketrew_pure.Target.State.t -> bool
          val killing : Ketrew_pure.Target.State.t -> bool
          val tried_to_kill : Ketrew_pure.Target.State.t -> bool
          val did_not_ensure_condition : Ketrew_pure.Target.State.t -> bool
          val killed : Ketrew_pure.Target.State.t -> bool
          val finished : Ketrew_pure.Target.State.t -> bool
          val passive : Ketrew_pure.Target.State.t -> bool
          val killable : Ketrew_pure.Target.State.t -> bool
          val finished_because_dependencies_died :
            Ketrew_pure.Target.State.t -> bool
          val activated_by_user : Ketrew_pure.Target.State.t -> bool
        end
      module Count :
        sig
          val consecutive_recent_attempts : Ketrew_pure.Target.State.t -> int
        end
      module Flat :
        sig
          type state = Ketrew_pure.Target.State.t
          type item = private {
            time : float;
            simple : Ketrew_pure.Target.State.simple;
            name : string;
            message : string option;
            more_info : string list;
            finished : bool;
          }
          val item_to_yojson :
            Ketrew_pure.Target.State.Flat.item -> Yojson.Safe.json
          val item_of_yojson :
            Yojson.Safe.json ->
            [ `Error of string | `Ok of Ketrew_pure.Target.State.Flat.item ]
          val time : Ketrew_pure.Target.State.Flat.item -> float
          val simple :
            Ketrew_pure.Target.State.Flat.item ->
            Ketrew_pure.Target.State.simple
          val name : Ketrew_pure.Target.State.Flat.item -> string
          val message : Ketrew_pure.Target.State.Flat.item -> string option
          val more_info : Ketrew_pure.Target.State.Flat.item -> string list
          val finished : Ketrew_pure.Target.State.Flat.item -> bool
          type t = private {
            history : Ketrew_pure.Target.State.Flat.item list;
          }
          val to_yojson : Ketrew_pure.Target.State.Flat.t -> Yojson.Safe.json
          val of_yojson :
            Yojson.Safe.json ->
            [ `Error of string | `Ok of Ketrew_pure.Target.State.Flat.t ]
          val empty : unit -> Ketrew_pure.Target.State.Flat.t
          val of_state :
            Ketrew_pure.Target.State.Flat.state ->
            Ketrew_pure.Target.State.Flat.t
          val history :
            Ketrew_pure.Target.State.Flat.t ->
            Ketrew_pure.Target.State.Flat.item list
          val latest :
            Ketrew_pure.Target.State.Flat.t ->
            Ketrew_pure.Target.State.Flat.item option
          val since :
            Ketrew_pure.Target.State.Flat.t ->
            float -> Ketrew_pure.Target.State.Flat.t option
          val merge :
            Ketrew_pure.Target.State.Flat.t ->
            Ketrew_pure.Target.State.Flat.t ->
            Ketrew_pure.Target.State.Flat.t
        end
    end
  type t
  val to_yojson : Ketrew_pure.Target.t -> Yojson.Safe.json
  val of_yojson :
    Yojson.Safe.json -> [ `Error of string | `Ok of Ketrew_pure.Target.t ]
  val create :
    ?id:Ketrew_pure.Target.id ->
    ?name:string ->
    ?metadata:[ `String of string ] ->
    ?depends_on:Ketrew_pure.Target.id list ->
    ?on_failure_activate:Ketrew_pure.Target.id list ->
    ?on_success_activate:Ketrew_pure.Target.id list ->
    ?make:Ketrew_pure.Target.Build_process.t ->
    ?condition:Ketrew_pure.Target.Condition.t ->
    ?equivalence:Ketrew_pure.Target.Equivalence.t ->
    ?tags:string list -> unit -> Ketrew_pure.Target.t
  val id : Ketrew_pure.Target.t -> Internal_pervasives.Unique_id.t
  val name : Ketrew_pure.Target.t -> string
  val depends_on : Ketrew_pure.Target.t -> Ketrew_pure.Target.id list
  val on_success_activate :
    Ketrew_pure.Target.t -> Ketrew_pure.Target.id list
  val on_failure_activate :
    Ketrew_pure.Target.t -> Ketrew_pure.Target.id list
  val metadata : Ketrew_pure.Target.t -> [ `String of string ] option
  val build_process :
    Ketrew_pure.Target.t -> Ketrew_pure.Target.Build_process.t
  val condition :
    Ketrew_pure.Target.t -> Ketrew_pure.Target.Condition.t option
  val equivalence : Ketrew_pure.Target.t -> Ketrew_pure.Target.Equivalence.t
  val additional_log :
    Ketrew_pure.Target.t -> (Internal_pervasives.Time.t * string) list
  val tags : Ketrew_pure.Target.t -> string list
  val state : Ketrew_pure.Target.t -> Ketrew_pure.Target.State.t
  module Automaton :
    sig
      type failure_reason
      type progress = [ `Changed_state | `No_change ]
      type 'a transition_callback =
          ?log:string ->
          '-> Ketrew_pure.Target.t * Ketrew_pure.Target.Automaton.progress
      type severity = [ `Fatal | `Try_again ]
      type bookkeeping = { plugin_name : string; run_parameters : string; }
      type long_running_failure =
          Ketrew_pure.Target.Automaton.severity * string *
          Ketrew_pure.Target.Automaton.bookkeeping
      type long_running_action =
          (Ketrew_pure.Target.Automaton.bookkeeping,
           Ketrew_pure.Target.Automaton.long_running_failure)
          Pvem.Result.t
      type process_check =
          [ `Still_running of Ketrew_pure.Target.Automaton.bookkeeping
          | `Successful of Ketrew_pure.Target.Automaton.bookkeeping ]
      type process_status_check =
          (Ketrew_pure.Target.Automaton.process_check,
           Ketrew_pure.Target.Automaton.long_running_failure)
          Pvem.Result.t
      type condition_evaluation =
          (bool, Ketrew_pure.Target.Automaton.severity * string)
          Pvem.Result.t
      type dependencies_status =
          [ `All_succeeded
          | `At_least_one_failed of Ketrew_pure.Target.id list
          | `Still_processing ]
      type transition =
          [ `Activate of
              Ketrew_pure.Target.id list *
              unit Ketrew_pure.Target.Automaton.transition_callback
          | `Check_and_activate_dependencies of
              Ketrew_pure.Target.Automaton.dependencies_status
              Ketrew_pure.Target.Automaton.transition_callback
          | `Check_process of
              Ketrew_pure.Target.Automaton.bookkeeping *
              Ketrew_pure.Target.Automaton.process_status_check
              Ketrew_pure.Target.Automaton.transition_callback
          | `Do_nothing of
              unit Ketrew_pure.Target.Automaton.transition_callback
          | `Eval_condition of
              Ketrew_pure.Target.Condition.t *
              Ketrew_pure.Target.Automaton.condition_evaluation
              Ketrew_pure.Target.Automaton.transition_callback
          | `Kill of
              Ketrew_pure.Target.Automaton.bookkeeping *
              Ketrew_pure.Target.Automaton.long_running_action
              Ketrew_pure.Target.Automaton.transition_callback
          | `Start_running of
              Ketrew_pure.Target.Automaton.bookkeeping *
              Ketrew_pure.Target.Automaton.long_running_action
              Ketrew_pure.Target.Automaton.transition_callback ]
      val transition :
        Ketrew_pure.Target.t -> Ketrew_pure.Target.Automaton.transition
    end
  val activate_exn :
    ?log:string ->
    Ketrew_pure.Target.t ->
    reason:[ `Dependency of Ketrew_pure.Target.id | `User ] ->
    Ketrew_pure.Target.t
  val kill :
    ?log:string -> Ketrew_pure.Target.t -> Ketrew_pure.Target.t option
  val reactivate :
    ?with_id:Ketrew_pure.Target.id ->
    ?with_name:string ->
    ?with_metadata:[ `String of string ] option ->
    ?log:string -> Ketrew_pure.Target.t -> Ketrew_pure.Target.t
  val is_equivalent : Ketrew_pure.Target.t -> Ketrew_pure.Target.t -> bool
  val log : Ketrew_pure.Target.t -> Internal_pervasives.Log.t
  val latest_run_parameters : Ketrew_pure.Target.t -> string option
  module Stored_target :
    sig
      type target = Ketrew_pure.Target.t
      type t
      val to_json :
        Ketrew_pure.Target.Stored_target.t -> Internal_pervasives.Json.t
      val serialize : Ketrew_pure.Target.Stored_target.t -> string
      val deserialize :
        string ->
        (Ketrew_pure.Target.Stored_target.t,
         [> `Target of [> `Deserilization of string ] ])
        Internal_pervasives.Result.t
      val get_target :
        Ketrew_pure.Target.Stored_target.t ->
        [ `Pointer of Ketrew_pure.Target.id
        | `Target of Ketrew_pure.Target.Stored_target.target ]
      val of_target :
        Ketrew_pure.Target.Stored_target.target ->
        Ketrew_pure.Target.Stored_target.t
      val id : Ketrew_pure.Target.Stored_target.t -> Ketrew_pure.Target.id
      val make_pointer :
        from:Ketrew_pure.Target.Stored_target.target ->
        pointing_to:Ketrew_pure.Target.Stored_target.target ->
        Ketrew_pure.Target.Stored_target.t
    end
  module Summary :
    sig
      type full_target = Ketrew_pure.Target.t
      type t
      val to_yojson : Ketrew_pure.Target.Summary.t -> Yojson.Safe.json
      val of_yojson :
        Yojson.Safe.json ->
        [ `Error of string | `Ok of Ketrew_pure.Target.Summary.t ]
      val create :
        Ketrew_pure.Target.Summary.full_target ->
        Ketrew_pure.Target.Summary.t
      val id :
        Ketrew_pure.Target.Summary.t -> Internal_pervasives.Unique_id.t
      val name : Ketrew_pure.Target.Summary.t -> string
      val depends_on :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.id list
      val on_success_activate :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.id list
      val on_failure_activate :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.id list
      val metadata :
        Ketrew_pure.Target.Summary.t -> [ `String of string ] option
      val build_process :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.Build_process.t
      val condition :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.Condition.t option
      val equivalence :
        Ketrew_pure.Target.Summary.t -> Ketrew_pure.Target.Equivalence.t
      val tags : Ketrew_pure.Target.Summary.t -> string list
    end
end