The provider seam
Config is a pluggable-provider feature. The skeleton ships the selection seam — a config mode, its settings, and a factory that maps a mode to a provider module — and the default file provider. The active mode is chosen withTAI_CONFIG_MODE
(file by default). The factory loads the selected provider by dynamic import and
builds its manager:
build_config_manager() convention. The factory needs nothing but the mode and the
module; the consuming code never knows which provider is behind the manager.
Secrets are referenced, not embedded
Sensitive values are referenced by the name of the environment variable that holds them, not by value. Asecret_env field carries an env var name; the runtime
reads the secret from the environment at use time. So a manifest, a hook, or a
webhook verifier binding names secret_env and never contains the credential
itself — keeping secrets out of files that are edited, versioned, or displayed.
How a config change is written
Every change to the manifest or env — a tool reload, a manifest replace, a live env edit — runs one mutation pipeline: validate the resulting config, persist it transactionally, reload the calling process, then broadcast on the worker bus. Persisting before reloading is why the persisted config and the live config cannot drift apart through a supported path — the running state is always what is on disk. Two guarantees hold across every provider:- Transactional writes, in both config modes. A write holds exclusive access
across the whole read-modify-write span, so a concurrent writer cannot
interleave and lose an update — the
fileprovider takes a lock, thek8sprovider retries on an optimistic-concurrency conflict. - Comment preservation. A manifest edit keeps the surrounding comments, key order, and formatting of the untouched document. An automated edit does not reflow a file a human maintains by hand.
The plugin model
Config providers are one member of a broader pattern. A plugin is any separately-shipped package that registers through thetai42_app contract handle —
connectors, storage backends, config providers, backends,
monitoring, and webhook verifiers. A plugin is loaded because the
manifest names its module, and no plugin imports the
skeleton, which is what keeps the core provider-free and the ecosystem open-ended.
Change environment values and read the active mode from the CLI:
Settings reference
Every setting below is read from the environment (or the managed.env store) at
use time. These are hand-maintained here — there is no generated reference for the
skeleton, toolbox, and agents settings, so this page is their canonical home.
Core environment
Worker bus
The worker bus is app-owned internal infrastructure — a plain-Redis fan-out primitive, not a plugin. It is configured entirely through theseTAI_BUS_* variables; no manifest field selects a bus.
Connector token encryption
Connector OAuth token blobs are encrypted at rest. Supply the key by env var name — the value is never embedded in a manifest.Proxy pool (tai42-toolbox)
Timeouts and limits
Guardrails on downstream calls, concurrency, and payload sizes. All have safe defaults; raise a timeout only when a legitimately longer operation needs it.
Per-feature connection timeouts. Each Redis- or Postgres-backed feature carries
its own connection tuning under that feature’s env prefix. Postgres connections
expose
<PREFIX>PG_CONNECT_TIMEOUT (default 10) and
<PREFIX>PG_STATEMENT_TIMEOUT_SECONDS (default 60) — for example
ACCESS_CONTROL_STORE_PG_CONNECT_TIMEOUT, VERSIONING_STORE_PG_STATEMENT_TIMEOUT_SECONDS.
Redis connections expose <PREFIX>SOCKET_TIMEOUT and <PREFIX>SOCKET_CONNECT_TIMEOUT
— for example ACCESS_CONTROL_SOCKET_TIMEOUT, TAI_TOOL_RUNS_SOCKET_CONNECT_TIMEOUT.
A specific config provider’s setup — for example which secret store and config
source it reads — lives in that provider package’s own repository, reachable
from the catalog. The platform documents the provider
contract, not any one provider.
tai config.
