Ask AI
Ask AI Start conversation ↵

I'm an AI assistant with Grove's codebase and documentation in context.

Ask me anything about Grove.

EXAMPLE QUESTIONS

Every field and its default

Every section of .grove/config.json, one table each, with a nested block's fields listed under the field that holds it. Generated from Grove's own config model.

Environment variable overrides

These fields also read a fixed environment variable, so a deployment can set them without a config file. An unset variable does not override, GROVE_<SECTION>__<FIELD> still wins, and any string value can reference a variable of your own with ${YOUR_VAR}. See the cascade.

Field Variable
notifications.gotify.server_url GROVE_GOTIFY_API_URL
tickets.gitea.base_url GROVE_GITEA_BASE_URL
tls.ca_path GROVE_TLS_CA_PATH

Top-level fields

Field Type Default Description
builtin_agents boolean true Whether Grove's own agents are offered alongside the ones you declare. Off makes your agents list the whole roster.
lifecycle_max_pending integer 64 Maximum accepted lifecycle operations, including lock waiters and running work.
projects array<string> unset Repo roots kept visible in every picker even with zero workspaces. ~ expands, and a path that is not a git repo is ignored.

activity_admission

Capacity includes work already handed to consumers.

Field Type Default Description
max_bytes integer 4194304
max_items integer 256

agent_cwds

Named directories inside the repo an agent may start in. Only the agent session moves, the worktree, branch and init script stay at the root.

Field Type Default Description
default string \| null unset The label a create resolves to when it names no directory. Unset starts the agent at the worktree root.
entries object unset Label to repo relative path. The label is what a person picks, the path is what the agent starts in, and insertion order is picker order.

agents (a list, one entry each)

One selectable agent in the create picker. Anything terminal based works.

Field Type Default Description
command string required Shell command sent to the agent window. Quoted arguments and $VAR expansion work.
description string unset One line label shown in the picker.
env object unset Extra environment variables exported into the agent's window before launch.
env_unset array<string> unset Variable names cleared before env is applied, so an ambient value cannot leak into the agent's window.
kind string "generic" Which adapter reads this agent's session. claude_code and codex read transcripts for live state and tokens, mewbo reads a remote session over REST, generic tracks nothing.
models array<string> unset Model ids offered in the create form picker. A convenience list, never a validated allowlist. Empty uses the adapter's native discovery or maintained fallback catalog.
name string required Picker identifier, and the merge key across cascade layers.
native boolean true Run the agent as a Grove owned native session instead of its interactive terminal. On by default for Claude Code and Codex, ignored by other kinds, and every create surface can override it per workspace.
tools_offline boolean false Launch with network facing tools disallowed. Claude Code drops WebFetch and WebSearch, Codex turns off sandbox networking. No effect on generic or mewbo.

auth

Daemon authentication and pairing limits.

Field Type Default Description
enabled boolean true Master switch for daemon authentication. Only in process tests turn it off.
pair_init_per_minute integer 5 Per source rate limit on starting a pairing, which bounds brute force.
pair_poll_per_minute integer 60 Per source rate limit on polling a pairing. The browser polls every two seconds while it waits for approval.
pairing_ttl_seconds integer 300 How long a pairing code stays valid for approval.
session_ttl_seconds integer 2592000 Sliding session lifetime. Every request extends it, so a daily user never re pairs and an idle device ages out.

brief

The one paragraph brief a new agent is handed on its first turn, pointing it at Grove's working-in-grove skill.

Field Type Default Description
enabled boolean true Whether a new agent receives the brief at all.
instructions string unset Your own text, appended to the brief every agent in this repo receives.
self_naming boolean true Ask an agent whose workspace has no description to write one, and to replace a generated title with a real one.

channels

Grove managed Claude Code channel delivery, a research preview.

Field Type Default Description
admission see below Capacity includes work already handed to consumers.
allowed_senders array<string> unset Sender labels allowed to post into a running session's channel. Empty allows every sender, so populate it to restrict.
enabled boolean false Whether Grove delivers channel messages into running Claude Code sessions.

admission

Field Type Default Description
max_bytes integer 4194304
max_items integer 256

container

Run the agent inside a container built from the repo's own devcontainer.

