Skip to content
LogoLogo

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:

SourceUse
secretManager.existingSecretNameRequired runtime secrets such as database, Slack, sandbox signing, and 1Password credentials.
api.extraEnvAPI feature flags, worker tuning, retention, observability, and deployment-specific overrides.
apiRs.extraEnvRust 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.tolerationsControls scheduling for api-rs pods, including dedicated tainted node pools.
console.nodeSelector, console.affinity, console.tolerationsControls scheduling for Console web pods, including dedicated tainted node pools.
console.worker.nodeSelector, console.worker.affinity, console.worker.tolerationsControls scheduling for Console background worker pods independently from the web pods.
postgres.nodeSelector, postgres.affinity, postgres.tolerationsControls 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.extraEnvSlackbot HTTP, Slack, feedback, and cross-org behavior.
sandbox.extraEnvExtra variables copied into every sandbox pod through KUBERNETES_SANDBOX_EXTRA_ENV.
overlays.sourcesOrdered repo-cache-backed overlay repos for tools, workflows, and skills; subdirs default to tools, workflows, and .agents/skills.
overlay.systemPromptSmall 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 varSet fromControls
DATABASE_URLsecretManager.existingSecretName; local bootstrap generates it.API and Slackbot Postgres connection.
SLACK_SIGNING_SECRETsecretManager.existingSecretName; local bootstrap reads shell env.Slack request signature verification.
SLACKBOT_API_KEYsecretManager.existingSecretName; local bootstrap reads shell env.Dedicated Slackbot key accepted by api-rs for the Slack session namespace and workflow events.
SLACK_BOT_TOKENsecretManager.existingSecretName; local bootstrap reads shell env.Slack Web API access for Slackbot and api-rs Slack helpers.
IRON_MANAGEMENT_API_KEYsecretManager.existingSecretName; local bootstrap generates it.Management key for API-created iron-proxy pods.
OP_SERVICE_ACCOUNT_TOKENLocal shell, then centaur-infra-env; production Secret.1Password service-account auth when using onepassword secret source.
OP_VAULTLocal shell, then centaur-infra-env; defaults to ai-agents in code.1Password vault used for op://... secret refs.

Optional required-by-mode variables:

