Configuration
Configuration
All settings are under the sidecar.* prefix. Open VS Code settings (Cmd+, / Ctrl+,) and search for “sidecar”.
Connection
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.baseUrl |
string | http://localhost:11434 |
API base URL. Ollama: http://localhost:11434, Anthropic: https://api.anthropic.com, OpenAI: https://api.openai.com, Kickstand: http://localhost:11435, OpenAI-compatible: any URL |
sidecar.apiKey |
string | ollama |
API key. Stored in VS Code SecretStorage (see below). Ignored for local Ollama, required for Anthropic, OpenAI, and some OpenAI-compatible servers |
sidecar.model |
string | gemma4:e4b |
Model for chat (e.g., gemma4:e4b, ministral-3:latest, qwen3-coder:30b, claude-sonnet-4-6, or any model on your server) |
sidecar.provider |
enum | auto |
Backend provider: auto, ollama, anthropic, openai, kickstand. Auto-detects from URL |
sidecar.systemPrompt |
string | "" |
Custom system prompt appended to the default |
Switching backends (recommended)
You don’t have to edit these settings by hand. Click the ⚙ gear in the chat header and pick a backend from the Backend section of the settings menu — SideCar’s built-in profiles flip baseUrl, provider, and model in one click:
| Profile | Provider | Base URL | Default model |
|---|---|---|---|
| Local Ollama | ollama |
http://localhost:11434 |
qwen2.5-coder:7b |
| Anthropic Claude | anthropic |
https://api.anthropic.com |
claude-sonnet-4-6 |
| OpenAI | openai |
https://api.openai.com |
gpt-4o |
| Kickstand | kickstand |
http://localhost:11435 |
Token auto-loaded from ~/.config/kickstand/token — no key prompt |
Each profile stores its API key in its own SecretStorage slot (sidecar.profileKey.<id>), so switching between profiles preserves keys you’ve already entered — setting your Anthropic key once won’t clobber your OpenAI key, and vice versa. The currently active profile is checkmarked in the menu. The same flow is available from the Command Palette as SideCar: Switch Backend.
On first switch to a profile that needs a key, SideCar will surface a warning with a “Set API Key” button that chains into the standard SideCar: Set API Key flow — the key is stored under the correct profile slot automatically.
For custom setups (non-standard ports, Anthropic-compatible proxies, etc.) the settings table above is still the right path — the profile switcher only covers the built-in providers.
Provider auto-detection
When sidecar.provider is auto (default), SideCar detects the backend from the URL:
localhost:11434→ Ollama (native API)anthropic.com→ Anthropic (Messages API with prompt caching)localhost:11435→ Kickstand — reads bearer token from~/.config/kickstand/tokenautomatically- Everything else → OpenAI-compatible (
/v1/chat/completions)
Set sidecar.provider explicitly if auto-detection doesn’t match your setup — for example, if you’re running an Anthropic-compatible proxy on a custom URL, or a local Kickstand dev build on a non-standard port.
API key storage (SecretStorage)
API keys are stored in VS Code’s SecretStorage, not in plaintext settings.json. This applies to both sidecar.apiKey and sidecar.fallbackApiKey.
Setting or refreshing your key:
Three equivalent ways to set or rotate your key:
- Open the command palette (
Cmd+Shift+P/Ctrl+Shift+P) and runSideCar: Set / Refresh API Key. - Click the
$(key)icon in the chat view’s title bar. - Let a native error toast prompt you — when an auth error fires, the
Set API Keyaction button on the toast runs the same flow.
A password input prompt appears. Values are trimmed of whitespace on save (defense-in-depth trim also fires at the AnthropicBackend constructor, in case an existing stored key has a stray newline from an earlier paste). Empty input is rejected with a warning. The value is stored encrypted in your OS keychain (macOS Keychain, Windows Credential Manager, or libsecret on Linux). After saving, SideCar automatically refreshes the model list so the UI recovers from any “Cannot connect” error state without requiring a window reload.
Migration from plaintext:
If you previously set sidecar.apiKey in settings.json, SideCar automatically migrates it to SecretStorage on first activation:
- Reads the plaintext value from
settings.json - Stores it in SecretStorage
- Clears the plaintext value from
settings.json
After migration, the setting in settings.json will be empty (or back to the default "ollama"), and the actual key lives in SecretStorage.
Why this matters:
- API keys never appear in
settings.json— safer when sharing settings, dotfiles, or screenshots - Per-machine isolation — settings sync won’t push your keys to other devices
- Standard OS-level secret storage instead of plaintext on disk
The fallback API key (sidecar.fallbackApiKey) follows the same pattern but does not have a dedicated command — set it via settings.json once and it migrates automatically on the next activation.
Multi-file Edit Planning (v0.111+)
When an agent task touches 3 or more files, SideCar generates an EditPlan manifest before writing anything. The plan lists every file, operation (create / edit / delete), rationale, and dependency edges. A collapsible Planned edits card appears in chat so you see the full scope before execution begins.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.multiFileEdits.minFilesForPlan |
number | 3 |
Minimum number of files in a batch before the planner pass fires. Set to 1 to always plan; 0 to disable planning |
sidecar.multiFileEdits.maxParallel |
number | 8 |
Maximum files written in parallel within a DAG layer. Independent files stream simultaneously; files with dependsOn edges wait for their prerequisites |
sidecar.multiFileEdits.plannerModel |
string | "" |
Model used for the structured planning pass (empty = use the main chat model). Use a smaller/faster model to reduce planning overhead |
Add @no-plan anywhere in your prompt to skip the planner for that request.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.multiFileEdits.enabled |
boolean | true |
Master toggle for multi-file edit streams. When false, the agent writes files sequentially without a plan card. |
sidecar.multiFileEdits.planningPass |
boolean | true |
Run a dedicated Edit Plan LLM turn before executing writes. Adds one extra LLM call but produces the plan card and enables per-file cancel. Set false to skip planning and stream writes immediately. |
sidecar.multiFileEdits.reviewGranularity |
string | "per-file" |
How the Pending Changes panel presents the batch. "per-file" = accept/reject each file individually; "bulk" = Accept All / Reject All only. |
Each file in the planned-edits card has a cancel button — clicking it aborts that file’s write mid-stream without affecting other in-flight files. Use Accept All or Reject All in the card to apply or discard the entire batch atomically.
Agent behavior
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.agentMode |
string | cautious |
Agent mode: cautious, autonomous, manual, plan, review, or a custom mode name from sidecar.customModes. See Agent Mode → Approval modes for the behavior of each |
sidecar.agentTemperature |
number | 0.2 |
Temperature for agent tool-calling requests. Lower values (0.1–0.3) produce more deterministic tool selection |
sidecar.agentMaxIterations |
number | 25 |
Max agent loop iterations |
sidecar.agentMaxTokens |
number | 200000 |
Max tokens per agent run |
sidecar.requestTimeout |
number | 120 |
Timeout in seconds for each LLM request. Aborts if no tokens arrive within this window. Set to 0 to disable |
sidecar.toolPermissions |
object | {} |
Per-tool overrides: { "tool_name": "allow" \| "deny" \| "ask" } |
sidecar.customModes |
array | [] |
Custom agent modes with dedicated system prompts and approval behavior. See Custom modes |
sidecar.bgMaxConcurrent |
number | 3 |
Maximum number of background agents that can run simultaneously (1–10) |
Model Management
Editor model
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.editorModel |
string | "" |
Secondary model for agent execution turns. When set, planning turns (no prior tool calls) use sidecar.model; execution turns (following tool calls) use this model. Leave empty to disable the split. |
Set sidecar.editorModel to a cheaper/faster model (e.g. claude-haiku-4-5) to reduce cost on long agent runs without sacrificing planning quality.
Fallback backend
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.fallbackBaseUrl |
string | "" |
URL of a fallback backend. SideCar switches here automatically after repeated primary failures. Leave empty to disable. |
sidecar.fallbackApiKey |
string | "" |
API key for the fallback backend. Stored in VS Code SecretStorage. |
sidecar.fallbackModel |
string | "" |
Model to use on the fallback backend. Empty = reuse the primary model name. |
Typical setup: primary = Anthropic, fallback = local Ollama, so API outages don’t block work. SideCar switches back to the primary automatically once it recovers.
Model routing
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.modelRouting.enabled |
boolean | false |
Enable role-based routing. When false, every dispatch role uses sidecar.model. |
sidecar.modelRouting.rules |
array | [] |
Ordered routing rules. Each rule has a when expression, a model, and optional fallbackModel plus per-rule budget caps (sessionBudget, dailyBudget, hourlyBudget in USD). |
sidecar.modelRouting.defaultModel |
string | "" |
Model used when no rule matches. Empty falls back to sidecar.model. |
sidecar.modelRouting.dryRun |
boolean | false |
Log routing decisions without applying them — calibrate rules before enabling. |
sidecar.modelRouting.visibleSwaps |
boolean | true |
Show a toast whenever a routing rule swaps the active model mid-session. |
Rule when expressions support role names (agent-loop, chat, critic, summarize, completion, planner), attribute comparisons (agent-loop.complexity=high), prompt regex (chat.prompt~=/proof/i), and file glob (agent-loop.files~=src/physics/**). Budget caps trigger an automatic downgrade to fallbackModel.
Thinking mode
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.thinking.mode |
string | "single" |
Thinking visualization mode for models with extended thinking. Values: "single" (default), "self-debate" (pros/cons framing), "tree-of-thought" (possibility tree), "red-team" (adversarial critique). |
SteerQueue and message limits
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.steerQueue.coalesceWindowMs |
number | 2000 |
Milliseconds to wait at an iteration boundary before draining pending steers, coalescing rapid follow-ups into one turn. 0 drains immediately. |
sidecar.steerQueue.maxPending |
number | 5 |
Maximum queued steers. When full, the oldest nudge is evicted; an all-interrupt queue rejects new submissions with an explicit error. |
sidecar.agentMaxMessages |
number | 25 |
Soft ceiling on conversation message count before the agent wraps up. |
sidecar.firstTokenTimeout |
number | 300 |
Seconds to wait for the first token from the model. Local models loading from disk may need the full window. Set to 0 to disable. |
Context
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.includeWorkspace |
boolean | true |
Include workspace files in context |
sidecar.includeActiveFile |
boolean | true |
Include the currently active file |
sidecar.filePatterns |
array | ["**/*.ts", ...] |
Glob patterns for workspace context (25+ languages) |
sidecar.maxFiles |
number | 10 |
Max files to include in workspace context |
sidecar.contextLimit |
number | 0 |
Override context token limit for local models. 0 = auto-detect — uses the value Ollama reports, capped at 128K. Set explicitly (e.g. 32768) to reduce KV-cache pressure on low-VRAM machines |
sidecar.pinnedContext |
array | [] |
Files or folders always included in context (relative paths) |
sidecar.fetchUrlContext |
boolean | true |
Auto-fetch web page content when URLs are pasted in chat |
Context pinning
Pin files or folders so they’re always included in context, regardless of relevance scoring:
"sidecar.pinnedContext": ["src/config/settings.ts", "src/agent/"]
You can also pin files dynamically in chat using @pin:path:
@pin:src/types.ts How does the ContentBlock type work?
Pinned files appear in a dedicated “Pinned Files” section before relevance-scored files.
Large file & monorepo handling
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.workspaceRoots |
array | [] |
Specific workspace roots to index (empty = all folders). Use for monorepos to focus on specific sub-projects |
sidecar.maxFileSizeBytes |
number | 102400 (100KB) |
Maximum file size to fully read. Larger files get summaries first/last lines |
sidecar.streamingReadThreshold |
number | 51200 (50KB) |
Files above this size use summary mode (head/tail lines) instead of full content |
sidecar.maxTraversalDepth |
number | 10 |
Maximum directory nesting depth for context inclusion. Set lower for shallow indexing in large projects |
sidecar.enableLazyIndexing |
boolean | true |
Defer indexing slow/large directories until explicitly needed |
sidecar.maxIndexedFiles |
number | 1000 |
Maximum indexed files before lazy-loading remainder. Improves startup time in huge repos |
Streaming reads
For large files exceeding streamingReadThreshold, SideCar automatically uses summary mode:
- Reads first N lines (default 50)
- Reads last M lines (default 30)
- Shows omitted line count in the middle
This keeps context focused on the structure and key parts of files without loading entire file content.
Multi-root workspaces
Pin specific workspace roots for monorepo development:
"sidecar.workspaceRoots": ["/path/to/repo/packages/core", "/path/to/repo/packages/ui"]
This is useful for:
- Monorepos: focus indexing on the sub-projects you’re actively working on
- Multi-root workspaces: reduce context noise by excluding irrelevant projects
- Large codebases: improve startup time by indexing only relevant directories
If not set (default), SideCar indexes all workspace folders.
Depth limiting
For deeply nested projects, limit traversal depth to prevent context bloat:
"sidecar.maxTraversalDepth": 5
Files deeper than this level are excluded from workspace indexing, reducing noise in large projects with many nested directories.
Ignoring patterns
Create a .sidecarignore file in your workspace root (same format as .gitignore):
# Ignore build artifacts
dist/
build/
.next/
# Ignore dependencies
node_modules/
venv/
Patterns from .sidecarignore are merged with default excludes (.git, .sidecar, node_modules, etc.).
Auto-fix
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.autoFixOnFailure |
boolean | false |
Auto-check diagnostics after edits and feed errors back to the model |
sidecar.autoFixMaxRetries |
number | 3 |
Max auto-fix retry attempts |
When enabled, SideCar automatically runs VS Code’s language diagnostics after the agent writes or edits a file. If errors are found, they’re fed back to the model to self-correct — up to the configured retry limit.
Adversarial Critic (v0.48+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.critic.enabled |
boolean | false |
Run an adversarial critic LLM call after every write_file / edit_file and after every failed run_tests. Disabled by default because it doubles API spend on edit turns. |
sidecar.critic.model |
string | "" |
Model for the critic call. Empty = reuse sidecar.model. Set to a cheaper model (e.g. claude-haiku-4-5) to reduce cost. |
sidecar.critic.blockOnHighSeverity |
boolean | true |
Inject a synthetic user message forcing the agent to address high-severity findings before the turn can finish. When false, findings surface as chat annotations only. |
The critic is capped at 2 injections per file per run to prevent unbounded spend on stuck loops.
Reactive Diagnostics Fix (v0.71+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.diagnostics.reactiveFixEnabled |
boolean | false |
Automatically propose fixes for new VS Code diagnostics as they appear in the Problems panel. |
sidecar.diagnostics.reactiveFixSeverity |
string | "error" |
Minimum severity to trigger a fix. "error" = errors only; "warning" = errors and warnings. |
sidecar.diagnostics.reactiveFixDebounceMs |
number | 2000 |
Milliseconds to wait after a diagnostic appears before firing, to avoid triggering mid-edit. |
Completion gate
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.completionGate.enabled |
boolean | true |
Refuse to let the agent declare a turn done until lint and the colocated tests for edited files have actually run |
When enabled, SideCar tracks every write_file / edit_file call against every run_tests / eslint / tsc / vitest / jest / pytest / npm test invocation during the turn. At the natural termination point, if any edited source file has a colocated .test.ts / .spec.ts that wasn’t exercised, or if lint never ran, the gate injects a synthetic user message into the loop demanding the checks before the turn can end. Capped at 2 injections per turn to prevent loops — after exhaustion the loop terminates with a warning rather than hanging.
This catches the failure mode where the model reports a change as “ready for use” without ever running the checks it claims pass. See Agent Mode → Safety guardrails for the full mechanism.
Regression Guards (v0.107+)
Shell-command guards wired into the agent loop via RegressionGuardHook. Guards run after relevant tool calls and block the turn with a reprompt when they fail, preventing the agent from declaring a task done while regressions exist.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.regressionGuards |
array | [] |
List of guard configs. Each has name, command, trigger, mode, scope, and maxAttempts |
sidecar.regressionGuards.mode |
enum | "strict" |
Global override: strict (block on failure), warn (log but continue), off (disable all guards) |
Guard config schema
"sidecar.regressionGuards": [
{
"name": "lint",
"command": "npm run lint",
"trigger": "post-write",
"mode": "blocking",
"scope": ["src/**/*.ts"],
"maxAttempts": 5
}
]
trigger:"post-write"(after any file write),"post-turn"(at turn end), or"pre-completion"(before the agent declares done)mode:"blocking"(failure halts the turn with a reprompt) or"advisory"(logged but non-blocking)scope: glob array — guard only fires when an edited file matches. Empty = always fires.maxAttempts(default5) — guard retries cap with exponential backoff; after exhaustion the turn terminates with a warning.
Built-in guards
Three ecosystem-aware guards are available without configuration. Enable them per-skill via guards: frontmatter — see Extending SideCar — Skills.
| Guard | Trigger command | Ecosystem |
|---|---|---|
lint-clean |
npm run lint / cargo clippy / flake8 |
auto-detected |
tests-pass |
npm test / cargo test / pytest |
auto-detected |
no-new-todos |
grep for new TODO/FIXME in edited files |
any |
Use /guards in chat to list active guards and the built-in catalog.
Background doc sync
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.jsDocSync.enabled |
boolean | true |
On save and open of any TS/JS file, flag orphan and missing JSDoc @param tags with quick fixes |
sidecar.readmeSync.enabled |
boolean | true |
On save and open of README.md (and on save of any src/ source file), flag fenced code-block calls whose argument count no longer matches the current workspace-exported function |
JSDoc sync scans the leading JSDoc block for every top-level function / arrow-const declaration and compares each @param entry against the signature. Orphan tags (tags with no matching parameter) and missing tags (parameters with no documentation) surface as warning diagnostics. Two quick fixes are offered per finding: “Remove orphan @param” and “Add missing @param” — both preserve the JSDoc block’s indentation and * prefix. Functions with destructured or rest parameters are skipped.
README sync scans fenced ts / tsx / js / jsx / typescript / javascript code blocks in README.md for direct calls to workspace-exported functions. Exported functions are indexed from src/**/*.{ts,tsx,js,jsx} on activation and refreshed incrementally on file save / create / change / delete, so README drift surfaces immediately after you rename or change a function signature. Quick fix rewrites the call to match the signature: drops trailing arguments when there are too many, or appends the missing parameter names as placeholders when there are too few. Method calls (obj.foo(...)), constructor calls (new Foo(...)), and control-flow keywords (if (x), while (y)) are excluded. Only single-line call expressions with no nested parens in their arguments are checked — nested or multi-line calls are silently skipped rather than mis-flagged.
Spending budgets
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.dailyBudget |
number | 0 |
Daily spending budget in USD. Agent runs are blocked when the limit is reached. Set to 0 to disable |
sidecar.weeklyBudget |
number | 0 |
Weekly spending budget in USD. Agent runs are blocked when the limit is reached. Set to 0 to disable |
Set spending limits to prevent runaway costs when using paid APIs (Anthropic, OpenRouter). When a budget is active:
- At 80% usage: a warning message appears in chat before the agent run starts
- At 100% usage: the agent run is blocked with a message indicating which setting to adjust
Budget tracking uses the per-run cost estimates stored in metrics history. View current spending with the /usage command, which shows a Budget Status table with spent/limit/remaining for each active budget.
Budgets reset on calendar boundaries — daily at midnight local time, weekly on Monday midnight.
Cost controls (paid backends)
Four additional settings that pair with the spending budgets above to drive down the cost of agent runs on Anthropic / OpenAI. See the Cost controls section in the README for the full rationale.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.promptPruning.enabled |
boolean | true |
Prune prompts before sending to paid backends. Collapses whitespace, head+tail truncates oversized tool results, and dedupes repeated file content. Safe for agent loops — only lossy on tool output, never on user or assistant messages |
sidecar.promptPruning.maxToolResultTokens |
number | 4000 |
Maximum token count for any single tool_result block sent to a paid backend. Longer results are head+tail truncated with an elision marker. Raise this for frontier models with large context windows; lower it to reduce cost on exploration-heavy tasks. Clamped to [200, 20000] |
sidecar.delegateTask.enabled |
boolean | true |
Expose the delegate_task tool to paid backends. The orchestrator can offload read-only research to a local Ollama worker and receive a compact summary. No-op on local-only setups |
sidecar.delegateTask.workerModel |
string | "" |
Ollama model used by the delegate_task worker. Empty = reuse the chat model. Recommended: a code-tuned model like qwen3-coder:30b or deepseek-coder:33b |
sidecar.delegateTask.maxIterations |
number | 10 |
Maximum agent loop iterations for a delegated worker task. |
sidecar.delegateTask.workerBaseUrl |
string | http://localhost:11434 |
Base URL of the Ollama instance the worker connects to. Must be local or reachable — not an Anthropic / OpenAI URL |
Session spend tracker is not a setting — it’s always on for Anthropic requests when they return usage data. The $(credit-card) $0.12 status bar item shows up the moment a paid backend incurs cost. Click it for a per-model breakdown. Manage via:
SideCar: Show Session Spend— QuickPick with totals, request counts, and per-model token breakdownSideCar: Reset Session Spend— clear the tally (does not affect the Anthropic-side totals in their Console)
The price table is a hardcoded best-effort at list prices for Claude Opus 4.6/4.5, Sonnet 4.6/4.5, Haiku 4.5, and the 3.x fallbacks. Enterprise and committed-spend discounts are not reflected. Use the Anthropic Console for authoritative monthly totals.
Inline completions
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.enableInlineCompletions |
boolean | false |
Enable Copilot-like autocomplete |
sidecar.completionModel |
string | "" |
Model for completions (empty = use chat model) |
sidecar.completionMaxTokens |
number | 256 |
Max tokens per completion |
sidecar.completionDebounceMs |
number | 300 |
Minimum ms between completion requests |
Speculative decoding (v0.110+)
When enabled, a smaller draft model proposes tokens that the main model verifies in parallel — delivering main-model quality at draft-model latency.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.speculativeDecoding.enabled |
boolean | true |
Enable speculative FIM decoding. Auto-disabled if the backend doesn’t support a draft model |
sidecar.completionDraftModel |
string | "" |
Draft model (e.g. qwen2.5-coder:0.5b). Empty = auto-discover the smallest available model on the active backend |
sidecar.speculativeDecoding.lookahead |
number | 4 |
Draft tokens proposed per cycle. Higher = faster on cache hits, more wasted work on misses. Clamped 1–16 |
sidecar.speculativeDecoding.temperature |
number | 0.0 |
Draft model temperature (0 = greedy, fastest) |
sidecar.speculativeDecoding.minAcceptRateToKeepEnabled |
number | 0.4 |
If the rolling accept rate drops below this threshold, speculative decoding auto-disables for the session. Range 0–1 |
Kickstand Advanced Settings (v0.109+)
Settings specific to the Kickstand self-hosted backend. Ignored when using Ollama, Anthropic, or other providers.
RoPE / YaRN long-context scaling
Extend a model’s native context window by tuning its positional-encoding parameters at load time.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.kickstand.nCtx |
number | 32768 |
Context window size (n_ctx) passed to Kickstand when loading a model. Increase for longer conversations; decrease to reduce VRAM usage. Ignored when using the RoPE/YaRN yarnOrigCtx override. |
sidecar.kickstand.ropeFreqBase |
number | 0 |
RoPE base frequency override. 0 = model default. Example: 500000 for Llama 3.1 128K extension |
sidecar.kickstand.ropeFreqScale |
number | 0 |
RoPE frequency scaling factor. 0 = model default. Example: 0.5 for a generic 2× context extension |
sidecar.kickstand.yarnExtFactor |
number | -1 |
YaRN extrapolation factor. -1 leaves llama.cpp’s built-in YaRN default intact |
sidecar.kickstand.yarnOrigCtx |
number | 0 |
Original training context length for YaRN scaling. 0 = model default |
Example — Llama 3.1 with 128K context:
"sidecar.kickstand.ropeFreqBase": 500000
Flash Attention
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.kickstand.flashAttn |
boolean | false |
Enable Flash Attention. 2–4× speedup on long contexts with Metal (macOS) or CUDA. Silently ignored on CPU-only builds |
All Kickstand settings are preserved across Kickstand auto-restarts.
Adaptive Paste (v0.72+)
When you paste foreign content into a file, SideCar detects the content type and offers a lightbulb code action to transform it to fit the target language. Detection is heuristic (no LLM call until you confirm). Built-in transforms include JSON → TypeScript type, SQL → ORM query, curl → fetch(), CSS → Tailwind, Python → TypeScript, shell → child_process, .env → Zod schema.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.adaptivePaste.enabled |
boolean | true |
Enable Adaptive Paste. When disabled, no paste tracking or lightbulb actions are registered. |
sidecar.adaptivePaste.autoDetect |
boolean | true |
Automatically detect paste events via document change tracking. When false, only the explicit Transform Paste with SideCar command is available. |
sidecar.adaptivePaste.minPasteLength |
number | 50 |
Minimum character count for an insertion to be treated as a paste. Prevents the tracker from firing on short typed snippets. |
sidecar.adaptivePaste.model |
string | "" |
Model override for paste transformations. Empty = use the chat model. |
Next Edit Suggestions (v0.72+)
After you edit a symbol, SideCar walks the symbol graph to find callers and dependents that may also need updating. Candidates appear as ghost-text badge decorations (①②③) at the relevant lines; cross-file hits show in the status bar. Use Tab / Alt+↓ / Alt+↑ / Esc to accept, navigate, and dismiss.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.nextEdit.enabled |
boolean | false |
Enable Next Edit Suggestions. |
sidecar.nextEdit.model |
string | "" |
Model override for next-edit scoring. Empty = use the chat model. |
sidecar.nextEdit.debounceMs |
number | 600 |
Delay in milliseconds after a document change before the analyser runs. |
sidecar.nextEdit.crossFileEnabled |
boolean | true |
Include suggestions in files other than the one being edited. |
sidecar.nextEdit.maxHops |
number | 2 |
Symbol graph hops to walk. 1 = direct callers only; 2 = also files that import the changed file. |
sidecar.nextEdit.topK |
number | 3 |
Maximum suggestions to surface at once (1–9). |
sidecar.nextEdit.autoTriggerOnSave |
boolean | false |
Also run the analyser on file save, in addition to debounced keystroke triggers. |
Shell execution
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.shellTimeout |
number | 120 |
Default timeout for shell commands in seconds |
sidecar.shellMaxOutputMB |
number | 10 |
Maximum shell output size in MB before truncation |
sidecar.terminalExecution.enabled |
boolean | true |
Route run_command / run_tests through VS Code’s shell-integration API in a dedicated SideCar Agent terminal. Set to false to keep all agent commands on the hidden ShellSession path |
sidecar.terminalExecution.terminalName |
string | "SideCar Agent" |
Display name for the reusable agent terminal |
sidecar.terminalExecution.fallbackToChildProcess |
boolean | true |
When shell integration is unavailable (bare shell without the init script, older VS Code), fall back to the ShellSession / child_process path. Set false to fail loudly instead |
sidecar.terminalExecution.shellIntegrationTimeoutMs |
number | 2000 |
Milliseconds to wait for shell integration to attach to a freshly created terminal before falling back |
Since v0.59, agent shell commands (run_command, run_tests) render live in a reusable SideCar Agent terminal via VS Code’s shell-integration API rather than in a hidden subprocess. Benefits: transparency (you see exactly what the agent runs), SSH / Dev Container / WSL / Codespaces correctness (shell integration inherits VS Code’s remote shell session instead of escaping to the host), and proper exit-code capture. If shell integration isn’t available on your shell, the ShellSession fallback kicks in automatically — it’s a persistent shell session with environment variables, cwd, and aliases persisting between tool calls. Set a longer timeout for builds and installs. Use background: true to start long-running processes and check on them later with command_id.
Shadow Workspaces (v0.59+)
Optional sandbox for agent tasks. When enabled, the agent runs in an ephemeral git worktree at .sidecar/shadows/<task-id>/ off the current HEAD — writes never touch your main working tree until you accept the resulting diff.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.shadowWorkspace.mode |
enum | "off" |
off disabled; opt-in only wraps tasks that explicitly opt in; always wraps every agent task |
sidecar.shadowWorkspace.autoCleanup |
boolean | true |
Remove the shadow worktree + directory after every task. Set false to preserve rejected/failed shadows at .sidecar/shadows/<task-id>/ for post-mortem inspection |
sidecar.shadowWorkspace.sweepStaleOnActivation |
boolean | true |
On activation, remove shadow worktrees under .sidecar/shadows/ that have no corresponding agent session (e.g. from a crashed VS Code). Keeps the worktree list clean without requiring manual cleanup. |
sidecar.shadowWorkspace.gateCommand |
string | "npm run check" |
Shell command to run inside the shadow before the accept/reject prompt opens. Not yet wired in v0.59 — lands in v0.60. Override for non-JS projects (e.g. "cargo check && cargo test") |
At task completion, SideCar shows a showQuickPick with the diff summary (file count, line count) and an Accept / Reject choice. Accept applies the diff to main as staged changes (so you see them in git status). Reject discards the shadow and leaves your main tree untouched. The v0.59 MVP uses an accept-all / reject-all prompt; per-hunk review UI, conflict handling, symlinked build dirs, and /sandbox <task> slash command wiring land in v0.60+.
SIDECAR.md Path-Scoped Section Injection (v0.67+) + Retrieval Mode (v0.92+)
Pre-v0.67, the entire SIDECAR.md body landed in every agent turn’s system prompt and got mid-chopped on overflow. v0.67 replaces that with a deterministic, path-aware selector that routes sections by <!-- @paths: glob --> sentinels. v0.92 adds a third mode — retrieval — for large SIDECAR.md files where path-scoped routing is either unannotated or too coarse.
See SIDECAR.md for the sentinel schema.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.sidecarMd.mode |
enum | "sections" |
How SIDECAR.md content is injected. sections (default) — path-scoped routing by @paths sentinels + active file + mentioned paths. retrieval — only always-priority sections inject verbatim; all other sections are scored by semantic similarity at query time via the RRF fusion pipeline. Best for files with 20+ sections. full — legacy whole-file dump with mid-chop on overflow |
sidecar.sidecarMd.alwaysIncludeHeadings |
string[] | ["Build", "Conventions", "Setup"] |
H2 headings that always inject verbatim in every mode. Case-insensitive match |
sidecar.sidecarMd.lowPriorityHeadings |
string[] | ["Glossary", "FAQ", "Changelog"] |
H2 headings demoted to low priority in sections mode — included only when budget remains. In retrieval mode these are scored like any other section |
sidecar.sidecarMd.maxScopedSections |
number | 5 |
Cap on path-scoped sections per injection in sections mode. Clamped 1–50 |
sidecar.sidecarMd.retrieval.topK |
number | 5 |
Max SIDECAR.md sections surfaced per turn in retrieval mode. Clamped 1–20 |
sidecar.sidecarMd.retrieval.minScore |
number | 0.3 |
Cosine-similarity floor for retrieval mode. Sections below this threshold are never injected even if they rank in the top-K. Range 0–1 |
Retrieval mode detail: on first use (or after a content change), each section body is embedded with all-MiniLM-L6-v2 and persisted to .sidecar/cache/sidecarMd/. Subsequent turns only re-embed sections whose content changed. The SidecarMdRetriever joins the existing RRF fusion pipeline alongside DocRetriever, SemanticRetriever, etc. — so SIDECAR.md sections compete on the same relevance footing as project knowledge and documentation.
Fork & Parallel Solve (v0.67+)
Spawns N parallel approaches to the same task in isolated Shadow Workspaces, then picks the winner. See Slash Commands — Fork.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.fork.enabled |
boolean | true |
Master toggle for Fork. When false, /fork and the palette entry show a one-line info toast instead of dispatching |
sidecar.fork.defaultCount |
number | 3 |
Default number of parallel forks per dispatch. Clamped 2–10; values outside that range degenerate to “agent loop with no comparison” |
sidecar.fork.maxConcurrent |
number | 3 |
Max forks running in parallel at once. Clamped 1–10. Higher values finish faster at the cost of more concurrent Shadow Workspaces (disk churn) and more concurrent LLM requests (cost + rate limits) |
Every fork forces forceShadow: true, deferPrompt: true regardless of sidecar.shadowWorkspace.mode — the user’s main tree is untouched during the run and no mid-run quickpicks fire. The aggregated review runs once every fork settles.
Typed Sub-Agent Facets (v0.66+)
Dispatchable specialists — general-coder, test-author, security-reviewer, latex-writer, signal-processing, frontend, technical-writer, data-engineer, plus project + user overrides. See Agent Mode — Typed Sub-Agent Facets and Extending SideCar — Facets for the dispatch flow and schema.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.facets.enabled |
boolean | true |
Master toggle for the Facets feature. When false, the SideCar: Facets: Dispatch Specialists command surfaces a one-line info toast instead of the picker |
sidecar.facets.maxConcurrent |
number | 3 |
Maximum facets run in parallel within a topological layer. Clamped 1–16. Higher values accelerate wide batches at the cost of more concurrent Shadow Workspaces |
sidecar.facets.rpcTimeoutMs |
number | 30000 |
Milliseconds a facet’s rpc.<peerId>.<method> call waits before the bus resolves the call as { ok: false, errorKind: 'timeout' }. The bus never rejects — timeouts become typed outcomes the caller handles. Clamped 1000–300000 |
sidecar.facets.registry |
string[] | [] |
Absolute paths to individual facet markdown files loaded alongside built-ins and <workspace>/.sidecar/facets/*.md. Useful for personal or team-shared facets checked into a separate repo |
Built-in facets are embedded in the extension and always available — no disk I/O, no broken-unpack footgun. Disk facets with an id matching a built-in override the built-in; duplicate ids across disk sources surface as load errors without aborting the rest of the registry.
Skills Registry & Sync (v0.112+)
Git-native skill distribution. SideCar clones personal and team skill registries on activation; SkillLoader picks up every .agent.md inside as a loadable skill. Standard git auth (SSH keys, HTTPS tokens) applies.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.skills.userRegistry |
string | "" |
Git URL or absolute local folder for your personal skill collection. Cloned/pulled into ~/.sidecar/user-skills/ on activation. |
sidecar.skills.teamRegistries |
array | [] |
Git URLs for team skill collections, each cloned into ~/.sidecar/team-skills/<slug>/. Skills Picker tags each skill by origin registry. |
sidecar.skills.autoPull |
string | "on-start" |
When to sync registries. "on-start" refreshes on every activation; "manual" only when you run SideCar: Sync Skill Registries. |
sidecar.skills.offline |
boolean | false |
Air-gapped mode — no network calls for sync. The loader reads only from what is already cached. |
sidecar.skills.trustedRegistries |
array | [] |
Registry URLs that skip the first-install trust prompt. Per-skill allowed-tools and disable-model-invocation guardrails still apply. |
Auto Mode (v0.73+)
Runs the agent in a loop against a markdown backlog file, processing each unchecked item in order and marking it complete on success. Start with the SideCar: Start Auto Mode command; stop with SideCar: Stop Auto Mode. Failures are appended to .sidecar/logs/auto-mode-failures.md.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.autoMode.backlogPath |
string | ".sidecar/backlog.md" |
Path to the backlog file. Relative to workspace root. Each unchecked - [ ] task line is a task. |
sidecar.autoMode.maxTasksPerSession |
number | 10 |
Maximum backlog items to attempt in one session. |
sidecar.autoMode.maxRuntimeMinutes |
number | 240 |
Wall-clock time limit in minutes. The session stops when reached even if items remain. |
sidecar.autoMode.haltOnFailure |
boolean | false |
Stop after the first failed task. When false, the failure is logged and the next item runs. |
sidecar.autoMode.autoOpenPR |
boolean | true |
Automatically open a pull request after all tasks complete successfully. |
sidecar.autoMode.interTaskCooldownSeconds |
number | 30 |
Seconds to wait between tasks — provides a window to stop the session before the next task begins. |
Each task runs through runAgentLoopInSandbox with autonomous approval; shadow-workspace isolation applies when sidecar.shadowWorkspace.mode is not "off".
Debugging & reasoning
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.verboseMode |
boolean | true |
Show system prompt, iteration summaries, and tool selection context |
sidecar.expandThinking |
boolean | false |
Show model reasoning blocks expanded instead of collapsed |
Since v0.45.0, reasoning is rendered as a numbered timeline: each thinking block closes out when a tool call starts, producing discrete steps with purple pills (reasoning) or blue pills (tools) and a duration badge per step. Longer-running steps show elapsed time; sub-500ms steps hide the badge to reduce visual noise.
Chat UI
Three settings control chat UI density, font size, and accent color. All three update live — changing them in Settings takes effect immediately without a reload.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.chatDensity |
string | normal |
One of compact, normal, comfortable. Controls message padding and the gap between messages |
sidecar.chatFontSize |
number | 13 |
Chat UI base font size in pixels (10–22) |
sidecar.chatAccentColor |
string | "" |
Override the chat accent color (user message bubble and step indicator pills). Accepts hex (#ff6b6b), rgb() / rgba(), hsl() / hsla(), or a small allowlist of named colors. Leave empty to inherit from the active VS Code theme |
Accent color values pass through an allowlist CSS-color validator before being written to the DOM as a custom property, so settings strings can’t smuggle additional style declarations into the chat.
Terminal error interception
SideCar watches the integrated terminal for commands that exit with a non-zero status. When it detects a failure it shows a Diagnose in chat notification; accepting injects a synthesized prompt containing the command, exit code, working directory, and the ANSI-stripped tail of the output, then runs the agent against the failure.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.terminalErrorInterception |
boolean | true |
Enable automatic detection of failed terminal commands. Requires VS Code shell integration |
Requirements: VS Code 1.93+ with shell integration active. POSIX shells (bash, zsh, fish) and PowerShell are supported natively; other shells may need manual shell integration setup. When shell integration is unavailable the watcher silently no-ops — the setting itself is harmless.
Dedup: Identical command lines within a 30-second cooldown window fire only once, so a retry loop of npm test won’t spam notifications.
Ignored terminals: SideCar’s own SideCar terminal is always skipped to avoid feedback loops when the agent runs shell commands.
Semantic Search
SideCar uses ONNX embeddings for semantic file search — queries like “authentication logic” find src/auth/jwt.ts even without keyword matches in the file path or conversation history.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.enableSemanticSearch |
boolean | true |
Enable ONNX-based semantic file search. The embedding model (~23MB) downloads on first use |
sidecar.semanticSearchWeight |
number | 0.6 |
Blend ratio between semantic and heuristic scoring (0 = keyword only, 1 = embeddings only). Default 0.6 weights embeddings higher |
The embedding model (all-MiniLM-L6-v2, 384-dimensional, quantized) loads in the background after the workspace is indexed. Until it’s ready, SideCar falls back to keyword-based scoring. Embeddings are cached in .sidecar/cache/embeddings.bin and only recomputed when file content changes.
Web Search
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.webSearch.provider |
string | "duckduckgo" |
Provider for the web_search tool. "duckduckgo" — HTML scraping, no key required. "tavily" — purpose-built LLM search API. "brave" — privacy-focused independent index. Tavily and Brave require sidecar.webSearch.apiKey. |
sidecar.webSearch.apiKey |
string | "" |
API key for Tavily or Brave. Not used when provider is "duckduckgo". |
The web_search tool blocks queries containing credential-shaped tokens (AWS keys, GitHub tokens, JWTs) before they reach any provider, regardless of this setting.
Zen Mode (v0.96+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.zenMode.enabled |
boolean | false |
Only inject RAG hits scoring at or above zenMode.minScore. Reduces retrieval noise for local models on focused tasks. |
sidecar.zenMode.minScore |
number | 0.35 |
Minimum RRF score required for a context hit to be included when Zen Mode is active. |
Audit Mode settings (v0.60+)
These settings tune the Audit Mode buffer behaviour. See Agent Mode → Review mode for the full Audit Mode flow.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.audit.autoApproveReads |
boolean | true |
read_file and list_directory bypass the audit buffer — reads don’t mutate state. Set false to require explicit review of every read. |
sidecar.audit.bufferGitCommits |
boolean | true |
Buffer git_commit calls alongside file writes so a rejected flush leaves HEAD unchanged. Set false to let commits land immediately. |
Ollama Settings
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.ollama.disableThinking |
boolean | false |
Pass think: false with every Ollama request, disabling extended reasoning for models that support it (Qwen3, DeepSeek-R1). Reduces latency at the cost of reasoning depth. |
sidecar.ollama.numCtx |
number | null |
Override the context window size (num_ctx). null = use the model’s Modelfile default. Set to e.g. 32768 or 65536 to force a specific window. Ollama backend only. |
Retrieval & Project Knowledge (advanced)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.retrieval.queryRewrite |
string | "rule" |
Rewrite the user message before embedding for retrieval. "off" = passthrough; "rule" = strip preambles, expand camelCase (zero cost); "llm" = LLM-reformulated query; "expand" = rule + LLM combined. |
sidecar.retrieval.graphExpansion.enabled |
boolean | true |
After semantic retrieval, walk the symbol graph’s calls edges outward to surface dependency-coupled symbols. |
sidecar.retrieval.graphExpansion.maxHits |
number | 8 |
Cap on symbols added via graph walk per retrieval call. |
sidecar.projectKnowledge.enabled |
boolean | true |
Enable the Project Knowledge Index — semantic symbol search via tree-sitter + MiniLM embeddings. Disable to turn off background indexing entirely. |
sidecar.projectKnowledge.graphWalkDepth |
number | 2 |
Hops to walk the symbol graph after a vector hit. 1 = direct callers only; 2 = callers of callers. Higher values surface more context at the cost of more tokens. |
sidecar.projectKnowledge.maxGraphHits |
number | 10 |
Cap on symbols added via graph walk per project_knowledge_search call. Guards against popular symbols drowning results. |
sidecar.projectKnowledge.backend |
string | "flat" |
Vector storage backend. "flat" = in-memory Float32Array (fast up to ~100k symbols). "lance" = LanceDB for persistent out-of-memory storage (requires @lancedb/lancedb). |
sidecar.projectKnowledge.maxSymbolsPerFile |
number | 500 |
Safety cap on embedded symbols per file. Prevents auto-generated files from monopolising the embedder queue. |
sidecar.merkleIndex.enabled |
boolean | true |
Enable content-addressed Merkle tree over the symbol index. Prunes candidate files via embedding descent before scoring leaves — significant speedup on large codebases. |
Outbound Allowlist
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.outboundAllowlist |
array | [] |
Hostnames permitted for URL fetching in chat. Supports a leading *. wildcard (e.g. *.github.com). Empty = allow all public URLs (built-in SSRF and private-IP blocking still applies). |
Verbose Logs
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.verboseLogs |
boolean | false |
Append per-turn API call metadata (runId, model, inputTokens, outputTokens, stopReason, timestamp) to .sidecar/logs/api.jsonl for auditing and cost tracking. |
RAG & Agent Memory
SideCar uses Retrieval-Augmented Generation (RAG) to inject relevant documentation into the agent’s context, and persistent memory to track learned patterns across sessions.
RAG Configuration
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.enableDocumentationRAG |
boolean | true |
Enable documentation retrieval for every user message |
sidecar.ragMaxDocEntries |
number | 5 |
Maximum number of documentation entries to inject per message (1-20) |
sidecar.ragUpdateIntervalMinutes |
number | 60 |
Re-index documentation every N minutes (5-360). Set to 0 to disable auto-refresh |
Documentation is automatically discovered in:
- Project root:
README*,ARCHITECTURE*,DESIGN* - Directories:
docs/**,doc/**,wiki/** - All
.mdfiles in these locations are indexed and searchable
When a user sends a message, SideCar searches the indexed documentation for relevant sections using keyword matching. Matching entries are injected into the system prompt to improve accuracy.
Example: If you ask “how does authentication work?”, and there’s a docs/AUTHENTICATION.md with relevant content, it’s automatically included in the context.
Agent Memory Configuration
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.enableAgentMemory |
boolean | true |
Enable persistent agent memory across sessions |
sidecar.agentMemoryMaxEntries |
number | 500 |
Maximum number of memory entries to retain (10-500). Older entries are evicted when limit is reached |
Agent memory tracks:
- Patterns: Tools that work well for specific problem types
- Decisions: Coding conventions and architectural choices
- Conventions: Project-specific patterns and established practices
Memory is persisted to .sidecar/memory/agent-memories.json and automatically loaded when SideCar starts. Each memory entry includes:
- Timestamp of when it was learned
- Use count (incremented each time referenced)
- Category for organization
Example: After the agent successfully uses formatAuthorName() for a specific task, it’s remembered. When a similar task is encountered later, the memory is retrieved and injected, improving consistency.
Memory is also recorded during agent runs whenever:
- A tool is successfully executed (success pattern recorded)
- New coding conventions are applied
- Project decisions are made
Pinned Memory (v0.72+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.pinnedMemory.enabled |
boolean | true |
Enable pinned memory. Pinned entries are always injected into the system prompt with always-include semantics — they survive context compaction and are never mid-chopped. |
sidecar.pinnedMemory.maxPins |
number | 50 |
Maximum number of pinned entries. Higher-boost entries are injected first; entries beyond the cap are dropped from injection. |
sidecar.pinnedMemory.maxCharsPerPin |
number | 5000 |
Maximum characters per pinned entry. Entries exceeding this are truncated with a marker, not dropped. |
Entries are persisted to .sidecar/memory/ and keyed by SHA-256 of path + optional heading list, so re-pinning the same content updates in place. Pin and unpin via /memories in chat or the Pinned Memory sidebar.
PR Defaults (v0.99+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.pr.create.draftByDefault |
boolean | true |
Open new PRs as drafts so CI runs without notifying reviewers. |
sidecar.pr.create.baseBranch |
string | "auto" |
Base branch for new PRs. "auto" resolves the remote’s default branch via git, falling back to main. |
sidecar.pr.create.template |
string | "auto" |
PR template handling. "auto" reads .github/pull_request_template.md and fills each section; "ignore" writes a fresh Summary + Test Plan body regardless. Any other value is treated as a path to a custom template file. |
sidecar.pr.branchProtection.enabled |
boolean | true |
Check branch protection rules before git_push. If direct pushes are blocked, the push is aborted and the agent is told why. Requires a GitHub token with repo scope. |
sidecar.pr.branchProtection.warnEvenIfPassing |
boolean | false |
Include branch protection rule summary in git_push output even when direct pushes are allowed, so the agent is aware of required status checks before submitting the PR. |
CodeLens, DESIGN.md, and Mermaid
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.codeLens.enabled |
boolean | true |
Show SideCar code lenses above function/class declarations (Explain, Fix, Add tests, Refactor) and above TODO/FIXME comments (Fix) for TypeScript, JavaScript, Python, Go, and Rust files. |
sidecar.designMd.enabled |
boolean | true |
Read DESIGN.md (or .sidecar/DESIGN.md) and inject design tokens into agent context. The compact tokens block is always included; full prose rationale is added only when the active file is a UI file. |
sidecar.enableMermaid |
boolean | true |
Render fenced ` ```mermaid ` blocks as diagrams in the chat panel. Disable to skip the mermaid.js runtime load and render them as plain code. |
Extensibility
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.mcpServers |
object | {} |
MCP server connections (stdio, HTTP, SSE). See MCP Servers |
sidecar.hooks |
object | {} |
Pre/post tool execution hooks. See Hooks |
sidecar.eventHooks |
object | {} |
Event-based hooks (onSave, onCreate, onDelete) |
sidecar.scheduledTasks |
array | [] |
Recurring agent tasks. See Scheduled Tasks |
sidecar.customTools |
array | [] |
Custom shell command tools. See Custom Tools |
sidecar.customModes |
array | [] |
Custom agent modes. See Custom modes |
Custom tools example
"sidecar.customTools": [
{
"name": "deploy",
"description": "Deploy the application to staging",
"command": "npm run deploy:staging"
}
]
Custom tools appear alongside built-in tools and go through the same approval flow.
macOS Seatbelt Sandbox (v0.89+)
Wraps agent run_command and run_tests calls with /usr/bin/sandbox-exec on macOS. The deny-default SBPL profile allows reads everywhere, network-outbound, and writes only inside the workspace root, /tmp, and common build caches (~/.npm, ~/.cargo, ~/.gradle, ~/.m2). Automatically disabled on Linux and Windows where sandbox-exec is unavailable.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.sandbox.enabled |
boolean | true |
Enable the macOS Seatbelt sandbox for agent shell commands. Disable if a tool you rely on writes outside the allowed paths and you have verified it is safe |
External Context Providers (v0.89+)
Pull live issue-tracker context into every agent system prompt. At the start of each turn SideCar fetches the configured trackers, injects an ## Active Issues block, and caches results for 5 minutes. Errors (bad token, network failure) are non-fatal — a ⚠️ line appears in the block but the turn continues.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.contextProviders |
array | [] |
List of context provider configs. Each entry has type (github | linear | jira | bitbucket), filter, maxIssues, and provider-specific fields (owner/repo, apiKey, teamId, etc.) |
GitHub Issues example:
"sidecar.contextProviders": [
{
"type": "github",
"filter": "assigned",
"maxIssues": 5
}
]
The GitHub provider auto-detects owner/repo from git remote get-url origin. For Linear and Jira supply apiKey and optionally teamId / projectKey.
RAM/VRAM Monitor (v0.111+)
MemoryPressureMonitor polls free RAM every 30 seconds and GPU memory via nvidia-smi / rocm-smi. A right-side status bar item shows live RAM% and GPU% — colour-coded red when free RAM < 1 GiB, yellow when < 2 GiB. Click it to force a poll, or use the command palette:
SideCar: Refresh Memory Status(sidecar.memory.refresh) — force an immediate poll
Pre-flight checks run automatically before:
- Loading a model in Kickstand (
SideCar: Load Model) - Starting a HuggingFace safetensors install
- Opening an Arena session (
/arena,/arena agent)
At low pressure (< 2 GiB free): a warning dialog asks for confirmation before proceeding.
At critical pressure (< 1 GiB free): the operation is blocked with an error message.
After two consecutive pressure readings at the same level, a notification fires — then suppressed for 5 minutes to avoid spam. No settings are required; the monitor activates automatically at extension startup.
Model Arena (v0.90+)
Side-by-side streaming comparison of 2–4 models on the same prompt, with a local ELO leaderboard. See Slash Commands — Model Arena for the full flow.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.arena.enabled |
boolean | true |
Master toggle for Model Arena. When false, /arena and the palette entries show a one-line info toast |
sidecar.arena.defaultModels |
string[] | [] |
Pre-populated model list — when non-empty, the QuickPick is skipped and these models are used directly. Example: ["llama3.2:3b", "qwen3:8b"] |
ELO ratings are persisted to .sidecar/arena/elo.json (K=32, multi-way pairwise) and accumulate across both chat and agent arena runs.
Monorepo Support (v0.97+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.monorepo.enabled |
boolean | true |
Enable monorepo package discovery. Auto-detects Nx, Turborepo, pnpm workspaces, Yarn workspaces, and Lerna. When detected, the monorepo_packages agent tool lists workspace packages with metadata (name, version, path, scripts, dependencies). |
Database Integration (v0.76+)
Configure database connections for the db_query, db_execute, db_migrate_up, db_list_tables, db_describe_table, and db_list_connections agent tools.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.databases.profiles |
array | [] |
List of named database connection profiles. Each entry has name (identifier shown to the agent), type ("sqlite" / "postgres" / "mysql" / "duckdb"), and connection-specific fields (path for SQLite/DuckDB; host, port, database, user, password for Postgres/MySQL). |
sidecar.databases.queryRowLimit |
number | 10000 |
Maximum rows returned by db_query. Results beyond this limit are truncated with a count of omitted rows. |
sidecar.databases.queryTimeoutMs |
number | 30000 |
Hard timeout in milliseconds for every db_query call. Prevents runaway queries from blocking the agent. |
Example profile (SQLite):
"sidecar.databases.profiles": [
{ "name": "local", "type": "sqlite", "path": "./data/app.db" }
]
Store passwords using environment variables ("password": "${DB_PASS}") rather than plaintext in settings.json.
Dependency Drift Alerts (v0.91+)
Scans package.json, requirements*.txt, Cargo.toml, and go.mod for outdated dependencies and known vulnerabilities. Findings appear in the VS Code Problems panel (source: sidecar-deps) — Information for outdated, Warning for medium/high vulnerabilities, Error for critical. File watchers trigger a debounced (2 s) re-scan on manifest save. See Security Scanning — Dependency Drift for details.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.deps.enabled |
boolean | true |
Enable Dependency Drift Alerts, the file watchers, and the check_dependencies agent tool |
sidecar.deps.checkVulnerabilities |
boolean | true |
Query the OSV API for CVE/GHSA matches. Disable in offline or air-gapped environments |
Force an immediate workspace-wide scan with SideCar: Scan Dependencies for Drift & Vulnerabilities from the Command Palette, or call the check_dependencies agent tool directly.
Code Profiling (v0.93+)
The profile_code agent tool auto-detects the project ecosystem and runs the appropriate profiler, returning the top-N CPU hotspots as ranked markdown. Disabled by default to avoid unexpected shell executions.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.profiling.enabled |
boolean | false |
Enable the profile_code agent tool |
sidecar.profiling.topN |
number | 10 |
Default number of hotspots to return (1–50). Override per-call with top_n |
Ecosystem detection (first match wins): package.json → Node.js, requirements.txt/pyproject.toml/setup.py → Python, Cargo.toml → Rust, go.mod → Go. Override with ecosystem="node|python|go|rust".
Node.js and Python require a script parameter pointing to the entry file (e.g. profile_code(ecosystem="python", script="src/main.py")). Go and Rust use their built-in bench runners and need no script.
Visual Verification (v0.77+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.visualVerify.enabled |
boolean | false |
Enable the visual verification tool suite: screenshot_page, analyze_screenshot, open_in_browser, run_playwright_code. Requires a vision-capable model. |
sidecar.visualVerify.mode |
string | "warn" |
How the agent treats visual verification failures. "strict" — blocking error; "warn" — surface but continue; "advisory" — informational only. |
sidecar.visualVerify.vlm |
string | "" |
Vision model for analyze_screenshot. Empty = auto-detect from the active backend (Claude 3+, GPT-4o, Ollama vision models). |
sidecar.visualVerify.maxAttempts |
number | 3 |
Suggested maximum visual-correction attempts. Injected into the system prompt as guidance. |
sidecar.visualVerify.screenshotsDir |
string | ".sidecar/screenshots" |
Directory where screenshot_page saves captured PNGs. Relative to workspace root. |
sidecar.visualVerify.allowedDomains |
array | [] |
Domains permitted for screenshot_page even when they resolve to loopback or private-network addresses (e.g. localhost). |
sidecar.visualVerify.cheapChecksOnly |
boolean | false |
Run only heuristic pre-filter checks (blank canvas, edge clipping) and skip the VLM call. Useful on tight local-inference budgets. |
analyze_screenshot always runs a fast heuristic pre-filter before calling the VLM. run_playwright_code always requires user approval regardless of agent mode.
Voice Input (v0.98+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.voice.enabled |
boolean | false |
Show the microphone button in the chat input. Click to start recording; click again to stop. Transcribed text is injected into the chat box ready to send or edit. |
sidecar.voice.model |
string | "Xenova/whisper-tiny" |
Whisper model for speech-to-text. HuggingFace hub IDs (containing /) run in-process via ONNX — no API key needed. Plain names like whisper-1 route to the HTTP transcription API. |
sidecar.voice.transcriptionUrl |
string | "" |
Override URL for the Whisper transcription endpoint. Leave empty to derive from the active backend’s base URL. |
Audio is captured directly in the VS Code extension host. Platform paths: Swift/AVFoundation on macOS, arecord on Linux, PowerShell + WinMM on Windows. Local models are lazy-loaded and cached for the extension host lifetime.
LaTeX Agentic Debugging (v0.94+)
The latex_compile agent tool compiles a .tex document and returns structured errors and warnings with file and line references. Disabled by default.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.latex.enabled |
boolean | false |
Enable the latex_compile agent tool |
sidecar.latex.compiler |
string | "latexmk" |
Compiler to use: "latexmk" (handles multi-pass automatically) or "pdflatex" |
The tool auto-detects the main .tex file in the workspace root; pass file="path/to/main.tex" to target a specific document. latexmk is probed at each call and falls back to pdflatex if not installed.
Doc-to-Test Synthesis (v0.79+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.docTests.enabled |
boolean | true |
Enable the extract_constraints, synthesize_tests, and classify_test_failure agent tools. |
sidecar.docTests.extractionModel |
string | "" |
Model override for constraint extraction. Empty = use the active model. |
sidecar.docTests.floatTolerance |
number | 1e-9 |
Default relative tolerance passed to pytest.approx() for numeric example constraints. |
sidecar.docTests.outputDir |
string | "tests/from_docs" |
Directory where synthesized test files are written, relative to workspace root. |
sidecar.docTests.requireConstraintApproval |
boolean | true |
Present the constraint manifest for review before calling synthesize_tests. When false, tests are synthesized immediately after extraction. |
sidecar.docTests.testFramework |
string | "pytest" |
Test framework to target when synthesizing tests. |
The synthesis loop: extract_constraints parses docs into a typed constraint manifest → synthesize_tests generates a complete test file from approved constraints → classify_test_failure triages failures back to impl_wrong, doc_wrong, or extraction_wrong.
CI Failure Analysis (v0.99+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.ci.analysis.enabled |
boolean | true |
Enable the analyze_ci_failure agent tool and SideCar: Analyze CI Failure command palette entry. |
sidecar.ci.analysis.jobFilter |
array | ["*"] |
Glob patterns matched against CI job names. ["*"] = all failed jobs. Narrow to e.g. ["test", "lint"] to skip unrelated jobs. |
sidecar.ci.analysis.maxLogBytes |
number | 4000000 |
Maximum bytes to download per CI job log. Logs larger than this are tailed. |
Requires a GitHub token with actions:read scope configured via SideCar: Set GitHub Token.
Persistent Executive Function (v0.94+)
When enabled, the agent checkpoints its task state to .sidecar/plans/active.json after each iteration. If VS Code closes mid-run, the next activation prompts you to resume or discard the interrupted task.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.executiveFunction.enabled |
boolean | true |
Checkpoint agent task state after each iteration so runs can resume after a VS Code restart or crash. Disable to suppress the resume prompt on startup |
Checkpoints older than 24 hours are automatically discarded on the next activation.
Agentic Task Delegation via MCP (v0.95+)
Two-direction MCP delegation: the SideCar agent can sub-delegate tasks to external MCP servers (delegate_to_mcp tool), and SideCar can expose its own agent loop as a local MCP server for other tools to call.
delegate_to_mcp — agent → MCP server
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.mcpDelegation.enabled |
boolean | false |
Enable the delegate_to_mcp tool. When false the tool is not registered and does not appear in the model’s tool list |
sidecar.mcpDelegation.allowedServers |
string[] | [] |
Allowlist of MCP server names the tool may target. Empty array = all configured servers are allowed |
When enabled, the agent can call delegate_to_mcp(server="my-server", task="...") to offload a sub-task. SideCar auto-detects the entry-point tool from the server’s catalog (run_task, execute_task, task, run, execute, process, handle). Use sidecar.mcpDelegation.allowedServers to restrict which servers the agent may reach.
SideCar as MCP server — inbound calls
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.mcpServer.enabled |
boolean | false |
Expose SideCar’s agent loop as a local MCP server on 127.0.0.1 |
sidecar.mcpServer.port |
number | 3457 |
Listening port (1024–65535) |
sidecar.mcpServer.requireAuth |
boolean | false |
Require a bearer token on inbound requests |
sidecar.mcpServer.authToken |
string | "" |
Bearer token clients must supply when requireAuth is true |
sidecar.mcpServer.maxConcurrent |
number | 1 |
Maximum concurrent agent tasks from inbound calls |
Exposes one tool: run_agent_task(task, maxIterations?, approvalMode?). Other tools (Claude Code, VS Code extensions, CI scripts) can call SideCar’s agent loop via HTTP. The server binds to 127.0.0.1 only — never exposed to the network.
Notebook Mode (v0.82+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.notebookMode.enabled |
boolean | false |
Enable the source-grounded research tool suite: ingest_source, generate_briefing, generate_study_guide, generate_faq, generate_timeline, generate_outline. Each artifact carries per-sentence citations back to the ingested source. |
sidecar.notebookMode.requireCitations |
boolean | true |
Instruct the agent to re-generate any section that contains uncited claims. |
sidecar.notebookMode.studyAids.enabled |
boolean | true |
Enable generate_study_guide and generate_faq. Disable to keep only the core ingest, briefing, timeline, and outline pipeline. |
Zotero Integration (v0.75+)
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.zotero.userId |
string | "" |
Your Zotero user ID (found at zotero.org/settings/keys). Required for zotero_search and zotero_get_item. |
sidecar.zotero.apiKey |
string | "" |
Your Zotero API key with read access. Required for zotero_search and zotero_get_item. |
sidecar.zotero.baseUrl |
string | "https://api.zotero.org" |
Zotero API base URL. Override for self-hosted Zotero instances. |
sidecar.literature.enabled |
boolean | false |
Include indexed PDF literature from .sidecar/literature/ in retrieval context. Use index_pdf to add papers first. |
Research Assistant (v0.104+)
Structured project tracking for scientific or engineering research workflows. Projects are stored in .sidecar/research/ and tracked in git. Eight agent tools plus a sidebar panel and /research slash command.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.research.enabled |
boolean | false |
Enable the Research Assistant and register the 8 research agent tools |
sidecar.research.activeProject |
string | "" |
Name of the currently active project. Set automatically by research_create_project or the /research slash command |
When enabled: research_create_project, research_add_hypothesis, research_log_experiment, research_add_observation, research_update_hypothesis_status, research_set_project_status, research_list_projects, and research_export_report are available to the agent. The Research sidebar panel provides a live tree view of all projects.
Completion gates — analysis (v0.115+)
Domain-specific completion gates that block finishing a turn when the agent edited code of a given class without the corresponding verification. Complements the general sidecar.completionGate.* settings above. All default off.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.codeGraph.impactGate |
boolean | false |
Block completion when the agent edits an exported symbol that has unverified cross-file dependents (uses the symbol graph’s import-resolved impact set). |
sidecar.numericalContracts.gate |
boolean | false |
Block completion when the agent edits a numerical kernel (array/tensor/quantity-typed params or returns) whose shape/dtype/unit contract is unstated. |
sidecar.analyticBounds.gate |
boolean | false |
Block completion when the agent edits a kernel that declares an analytic value bound (e.g. # bounds: 0 <= result <= 1) without a check proving it holds. |
Mutation Testing (v0.115+)
Verify-the-verifier tooling: seeds single-point faults into a source file and reports which mutants survive the test suite (surviving mutants = gaps in the tests).
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.mutation.enabled |
boolean | false |
Enable the mutation_test agent tool. |
sidecar.mutation.maxMutants |
number | 25 |
Cap on mutants generated + tested per run (the test command runs once per mutant, so this bounds runtime). |
sidecar.mutation.testTimeoutMs |
number | 60000 |
Per-mutant test-run timeout (ms). A mutant whose run times out is counted as errored, not killed. |
Scaffolding (keep-best & adaptive)
Loop-safety scaffolding tuning. See also the scaffolding roadmap in docs/.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.adaptiveScaffolding.enabled |
boolean | false |
Tune loop-safety scaffolding to the active model’s capability tier — strong models relax (fewer reprompts, looser burst cap), weaker models tighten. |
sidecar.scaffolding.keepBest |
boolean | true |
Pareto-safe keep-best ratchet: snapshot files when scaffolding first drives extra work and revert if the extra work proved no test signal. |
sidecar.scaffolding.keepBestOverEngineerBytes |
number | 0 |
Byte growth past which a scaffold-driven patch that improved no test signal is reverted as over-engineered. 0 = any unproven growth reverts. |
sidecar.scaffolding.cycleDetectionMinRepeats |
number | 10 |
Repeats of the same tool + file (content-aware) before the loop bails as a stuck cycle. Higher gives weak models more self-correction attempts. |
AWS Bedrock
Endpoint selection for the Bedrock backend. Auth is the AWS credential chain (see the Connection section), not an API key.
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.bedrock.region |
string | "us-east-1" |
AWS region for the Bedrock Runtime endpoint (bedrock-runtime.<region>.amazonaws.com). |
sidecar.bedrock.fips |
boolean | false |
Use the Bedrock FIPS endpoint (bedrock-runtime-fips.<region>.amazonaws.com) instead of the standard host. |
Other feature flags
| Setting | Type | Default | Description |
|---|---|---|---|
sidecar.injectionGuard.enabled |
boolean | true |
Prompt-injection guard: scan tool output (files, web search, fetched URLs, shell/CI logs, tickets) for injection attempts and warn. |
sidecar.agentSeed |
number/null | null |
Fixed RNG seed for reproducible generation (benchmarks / ablation). null leaves generation unseeded. |
sidecar.evalHistory.enabled |
boolean | false |
Enable the query_history agent tool (read-only SELECT over the local eval-history DB in .sidecar/history/). |
sidecar.notebookMode.sources.webUrl |
boolean | true |
Allow Notebook Mode to ingest sources from web URLs via ingest_source. |
sidecar.whatsNew.enabled |
boolean | true |
Show a one-time release-notes notification after SideCar updates. The SideCar: What's New command works regardless of this flag. |