Field Type Default Description
agent_config see below What the container shares from your host agent configuration.
decor see below Whether the container gets Grove's tmux chrome and statusline.
default_config string unset The devcontainer.json used for a repo that has none of its own. Empty uses the self contained config packaged with Grove.
docker_bin string "docker" The docker compatible CLI Grove shells out to. A name on PATH or an absolute path.
egress see below Where a containerized agent may reach on the network.
enabled boolean true The default runtime for a new workspace. true is container, false is host. Read only at create, so flipping it never moves an existing workspace.
env_command string \| null unset Host command whose stdout is parsed as dotenv, so a secret never touches disk. Re run at every use and never honored from a committed layer.
env_file string \| null unset Dotenv file this section's variables are read from. Repo relative or absolute, ~ expanded. A configured file that is missing is an error at use.
resources see below Per container caps, applied at launch.
shell array<string> ["bash", "sh"] Shells grove shell tries inside the container, in order.
tmux see below Whether the agent runs under a tmux inside its container, and whose tmux.
up_timeout_seconds number 900.0 Seconds one devcontainer up or build may take before the create counts as failed. A cold build is legitimately minutes long.

agent_config

Field Type Default Description
share string "full" How much of your agent configuration the container sees. full mounts sign in, skills and memory, projects mounts transcripts only, isolated gives the container its own config directory. A committed layer can only tighten it.
trust boolean true Seed the workspace folder as already trusted and its committed .mcp.json servers as already approved, so the agent never stops on a first run dialog nobody can answer.

decor

Field Type Default Description
enabled boolean true Mount and compose the terminal chrome bundle at all.
payload string unset A host directory of your own decor assets, mounted read only in place of Grove's bundle.
statusline boolean true Compose Grove's statusline into the agent's settings.
tmux_conf boolean true Pass Grove's tmux config to the in container tmux.

egress

Field Type Default Description
agent_plane object unset Per agent kind provider endpoints. A gateway deployment repoints them here.
allow array<string> unset Extra hostnames or CIDRs added to the derived allowlist.
grove_plane array<string> ["host.docker.internal"] How the container reaches Grove itself for hook ingest and the daemon.
mode string "allowlist" allowlist applies the derived firewall, open applies nothing, deny permits only loopback and the workspace's own network. Anything but open fails closed if the firewall cannot be applied.
package_plane array<string> unset Package indexes and registries reachable regardless of agent kind.
range_sources array<object> unset Providers that publish their address ranges as JSON, fetched from the host at provision time, for hosts whose DNS answers outlive their usefulness.

resources

Field Type Default Description
cpus string unset CPU cap such as 4 or 1.5, as a string. Empty is uncapped.
memory string unset Memory cap such as 8g or 512m. Empty is uncapped.
pids integer 0 Process count cap. 0 is uncapped.

tmux

Field Type Default Description
enabled boolean true Run the agent under a tmux inside the container when one is reachable. Off is a bare exec with no persistence.
payload string unset A host directory holding bin/<arch>/tmux and a terminfo/ tree, in place of Grove's bundle.
prefer_image boolean true Use the image's own tmux when it has one, otherwise Grove's bundle.
session string "agent" The in container tmux session the agent runs in. Renaming it orphans a live agent.
shell_session string "shell" The in container tmux session grove shell attaches to.
term_fallback string "xterm-256color" TERM retried when tmux refuses the client's own. Empty disables the retry.

defaults

Your saved answers for a create that does not name one. Every field is optional and an unset one falls through to its normal source.

Field Type Default Description
agent string \| null unset Agent selected when a create form opens.
base_ref string \| null unset The branch or ref a new branch starts from.
branch_mode string \| null unset How a create picks its branch. auto, new, existing, remote or root.
brief boolean \| null unset Whether a new agent receives Grove's first turn brief. Unset falls through to brief.enabled.
model string \| null unset Model id sent to the selected agent. Unset uses the agent's own default.
runtime string \| null unset host or container for a new workspace. Unset falls through to container.enabled.
skip_init boolean \| null unset Whether to skip the configured init script.

hooks

Grove managed Claude Code status hooks, for exact push based state.

Field Type Default Description
daemon_url string unset Base URL the hook posts each event to.
enabled boolean true Launch Claude Code with Grove's managed hooks for exact push based status.

init_script

A setup script run in its own tmux window before the agent starts.