Env varSet fromControls
OP_CONNECT_CREDENTIALS_FILELocal shell before just deploy.Enables the 1Password Connect subchart and creates its credentials Secret.
OP_CONNECT_TOKENSecret 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_IDLocal shell before just bootstrap-secrets; production Secret.Required by Teamsbot when teamsbot.enabled=true.
TEAMSBOT_API_KEYsecretManager.existingSecretName; local bootstrap generates it when Teams credentials are present and it is omitted.Static API key used by Teamsbot.
CENTAUR_APIRS_ADMIN_API_KEYsecretManager.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_URLsecretManager.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 valueSet fromControls
IRON_CONTROL_DATABASE_URLsecretManager.existingSecretName.Console database connection. Keep it separate from the api-rs logical database.
IRON_CONTROL_INITIAL_USER_EMAIL, IRON_CONTROL_INITIAL_USER_PASSWORDsecretManager.existingSecretName; local bootstrap generates defaults when absent.Creates the initial Console admin when no user exists.
IRON_CONTROL_INITIAL_API_KEYsecretManager.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_SALTsecretManager.existingSecretName; local bootstrap generates them when absent.Encrypts credential material at rest. Keep these stable after first boot.
IRON_CONTROL_SECRET_KEY_BASEsecretManager.existingSecretName; local bootstrap generates it when absent.Console session and application signing secret.
CENTAUR_JWT_SIGNING_SECRETsecretManager.existingSecretName; local bootstrap generates it when absent.Signs Console-issued MCP tokens, Console service tokens, and sandbox api-rs principal tokens.
console.publicUrlHelm value.Public Console origin used for links and MCP authorization metadata.
console.passwordLoginEnabledHelm value, default true.Enables the break-glass email and password login. Disable after SSO is configured for a public Console.
console.ssoEmailDomainsHelm value.Limits Google, Slack, or Okta SSO admission by email domain. Empty accepts any IdP-authenticated email.
console.sqlExporter.enabledHelm 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.databaseUrlSecretKeyHelm value, default CONSOLE_SQLEXPORTER_DATABASE_URL.Selects the key in secretManager.existingSecretName containing the database URL for a dedicated read-only PostgreSQL role.
networkPolicy.metricsIngressSourceNamespacesHelm value.Allows Prometheus-compatible collectors in the listed namespaces to scrape internal metrics Services. Collectors in the Centaur namespace are always allowed.
console.oktaOauth.enabledHelm value, default false.Enables Okta OIDC login for the Console.
console.oktaOauth.issuerHelm value.Okta organization or custom authorization-server issuer used for OIDC discovery.
console.oktaOauth.tokenEndpointAuthMethodHelm 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_SECRETsecretManager.existingSecretName when Okta login is enabled.Okta OIDC web application credentials.
apiRs.syncInfraSecrets, IRON_CONTROL_SYNC_INFRA_SECRETSHelm 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_KEYChart-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 varSet fromControls
CENTAUR_DEFAULT_HARNESSapi.defaultHarness.Default harness for new executions.
CENTAUR_ENVIRONMENTapi.extraEnv or deployment env.Environment label in traces and telemetry.
CENTAUR_LOG_LEVEL, LOG_LEVELHelm sets CENTAUR_LOG_LEVEL=info; override in api.extraEnv.API log level.
CENTAUR_SERVICE_NAMEapi.extraEnv.Default API log service field.
SHUTDOWN_DRAIN_TIMEOUT_Sapi.extraEnv.Graceful shutdown wait for in-flight HTTP requests.
EXECUTION_WORKER_ENABLEDapi.executionWorkerEnabled.Starts the durable agent execution worker.
WORKFLOW_WORKER_ENABLEDapi.workflowWorkerEnabled.Starts the durable workflow worker.
WARM_POOL_ENABLEDapi.warmPoolEnabled.Starts warm sandbox replenishment.
PLUGIN_WATCHER_ENABLEDapi.pluginWatcherEnabled.Enables tool and workflow hot-reload watchers.
TOOL_DIRS, PLUGINS_DIRChart-rendered from overlays.sources[*].toolsSubdir (default tools); fallback to PLUGINS_DIR.Tool discovery paths.
WORKFLOW_DIRSChart-rendered from overlays.sources[*].workflowsSubdir (default workflows).Workflow discovery paths.
SLACKBOT_URLChart-rendered Slackbot service URL.API callback target for Slack delivery.
FINAL_DELIVERY_MAX_ATTEMPTS, FINAL_DELIVERY_READY_GRACE_Sapi.extraEnv.Final-delivery retry and claim timing.
CENTAUR_ENABLE_GCLOUD_BOOTSTRAP, GCP_GCLOUD_CREDENTIAL, GCLOUD_PROJECTapi.extraEnv or Secret.Optional gcloud ADC bootstrap in the API container.
CLAUDE_MODEL, CODEX_MODELapi.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 valueSet fromControls
RUST_LOGChart sets info; override with apiRs.extraEnv.Rust tracing filter for the API-RS binary and crates.
OTEL_SERVICE_NAMEapiRs.extraEnv; defaults to centaur-api-rs.OpenTelemetry service name used by trace backends.
CENTAUR_ENVIRONMENT, DEPLOY_ENV, ENVIRONMENTapiRs.extraEnv or deployment env.Deployment environment resource attribute for telemetry.
OTEL_TRACES_EXPORTERapiRs.extraEnv.Set to otlp to force OTLP trace export, or none/off to disable it.
OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINTapiRs.extraEnv.Enables OTLP trace export to Tempo, Jaeger, or another OTLP collector.
apiRs.workflowHostSandbox, WORKFLOW_HOST_SANDBOXHelm 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.scrapeAnnotationsHelm value, default true.Adds Prometheus scrape annotations to the API-RS Pod template and Service.
apiRs.metrics.pathHelm value, default /metrics.Metrics scrape path for annotation-based discovery.
apiRs.metrics.annotationsHelm 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_TOKENExplicit secretKeyRef from secretManager.existingSecretName.Slack Web API access for api-rs Slack proxy and workflow Slack helpers.
OPENAI_API_KEYSecret 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_URLapiRs.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_URLDeprecated apiRs.activitySummary.openaiBaseUrl compatibility setting.Existing activity-summary endpoint override. OPENAI_BASE_URL takes precedence when both are set.
SESSION_ACTIVITY_SUMMARY_MODELapiRs.activitySummary.model, default gpt-5.4-nano.Model used for the short live activity sentence.

