Configuration
Most Centaur settings come from Helm values and are rendered into service
environment variables by service-specific templates under contrib/chart/templates/.
Use these as the main extension points:
| Source | Use |
|---|---|
secretManager.existingSecretName | Required runtime secrets such as database, Slack, sandbox signing, and 1Password credentials. |
api.extraEnv | API feature flags, worker tuning, retention, observability, and deployment-specific overrides. |
apiRs.extraEnv | Rust API feature flags, telemetry exporter settings, and deployment-specific overrides. |
apiRs.metrics.* | Prometheus/VictoriaMetrics scrape metadata for the Rust API /metrics endpoint. |
apiRs.nodeSelector, apiRs.affinity, apiRs.tolerations | Controls scheduling for api-rs pods, including dedicated tainted node pools. |
console.nodeSelector, console.affinity, console.tolerations | Controls scheduling for Console web pods, including dedicated tainted node pools. |
console.worker.nodeSelector, console.worker.affinity, console.worker.tolerations | Controls scheduling for Console background worker pods independently from the web pods. |
postgres.nodeSelector, postgres.affinity, postgres.tolerations | Controls scheduling for the bundled PostgreSQL pod. Ensure selected nodes can mount its persistent storage. |
console.sqlExporter.* | SQL Exporter configuration and scrape metadata for Console database metrics. |
slackbot.extraEnv | Slackbot HTTP, Slack, feedback, and cross-org behavior. |
sandbox.extraEnv | Extra variables copied into every sandbox pod through KUBERNETES_SANDBOX_EXTRA_ENV. |
overlays.sources | Ordered repo-cache-backed overlay repos for tools, workflows, and skills; subdirs default to tools, workflows, and .agents/skills. |
overlay.systemPrompt | Small inline prompt overlay escape hatch. |
Tool credentials are not listed here. Tool plugins declare their own secrets in
tools/**/pyproject.toml; Centaur resolves them through secret(...) and
iron-proxy instead of treating them as global platform configuration.
Required
These must exist for the normal Helm deployment. For local development,
just bootstrap-secrets creates centaur-infra-env from your shell.
| Env var | Set from | Controls |
|---|---|---|
DATABASE_URL | secretManager.existingSecretName; local bootstrap generates it. | API and Slackbot Postgres connection. |
SLACK_SIGNING_SECRET | secretManager.existingSecretName; local bootstrap reads shell env. | Slack request signature verification. |
SLACKBOT_API_KEY | secretManager.existingSecretName; local bootstrap reads shell env. | Dedicated Slackbot key accepted by api-rs for the Slack session namespace and workflow events. |
SLACK_BOT_TOKEN | secretManager.existingSecretName; local bootstrap reads shell env. | Slack Web API access for Slackbot and api-rs Slack helpers. |
IRON_MANAGEMENT_API_KEY | secretManager.existingSecretName; local bootstrap generates it. | Management key for API-created iron-proxy pods. |
OP_SERVICE_ACCOUNT_TOKEN | Local shell, then centaur-infra-env; production Secret. | 1Password service-account auth when using onepassword secret source. |
OP_VAULT | Local shell, then centaur-infra-env; defaults to ai-agents in code. | 1Password vault used for op://... secret refs. |
Optional required-by-mode variables:
| Env var | Set from | Controls |
|---|---|---|
OP_CONNECT_CREDENTIALS_FILE | Local shell before just deploy. | Enables the 1Password Connect subchart and creates its credentials Secret. |
OP_CONNECT_TOKEN | Secret or local bootstrap shell env. | Token used by iron-proxy when ironProxy.secretSource=onepassword-connect. |
TEAMS_BOT_APP_ID, TEAMS_BOT_APP_PASSWORD, TEAMS_BOT_APP_TENANT_ID | Local shell before just bootstrap-secrets; production Secret. | Required by Teamsbot when teamsbot.enabled=true. |
TEAMSBOT_API_KEY | secretManager.existingSecretName; local bootstrap generates it when Teams credentials are present and it is omitted. | Static API key used by Teamsbot. |
CENTAUR_APIRS_ADMIN_API_KEY | secretManager.existingSecretName or the api-rs environment. | Optional static bearer token with every api-rs capability. Generate a distinct value with openssl rand -hex 32. |
CONSOLE_SQLEXPORTER_DATABASE_URL | secretManager.existingSecretName; local bootstrap copies it from the shell when provided. | Database URL for a separately provisioned read-only PostgreSQL role. Required when console.sqlExporter.enabled=true. |
Console and Permission Control Plane
The Console stores principals, roles, grants, sandbox capabilities, and encrypted secret-source configuration. The chart renders its internal URL and admin API key into api-rs. See Advanced Permissioning for the operator workflow.
| Env var or value | Set from | Controls |
|---|---|---|
IRON_CONTROL_DATABASE_URL | secretManager.existingSecretName. | Console database connection. Keep it separate from the api-rs logical database. |
IRON_CONTROL_INITIAL_USER_EMAIL, IRON_CONTROL_INITIAL_USER_PASSWORD | secretManager.existingSecretName; local bootstrap generates defaults when absent. | Creates the initial Console admin when no user exists. |
IRON_CONTROL_INITIAL_API_KEY | secretManager.existingSecretName; local bootstrap generates it when absent. | Admin API key used by api-rs and centaur-perms. |
IRON_CONTROL_AR_ENCRYPTION_PRIMARY_KEY, IRON_CONTROL_AR_ENCRYPTION_DETERMINISTIC_KEY, IRON_CONTROL_AR_ENCRYPTION_KEY_DERIVATION_SALT | secretManager.existingSecretName; local bootstrap generates them when absent. | Encrypts credential material at rest. Keep these stable after first boot. |
IRON_CONTROL_SECRET_KEY_BASE | secretManager.existingSecretName; local bootstrap generates it when absent. | Console session and application signing secret. |
CENTAUR_JWT_SIGNING_SECRET | secretManager.existingSecretName; local bootstrap generates it when absent. | Signs Console-issued MCP tokens, Console service tokens, and sandbox api-rs principal tokens. |
console.publicUrl | Helm value. | Public Console origin used for links and MCP authorization metadata. |
console.passwordLoginEnabled | Helm value, default true. | Enables the break-glass email and password login. Disable after SSO is configured for a public Console. |
console.ssoEmailDomains | Helm value. | Limits Google, Slack, or Okta SSO admission by email domain. Empty accepts any IdP-authenticated email. |
console.sqlExporter.enabled | Helm value, default false. | Runs one internal SQL Exporter replica, initially configured with Solid Queue collectors. Enable it after the read-only database role and Secret key exist. |
console.sqlExporter.metrics.* | Helm values. | Configures the SQL Exporter metrics path and Prometheus-compatible scrape annotations. |
console.sqlExporter.databaseUrlSecretKey | Helm value, default CONSOLE_SQLEXPORTER_DATABASE_URL. | Selects the key in secretManager.existingSecretName containing the database URL for a dedicated read-only PostgreSQL role. |
networkPolicy.metricsIngressSourceNamespaces | Helm value. | Allows Prometheus-compatible collectors in the listed namespaces to scrape internal metrics Services. Collectors in the Centaur namespace are always allowed. |
console.oktaOauth.enabled | Helm value, default false. | Enables Okta OIDC login for the Console. |
console.oktaOauth.issuer | Helm value. | Okta organization or custom authorization-server issuer used for OIDC discovery. |
console.oktaOauth.tokenEndpointAuthMethod | Helm value, default client_secret_basic. | Client authentication method configured on the Okta application: client_secret_basic or client_secret_post. |
CENTAUR_CONSOLE_OKTA_CLIENT_ID, CENTAUR_CONSOLE_OKTA_CLIENT_SECRET | secretManager.existingSecretName when Okta login is enabled. | Okta OIDC web application credentials. |
apiRs.syncInfraSecrets, IRON_CONTROL_SYNC_INFRA_SECRETS | Helm value, default true. | Upserts the shared infra role and its harness/platform secrets. Set false only when another process owns that shared Console state. |
IRON_CONTROL_URL, IRON_CONTROL_API_KEY | Chart-rendered for api-rs; operator shell for centaur-perms. | Connects the runtime or CLI to the Console. |
Default roles and default sandbox capabilities are stored in the Console, not as Helm values. Configure them in System Settings before new principals are created. Changing a default does not rewrite existing principals.
API
| Env var | Set from | Controls |
|---|---|---|
CENTAUR_DEFAULT_HARNESS | api.defaultHarness. | Default harness for new executions. |
CENTAUR_ENVIRONMENT | api.extraEnv or deployment env. | Environment label in traces and telemetry. |
CENTAUR_LOG_LEVEL, LOG_LEVEL | Helm sets CENTAUR_LOG_LEVEL=info; override in api.extraEnv. | API log level. |
CENTAUR_SERVICE_NAME | api.extraEnv. | Default API log service field. |
SHUTDOWN_DRAIN_TIMEOUT_S | api.extraEnv. | Graceful shutdown wait for in-flight HTTP requests. |
EXECUTION_WORKER_ENABLED | api.executionWorkerEnabled. | Starts the durable agent execution worker. |
WORKFLOW_WORKER_ENABLED | api.workflowWorkerEnabled. | Starts the durable workflow worker. |
WARM_POOL_ENABLED | api.warmPoolEnabled. | Starts warm sandbox replenishment. |
PLUGIN_WATCHER_ENABLED | api.pluginWatcherEnabled. | Enables tool and workflow hot-reload watchers. |
TOOL_DIRS, PLUGINS_DIR | Chart-rendered from overlays.sources[*].toolsSubdir (default tools); fallback to PLUGINS_DIR. | Tool discovery paths. |
WORKFLOW_DIRS | Chart-rendered from overlays.sources[*].workflowsSubdir (default workflows). | Workflow discovery paths. |
SLACKBOT_URL | Chart-rendered Slackbot service URL. | API callback target for Slack delivery. |
FINAL_DELIVERY_MAX_ATTEMPTS, FINAL_DELIVERY_READY_GRACE_S | api.extraEnv. | Final-delivery retry and claim timing. |
CENTAUR_ENABLE_GCLOUD_BOOTSTRAP, GCP_GCLOUD_CREDENTIAL, GCLOUD_PROJECT | api.extraEnv or Secret. | Optional gcloud ADC bootstrap in the API container. |
CLAUDE_MODEL, CODEX_MODEL | api.extraEnv or request model override. | Harness model selection defaults. When set via sandbox.extraEnv, the chart also mirrors them into slackbotv2 and the Console so their model displays track the deployment. |
API-RS
| Env var or value | Set from | Controls |
|---|---|---|
RUST_LOG | Chart sets info; override with apiRs.extraEnv. | Rust tracing filter for the API-RS binary and crates. |
OTEL_SERVICE_NAME | apiRs.extraEnv; defaults to centaur-api-rs. | OpenTelemetry service name used by trace backends. |
CENTAUR_ENVIRONMENT, DEPLOY_ENV, ENVIRONMENT | apiRs.extraEnv or deployment env. | Deployment environment resource attribute for telemetry. |
OTEL_TRACES_EXPORTER | apiRs.extraEnv. | Set to otlp to force OTLP trace export, or none/off to disable it. |
OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT | apiRs.extraEnv. | Enables OTLP trace export to Tempo, Jaeger, or another OTLP collector. |
apiRs.workflowHostSandbox, WORKFLOW_HOST_SANDBOX | Helm value, default true; override with apiRs.extraEnv. | Runs workflow hosts in Kubernetes sandboxes instead of the api-rs process. Required for workflow-scoped principals. |
apiRs.metrics.scrapeAnnotations | Helm value, default true. | Adds Prometheus scrape annotations to the API-RS Pod template and Service. |
apiRs.metrics.path | Helm value, default /metrics. | Metrics scrape path for annotation-based discovery. |
apiRs.metrics.annotations | Helm value. | Additional scrape annotations for Prometheus-compatible collectors. |
apiRs.activitySummary.* | Helm values, default disabled. | Enables API-RS to summarize live session activity into durable session.activity_summary events. |
SLACK_BOT_TOKEN | Explicit secretKeyRef from secretManager.existingSecretName. | Slack Web API access for api-rs Slack proxy and workflow Slack helpers. |
OPENAI_API_KEY | Secret mounted into api-rs, or apiRs.extraEnv for local/dev overrides. | OpenAI credential for activity summaries; the feature stays disabled when no key is present. |
OPENAI_BASE_URL | apiRs.extraEnv; default https://api.openai.com/v1. | OpenAI-compatible Responses API base URL for every api-rs OpenAI caller: Codex, generated session titles, and activity summaries. API-RS passes it into Codex sandboxes and derives iron-proxy's OPENAI_API_KEY host scope from it. |
SESSION_ACTIVITY_SUMMARY_OPENAI_BASE_URL | Deprecated apiRs.activitySummary.openaiBaseUrl compatibility setting. | Existing activity-summary endpoint override. OPENAI_BASE_URL takes precedence when both are set. |
SESSION_ACTIVITY_SUMMARY_MODEL | apiRs.activitySummary.model, default gpt-5.4-nano. | Model used for the short live activity sentence. |
Sandbox lifecycle:
| Env var or value | Set from | Controls |
|---|---|---|
SESSION_IDLE_TIMEOUT_MS | slackbotv2.extraEnv; default is up to 3 hours. | Slackbot v2 execute idle timeout. After an execution reaches a terminal state, api-rs pauses the sandbox if no newer execution has used that sandbox. If SESSION_MAX_DURATION_MS is lower than 3 hours and this value is unset, Slackbot v2 caps the default idle timeout to the max duration. |
SESSION_MAX_DURATION_MS | slackbotv2.extraEnv. | Optional per-execution max duration forwarded to api-rs. api-rs rejects requests where idle_timeout_ms is greater than max_duration_ms. |
apiRs.sandboxMaxLifetimeSecs / SESSION_SANDBOX_MAX_LIFETIME_SECS | Helm value, default 259200 (72 hours). | Restart-surviving sandbox deletion backstop. The reaper stops any non-terminal sandbox older than this, regardless of whether it is running or suspended. Set 0 to disable max-lifetime reaping. |
apiRs.sessionEventsRetentionDays / SESSION_EVENTS_RETENTION_DAYS | Helm value, default 0 (disabled); range 0 through 3650. | Deletes only session.output.line events older than this many days, once their execution also completed before the cutoff. Other session event types are preserved. Events without an execution expire by event age alone. Requires the manual retention index. Sweeps skip deletion when the index is missing or invalid. |
apiRs.sessionEventsRetentionSweepIntervalSecs / SESSION_EVENTS_RETENTION_SWEEP_INTERVAL_SECS | Helm value, default 300. | How often api-rs runs a session-event retention sweep when retention is enabled. |
apiRs.sandboxReapIntervalSecs / SESSION_SANDBOX_REAP_INTERVAL_SECS | Helm value, default 300. | How often api-rs sweeps observed sandboxes for max-lifetime expiry and orphaned proxy resources. |
apiRs.sandboxOrphanSweepGraceSecs / SESSION_SANDBOX_ORPHAN_SWEEP_GRACE_SECS | Helm value, default 600. | Minimum age of an iron-proxy resource with no live Sandbox before the orphan sweep may delete it. |
apiRs.activitySummary.reasoningEffort / SESSION_ACTIVITY_SUMMARY_REASONING_EFFORT | Helm value, default low. | Reasoning effort sent with the activity-summary call. The output budget is small, so a server that resolves an absent effort to its highest level spends the whole budget reasoning and returns an incomplete response with no message. Set empty to omit the parameter for a server that rejects it. |
SESSION_TITLE_REASONING_EFFORT | Env on api-rs, default low. | The same, for the session-title call, whose budget is 24 output tokens. Set empty to omit the parameter. |
There is no separate suspended-only delete timer. Pausing is controlled by the per-execution idle timeout; deletion is controlled by sandbox max lifetime.
Execution tuning:
| Env var | Set from | Controls |
|---|---|---|
EXECUTION_WORKER_CONCURRENCY | api.extraEnv. | Max concurrent execution claims. |
EXECUTION_RESERVED_USER_SLOTS | api.extraEnv. | Worker slots reserved for user-facing requests. |
EXECUTION_WORKER_LEASE_S | api.extraEnv. | Execution claim lease duration. |
EXECUTION_SILENCE_TIMEOUT_S, EXECUTION_TOOL_SILENCE_TIMEOUT_S, EXECUTION_HARD_TIMEOUT_S | api.extraEnv. | Execution watchdog and absolute timeouts. |
EXECUTION_WATCHDOG_POLL_S, EXECUTION_RECONCILE_INTERVAL_S, EXECUTION_STALE_RECOVERY_INTERVAL_S | api.extraEnv. | Execution watchdog and reconciliation cadence. |
EXECUTION_RECONCILE_STARTUP_LIMIT | api.extraEnv. | Max interrupted executions recovered at startup. |
EXECUTION_STREAM_EOF_RETRY_DELAY_S | api.extraEnv. | Delay before retrying interrupted sandbox streams. |
THREAD_FAILURE_LOOP_WINDOW_S, THREAD_FAILURE_LOOP_THRESHOLD | api.extraEnv. | Repeated thread failure detection. |
IDLE_TTL_S, SUSPENDED_RETENTION_S, MAX_ACTIVE_SANDBOX_SESSIONS | api.extraEnv. | Sandbox cleanup limits. |
STREAM_EOF_REATTACH_MAX, STREAM_EOF_REATTACH_BACKOFF_S | api.extraEnv. | Stream reattach retry behavior. |
SANDBOX_CROSS_THREAD_READS | api.extraEnv. | Lets a sandbox token read any thread it has the key for (messages, status, attachments). Defaults to enabled. Set to 0 to confine reads to the token's own thread. Writes are always confined regardless. |
Slackbot
| Env var | Set from | Controls |
|---|---|---|
NODE_ENV | Runtime env. | Development route listing and telemetry environment fallback. |
PORT | Runtime env. | Slackbot HTTP port. |
SLACK_API_URL | slackbot.extraEnv. | Optional Slack Web API base URL override. |
CENTAUR_API_URL | Chart-rendered API service URL. | API base URL used by Slackbot. |
CENTAUR_SLACK_EVENTS_PATH | slackbot.extraEnv. | Slack Events API route; defaults to /api/webhooks/slack. |
RUNTIME_ERROR_ALERT_CHANNEL | slackbot.runtimeErrorAlertChannel. | Slack channel for runtime error alerts. |
SLACK_EVENT_DEDUP_TTL_MS | slackbot.extraEnv. | Slack event dedupe window. |
SLACK_SIGNATURE_MAX_AGE_SECONDS | slackbot.extraEnv. | Maximum accepted Slack signature age. |
LINEAR_API_KEY | Secret or slackbot.extraEnv. | Enables Slack feedback commands to create Linear issues. |
SLACK_FEEDBACK_COMMANDS, SLACK_FEEDBACK_ALLOWED_CHANNELS | slackbot.extraEnv. | Feedback slash commands and optional channel allowlist. |
SLACK_FEEDBACK_LINEAR_TEAM_ID, SLACK_FEEDBACK_LINEAR_PROJECT_ID | slackbot.extraEnv. | Linear destination for feedback issues. |
SLACKBOT_EXTERNAL_ORG_ALLOWLIST | slackbot.extraEnv. | Slack team ids allowed for external org handoff. |
SLACKBOTV2_AGENT_VIEW_ENABLED | slackbotv2.agentViewEnabled. | Enables Slack agent view, threaded DM sessions, and native status and titles. Defaults to false. Requires the Slack app migration described in Quickstart. Native Stop support is deferred. |
SLACKBOTV2_AUTO_JOIN_CREATED_CHANNELS | slackbotv2.autoJoinCreatedChannels. | Joins newly-created public channels after subscribed channel_created events. Requires channels:read and channels:join. Defaults to false. |
SLACKBOTV2_STEERING_REACTION_ENABLED | slackbotv2.steeringReactionEnabled. | Reacts to mentioned follow-up messages while an execution is active, then removes their reactions after the assistant response is posted. Requires reactions:write. Defaults to false and disables itself for the running process if Slack reports the scope is missing. |
SLACKBOTV2_STEERING_REACTION | slackbotv2.steeringReaction. | Slack emoji name used for steering acknowledgements. Defaults to hourglass_flowing_sand. |
SLACKBOTV2_DEFAULT_HARNESS | sandbox.harnessEngine. | Base harness for new Slack threads without an explicit flag or channel default. |
SLACKBOTV2_CODEX_NANOCODEX_ROLLOUT_PERCENT | slackbotv2.codexNanocodexRolloutPercent. | Percentage of otherwise-default Codex Slack threads assigned to Nanocodex. Assignment is deterministic by thread key and recorded in session and execution metadata. Selecting a non-default model bypasses the rollout. When response metadata is enabled, Slack shows the resolved harness name. Defaults to 0; increase it to enroll new Codex Slack threads. |
SLACKBOTV2_CHANNEL_DEFAULTS | slackbotv2.channelDefaults. | Per-channel default harness / model / provider / reasoning as a JSON object keyed by Slack conversation id, where each value is an object of optional harness/model/provider/reasoning fields (same vocabulary as the inline flags, so harness: claude, provider: bedrock, and Claude model aliases like opus all work), e.g. {"C0ENG":{"harness":"claude","model":"opus","reasoning":"high"},"C0TRIAGE":{"reasoning":"low"}}. A model is only meaningful within a harness, so name the harness alongside it. Applied when a message in that channel carries no explicit/sticky per-thread flag (below such a flag, above the deployment/baked default) and forwarded onto the harness input line so it takes effect; setting the harness restarts a thread onto it like a --claude/--codex flag. reasoning affects the Codex and Nanocodex harnesses. Malformed JSON and unrecognized field values are logged and ignored. |
SLACK_TEAM_ID | slackbot.extraEnv. | Workspace team ID (e.g. T01ABCD2EFG) used to rewrite https://*.slack.com/archives/... URLs in final-delivery messages into native slack://channel?team=... deep links that open in the Slack app. Leave unset to keep archive URLs unchanged. |
COMMIT_SHA | Build/deploy env. | Commit shown in Slackbot metadata. |
Teamsbot
| Env var | Set from | Controls |
|---|---|---|
PORT | Runtime env. | Teamsbot HTTP port; defaults to 3100. |
LOG_LEVEL | Runtime env. | Teamsbot JSON log level: debug, info, warn, error, or silent. |
CENTAUR_API_URL | Chart-rendered API service URL. | API base URL used by Teamsbot; local default is http://127.0.0.1:8080. |
TEAMSBOT_API_KEY | secretManager.existingSecretName. | Dedicated API key used by Teamsbot to call api-rs. |
TEAMSBOT_DATABASE_URL, DATABASE_URL, POSTGRES_URL | Secret. | Teamsbot Postgres state store. The service refuses to boot without one unless tests/dev inject a state store. |
TEAMSBOT_STATE_KEY_PREFIX | Runtime env. | Postgres state namespace; defaults to centaur-teamsbot. |
TEAMS_BOT_APP_ID, TEAMS_BOT_APP_PASSWORD, TEAMS_BOT_APP_TENANT_ID | Secret. | Required Bot Framework app credentials. |
TEAMS_ALLOWED_TEAM_IDS, TEAMS_ALLOWED_CHANNEL_IDS, TEAMS_ALLOWED_TENANT_IDS | teamsbot.allowedTeamIds, teamsbot.allowedChannelIds, teamsbot.allowedTenantIds. | Comma-separated allowlists. Empty means Teamsbot ignores all Teams messages. Personal chats require an allowed tenant id. |
TEAMS_REQUIRE_MENTION | teamsbot.requireMention. | Requires a bot mention before activating a thread; defaults to true. |
TEAMS_DEFAULT_HARNESS_TYPE | sandbox.harnessEngine. | Default harness requested for new Teams sessions. Existing harness conflicts retry on the session's current harness. |
SESSION_IDLE_TIMEOUT_MS, SESSION_MAX_DURATION_MS | Runtime env. | Forwarded to api-rs execute. TEAMS_IDLE_TIMEOUT_MS and TEAMS_MAX_DURATION_MS override these for Teams only. |
TEAMS_ACTIVE_EXECUTION_TTL_MS | Runtime env. | Stale execution timeout used to unwedge Teams threads after crashes. |
TEAMS_DOWNLOAD_ATTACHMENTS | teamsbot.downloadAttachments. | Enables allowed Teams attachment downloads into base64 payloads; defaults to false. |
TEAMS_ATTACHMENT_MAX_BYTES, TEAMS_ATTACHMENT_ALLOWED_HOSTS | Runtime env. | Attachment download size cap and HTTPS host allowlist. |
TEAMS_GRAPH_BEARER_TOKEN, TEAMS_GRAPH_TOKEN_SCOPE | Runtime env or Secret. | Optional Graph auth fallback for Graph/SharePoint-backed attachment URLs. |
Sandbox
API-set variables:
| Env var | Set from | Controls |
|---|---|---|
AGENT_IMAGE | sandbox.image.*. | Sandbox image used by the Kubernetes backend. |
AGENT_API_URL | Chart-rendered API service URL. | Source for sandbox CENTAUR_API_URL; required by Kubernetes backend. |
CENTAUR_API_URL, CENTAUR_THREAD_KEY | API sandbox creation. | API callback and thread key. |
AMP_MODE, AMP_THREAD_VISIBILITY, AMP_CONTINUE_THREAD_ID | API env or resume path. | Amp mode and resume behavior. |
FIREWALL_HOST, HTTPS_PROXY, HTTP_PROXY, NO_PROXY and lowercase variants | API sandbox creation. | Routes sandbox egress through per-sandbox iron-proxy. |
NODE_EXTRA_CA_CERTS, REQUESTS_CA_BUNDLE, SSL_CERT_FILE, GIT_SSL_CAINFO | API sandbox creation. | Trust bundle for proxied TLS. |
PG_PROXY_PASSWORD_<SECRET_NAME>, <PG_DSN_SECRET_NAME> | API per-sandbox proxy creation. | Proxied Postgres credentials for tools that declare pg_dsn secrets. |
Kubernetes backend:
| Env var | Set from | Controls |
|---|---|---|
KUBERNETES_NAMESPACE, POD_NAMESPACE, KUBERNETES_KUBECONFIG | Chart namespace, downward API, or api.extraEnv. | Kubernetes client namespace/config. |
KUBERNETES_AGENT_IMAGE_PULL_POLICY, KUBERNETES_SANDBOX_IMAGE_PULL_SECRETS | sandbox.image.pullPolicy, global.imagePullSecrets. | Sandbox image pull behavior. |
SESSION_SANDBOX_RUNTIME_CLASS_NAME | sandbox.runtimeClassName. | RuntimeClass for sandbox and iron-proxy pods (e.g. gVisor). |
SESSION_SANDBOX_SERVICE_ACCOUNT_NAME | sandbox.serviceAccountName. | ServiceAccount for sandbox pods (session, warm, and workflow-host), e.g. for cloud workload identity (EKS IRSA). Must already exist in the namespace; iron-proxy pods are unaffected and automountServiceAccountToken stays false. Changing it drains retained sandboxes before reuse. |
SESSION_SANDBOX_RESOURCES | sandbox.resources. | Session sandbox pod resources (per-session and warm) as a JSON Kubernetes ResourceRequirements object. Arbitrary resource names are preserved, and malformed input fails startup. |
WORKFLOW_HOST_RESOURCES | apiRs.workflowHostResources. | Workflow-host sandbox pod resources as a JSON Kubernetes ResourceRequirements object, sized independently of session sandboxes. |
KUBERNETES_IRON_PROXY_RESOURCES | ironProxy.resources. | Per-sandbox iron-proxy pod resources as a JSON Kubernetes ResourceRequirements object. |
KUBERNETES_SANDBOX_READY_TIMEOUT_S, KUBERNETES_ATTACH_LOG_TAIL_LINES | api.extraEnv. | Sandbox readiness and attach diagnostics. |
SESSION_SANDBOX_RUNNING_LIMIT, SESSION_SANDBOX_HOT_IDLE_GRACE_SECS | apiRs.sandboxRunningLimit, apiRs.sandboxHotIdleGraceSecs. | Capacity admission for running-like sandboxes; discards ready warm sandboxes first, then pauses least-recently-active idle sessions outside the grace window. |
SESSION_SANDBOX_CLEANUP_INTERVAL_SECS, SESSION_SANDBOX_IDLE_CLEANUP_BACKSTOP_SECS | apiRs.sandboxCleanupIntervalSecs, apiRs.sandboxIdleCleanupBackstopSecs. | DB-aware cleanup of unreferenced sandboxes and restart recovery for idle pauses. Persisted idle_timeout_ms is honored after restart; the backstop is the fallback for older execution rows without that metadata. |
KUBERNETES_SANDBOX_EXTRA_ENV | sandbox.extraEnv. | JSON list copied into each sandbox. |
KUBERNETES_WORKFLOW_DIRS | Chart-rendered from overlays.sources[*].workflowsSubdir (default workflows) using the sandbox repo-cache mount prefix. | Workflow-host sandbox discovery paths. |
KUBERNETES_FIREWALL_CA_SECRET_NAME, KUBERNETES_FIREWALL_CA_KEY_SECRET_NAME | firewall.existingCa* or generated CA Secrets. | CA material for sandbox/proxy TLS interception. |
KUBERNETES_SECRET_ENV_NAME, KUBERNETES_SECRET_ENV_PREFIX, KUBERNETES_BOOTSTRAP_SECRET_NAME | secretManager.*, secrets.bootstrapSecretName. | Secrets read by API-created proxy/sandbox pods. |
KUBERNETES_IRON_PROXY_IMAGE, KUBERNETES_IRON_PROXY_IMAGE_PULL_POLICY, KUBERNETES_IRON_PROXY_PORT, KUBERNETES_IRON_PROXY_MANAGEMENT_PORT, KUBERNETES_IRON_PROXY_HEALTH_PORT | ironProxy.*. | Per-sandbox iron-proxy image and ports. |
FIREWALL_MANAGER_SECRET_SOURCE, FIREWALL_MANAGER_SECRET_TTL | ironProxy.secretSource, ironProxy.secretTtl. | Secret source and cache TTL for rendered proxy config. |
KUBERNETES_OP_CONNECT_HOST, KUBERNETES_OP_CONNECT_APP_NAME, KUBERNETES_OP_CONNECT_PORT | Chart helper or api.extraEnv. | 1Password Connect endpoint details. |
KUBERNETES_API_POD_LABEL_SELECTOR | Chart-rendered labels or api.extraEnv. | API pod selector for API-managed proxy policies. |
KUBERNETES_EGRESS_DISCOVERY_ENABLED, KUBERNETES_EGRESS_SERVICE_NAMESPACE, KUBERNETES_CLUSTER_DOMAIN, KUBERNETES_EGRESS_TAILNET_FQDN_ANNOTATION | api.egressDiscovery.*. | Egress service discovery for sandbox NetworkPolicies. |
REPOS_PATH | sandbox.reposPath. | Repo cache path mounted into sandboxes. |
Sandbox entrypoint and wrappers:
| Env var | Set from | Controls |
|---|---|---|
CENTAUR_HARNESS_CONFIG_DIR, CENTAUR_HARNESS_ADAPTER | Sandbox image or sandbox.extraEnv. | Harness config directory and optional adapter executable. |
CENTAUR_SKILL_DIRS | Chart-rendered from overlays.sources[*].skillsSubdir (default .agents/skills) through SESSION_SANDBOX_EXTRA_ENV. | Ordered skill directories copied into the agent workspace. |
AGENT_REPO, AGENT_PERSONA | Runtime assignment metadata. | Workspace repo clone and persona prompt. |
GOOGLE_APPLICATION_CREDENTIALS | Sandbox entrypoint or sandbox.extraEnv. | Google ADC path; entrypoint creates a local stub when unset. |
CODEX_API_KEY, CODEX_HOME, CODEX_CONTINUE_THREAD_ID | sandbox.extraEnv or runtime resume. | Codex auth/config/resume behavior. |
CODEX_AUTH_MODE | sandbox.codexAuthMode. | Codex auth flow: api_key (default, hits api.openai.com) or access_token (hits chatgpt.com via the brokered ChatGPT login). The chart sets this on api-rs, which propagates it into sandboxes. See Codex Auth Modes. |
META_AI_API_KEY | Secret mounted into api-rs. | Meta AI direct credential for Codex provider responses and Slack or Linear --meta selection. |
CODEX_CUSTOM_PROVIDERS | Chart-rendered from codex.customProviders. | JSON provider catalog consumed by api-rs, sandboxes, chat ingresses, and Console. Prefer the chart value over setting this environment variable directly. Each entry supplies name, HTTPS baseUrl, apiKeyEnv, and an optional defaultModel; select it with --provider <id>. |
Custom provider apiKeyEnv | The configured iron-proxy secret source. | Bearer token for that provider. Sandboxes receive only a same-name placeholder, and replacement is restricted to the provider's baseUrl DNS host. |
CODEX_MODEL_REASONING_SUMMARY | sandbox.extraEnv. | Sets model_reasoning_summary in the Codex config (auto, concise, detailed, none). Codex >= 0.139 emits no reasoning summaries unless this is set, so renderers show no thinking trace. |
CODEX_MODEL_REASONING_EFFORT | sandbox.extraEnv. | Overrides the Codex model_reasoning_effort (baked into harness/codex/config.toml) and Nanocodex's default thinking effort. It is mirrored into Slackbot so the first response footer displays the effective level. One of none, minimal, low, medium, high, xhigh, max; an unknown value is ignored (the config default stands). |
CLAUDE_MODEL, CLAUDE_CONTINUE_SESSION_ID | sandbox.extraEnv or runtime resume. | Claude model and resume behavior. |
CLAUDE_CODE_AUTH_MODE | sandbox.claudeCodeAuthMode. | Claude Code auth flow: api_key (default, uses ANTHROPIC_API_KEY) or access_token (Claude.ai Pro or Max via the brokered OAuth login). The chart sets this on api-rs, which propagates it into sandboxes. See Claude Auth Modes. |
CENTAUR_TELEMETRY_CAPTURE_TRANSCRIPTS | sandbox.telemetry.captureTranscripts; defaults to false. | Includes user prompts and assistant responses on harness LLM spans, plus bounded shell commands and workspace-relative working directories on tool spans. Usage, cost, status, session association, and tool telemetry do not require transcript capture. |
DEPLOY_ENV, ENVIRONMENT, TRACEPARENT | Deployment env or wrapper-generated. | Runtime environment and trace context. |
CALL_TIMEOUT_SECONDS | Sandbox env before running call. | Curl watchdog for API tool calls. |
SLACK_CHANNEL, SLACK_THREAD_TS | Sandbox env. | File-upload helper target. |
Workflows
| Env var | Set from | Controls |
|---|---|---|
WORKFLOW_WORKER_CONCURRENCY, WORKFLOW_WORKER_LEASE_S | api.extraEnv. | Workflow worker pool size and lease duration. |
WORKFLOW_RECONCILE_INTERVAL_S, WORKFLOW_RESUSPEND_BACKOFF_S | api.extraEnv. | Workflow claim/reclaim cadence. |
WORKFLOW_SCHEDULE_TICK_INTERVAL_S, WORKFLOW_SCHEDULE_CATCHUP_LIMIT, WORKFLOW_SCHEDULE_MISFIRE_GRACE_S | api.extraEnv. | Scheduled workflow timing and catch-up behavior. |
MY_THREAD_KEY, <WORKFLOW_NAME>_THREAD_KEY, <WORKFLOW_NAME>_SLACK_CHANNEL | Workflow-specific env. | Fallback thread/channel targets for workflow agent steps. |
<WEBHOOK_SECRET_REF> | API env or Secret named by a workflow WebhookSpec. | Signing secret or bearer token for public workflow webhooks, for example GITHUB_WEBHOOK_SECRET or a Standard Webhooks whsec_... value. |
Slack ETL workflows:
| Env var | Set from | Controls |
|---|---|---|
SLACK_ETL_ENABLED | apiRs.etl.slack.enabled. | Master switch for Slack sync/backfill/context schedules. |
SLACK_SYNC_INTERVAL_SECONDS, SLACK_BACKFILL_INTERVAL_SECONDS, COMPANY_CONTEXT_DOCUMENTS_INTERVAL_SECONDS | apiRs.etl.slack.syncIntervalSeconds, apiRs.etl.slack.backfill.intervalSeconds, apiRs.etl.companyContextDocuments.intervalSeconds. | Slack ETL schedule intervals. |
SLACK_SYNC_BACKFILL_LOOKBACK_DAYS, SLACK_SYNC_THREAD_LOOKBACK_DAYS | apiRs.etl.slack.syncBackfillLookbackDays, apiRs.etl.slack.syncThreadLookbackDays. | Slack history/thread lookback windows. |
SLACK_SYNC_INDEX_PRIVATE_CHANNELS | apiRs.etl.slack.indexPrivateChannels. | Includes private channels visible to the ETL token. |
SLACK_ETL_EXCLUDED_CHANNEL_PATTERNS | apiRs.etl.slack.excludedChannelPatterns. | Comma-separated channel-name globs to skip. |
SLACK_BACKFILL_ENABLED, SLACK_BACKFILL_CHANNEL_BATCH_LIMIT, SLACK_BACKFILL_CHANNEL_PAGES_PER_JOB | apiRs.etl.slack.backfill.*. | Backfill enablement and batch sizing. |
SLACK_RETENTION_ENABLED, SLACK_RETENTION_INTERVAL_MINUTES, SLACK_ETL_RETENTION_DAYS, SLACK_DM_RETENTION_DAYS | apiRs.etl.slack.retention.*. | Slack retention enablement, cadence, and separate public ETL/DM TTLs. |
COMPANY_CONTEXT_DOCUMENTS_ENABLED | apiRs.etl.companyContextDocuments.enabled. | Enables company-context projection when any ETL is on. |
COMPANY_CONTEXT_DOCUMENTS_MAX_WINDOW_SECONDS | apiRs.etl.companyContextDocuments.maxWindowSeconds. | Maximum source updated_at window projected by one company-context documents run. |
COMPANY_CONTEXT_EMBEDDINGS_ENABLED | apiRs.etl.companyContextEmbeddings.enabled, default false. | Enables scheduled document embedding and hybrid company-context search in agent sandboxes. |
COMPANY_CONTEXT_EMBEDDINGS_INTERVAL_SECONDS | apiRs.etl.companyContextEmbeddings.intervalSeconds, default 300. | Delay between scans for missing or stale document embeddings. |
COMPANY_CONTEXT_EMBEDDINGS_BATCH_SIZE | apiRs.etl.companyContextEmbeddings.batchSize, default 250. | Maximum documents claimed by one embedding workflow run. |
COMPANY_CONTEXT_EMBEDDINGS_MAX_INPUT_CHARS | apiRs.etl.companyContextEmbeddings.maxInputChars, default 8192. | Maximum characters embedded from each document. Values cannot exceed 8192. |
COMPANY_CONTEXT_EMBEDDINGS_MODEL | apiRs.etl.companyContextEmbeddings.model, default text-embedding-3-small. | Embedding model shared by document generation and hybrid queries. |
COMPANY_CONTEXT_EMBEDDINGS_DIMENSIONS | apiRs.etl.companyContextEmbeddings.dimensions, default 1536. | Vector width requested by document generation and hybrid queries. It must match the database column width. |
The bundled PostgreSQL image provides pgvector. External PostgreSQL deployments
must make the vector extension available before migrations run. The workflow
uses the shared Python workflow-host database connection, OpenAI credential,
and OPENAI_BASE_URL. No workflow-specific PostgreSQL role or DSN is required.
The database migration creates the embedding column as vector(1536). Before
using another dimension, migrate that column and rebuild its HNSW index, then
re-embed the stored documents. Changing the chart value does not alter the
database schema.
Google Workspace ETL workflows:
| Env var | Set from | Controls |
|---|---|---|
GOOGLE_DRIVE_ETL_ENABLED | apiRs.etl.googleDrive.enabled. | Enables Google Drive Docs sync. |
GOOGLE_DRIVE_SYNC_INTERVAL_SECONDS | apiRs.etl.googleDrive.syncIntervalSeconds. | Google Drive Docs sync schedule interval. |
GOOGLE_CALENDAR_ETL_ENABLED | apiRs.etl.googleCalendar.enabled. | Enables Google Calendar sync. |
GOOGLE_CALENDAR_SYNC_INTERVAL_SECONDS | apiRs.etl.googleCalendar.syncIntervalSeconds. | Google Calendar sync schedule interval. |
Linear ETL workflows:
| Env var | Set from | Controls |
|---|---|---|
LINEAR_ETL_ENABLED | apiRs.etl.linear.enabled. | Enables Linear project/issue/comment sync. |
LINEAR_SYNC_INTERVAL_SECONDS | apiRs.etl.linear.syncIntervalSeconds. | Linear sync schedule interval. |
Observability and Retention
| Env var | Set from | Controls |
|---|---|---|
VICTORIAMETRICS_URL, VICTORIAMETRICS_PUSH_ENABLED | api.extraEnv, api.victoriaMetricsPushEnabled. | Push-based API metrics. |
apiRs.metrics.* | Helm values. | Pull-based scrape metadata for API-RS Prometheus metrics. |
CENTAUR_RETENTION_ATTACHMENTS_TTL_DAYS, CENTAUR_RETENTION_TRANSCRIPTS_TTL_DAYS | api.extraEnv. | Attachment/transcript retention TTLs. |
CENTAUR_RETENTION_SWEEP_INTERVAL_SECONDS, CENTAUR_RETENTION_BATCH_SIZE, CENTAUR_RETENTION_DRY_RUN | api.extraEnv. | Retention sweep cadence, batch size, and dry-run mode. |
TOOL_CALL_TIMEOUT_S, TOOL_BINARY_INLINE_MAX_BYTES, TOOL_BINARY_PREVIEW_BYTES | api.extraEnv. | Tool execution timeout and binary result handling. |
Stdout Event Retention
Retention is disabled by default. Its index is installed separately from API-RS startup migrations, so an index build failure does not prevent the API from starting. Create the index before enabling retention.
Connect psql to the application database with an account that owns
session_events. Use your normal libpq connection settings and credential file.
From the repository root, run:
psql -X --set ON_ERROR_STOP=1 \
--file services/api-rs/crates/centaur-session-sqlx/manual-migrations/session_events_retention_index.sqlThe script creates a partial index concurrently. Run it outside a transaction;
do not use psql --single-transaction. Ordinary reads and writes can continue,
but the build adds database load and can wait for existing transactions.
Verify the index after the command succeeds:
SELECT indexrelid::regclass AS index_name, indisvalid, indisready, indislive
FROM pg_catalog.pg_index
WHERE indexrelid = to_regclass('session_events_stdout_created_at_idx')
AND indrelid = 'session_events'::regclass;Expect one row with all three flags set to true. Then set
apiRs.sessionEventsRetentionDays or SESSION_EVENTS_RETENTION_DAYS to a value
from 1 through 3650. An execution's stdout becomes eligible after its
completion time passes the retention cutoff. Deletions remain batched, so a
large backlog can take several sweeps to drain.
If a build fails, inspect the index before retrying. No row means the index is absent and the creation script can be retried after addressing the failure. If the index exists but is invalid, repair it outside a transaction:
REINDEX INDEX CONCURRENTLY session_events_stdout_created_at_idx;Verify the flags again after repair. The creation script deliberately fails if the name already exists, so a retry cannot silently accept an invalid index. An already valid index does not need to be recreated.
Each retention sweep checks the index. If it is missing or invalid, the worker
logs session_events_retention_skipped and deletes nothing. API-RS stays
available. After the index is repaired, the next sweep can proceed without
another restart. Setting retention back to 0 disables the worker.
Local Scripts
| Env var | Set from | Controls |
|---|---|---|
CENTAUR_NAMESPACE, CENTAUR_RELEASE | Local shell or .env. | Namespace/release used by just and debug scripts. |
JUST_BUILD_SEQUENTIAL | Local shell. | Builds service images sequentially. |
CENTAUR_API_URL | Local shell. | API target for contrib scripts. |
MUESLI_API_KEY | Local shell. | API key for the Muesli meeting ingest helper. |
MUESLI_CLI, MUESLI_HOST, MUESLI_PUSH_LOG, MUESLI_SLACK_CHANNEL | Local shell. | Muesli meeting ingest helper behavior. |