GthConfig
Defined in: packages/core/dist/config/types.d.ts:161
This is a processed Gaunt Sloth config ready to be passed down into components.
Default values can be found in DEFAULT_CONFIG
Properties
Section titled “Properties”a2aAgents?
Section titled “a2aAgents?”
optionala2aAgents?:Record<string,unknown>
Defined in: packages/core/dist/config/types.d.ts:480
A2A (Agent-to-Agent) protocol agents configuration.
Enables delegation of tasks to external AI agents.
Each agent becomes available as a tool named a2a_agent_<agentId>.
This feature is experimental and may change.
optionalacp?:object
Defined in: packages/core/dist/config/types.d.ts:546
EXT-117 — the ACP (Agent Client Protocol) surface, i.e. a session an editor such as Zed opens.
mode is the command an ACP session is resolved under, and it defaults to code: an
editor asks for an agent that can do the job, and a read-only one is a worse default than an
occasional prompt. Set acp: { mode: 'chat' } for a read-only editor agent.
The deliberate consequence, because it is what makes this overridable without a second parallel
config surface: the mode names an EXISTING command, so an ACP session is configured by that
command’s own block. At the default the session takes its filesystem, approvals,
builtInTools and mode prompt from GthConfig.commands.code — the same settings
gth code runs under — and at chat from commands.chat. There is no ACP-only copy of those
knobs to keep in step.
Defaulted at the read site (not in DEFAULT_CONFIG) to avoid churning the effective-config snapshot, à la injectModelContext.
optionalmode?:"chat"|"code"
agent?
Section titled “agent?”
optionalagent?:object
Defined in: packages/core/dist/config/types.d.ts:176
Selects the agent backend.
lean — the plain LangChain agent (GthLangChainAgent), given gsloth’s full toolset
(filesystem + hardened dev/shell + the gth_checklist planning tool) — is the only backend,
and what runs when the key is omitted. Every command resolves the same one, so the key selects
nothing today; it exists so a config can name what it runs on, and so a second backend has a
name to arrive under.
The retired deep value is a hard config error, not a coercion — see RETIRED_AGENT_BACKENDS
in config/schema.ts for why substituting a different agent for the one a config named is the
wrong kindness.
backend?
Section titled “backend?”
optionalbackend?:"lean"
aiignore?
Section titled “aiignore?”
optionalaiignore?:object
Defined in: packages/core/dist/config/types.d.ts:482
enabled?
Section titled “enabled?”
optionalenabled?:boolean
patterns?
Section titled “patterns?”
optionalpatterns?:string[]
allowDirs?
Section titled “allowDirs?”
optionalallowDirs?:string[]
Defined in: packages/core/dist/config/types.d.ts:623
Transient (runtime-only) extra filesystem roots the agent may read/write for THIS run, in
addition to the cwd sandbox. Populated by gth exec --allow-dir <path> (repeatable); never
persisted to a config file.
Currently inert. The permission layer that widened the sandbox belonged to the deepagents
backend; the filesystem toolkit the lean agent uses is rooted at the cwd and has no notion of
extra roots. The field, the flag and the config merge policy are kept so a config and a script
that already declare roots keep working when widening returns, and gth exec says plainly
that the flag does nothing rather than announcing a widening that never happens — a warning
about a guardrail that was not actually removed teaches the user to distrust the warnings.
allowedTools?
Section titled “allowedTools?”
optionalallowedTools?:string[]
Defined in: packages/core/dist/config/types.d.ts:307
Restrict the agent to this allow-list of tool names, applied after every tool source
(filesystem, built-in, custom, MCP, A2A, and tools) is resolved. This is the only knob
that can gate MCP and A2A tools, which have no per-source override of their own.
- omitted/undefined: no filtering, all resolved tools remain available.
- non-empty array: keep only tools whose name is in the list.
- empty array
[]: disable every tool. MCP servers are not even contacted (no OAuth), which is useful for agents that only need to reason over the prompt (e.g. the review agent).
Can be overridden per command via commands.<command>.allowedTools.
approvals?
Section titled “approvals?”
optionalapprovals?:ApprovalsConfig
Defined in: packages/core/dist/config/types.d.ts:292
CFG-27 — the tool-approval ladder: one of the five rungs (manual · write ·
assisted · auto · bypass), written either as the bare rung name or as an object
carrying the rater’s identity profile and the declared allow/deny lists. Each rung fully
determines behaviour — there are no severity thresholds, no strictness levels and no
independent rater switch.
Settable at the root or per command (commands.<command>.approvals). §9.1 — a per-command
value overrides only the fields it NAMES. mode, rater and raterTimeoutMs replace the
root’s; deny and escalate CONCATENATE across every scope, so a per-command rung can never
discard the root’s prohibitions; allow is REPLACED when the command states its own and
inherited when it does not, so a scope may narrow what runs unprompted and may never widen
what is prohibited (§3.1: a too-broad allow entry runs unrated, a missed deny entry does not).
Absent = assisted, resolved by resolveApprovals.
askWriteMode?
Section titled “askWriteMode?”
optionalaskWriteMode?:boolean
Defined in: packages/core/dist/config/types.d.ts:629
Transient (runtime-only) flag set by gth ask --write: opt ask into the same
“do-the-job” filesystem + dev tools that exec/code get, so a question can act
(read/write files, run commands) rather than only chat. Never persisted to a config file.
autocompact?
Section titled “autocompact?”
optionalautocompact?:string|number|boolean| {enabled?:boolean;threshold?:string|number; }
Defined in: packages/core/dist/config/types.d.ts:734
EXT-161 — preventive conversation compaction: ON BY DEFAULT.
When the conversation is about to outgrow the model’s context window, the older part is folded into a summary before the request is sent, rather than after the provider has rejected it. The threshold is derived from the model’s real window — the models.dev catalog first, the provider package’s own model profile as a backstop — and when neither knows the window, nothing fires: a guessed threshold is worse than none, because the user cannot see it.
false(or{ enabled: false }) turns it off; the conversation is never folded preventively andstate.messagesis left exactly as it is.true/ omitted → on, with the threshold derived from the window.- a count (
300000), a suffixed count ('300K','0.9M') or a share of the window ('80%') sets the threshold explicitly.Kis 1000 andMis 1,000,000 — decimal, because provider token counts are decimal everywhere. - object →
{ enabled?, threshold? }spells both out.
A malformed threshold is a hard validation error naming the offending text; it never silently
becomes NaN, 0 or a default. /autocompact moves the number for one session, and
/status reports the number in force and where it came from.
The on-by-default is applied at the read site (resolveAutocompactConfig), not in
DEFAULT_CONFIG, to avoid churning the effective-config snapshot.
binaryFormats?
Section titled “binaryFormats?”
optionalbinaryFormats?:false|BinaryFormatConfig[]
Defined in: packages/core/dist/config/types.d.ts:203
Binary format support configuration. Disabled by default unless explicitly configured.
builtInTools?
Section titled “builtInTools?”
optionalbuiltInTools?:BuiltInToolsSetting
Defined in: packages/core/dist/config/types.d.ts:276
Selects and configures the built-in tools the agent loads. Either a string[] of tool names
(each enabled) or a registry keyed by tool name whose values enable (true), force-disable
(false), or configure (BuiltInToolConfig) each tool. CFG-18 folded the former
per-command devTools (the run_* commands + run_shell_command’s EXT-9/10/12 config) into
this single registry: e.g. { "run_tests": { "command": "npm test" }, "run_shell_command": { "timeout": 300000 } }. Settable at the root or per command (commands.<command>.builtInTools);
a per-command value replaces the top-level one.
builtInToolsConfig?
Section titled “builtInToolsConfig?”
optionalbuiltInToolsConfig?:BuiltInToolsConfig
Defined in: packages/core/dist/config/types.d.ts:481
canInterruptInferenceWithEsc
Section titled “canInterruptInferenceWithEsc”canInterruptInferenceWithEsc:
boolean
Defined in: packages/core/dist/config/types.d.ts:427
Allow inference to be interrupted with esc. Only has an effect in TTY mode.
commandEnv?
Section titled “commandEnv?”
optionalcommandEnv?:CommandEnvConfig
Defined in: packages/core/dist/config/types.d.ts:610
EXT-126 — what a command Gaunt Sloth spawns (the built-in shell tool and every custom tool) receives as its environment. See CommandEnvConfig. Top-level only: one setting governs every mode, so there is no per-command variant to diverge from it.
commands?
Section titled “commands?”
optionalcommands?:object
Defined in: packages/core/dist/config/types.d.ts:486
optionalapi?:object
api.approvals?
Section titled “api.approvals?”
optionalapprovals?:ApprovalsConfig
§9.1 — per-command approvals posture. It overrides only the fields it NAMES: mode,
rater, raterTimeoutMs and allow replace the root’s, while deny and escalate
concatenate with it. See GthConfig.approvals.
api.builtInTools?
Section titled “api.builtInTools?”
optionalbuiltInTools?:BuiltInToolsSetting
api.cors?
Section titled “api.cors?”
optionalcors?:object
api.cors.allowHeaders?
Section titled “api.cors.allowHeaders?”
optionalallowHeaders?:string
api.cors.allowMethods?
Section titled “api.cors.allowMethods?”
optionalallowMethods?:string
api.cors.allowOrigin?
Section titled “api.cors.allowOrigin?”
optionalallowOrigin?:string
api.filesystem?
Section titled “api.filesystem?”
optionalfilesystem?:string[] |"none"|"all"|"read"
api.host?
Section titled “api.host?”
optionalhost?:string
The interface the AG-UI server binds. Defaulted at the read site rather than in
DEFAULT_CONFIG — see DEFAULT_AGUI_HOST in @gaunt-sloth/agent’s apiAgUiModule, which
is IPv4 loopback. Set 0.0.0.0 (or :: for IPv6 as well) to accept connections from the
network; the endpoint has no authentication, so that is a deliberate exposure.
One listen binds one address, so the default is IPv4 loopback and not both loopbacks: a
client on this machine that resolves localhost to ::1 and does not retry over IPv4 is
refused. Set ::1 for that one — IPv6 loopback, still this machine only.
api.port?
Section titled “api.port?”
optionalport?:number
optionalask?:CommandToolingConfig
optionalchat?:CommandToolingConfig
optionalcode?:CommandToolingConfig
gth code — interactive coding session. Carries the do-the-job tool/filesystem knobs; the
dev/shell tools (CFG-18) are configured via CommandToolingConfig.builtInTools.
optionalexec?:CommandToolingConfig
gth exec — prompt-as-script runtime. Like code, an exec run may need to actually
do the job (read/write files, run commands), so it carries the same tool/filesystem knobs.
optionalpr?:PrCommandConfig
review?
Section titled “review?”
optionalreview?:ReviewCommandConfig
commit?
Section titled “commit?”
optionalcommit?:object
Defined in: packages/core/dist/config/types.d.ts:560
GS2-35/EXT-83 — identity for the Co-Authored-By trailer of agent-authored git commits. Gaunt
Sloth has no dedicated commit tool (it commits via run_shell_command), so this identity is
injected into the code-mode system prompt, which instructs the agent to co-author commits as
this account. Optional and defaulted, each field independently: when the name is unset the
default is DEFAULT_COMMIT_CO_AUTHOR_NAME decorated with the resolved active model —
Gaunt Sloth (provider:model) — falling back to the bare
DEFAULT_COMMIT_CO_AUTHOR_NAME when no model resolves or injectModelContext is
false; when the email is unset it is DEFAULT_COMMIT_CO_AUTHOR_EMAIL. A CONFIGURED
name is emitted verbatim — the model identity decorates only the default.
coAuthor?
Section titled “coAuthor?”
optionalcoAuthor?:object
coAuthor.email?
Section titled “coAuthor.email?”
optionalemail?:string
coAuthor.name?
Section titled “coAuthor.name?”
optionalname?:string
consoleLevel?
Section titled “consoleLevel?”
optionalconsoleLevel?:StatusLevel
Defined in: packages/core/dist/config/types.d.ts:445
Console logging level. Only messages at or above this level will be displayed. Valid values: ‘debug’, ‘info’, ‘display’, ‘success’, ‘warning’, ‘error’, ‘stream’ Default: ‘info’ (not debug)
contentSource
Section titled “contentSource”contentSource:
string
Defined in: packages/core/dist/config/types.d.ts:209
Content source type. Source used to fetch content (usually diff) for review or pr command.
contentSourceConfig?
Section titled “contentSourceConfig?”
optionalcontentSourceConfig?:Record<string,unknown>
Defined in: packages/core/dist/config/types.d.ts:448
customTools?
Section titled “customTools?”
optionalcustomTools?:CustomToolsConfig
Defined in: packages/core/dist/config/types.d.ts:446
debugDump?
Section titled “debugDump?”
optionaldebugDump?:object
Defined in: packages/core/dist/config/types.d.ts:602
GS2-47 — controls the shared secret-redaction pass applied to /debug-dump archives. Default
ON (omitted = redact): secret-named env-var values, inline config secrets, provider-key/auth
patterns and sensitive config fields are masked before any artifact hits disk. Set
debugDump.redact: false (or run /debug-dump --unsafe-no-redact) to write a RAW archive, which
the command flags with a loud “may contain secrets” warning. Defaulted at the read site (not in
DEFAULT_CONFIG) to avoid churning the effective-config snapshot.
redact?
Section titled “redact?”
optionalredact?:boolean
debugLog?
Section titled “debugLog?”
optionaldebugLog?:boolean
Defined in: packages/core/dist/config/types.d.ts:432
Log messages and events to gaunt-sloth.log,
use llm.verbose or gth --verbose as more intrusive option, setting verbose to LangChain / LangGraph
evalToolCoverage?
Section titled “evalToolCoverage?”
optionalevalToolCoverage?:EvalToolCoverageConfig
Defined in: packages/core/dist/config/types.d.ts:418
BATCH-48 — the run-level tool-coverage floor for gth eval.
Distinct from a suite’s own tool_coverage.min. That one is graded against the suite that
declared it; this one is graded against the run’s aggregate, and the two are independent —
neither is promoted into the other. A profile is the intended home: one profile declares the
MCP server under test and the floor over that server’s surface.
Optional, with no default and deliberately absent from DEFAULT_CONFIG. A run that never set
the key has no run floor, and a default written here would invent one for every config that
never asked.
filesystem
Section titled “filesystem”filesystem:
string[] |"none"|"all"|"read"
Defined in: packages/core/dist/config/types.d.ts:266
history?
Section titled “history?”
optionalhistory?:object
Defined in: packages/core/dist/config/types.d.ts:188
GS2-7 (B20) / GS2-20 — local session history store. DEFAULT ON (absent = enabled): each run is
recorded to a local SQLite store (~/.gsloth/history.db by default, overridable via dbPath)
for gth history search / gth insights, and interactive sessions checkpoint their graph state
into the same store so a conversation can be resumed. The store is a directory of SQLite files
(GS2-121; see history/historyLayout.ts), and a single-file store from 2.0.0 at that path is
split into one on first open. enabled: false turns both off and
restores the stateless identity. Local only — no telemetry leaves the machine.
dbPath?
Section titled “dbPath?”
optionaldbPath?:string
enabled?
Section titled “enabled?”
optionalenabled?:boolean
identityProfile?
Section titled “identityProfile?”
optionalidentityProfile?:string
Defined in: packages/core/dist/config/types.d.ts:245
Separate identity profile.
May include separate identity, guidelines and command protocol,
making gsloth behave as an agent different from default profile behaviour.
for example, devops profile to detect changes such as properties and environment variables.
Custom config can still win over this one.
This setting requires .gsloth/.gsloth-settings directory to exist.
includeCurrentDateAfterGuidelines
Section titled “includeCurrentDateAfterGuidelines”includeCurrentDateAfterGuidelines:
boolean
Defined in: packages/core/dist/config/types.d.ts:249
Whether to include the current date in the project review instructions or not.
injectModelContext?
Section titled “injectModelContext?”
optionalinjectModelContext?:boolean
Defined in: packages/core/dist/config/types.d.ts:593
GS2-34 — inject the resolved active provider:model identity into the assembled system prompt
so the agent knows which model is serving it (to answer “what model are you?” and reason about
its own capabilities/limits). Default ON (omitted = inject). Opt out with
injectModelContext: false to keep reproducible / model-agnostic runs (e.g. review) blind to
the identity — when off, the assembled prompt is exactly as it is without this feature.
EXT-83 — it governs the model identity EVERYWHERE in the prompt, not just the identity line:
in code mode the same resolved identity decorates the default git commit co-author name
(GthConfig.commit), so turning this off also removes the model from the commit trailer,
which degrades to the plain default name. The identity LINE applies in all modes; the trailer
it also feeds is code-mode-only, like the cwd/os-shell notes. Defaulted at the read site (not
in DEFAULT_CONFIG) to avoid churning the effective-config snapshot.
llm:
BaseChatModel
Defined in: packages/core/dist/config/types.d.ts:162
mcpServers?
Section titled “mcpServers?”
optionalmcpServers?:Record<string,unknown>
Defined in: packages/core/dist/config/types.d.ts:454
MCP (Model Context Protocol) server connections. Allows connecting to external MCP servers including those requiring OAuth.
https://modelcontextprotocol.io/
memory?
Section titled “memory?”
optionalmemory?:object
Defined in: packages/core/dist/config/types.d.ts:196
GS2-7 (B21) — opt-in file-backed memory (MEMORY.md / USER.md). DEFAULT OFF. Forward-compat toggle only; the feature is a deferred follow-up.
enabled?
Section titled “enabled?”
optionalenabled?:boolean
middleware?
Section titled “middleware?”
optionalmiddleware?:unknown[]
Defined in: packages/core/dist/config/types.d.ts:340
Middleware configuration for LangChain v1. Middleware provides hooks to intercept and control agent execution at critical points.
Middleware can be:
- Predefined middleware (string or config object) - works in both JSON and JS configs
- Custom middleware objects - only available in JS configs
Example (JSON config):
{ "middleware": [ "summarization", { "name": "anthropic-prompt-caching", "ttl": "5m" } ]}Example (JS config):
{ middleware: [ "summarization", { beforeModel: (state) => { /* custom logic */ return state; } } ]}Available predefined middleware:
anthropic-prompt-caching: Reduces API costs by caching prompts (Anthropic only)summarization: Condenses conversation history when approaching token limits
modelDisplayName?
Section titled “modelDisplayName?”
optionalmodelDisplayName?:string
Defined in: packages/core/dist/config/types.d.ts:566
modelProviderType?
Section titled “modelProviderType?”
optionalmodelProviderType?:string
Defined in: packages/core/dist/config/types.d.ts:578
GS2-53 — the configured provider type string (openrouter/deepseek/xai/anthropic/…),
stashed by the loader from the raw llm.type before the built BaseChatModel replaces the raw
spec. INTERNAL (loader-set, never user-supplied), so it is deliberately absent from the config
schema. resolveModelIdentity PREFERS this over
the live model’s _llmType() for the injected identity, because that is the model class’s own
label rather than the gth provider namespace (huggingface reports openai, and both Gemini
providers report google) and would otherwise mislabel the provider half. Absent for module
configs (which hand us an already-built
LLM with no raw type), where resolution falls back to the guarded _llmType().
noDefaultPrompts?
Section titled “noDefaultPrompts?”
optionalnoDefaultPrompts?:boolean
Defined in: packages/core/dist/config/types.d.ts:265
If true, only use user-provided system prompts. Do not fall back to the
bundled .gsloth.*.md prompt files shipped with the installation.
This applies to all .gsloth.*.md files (backstory, system, chat, code, guidelines, review).
organization?
Section titled “organization?”
optionalorganization?:object
Defined in: packages/core/dist/config/types.d.ts:255
Organisation name, locale and timezone. Only used with includeCurrentDateAfterGuidelines. timeZone and locale should be in format supported by Intl.DateTimeFormat
locale?
Section titled “locale?”
optionallocale?:string
optionalname?:string
timezone?
Section titled “timezone?”
optionaltimezone?:string
output?
Section titled “output?”
optionaloutput?:object
Defined in: packages/core/dist/config/types.d.ts:659
GS2-93 — output surface controls.
output.header grades what a NON-TUI text run (--no-tui, ask, exec, eval, pr,
review, piped/CI) opens with, across three rungs:
debug— the full technical preamble: the Workdir/Model/Tools/Middleware status block, thePress Escape or Q to interrupthint, and their surrounding blank lines.compact(the DEFAULT, so an unset key opens with this) — no preamble, and one attribution line naming the command and the model that served it.review/prrender their existing attribution block instead of this line.none— nothing at all, including the review attribution block, for a byte-clean stream a caller can diff or template.
The interactive TUI ignores the setting and always shows the full header. Only the opening is
graded — never model/tool output, errors, or config-validation warnings, and never the live
Thinking… indicator. Defaulted at the read site, not in DEFAULT_CONFIG, to avoid
churning the effective-config snapshot.
GS2-106 — output.resumeHint grades the line gth ask and gth exec print on stderr after a
recorded run, naming the command that continues the conversation, on the same three rungs:
compact(the DEFAULT) — the one line, e.g.gth ask --resume <run id> "…".debug— that line plus the conversation’s integer id and the history file it lives in; and when a run gets no hint, a line saying why.none— nothing.
Batch, eval and workflow cells never print it, whatever the rung. Defaulted at the read site.
header?
Section titled “header?”
optionalheader?:"none"|"compact"|"debug"
resumeHint?
Section titled “resumeHint?”
optionalresumeHint?:"none"|"compact"|"debug"
prompts?
Section titled “prompts?”
optionalprompts?:PromptsConfig
Defined in: packages/core/dist/config/types.d.ts:220
GS2-43 — the unified prompt-segment config (see PromptsConfig). Each of the seven
segments (backstory | guidelines | system | chat | code | exec | review) accepts a string
path (e.g. "guidelines": "AGENTS.md") or an object ({ path?, enabled?, mode? }). When a
segment is omitted its default-named file / bundled default applies unchanged.
recap?
Section titled “recap?”
optionalrecap?:"off"|"outstanding"|"always"
Defined in: packages/core/dist/config/types.d.ts:688
[[EXT-178]] — the end-of-run recap: a short paragraph on the one stop that says nothing today.
Every ending except completed and suspended already announces itself, so the run that
looks like success — text, no tool calls, no error — is the silent one, whether or not it
finished the job. This grades what that stop says, across three rungs:
off(the DEFAULT, so an unset key behaves exactly as before this existed) — nothing. The deterministic unfinished-checklist notice still speaks, unchanged.outstanding— a recap only on a clean stop whose own checklist still lists work. The cheapest rung that buys the feature’s point, and the one to reach for first.always— a recap on every clean stop, including the ones where nothing is left. A recap of a run that went well is useful in its own right, which is what makes this a feature rather than a diagnostic.
It costs a model call, a small non-agentic one made after the turn has already ended, which
is why the default is off — see DEFAULT_RUN_RECAP_RUNG in core/runRecap.ts for the whole
argument. Defaulted at the read site, not in DEFAULT_CONFIG, to avoid churning the
effective-config snapshot. When a recap renders, it replaces the unfinished-checklist notice
for that stop rather than appearing beside it, and carries the same counts.
Honoured on chat/code (both the TUI and --no-tui), ask and exec. Deliberately not on
batch, eval, workflow, review, pr, ACP or AG-UI — see SingleShotOptions and the
node for why each is excluded.
recursionLimit?
Section titled “recursionLimit?”
optionalrecursionLimit?:number
Defined in: packages/core/dist/config/types.d.ts:439
LangGraph recursion limit for an agent run — the maximum number of super-steps (model ↔ tool round-trips) before the graph throws. Defaults to 1000, which suits long coding chains; embodied / tight-loop consumers can lower it so a stuck run fails fast and visibly instead of grinding.
reporters?
Section titled “reporters?”
optionalreporters?:Record<string,string>
Defined in: packages/core/dist/config/types.d.ts:761
BATCH-19 — custom gth eval reporters, keyed by the NAME they are selected under
(gth eval … --reporter <name>). Each value is a MODULE PATH, resolved relative to the project
dir, whose default export is an EvalReporterFactory (() => EvalReporter). Loaded and
registered through the SAME seam the bundled reporters (text, junit) use, so a config
reporter can also override a built-in of the same name (config wins). A missing file, a failed
import, or a non-function default export is a hard error (the eval harness exits 2). Trusted:
it is the user’s own config, which already executes arbitrary JS.
requirementSource
Section titled “requirementSource”requirementSource:
string
Defined in: packages/core/dist/config/types.d.ts:213
Requirement source type. Source used to fetch requirements for review or pr command.
requirementSourceConfig?
Section titled “requirementSourceConfig?”
optionalrequirementSourceConfig?:Record<string,unknown>
Defined in: packages/core/dist/config/types.d.ts:447
scopedPrompts?
Section titled “scopedPrompts?”
optionalscopedPrompts?:ScopedPromptsEntry[]
Defined in: packages/core/dist/config/types.d.ts:236
CFG-70 — runtime only: the prompts.paths entries this run’s diff actually selected.
It is deliberately absent from the zod schema, from gsloth-config.schema.json and from every
config layer. A user never writes it; review() sets it on the already-resolved config after
matching the diff’s paths against prompts.paths, and the prompt-reading layer
(readPromptSegment) is its only reader. Writing it in a config file would therefore do
nothing useful, which is why the schema does not offer it — the schema describes what a user
can say, and this is what the run worked out.
It carries the selected entries, not composed text. File resolution needs the config dir,
the identity profile and noDefaultPrompts, all of which live in core’s prompt-reading layer;
keeping this a list of entries is what lets the review package select without knowing any of
that.
streamOutput
Section titled “streamOutput”streamOutput:
boolean
Defined in: packages/core/dist/config/types.d.ts:346
Stream output. Some models do not support streaming. Set value to false for them.
streamSessionInferenceLog
Section titled “streamSessionInferenceLog”streamSessionInferenceLog:
boolean
Defined in: packages/core/dist/config/types.d.ts:423
Stream session log instead of writing it when inference streaming is complete. (only works when streamOutput is true)
subagents?
Section titled “subagents?”
optionalsubagents?:SubagentProfileSpec[]
Defined in: packages/core/dist/config/types.d.ts:771
GS2-33 — profile-backed subagents. Each entry names a subagent and the named config profile the CHILD resolves when the parent spawns it,
so a subagent can run under a different model/tools/prompt than the parent (a cheap profile for
recall/search while the parent runs on a strong model). Currently honored by nothing: its
only consumer was the deep (deepagents) backend, whose task tool gained one selectable
subagent per entry, and that backend has been removed. The key is still accepted and warns on
use; the lean backend’s own subagent primitive lands in GS2-25.
optionaltls?:object
Defined in: packages/core/dist/config/types.d.ts:461
TLS trust for outbound HTTPS. Primarily so an http-transport MCP server behind a
private/corporate CA can be reached without prepending NODE_EXTRA_CA_CERTS on every
invocation. The mechanism is a process-global undici dispatcher, so it applies to ALL
outbound fetch this process makes (LLM provider calls included), not only MCP.
extraCaCerts?
Section titled “extraCaCerts?”
optionalextraCaCerts?:string[]
Extra CA certificate file(s) to trust IN ADDITION to Node’s built-in roots. Paths resolve
relative to the project dir (or ~/absolute). Additive — never removes a default root.
rejectUnauthorized?
Section titled “rejectUnauthorized?”
optionalrejectUnauthorized?:boolean
DANGER — false disables TLS certificate verification for ALL outbound HTTPS this process
makes, not just MCP. Escape hatch only; a loud security warning is emitted every session.
toolLoopGuard?
Section titled “toolLoopGuard?”
optionaltoolLoopGuard?:boolean| {halt?:boolean;threshold?:number;warn?:boolean; }
Defined in: packages/core/dist/config/types.d.ts:705
EXT-36 — the tool-loop guard: a repeated-identical-(tool, args) / no-progress detector that
runs as a lean-backend beforeModel middleware, the orthogonal sibling of GS2-36’s
consecutive-tool-ERROR budget. It catches the case GS2-36 leaves open — a model re-issuing the
SAME call verbatim, whether it keeps erroring or keeps “succeeding” with the same result.
falsedisables it entirely.true/ omitted → WARN on, HALT off, default threshold (DEFAULT_TOOL_LOOP_THRESHOLD).- object → per-field:
warn(default ON) injects a control-flow-free nudge at the threshold;halt(default OFF, opt-in) ends the run cleanly (jumpTo:'end', never a throw) at the threshold;thresholdis the number of consecutive identical calls that trip it.
WARN is provably harmless (no routing effect, one nudge per signature per streak). The WARN-on default is applied at the read site (not in DEFAULT_CONFIG) to avoid churning the effective-config snapshot.
toolOutputPreviewLines?
Section titled “toolOutputPreviewLines?”
optionaltoolOutputPreviewLines?:number
Defined in: packages/core/dist/config/types.d.ts:390
TUI-C105 — the default number of output lines a COLLAPSED tool call previews, on both the Ink
TUI and the plain surface, before the … (+N more lines) overflow marker. 0 reduces every
tool call to its one-line summary. Absent, the built-in cap applies
(TOOL_OUTPUT_PREVIEW_LINES in core/toolDisplay); override it for one tool with
builtInTools.<tool>.previewLines, which ranks above this.
A display cap, not a content cap. It changes only what is drawn for the human; the model
receives every tool result in full regardless. The knobs that change what a tool returns to
the model are separate and per-tool (builtInTools.gth_gh_read_file.maxBytes,
builtInTools.run_shell_command.maxOutputBytes).
MUST stay optional: absence is what distinguishes “the user chose a depth” from the built-in
cap, and the fallback in getToolPreviewLines collapses without that distinction.
toolResultCaptureMaxBytes?
Section titled “toolResultCaptureMaxBytes?”
optionaltoolResultCaptureMaxBytes?:number
Defined in: packages/core/dist/config/types.d.ts:405
BATCH-49 — how many UTF-8 bytes of a tool result are recorded into run stats and eval results.
The recorded stage, not the other two. builtInTools.<tool>.maxOutputBytes / maxBytes
cap what a tool returns to the model, and toolOutputPreviewLines caps what is drawn;
this caps what is stored, after the model has already seen the whole result. A longer payload
is cut on a character boundary, and the record says so (contentTruncated).
A positive integer. 0 is rejected rather than read as “unlimited”: toolOutputPreviewLines
uses 0 to mean the minimum, and the same number meaning the opposite here is the confusion
the rejection exists to prevent. Absent, the read site applies TOOL_RESULT_CONTENT_CAP;
the default is deliberately not in DEFAULT_CONFIG, so the effective-config snapshot does not
grow a key nobody set.
tools?
Section titled “tools?”
optionaltools?:StructuredToolInterface<ToolInputSchemaBase,any,any>[] |BaseToolkit[] |ServerTool[]
Defined in: packages/core/dist/config/types.d.ts:293
optionaltui?:boolean
Defined in: packages/core/dist/config/types.d.ts:751
CFG-37 — persistent surface preference for the chat/code interactive sessions, settable in
both the global and the project config (the project layer wins). true asks for the Ink TUI,
false for the plain readline session, absent leaves the terminal auto-detect in charge —
which is why it must stay optional, exactly as useColour/useMouse do.
This is the CONFIG-FILE preference, one rung of a chain rather than the answer: the
--tui/--no-tui flags and the GTH_NO_TUI escape hatch both outrank it, and the capability
gates (no TTY, TERM=dumb, ink not installed) outrank everything because they are checks and
not preferences — so true degrades to readline rather than forcing a crash. Deliberately NOT
in DEFAULT_CONFIG. The flag arrives separately as
CommandLineConfigOverrides.tui; the two meet only in shouldUseTui.
useColour
Section titled “useColour”useColour:
boolean
Defined in: packages/core/dist/config/types.d.ts:367
Use colour in output
useMouse
Section titled “useMouse”useMouse:
boolean
Defined in: packages/core/dist/config/types.d.ts:374
Enable terminal mouse reporting in the Ink TUI, making its affordances clickable.
On by default in an interactive terminal. While it is on the terminal’s own text selection
needs a modifier (Shift, or Option in some macOS terminals) — set this to false, or set
GTH_NO_MOUSE, to get unmodified selection back.
writeBinaryOutputsToFile
Section titled “writeBinaryOutputsToFile”writeBinaryOutputsToFile:
boolean
Defined in: packages/core/dist/config/types.d.ts:363
Whether binary model outputs should be written to files instead of printed inline.
When enabled, supported binary content blocks are materialized as gth_*.<ext> files.
writeOutputToFile
Section titled “writeOutputToFile”writeOutputToFile:
string|boolean
Defined in: packages/core/dist/config/types.d.ts:358
Should the output be written to md file.
(e.g. gth_2025-07-26_22-59-06_REVIEW.md).
Defaults to false (no file is written); set to true for the standard
gth_<timestamp>_<COMMAND>.md name.
Can be set to false with -wn or -w0
Can be set to a specific filename or path by passing a string:
- Bare filenames (e.g.
"review.md") are placed in.gsloth/when it exists, otherwise project root - Paths with separators (e.g.
"./review.md"or"reviews/last.md") are always relative to project root Please note the string does not accept absolute path, but allows to exit project with..if necessary.