45 lines
1.4 KiB
Elixir
45 lines
1.4 KiB
Elixir
defmodule Symbiont.Application do
|
|
@moduledoc """
|
|
OTP Application for Symbiont — the self-sustaining AI orchestrator.
|
|
|
|
Supervision tree (dev/prod):
|
|
Symbiont.Supervisor
|
|
├── Task.Supervisor (Symbiont.TaskSupervisor)
|
|
├── Symbiont.Ledger — append-only cost log
|
|
├── Symbiont.Queue — persistent task queue
|
|
├── Symbiont.Heartbeat — periodic health checks + queue processing
|
|
└── Bandit (Symbiont.API) — HTTP API
|
|
|
|
In test mode, the supervisor starts empty — tests manage their own processes.
|
|
"""
|
|
use Application
|
|
|
|
@impl true
|
|
def start(_type, _args) do
|
|
if Application.get_env(:symbiont, :port) == 0 do
|
|
# Test mode: start an empty supervisor, tests manage their own processes
|
|
Supervisor.start_link([], strategy: :one_for_one, name: Symbiont.Supervisor)
|
|
else
|
|
start_full()
|
|
end
|
|
end
|
|
|
|
defp start_full do
|
|
data_dir = Application.get_env(:symbiont, :data_dir, "data")
|
|
File.mkdir_p!(data_dir)
|
|
|
|
port = Application.get_env(:symbiont, :port, 8111)
|
|
|
|
children = [
|
|
{Task.Supervisor, name: Symbiont.TaskSupervisor},
|
|
{Symbiont.Ledger, data_dir: data_dir},
|
|
{Symbiont.Queue, data_dir: data_dir},
|
|
{Symbiont.Heartbeat, []},
|
|
{Bandit, plug: Symbiont.API, port: port, scheme: :http}
|
|
]
|
|
|
|
opts = [strategy: :rest_for_one, name: Symbiont.Supervisor]
|
|
Supervisor.start_link(children, opts)
|
|
end
|
|
end
|