Sandbox lifecycle:

Env var or valueSet fromControls
SESSION_IDLE_TIMEOUT_MSslackbotv2.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_MSslackbotv2.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_SECSHelm 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_DAYSHelm 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_SECSHelm value, default 300.How often api-rs runs a session-event retention sweep when retention is enabled.
apiRs.sandboxReapIntervalSecs / SESSION_SANDBOX_REAP_INTERVAL_SECSHelm 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_SECSHelm 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_EFFORTHelm 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_EFFORTEnv 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 varSet fromControls
EXECUTION_WORKER_CONCURRENCYapi.extraEnv.Max concurrent execution claims.
EXECUTION_RESERVED_USER_SLOTSapi.extraEnv.Worker slots reserved for user-facing requests.
EXECUTION_WORKER_LEASE_Sapi.extraEnv.Execution claim lease duration.
EXECUTION_SILENCE_TIMEOUT_S, EXECUTION_TOOL_SILENCE_TIMEOUT_S, EXECUTION_HARD_TIMEOUT_Sapi.extraEnv.Execution watchdog and absolute timeouts.
EXECUTION_WATCHDOG_POLL_S, EXECUTION_RECONCILE_INTERVAL_S, EXECUTION_STALE_RECOVERY_INTERVAL_Sapi.extraEnv.Execution watchdog and reconciliation cadence.
EXECUTION_RECONCILE_STARTUP_LIMITapi.extraEnv.Max interrupted executions recovered at startup.
EXECUTION_STREAM_EOF_RETRY_DELAY_Sapi.extraEnv.Delay before retrying interrupted sandbox streams.
THREAD_FAILURE_LOOP_WINDOW_S, THREAD_FAILURE_LOOP_THRESHOLDapi.extraEnv.Repeated thread failure detection.
IDLE_TTL_S, SUSPENDED_RETENTION_S, MAX_ACTIVE_SANDBOX_SESSIONSapi.extraEnv.Sandbox cleanup limits.
STREAM_EOF_REATTACH_MAX, STREAM_EOF_REATTACH_BACKOFF_Sapi.extraEnv.Stream reattach retry behavior.
SANDBOX_CROSS_THREAD_READSapi.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 varSet fromControls
NODE_ENVRuntime env.Development route listing and telemetry environment fallback.
PORTRuntime env.Slackbot HTTP port.
SLACK_API_URLslackbot.extraEnv.Optional Slack Web API base URL override.
CENTAUR_API_URLChart-rendered API service URL.API base URL used by Slackbot.
CENTAUR_SLACK_EVENTS_PATHslackbot.extraEnv.Slack Events API route; defaults to /api/webhooks/slack.
RUNTIME_ERROR_ALERT_CHANNELslackbot.runtimeErrorAlertChannel.Slack channel for runtime error alerts.
SLACK_EVENT_DEDUP_TTL_MSslackbot.extraEnv.Slack event dedupe window.
SLACK_SIGNATURE_MAX_AGE_SECONDSslackbot.extraEnv.Maximum accepted Slack signature age.
LINEAR_API_KEYSecret or slackbot.extraEnv.Enables Slack feedback commands to create Linear issues.
SLACK_FEEDBACK_COMMANDS, SLACK_FEEDBACK_ALLOWED_CHANNELSslackbot.extraEnv.Feedback slash commands and optional channel allowlist.
SLACK_FEEDBACK_LINEAR_TEAM_ID, SLACK_FEEDBACK_LINEAR_PROJECT_IDslackbot.extraEnv.Linear destination for feedback issues.
SLACKBOT_EXTERNAL_ORG_ALLOWLISTslackbot.extraEnv.Slack team ids allowed for external org handoff.
SLACKBOTV2_AGENT_VIEW_ENABLEDslackbotv2.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_CHANNELSslackbotv2.autoJoinCreatedChannels.Joins newly-created public channels after subscribed channel_created events. Requires channels:read and channels:join. Defaults to false.
SLACKBOTV2_STEERING_REACTION_ENABLEDslackbotv2.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_REACTIONslackbotv2.steeringReaction.Slack emoji name used for steering acknowledgements. Defaults to hourglass_flowing_sand.
SLACKBOTV2_DEFAULT_HARNESSsandbox.harnessEngine.Base harness for new Slack threads without an explicit flag or channel default.
SLACKBOTV2_CODEX_NANOCODEX_ROLLOUT_PERCENTslackbotv2.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_DEFAULTSslackbotv2.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_IDslackbot.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_SHABuild/deploy env.Commit shown in Slackbot metadata.

