lib/openagents/forge/supervisor.ex

58e6347eeb72 · 1 KB

defmodule OpenAgents.Forge.Supervisor do
  @moduledoc "The forge's own supervision subtree (bounded-context edge, audit A6)."

  use Supervisor

  def start_link(init_arg) do
    Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
  end

  @impl true
  def init(_init_arg) do
    children =
      [
        {Task.Supervisor, name: OpenAgents.Forge.TaskSupervisor},
        {OpenAgents.Forge.MirrorWatch, []}
      ] ++ anchor_children() ++ repository_children() ++ deploy_lane_children()

    Supervisor.init(children, strategy: :one_for_one)
  end

  # The WAL anchor publisher (EXIT-005, ADR 0008). Off the push path by
  # construction: a slow or failing anchor must never be able to refuse a push.
  defp anchor_children do
    if Application.get_env(:openagents, :forge_wal_anchor_enabled, true) do
      [{OpenAgents.Forge.AnchorPublisher, []}]
    else
      []
    end
  end

  defp repository_children do
    if Application.get_env(:openagents, :repository_provisioner_enabled, true) do
      [
        {OpenAgents.Repositories.Provisioner, []},
        {OpenAgents.Repositories.ImportWorkspaceJanitor, []},
        {OpenAgents.Stacks.OperationWorker, []},
        {OpenAgents.Stacks.EventDispatcher, []}
      ]
    else
      []
    end
  end

  # The deploy lane (builder + hot loader) runs in the release; tests start
  # these under their own supervision with scripted executors.
  defp deploy_lane_children do
    if Application.get_env(:openagents, :forge_deploy_lane_enabled, true) do
      [
        {OpenAgents.Forge.Builder, []},
        {OpenAgents.Forge.HotLoader, []},
        {OpenAgents.Forge.Janitor, []}
      ]
    else
      []
    end
  end
end