Field Type Default Description
applies_to string "all" Which runtimes the script is for. all, host or container.
enabled boolean false Run the init script when a workspace is created.
fail_fast boolean true A non zero exit rolls back the worktree, session and branch. Off leaves the workspace in error for you to inspect.
inline string \| null unset Inline shell snippet. Mutually exclusive with path.
path string \| null unset Repo relative path to a script file. Mutually exclusive with inline.
run_on_resume boolean false Run the script again when a paused workspace resumes.
shell string "bash" Shell the script runs under.
timeout_seconds integer 300 Seconds before the script is killed and counted as failed.

issueops

Turn issue comment mentions into workspace actions, and mirror progress back onto the ticket.

Field Type Default Description
admission see below Capacity includes work already handed to consumers.
agent string "claude" Which configured agent an issue ops created workspace spawns. Must name an entry in agents.
allowed_actors array<string> unset Logins allowed to drive issue ops regardless of repo permission. Write access always suffices, this only adds to it.
assign_bot boolean false Assign the tracker's own account to every ticket a live workspace holds, so Grove's work is findable with the tracker's assignee filter. Released when the workspace ends.
deep_link_base_url string unset Your dashboard's base URL. Set, the comment links to {base}/w/{id}. Empty omits the link.
enabled boolean false Publish the live status comment onto every ticket a workspace works. Off leaves command routing untouched and writes nothing to your tracker.
pickup_backoff_seconds number 300.0 How long a tracker is skipped after it fails or rate limits a poll. The next good poll clears it.
pickup_enabled boolean false Treat the assignee field as the work queue. Assign the bot to an open issue and the daemon starts a workspace for it, with no comment and no CI runner.
pickup_interval_seconds number 60.0 How often the pickup poll asks each tracker for its assigned issues.
pickup_max_active integer 3 How many pickup started workspaces may run at once across the host. The rest wait for the next tick.
prompt_template string "You are handling tracker issue #{number}: \"{title}\".\n\nIssue description:\n{body}\n\nThread so far:\n{comments}\n\nHow you were engaged:\n{command_text}\n\nYour mandate:\n\n- Work autonomously through to an OPEN pull request. Read the issue, map the\n affected components (read the nearest owning CLAUDE.md before editing),\n implement the change, run the project's gates, open the PR, and reply on the\n ticket saying what changed and where the PR is.\n- Where the ticket is underspecified, REPLY ON THE TICKET asking for exactly\n what is missing, and say what you will assume if nobody answers. Do not stall\n silently, and do not quietly guess at a requirement you could have asked\n about.\n- Satisfy the stated goals faithfully and safely \u2014 the goals as written, not\n the larger project you would rather do.\n- Stop and ask rather than take a risky or irreversible action: destroying\n data, force-pushing a shared branch, or touching anything in production.\n\nIssue link: {url}\n" The first prompt a ticket created workspace boots on, with {title}, {body}, {number}, {url}, {comments} and {command_text} filled from the ticket.
trigger string "@grove" The mention that must open a comment for Grove to act, matched case insensitively at a word boundary.
update_window_seconds number 5.0 At most one status comment edit per workspace per window, so a burst of activity never trips the forge's rate limit. 0 flushes every change.

admission

Field Type Default Description
max_bytes integer 4194304
max_items integer 256

mewbo

Connection settings for kind: "mewbo" agents.

Field Type Default Description
api_key_env string "MEWBO_API_KEY" Name of the environment variable holding the API key, never the key itself.
base_url string "http://127.0.0.1:5125" Base URL of the Mewbo REST API.
timeout_seconds number 10.0 Per request HTTP timeout.

models

How a model id READS in a picker, as distinct from what it costs.

Field Type Default Description
display_names object unset Model id to the name a picker prints for it. Exact match only, because a prefix rule would silently name a model the operator never saw. An id with no entry keeps its own spelling rather than being guessed at.

notifications

Push notifications when an agent needs you. Off by default.

Field Type Default Description
debounce_seconds number 30.0 Quiet window per workspace after a state fires, so one attention episode is one buzz. Questions dedupe by id instead.
deep_link_base_url string "http://localhost:3000" Where a tap lands, {base}/w/{id}. The default is the web app's own local origin, which a phone cannot reach, so set your reachable address or empty for no link.
enabled boolean false Send push notifications at all.
gotify see below The Gotify push channel.
on array<string> unset Agent states that fire a notification. waiting, blocked, error and idle.
on_lifecycle array<string> unset Workspace events that fire a notification, such as error, orphaned_detected and offline_detected. Routine verbs are off by default.
on_question boolean true Push when the agent asks you something, with the prompt and its options. The one trigger every harness can produce.
waiting_quiet_minutes number 15.0 How long a session must stay settled before a waiting push fires, since a finished turn may still have a background command running. 0 fires as soon as every known tracker agrees nothing is left.
webhook see below A generic JSON webhook channel speaking ntfy's publish format.