Teamsbot

Env varSet fromControls
PORTRuntime env.Teamsbot HTTP port; defaults to 3100.
LOG_LEVELRuntime env.Teamsbot JSON log level: debug, info, warn, error, or silent.
CENTAUR_API_URLChart-rendered API service URL.API base URL used by Teamsbot; local default is http://127.0.0.1:8080.
TEAMSBOT_API_KEYsecretManager.existingSecretName.Dedicated API key used by Teamsbot to call api-rs.
TEAMSBOT_DATABASE_URL, DATABASE_URL, POSTGRES_URLSecret.Teamsbot Postgres state store. The service refuses to boot without one unless tests/dev inject a state store.
TEAMSBOT_STATE_KEY_PREFIXRuntime env.Postgres state namespace; defaults to centaur-teamsbot.
TEAMS_BOT_APP_ID, TEAMS_BOT_APP_PASSWORD, TEAMS_BOT_APP_TENANT_IDSecret.Required Bot Framework app credentials.
TEAMS_ALLOWED_TEAM_IDS, TEAMS_ALLOWED_CHANNEL_IDS, TEAMS_ALLOWED_TENANT_IDSteamsbot.allowedTeamIds, teamsbot.allowedChannelIds, teamsbot.allowedTenantIds.Comma-separated allowlists. Empty means Teamsbot ignores all Teams messages. Personal chats require an allowed tenant id.
TEAMS_REQUIRE_MENTIONteamsbot.requireMention.Requires a bot mention before activating a thread; defaults to true.
TEAMS_DEFAULT_HARNESS_TYPEsandbox.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_MSRuntime env.Forwarded to api-rs execute. TEAMS_IDLE_TIMEOUT_MS and TEAMS_MAX_DURATION_MS override these for Teams only.
TEAMS_ACTIVE_EXECUTION_TTL_MSRuntime env.Stale execution timeout used to unwedge Teams threads after crashes.
TEAMS_DOWNLOAD_ATTACHMENTSteamsbot.downloadAttachments.Enables allowed Teams attachment downloads into base64 payloads; defaults to false.
TEAMS_ATTACHMENT_MAX_BYTES, TEAMS_ATTACHMENT_ALLOWED_HOSTSRuntime env.Attachment download size cap and HTTPS host allowlist.
TEAMS_GRAPH_BEARER_TOKEN, TEAMS_GRAPH_TOKEN_SCOPERuntime env or Secret.Optional Graph auth fallback for Graph/SharePoint-backed attachment URLs.

