Pixir.Config (pixir v0.1.6)

Copy Markdown View Source

Loader for ~/.pixir/config.json (ADR 0005 ergonomics).

Parses user-global knobs, ignores invalid values with warnings (never hard-fails on a bad field), and resolves effective values with this precedence for each key:

  1. config :pixir, :key (programmatic override)
  2. ~/.pixir/config.json
  3. built-in default

Model id keeps the Provider chain: config :pixir, :modelPIXIR_MODEL"model" in config.json → built-in default.

Legacy keys (model, models, context_windows) remain supported alongside the expanded surface (permission_default, reasoning.effort, text.verbosity, bash_timeout_ms, bash_timeout_max_ms, host_commands, max_retries, stream_idle_timeout_ms, compaction.tail_events).

bash_timeout_max_ms is an override cap, not a way to shorten the configured default. The effective cap is never lower than bash_timeout_ms; when config asks for a lower cap, load/1 reports a warning and raises the effective cap so the default bash command remains executable.

Summary

Functions

Whether model-assisted compaction is enabled (default false).

Context-window overrides from config.json (model => positive integer).

Model slug from config.json only (no env/app precedence).

Models list from config.json only, or nil when absent/invalid.

Resolved host-command boundary limits.

Load and resolve config.json.

Merge config defaults into Provider opts without clobbering explicit values.

Resolved permission default (:auto, :ask, or :read_only).

Resolved reasoning effort, or nil to omit and let the model default.

Resolved text verbosity, or nil to omit and let the model default.

Types

load_result()

@type load_result() :: %{required(String.t()) => term()}

warning()

@type warning() :: %{required(String.t()) => String.t()}

Functions

bash_timeout_max_ms(opts \\ [])

@spec bash_timeout_max_ms(keyword()) :: pos_integer()

bash_timeout_ms(opts \\ [])

@spec bash_timeout_ms(keyword()) :: pos_integer()

compaction_model_assisted(opts \\ [])

@spec compaction_model_assisted(keyword()) :: boolean()

Whether model-assisted compaction is enabled (default false).

compaction_tail_events(opts \\ [])

@spec compaction_tail_events(keyword()) :: pos_integer()

file_context_windows(opts \\ [])

@spec file_context_windows(keyword()) :: %{required(String.t()) => pos_integer()}

Context-window overrides from config.json (model => positive integer).

file_model(opts \\ [])

@spec file_model(keyword()) :: String.t() | nil

Model slug from config.json only (no env/app precedence).

file_models(opts \\ [])

@spec file_models(keyword()) :: [String.t()] | nil

Models list from config.json only, or nil when absent/invalid.

host_commands(opts \\ [])

@spec host_commands(keyword()) ::
  {:ok, %{required(String.t()) => non_neg_integer() | pos_integer()}}

Resolved host-command boundary limits.

load(opts \\ [])

@spec load(keyword()) :: load_result()

Load and resolve config.json.

Returns a JSON-serializable map with "path", "present", "effective", and "warnings". Missing files yield defaults and an empty warning list.

max_retries(opts \\ [])

@spec max_retries(keyword()) :: non_neg_integer()

merge_provider_opts(provider_opts, config_opts \\ [])

@spec merge_provider_opts(keyword(), keyword()) :: keyword()

Merge config defaults into Provider opts without clobbering explicit values.

permission_default(opts \\ [])

@spec permission_default(keyword()) :: Pixir.Permissions.mode()

Resolved permission default (:auto, :ask, or :read_only).

reasoning_effort(opts \\ [])

@spec reasoning_effort(keyword()) :: String.t() | nil

Resolved reasoning effort, or nil to omit and let the model default.

stream_idle_timeout_ms(opts \\ [])

@spec stream_idle_timeout_ms(keyword()) :: non_neg_integer()

text_verbosity(opts \\ [])

@spec text_verbosity(keyword()) :: String.t() | nil

Resolved text verbosity, or nil to omit and let the model default.