gotify

Field Type Default Description
enabled boolean false Deliver through Gotify.
markdown boolean true Send the rich markdown body. Turn it off for a client that does not render CommonMark.
priorities object unset Severity to Gotify priority, 0 to 10. The defaults land on Gotify's own Android thresholds, so a question buzzes and a routine pause does not.
priority integer 5 Fallback priority for a severity with no entry in priorities.
server_url string unset Your Gotify server.
timeout_seconds number 5.0 Seconds to wait on one push before skipping it.
token_env string "GROVE_GOTIFY_TOKEN" Name of the environment variable holding a Gotify application token, never the token.

webhook

Field Type Default Description
enabled boolean false Deliver through the webhook.
priorities object unset Severity to priority on ntfy's 1 to 5 scale. Bounded, since ntfy rejects a value outside it.
timeout_seconds number 5.0 Seconds to wait on one POST before skipping it.
token_env string unset Name of the environment variable holding a bearer token, if the URL needs one.
topic string unset ntfy topic, included only when set.
url string unset The URL to POST to.

panels (a list, one entry each)

One embeddable view served by a service in this workspace's compose stack.

Field Type Default Description
name string required URL safe identifier, unique within panels.
path string "/" Initial path and optional query string for the iframe.
port integer required Port the service exposes on its compose network.
service string required Docker Compose service name inside this workspace's stack.
title string required Tab label.

permission

Grove hosted answering of Claude Code's permission prompts.

Field Type Default Description
default string "deny" The answer while no human relay is wired. deny fails closed for an unattended agent, allow is the deliberate opt in for a bounded sandbox.
enabled boolean false Let Grove answer Claude Code's permission prompts through its prompt tool.

proxy

A loopback proxy in front of the LLM gateway for wire level capture.

Field Type Default Description
base_url_env object unset Per agent kind name of the variable that points that runtime at the proxy, such as ANTHROPIC_BASE_URL for Claude Code.
enabled boolean false Route agent traffic through Grove's loopback proxy for wire level capture. Off leaves launch env and traffic untouched.
host string "127.0.0.1" Loopback interface the proxy listens on. Never a routable address, since it relays provider credentials.
log_bodies boolean false Capture request bodies into the telemetry event. Off by default because a body can hold prompt content. Response bodies and headers are never captured.
max_body_bytes integer 8192 Cap on a captured request body.
port integer 8788 Port the proxy listens on.
upstreams object unset Per agent kind real upstream base URL. A kind absent here is not proxied.

telemetry

Langfuse credentials and OpenTelemetry passthrough. The three credential fields hold variable names, never secrets, so committed config stays publishable.