Sandbox

API-set variables:

Env varSet fromControls
AGENT_IMAGEsandbox.image.*.Sandbox image used by the Kubernetes backend.
AGENT_API_URLChart-rendered API service URL.Source for sandbox CENTAUR_API_URL; required by Kubernetes backend.
CENTAUR_API_URL, CENTAUR_THREAD_KEYAPI sandbox creation.API callback and thread key.
AMP_MODE, AMP_THREAD_VISIBILITY, AMP_CONTINUE_THREAD_IDAPI env or resume path.Amp mode and resume behavior.
FIREWALL_HOST, HTTPS_PROXY, HTTP_PROXY, NO_PROXY and lowercase variantsAPI sandbox creation.Routes sandbox egress through per-sandbox iron-proxy.
NODE_EXTRA_CA_CERTS, REQUESTS_CA_BUNDLE, SSL_CERT_FILE, GIT_SSL_CAINFOAPI 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 varSet fromControls
KUBERNETES_NAMESPACE, POD_NAMESPACE, KUBERNETES_KUBECONFIGChart namespace, downward API, or api.extraEnv.Kubernetes client namespace/config.
KUBERNETES_AGENT_IMAGE_PULL_POLICY, KUBERNETES_SANDBOX_IMAGE_PULL_SECRETSsandbox.image.pullPolicy, global.imagePullSecrets.Sandbox image pull behavior.
SESSION_SANDBOX_RUNTIME_CLASS_NAMEsandbox.runtimeClassName.RuntimeClass for sandbox and iron-proxy pods (e.g. gVisor).
SESSION_SANDBOX_SERVICE_ACCOUNT_NAMEsandbox.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_RESOURCESsandbox.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_RESOURCESapiRs.workflowHostResources.Workflow-host sandbox pod resources as a JSON Kubernetes ResourceRequirements object, sized independently of session sandboxes.
KUBERNETES_IRON_PROXY_RESOURCESironProxy.resources.Per-sandbox iron-proxy pod resources as a JSON Kubernetes ResourceRequirements object.
KUBERNETES_SANDBOX_READY_TIMEOUT_S, KUBERNETES_ATTACH_LOG_TAIL_LINESapi.extraEnv.Sandbox readiness and attach diagnostics.
SESSION_SANDBOX_RUNNING_LIMIT, SESSION_SANDBOX_HOT_IDLE_GRACE_SECSapiRs.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_SECSapiRs.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_ENVsandbox.extraEnv.JSON list copied into each sandbox.
KUBERNETES_WORKFLOW_DIRSChart-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_NAMEfirewall.existingCa* or generated CA Secrets.CA material for sandbox/proxy TLS interception.
KUBERNETES_SECRET_ENV_NAME, KUBERNETES_SECRET_ENV_PREFIX, KUBERNETES_BOOTSTRAP_SECRET_NAMEsecretManager.*, 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_PORTironProxy.*.Per-sandbox iron-proxy image and ports.
FIREWALL_MANAGER_SECRET_SOURCE, FIREWALL_MANAGER_SECRET_TTLironProxy.secretSource, ironProxy.secretTtl.Secret source and cache TTL for rendered proxy config.
KUBERNETES_OP_CONNECT_HOST, KUBERNETES_OP_CONNECT_APP_NAME, KUBERNETES_OP_CONNECT_PORTChart helper or api.extraEnv.1Password Connect endpoint details.
KUBERNETES_API_POD_LABEL_SELECTORChart-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_ANNOTATIONapi.egressDiscovery.*.Egress service discovery for sandbox NetworkPolicies.
REPOS_PATHsandbox.reposPath.Repo cache path mounted into sandboxes.

Sandbox entrypoint and wrappers:

