Client config

A single public endpoint the CLI polls for two things: the data-plane image refs it should deploy, and the CLI support policy (minimum supported release, latest release, install URL).

GET /v1/clientconfig — published images + CLI support policy

Auth: public. Always 200 OK — there is no error case; a server with no policy configured just returns empty version strings.

$ curl -s https://api.stagdb.com/v1/clientconfig

Response 200 OK

{
  "agent_image": "registry.stagdb.com/adjoint-agent:v0.4.0-a8f670b",
  "operator_image": "registry.stagdb.com/adjoint-operator:v0.4.0-a8f670b",
  "cli": {
    "min_version": "v0.2.0",
    "latest_version": "v0.3.0",
    "install_url": "https://stagdb.com/adjoint/install.sh"
  }
}
Field Type Notes
agent_image string Full adjoint-agent image ref to deploy. Server-configured (ADJ_AGENT_IMAGE); never empty in practice.
operator_image string Full adjoint-operator image ref to deploy. Server-configured (ADJ_OPERATOR_IMAGE); never empty in practice.
cli.min_version string Minimum supported adj release for cluster provisioning, e.g. v0.2.0. Empty means no floor is enforced.
cli.latest_version string Current recommended adj release, e.g. v0.3.0. Empty means no update nag is shown.
cli.install_url string URL the CLI pipes into sh to (re)install. Falls back to https://stagdb.com/adjoint/install.sh client-side if empty.

cli.min_version and cli.latest_version, when non-empty, are always a clean release tag (vX.Y.Z — no prerelease or build suffix); the server refuses to boot with a malformed value in ADJ_CLI_MIN_VERSION/ADJ_CLI_LATEST_VERSION.

Who consumes this, and when

Every request adj (v0.3.0+) makes carries an X-Adj-CLI-Version header — the control plane logs it (cli_version=..., log-only, no response behavior) as a fleet-version signal. GET /v1/clientconfig is the other half: the CLI reads it back to drive three things, all in cli/internal/clientcfg/ and cli/internal/cli/clientconfig.go:

Both the gate and the nag only ever compare release versions (vX.Y.Z — the same format this endpoint returns); a locally-built or git-describe adj binary skips both policies rather than failing a comparison it can't make sense of.

Next