Field Type Default Description
backfill see below Consent and profile selection for exporting historical sessions.
content_owner object unset Which side emits each runtime's prompt and response content, per agent kind, so a turn is never recorded twice or not at all.
enabled boolean false Export Grove's own spans to the configured backend.
env_command string \| null unset Host command whose stdout is parsed as dotenv, so a secret never touches disk. Re run at every use and never honored from a committed layer.
env_file string \| null unset Dotenv file this section's variables are read from. Repo relative or absolute, ~ expanded. A configured file that is missing is an error at use.
export see below Capacity and retry limits for acknowledged span export.
host_env string "LANGFUSE_HOST" Name of the variable holding the Langfuse host, never the URL itself. Rename it here if your secret store exports a different name.
passthrough_kinds array<string> ["claude_code", "codex"] Agent kinds that receive the derived telemetry environment at launch. mewbo runs server side and generic has nothing to instrument, so both are out by default.
public_key_env string "LANGFUSE_PUBLIC_KEY" Name of the variable holding the Langfuse public key.
receiver see below The daemon's own OTLP endpoint for a harness's native exporter.
reserved_env array<string> ["OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_HEADERS", "OTEL_EXPORTER_OTLP_PROTOCOL", "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "OTEL_EXPORTER_OTLP_TRACES_HEADERS", "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT", "OTEL_EXPORTER_OTLP_METRICS_HEADERS", "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL", "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT", "OTEL_EXPORTER_OTLP_LOGS_HEADERS", "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL", "OTEL_TRACES_EXPORTER", "OTEL_METRICS_EXPORTER", "OTEL_LOGS_EXPORTER"] OTLP exporter variables Grove owns for every agent it launches, so an agent's own exporter cannot split one session into two traces. A displaced value is logged by name.
secret_key_env string "LANGFUSE_SECRET_KEY" Name of the variable holding the Langfuse secret key, never the secret itself.

backfill

Field Type Default Description
content string "none" How much content a backfilled trace carries. none exports structure only.
enabled boolean false Allow grove usage backfill --telemetry to export historical sessions at all.
profiles object unset Provider config roots whose transcripts may be exported, such as ~/.codex.

export

Field Type Default Description
admission see below Capacity includes work already handed to consumers.
batch_size integer 512
max_retries integer 0
max_retry_backoff_seconds number 30.0
retry_backoff_seconds number 1.0

export.admission

Field Type Default Description
max_bytes integer 4194304
max_items integer 256

receiver

Field Type Default Description
enabled boolean false Mount the receiver on the daemon. Off serves no endpoint.
path string "/otlp" Where the receiver is mounted under the daemon's address. Point a harness's OTEL_EXPORTER_OTLP_ENDPOINT at it.
queue_capacity integer 256 Export batches held before the receiver starts shedding.
workers integer 2 Threads that transform accepted batches off the daemon's event loop.

tickets

Ticket tracker integration, one block per provider.

Field Type Default Description
env_command string \| null unset Host command whose stdout is parsed as dotenv, so a secret never touches disk. Re run at every use and never honored from a committed layer.
env_file string \| null unset Dotenv file this section's variables are read from. Repo relative or absolute, ~ expanded. A configured file that is missing is an error at use.
gitea see below Gitea Issues provider settings.
github see below GitHub Issues provider settings.
linear see below Linear provider settings.

gitea

Field Type Default Description
base_url string "https://gitea.com" Your Gitea instance.
branch_prefix string unset A branch prefix that marks a bare number as a Gitea ticket.
enabled boolean false Turn the provider on.
owner string \| null unset Repository owner.
repo string \| null unset Repository name.
token_env string "GROVE_GITEA_TOKEN" Name of the environment variable holding the API token, never the token.

github

Field Type Default Description
base_url string "https://api.github.com" The GitHub API root. Change it for GitHub Enterprise.
branch_prefix string unset A branch prefix that marks a bare number as a GitHub ticket.
enabled boolean false Turn the provider on.
owner string \| null unset Repository owner.
repo string \| null unset Repository name.
token_env string "GROVE_GITHUB_TOKEN" Name of the environment variable holding the API token, never the token.

linear

Field Type Default Description
base_url string "https://api.linear.app/graphql" The Linear API root.
enabled boolean false Turn the provider on.
team_key string \| null unset The team key that prefixes your issue ids, such as ENG.
token_env string "GROVE_LINEAR_TOKEN" Name of the environment variable holding the API token, never the token.

tls

Extra certificate authority roots for Grove's outbound TLS clients.

Field Type Default Description
ca_path string unset A PEM bundle or OpenSSL hashed CA directory trusted alongside the operating system's roots.

tmux

tmux session naming and refresh cadences.

Field Type Default Description
activity_threshold_seconds integer 30 Seconds of pane silence before a workspace flips from active to idle. Too low and a thinking agent flickers, too high and the badge lags.
agent_window_name string "agent" Window the agent runs in.
detached_size string "200x50" Size, as <columns>x<rows>, a session is created at while nothing is attached.
history_limit integer 50000 Scrollback lines kept per pane.
init_window_name string "init" Window the init script runs in.
peek_history_lines integer 500 Scrollback lines the pane snapshot captures.
peek_pane_refresh_seconds number 0.25 How often the peek rail refreshes the pane.
peek_stats_refresh_seconds number 3.0 How often the peek rail refreshes git counts and diff stats.
session_prefix string "grove-" Prefix on every Grove tmux session name.
shell_window_name string "shell" Window that holds a plain shell.
steer_settle_ms integer 200 Milliseconds between pasting steered text and sending Enter, so the agent's TUI treats Enter as a submit rather than part of the paste. 0 disables the wait.

transcript_cache

Process-wide retention budgets per filesystem agent adapter.

Field Type Default Description
max_retained_bytes integer 268435456 Maximum estimated retained fold bytes per adapter.
max_source_bytes integer \| null 268435456 Additional source-byte limit; null disables this secondary limit.
memo_max_bytes integer 67108864 Maximum estimated bytes retained by derived read products per adapter.
memo_max_entries integer 512 Maximum retained derived products, including empty answers.

ui

TUI preferences.

Field Type Default Description
keybindings object unset Key overrides for the TUI.
theme string "auto" auto, dark, light, or the name of a theme file under ${user_config_dir}/grove/themes/.

usage

The usage audit. Indexing, pricing, quota and insights.

Field Type Default Description
busy_timeout_ms integer 5000 How long a writer waits on the SQLite lock, since the daemon, the TUI and a backfill can all write at once. 0 raises immediately.
commands see below How a shell tool call's time is attributed to the command that led it.
enabled boolean true Index transcripts into the usage audit at all.
insights see below Thresholds for the usage audit's detectors.
max_breakdown_rows integer 50 Rows per breakdown dimension before the long tail is dropped. The response says when it truncated.
max_sessions_per_page integer 100 Upper bound on one page of the session table.
pricing see below Model prices used to estimate cost from token counts.
quota see below How subscription windows are collected per account.
retention_days integer \| null unset Drop indexed events older than this on refresh. Unset keeps everything.

commands

Field Type Default Description
aliases object unset Executable names folded onto one row.
basename boolean true Fold an absolute path to its final component, so /usr/bin/git and git are one row.
censored_at_ms integer 600000 A duration at or above this is reported as censored rather than as cost, since it marks the harness's own timeout rather than the command's length. 0 disables it.
version_suffix_pattern string "(?<=[A-Za-z])\\d+(?:\\.\\d+)+$" Trailing version fragment stripped from a name, so python3.12 counts as python.

insights

Field Type Default Description
concentration_share number 0.5 Share of tokens or time one project, account or model must hold before concentration is named.
edit_churn_edits integer 4 Edits to one file in a session before it is called churn.
enabled boolean true Run the detectors at all.
min_occurrences integer 3 How often a pattern must recur before it is reported.
retry_window_seconds integer 300 Repeats of the same failing call inside this window count as one retry loop.
slow_operation_ms integer 60000 A generation or tool call above this is a slow operation candidate.

pricing

Field Type Default Description
aliases object unset Model id to the id it is priced as. Explicit only, Grove never infers one from a prefix.
cache_ttl_seconds number 3600.0 Maximum age of a fetched price snapshot before it is refreshed.
currency string "USD" ISO 4217 code the prices are quoted in.
models object unset Manual prices by model id, exact match first then longest prefix. They override fetched entries.
sources array<object> unset Authenticated pricing endpoints. Empty disables remote pricing, and a higher layer replaces the list.

quota

Field Type Default Description
burn_over_percent number 100.0 Projected usage at reset above which a window reads over, on course to run out before it resets.
burn_tight_percent number 85.0 Projected usage at reset above which a window reads tight. Grove extrapolates the pace so far and contacts no provider.
enabled boolean true Collect quota for the selected profiles.
gateway see below One aggregate quota endpoint holding subscriptions from several vendors.
labels object unset Account id to display name, so two profiles are distinguishable without Grove storing an email.
profiles object unset Subscription profiles whose quota may be collected and displayed.
retry_floor_seconds integer 120 Wait after the first auth or rate limit failure, doubling per failure, while the last good reading keeps rendering as stale.
retry_max_seconds integer 3600 Ceiling on that doubling.
timeout_seconds number 10.0 Bound on each credential read and provider request.
ttl_seconds integer 900 How long a good reading is served before the provider is asked again.
window_seconds object unset Window label to its length, for providers that publish a reset instant but never the window's length.

quota.gateway

Field Type Default Description
base_url string unset The gateway endpoint fetched once per quota refresh.
token_env string "GROVE_QUOTA_GATEWAY_TOKEN" Name of the environment variable holding the gateway bearer token.

worktree

Where worktrees live and how branches are named.

Field Type Default Description
branch_prefix string "grove/" Prefix on every auto created branch.
root_template string "${repo}/.worktrees" Where worktrees live. Supports ${repo}, ${repo_name} and ~.