Env varSet fromControls
CENTAUR_HARNESS_CONFIG_DIR, CENTAUR_HARNESS_ADAPTERSandbox image or sandbox.extraEnv.Harness config directory and optional adapter executable.
CENTAUR_SKILL_DIRSChart-rendered from overlays.sources[*].skillsSubdir (default .agents/skills) through SESSION_SANDBOX_EXTRA_ENV.Ordered skill directories copied into the agent workspace.
AGENT_REPO, AGENT_PERSONARuntime assignment metadata.Workspace repo clone and persona prompt.
GOOGLE_APPLICATION_CREDENTIALSSandbox entrypoint or sandbox.extraEnv.Google ADC path; entrypoint creates a local stub when unset.
CODEX_API_KEY, CODEX_HOME, CODEX_CONTINUE_THREAD_IDsandbox.extraEnv or runtime resume.Codex auth/config/resume behavior.
CODEX_AUTH_MODEsandbox.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_KEYSecret mounted into api-rs.Meta AI direct credential for Codex provider responses and Slack or Linear --meta selection.
CODEX_CUSTOM_PROVIDERSChart-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 apiKeyEnvThe 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_SUMMARYsandbox.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_EFFORTsandbox.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_IDsandbox.extraEnv or runtime resume.Claude model and resume behavior.
CLAUDE_CODE_AUTH_MODEsandbox.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_TRANSCRIPTSsandbox.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, TRACEPARENTDeployment env or wrapper-generated.Runtime environment and trace context.
CALL_TIMEOUT_SECONDSSandbox env before running call.Curl watchdog for API tool calls.
SLACK_CHANNEL, SLACK_THREAD_TSSandbox env.File-upload helper target.

Workflows

Env varSet fromControls
WORKFLOW_WORKER_CONCURRENCY, WORKFLOW_WORKER_LEASE_Sapi.extraEnv.Workflow worker pool size and lease duration.
WORKFLOW_RECONCILE_INTERVAL_S, WORKFLOW_RESUSPEND_BACKOFF_Sapi.extraEnv.Workflow claim/reclaim cadence.
WORKFLOW_SCHEDULE_TICK_INTERVAL_S, WORKFLOW_SCHEDULE_CATCHUP_LIMIT, WORKFLOW_SCHEDULE_MISFIRE_GRACE_Sapi.extraEnv.Scheduled workflow timing and catch-up behavior.
MY_THREAD_KEY, <WORKFLOW_NAME>_THREAD_KEY, <WORKFLOW_NAME>_SLACK_CHANNELWorkflow-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 varSet fromControls
SLACK_ETL_ENABLEDapiRs.etl.slack.enabled.Master switch for Slack sync/backfill/context schedules.
SLACK_SYNC_INTERVAL_SECONDS, SLACK_BACKFILL_INTERVAL_SECONDS, COMPANY_CONTEXT_DOCUMENTS_INTERVAL_SECONDSapiRs.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_DAYSapiRs.etl.slack.syncBackfillLookbackDays, apiRs.etl.slack.syncThreadLookbackDays.Slack history/thread lookback windows.
SLACK_SYNC_INDEX_PRIVATE_CHANNELSapiRs.etl.slack.indexPrivateChannels.Includes private channels visible to the ETL token.
SLACK_ETL_EXCLUDED_CHANNEL_PATTERNSapiRs.etl.slack.excludedChannelPatterns.Comma-separated channel-name globs to skip.
SLACK_BACKFILL_ENABLED, SLACK_BACKFILL_CHANNEL_BATCH_LIMIT, SLACK_BACKFILL_CHANNEL_PAGES_PER_JOBapiRs.etl.slack.backfill.*.Backfill enablement and batch sizing.
SLACK_RETENTION_ENABLED, SLACK_RETENTION_INTERVAL_MINUTES, SLACK_ETL_RETENTION_DAYS, SLACK_DM_RETENTION_DAYSapiRs.etl.slack.retention.*.Slack retention enablement, cadence, and separate public ETL/DM TTLs.
COMPANY_CONTEXT_DOCUMENTS_ENABLEDapiRs.etl.companyContextDocuments.enabled.Enables company-context projection when any ETL is on.
COMPANY_CONTEXT_DOCUMENTS_MAX_WINDOW_SECONDSapiRs.etl.companyContextDocuments.maxWindowSeconds.Maximum source updated_at window projected by one company-context documents run.
COMPANY_CONTEXT_EMBEDDINGS_ENABLEDapiRs.etl.companyContextEmbeddings.enabled, default false.Enables scheduled document embedding and hybrid company-context search in agent sandboxes.
COMPANY_CONTEXT_EMBEDDINGS_INTERVAL_SECONDSapiRs.etl.companyContextEmbeddings.intervalSeconds, default 300.Delay between scans for missing or stale document embeddings.
COMPANY_CONTEXT_EMBEDDINGS_BATCH_SIZEapiRs.etl.companyContextEmbeddings.batchSize, default 250.Maximum documents claimed by one embedding workflow run.
COMPANY_CONTEXT_EMBEDDINGS_MAX_INPUT_CHARSapiRs.etl.companyContextEmbeddings.maxInputChars, default 8192.Maximum characters embedded from each document. Values cannot exceed 8192.
COMPANY_CONTEXT_EMBEDDINGS_MODELapiRs.etl.companyContextEmbeddings.model, default text-embedding-3-small.Embedding model shared by document generation and hybrid queries.
COMPANY_CONTEXT_EMBEDDINGS_DIMENSIONSapiRs.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 varSet fromControls
GOOGLE_DRIVE_ETL_ENABLEDapiRs.etl.googleDrive.enabled.Enables Google Drive Docs sync.
GOOGLE_DRIVE_SYNC_INTERVAL_SECONDSapiRs.etl.googleDrive.syncIntervalSeconds.Google Drive Docs sync schedule interval.
GOOGLE_CALENDAR_ETL_ENABLEDapiRs.etl.googleCalendar.enabled.Enables Google Calendar sync.
GOOGLE_CALENDAR_SYNC_INTERVAL_SECONDSapiRs.etl.googleCalendar.syncIntervalSeconds.Google Calendar sync schedule interval.

Linear ETL workflows:

Env varSet fromControls
LINEAR_ETL_ENABLEDapiRs.etl.linear.enabled.Enables Linear project/issue/comment sync.
LINEAR_SYNC_INTERVAL_SECONDSapiRs.etl.linear.syncIntervalSeconds.Linear sync schedule interval.

Observability and Retention

Env varSet fromControls
VICTORIAMETRICS_URL, VICTORIAMETRICS_PUSH_ENABLEDapi.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_DAYSapi.extraEnv.Attachment/transcript retention TTLs.
CENTAUR_RETENTION_SWEEP_INTERVAL_SECONDS, CENTAUR_RETENTION_BATCH_SIZE, CENTAUR_RETENTION_DRY_RUNapi.extraEnv.Retention sweep cadence, batch size, and dry-run mode.
TOOL_CALL_TIMEOUT_S, TOOL_BINARY_INLINE_MAX_BYTES, TOOL_BINARY_PREVIEW_BYTESapi.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.sql

The 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 varSet fromControls
CENTAUR_NAMESPACE, CENTAUR_RELEASELocal shell or .env.Namespace/release used by just and debug scripts.
JUST_BUILD_SEQUENTIALLocal shell.Builds service images sequentially.
CENTAUR_API_URLLocal shell.API target for contrib scripts.
MUESLI_API_KEYLocal shell.API key for the Muesli meeting ingest helper.
MUESLI_CLI, MUESLI_HOST, MUESLI_PUSH_LOG, MUESLI_SLACK_CHANNELLocal shell.Muesli meeting ingest helper behavior.