0781b7c203
`run_interactive` now calls `session_manager::prune_workspace_snapshots_at_boot` right after the system-skills installer, dropping any snapshot in the side-git repo older than 7 days (default; configurable via the new `[snapshots]` section in `config.example.toml`). The helper is non-fatal: a missing `git` binary, read-only home, or absent snapshot dir all log a single WARN (or DEBUG for the count of pruned commits) and return, so the TUI keeps starting even when retention can't run. Also document the snapshot subsystem in `config.example.toml` — disk-footprint expectations, where the side repo lives, and how `/restore` / `revert_turn` consume it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
256 lines
17 KiB
TOML
256 lines
17 KiB
TOML
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||
# ║ DeepSeek TUI Configuration ║
|
||
# ║ ║
|
||
# ║ Unofficial CLI for DeepSeek Platform - Not affiliated with DeepSeek Inc. ║
|
||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
# See `docs/CONFIGURATION.md` for how config is loaded (profiles, env overrides, etc.).
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Active provider + DeepSeek defaults
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Choose which provider to use by default. Per-provider credentials live in the
|
||
# `[providers.deepseek]` and `[providers.nvidia_nim]` sections near the bottom of
|
||
# this file — keeping both stored at once means `/provider deepseek` and
|
||
# `/provider nvidia-nim` (or `--provider nvidia-nim`) toggle without having to
|
||
# re-enter keys. Top-level `api_key` / `base_url` are still read as DeepSeek
|
||
# defaults when `[providers.deepseek]` is absent (backward compatibility).
|
||
provider = "deepseek" # deepseek | nvidia-nim
|
||
api_key = "YOUR_DEEPSEEK_API_KEY" # must be non-empty
|
||
base_url = "https://api.deepseek.com"
|
||
# base_url = "https://api.deepseeki.com" # China users
|
||
# base_url = "https://api.deepseek.com/beta" # DeepSeek beta features such as strict tool mode
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Default Models
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# DeepSeek V4 family:
|
||
# deepseek-v4-pro — flagship reasoning model on DeepSeek Platform
|
||
# deepseek-v4-flash — fast, cost-efficient (legacy aliases: deepseek-chat, deepseek-reasoner)
|
||
# deepseek-ai/deepseek-v4-pro — NVIDIA NIM-hosted Pro model ID
|
||
# deepseek-ai/deepseek-v4-flash — NVIDIA NIM-hosted Flash model ID
|
||
default_text_model = "deepseek-v4-pro"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Thinking Mode (DeepSeek V4 reasoning effort)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# "off" — disables chain-of-thought (thinking.type = disabled)
|
||
# "low" — compat-maps to "high" server-side
|
||
# "medium" — compat-maps to "high" server-side
|
||
# "high" — reasoning_effort = high (DeepSeek default)
|
||
# "max" — reasoning_effort = max (deepest reasoning)
|
||
#
|
||
# Shift+Tab in the TUI cycles between off / high / max. The header shows the
|
||
# current tier as a ⚡ chip.
|
||
reasoning_effort = "max"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Paths
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
skills_dir = "~/.deepseek/skills"
|
||
mcp_config_path = "~/.deepseek/mcp.json"
|
||
notes_path = "~/.deepseek/notes.txt"
|
||
|
||
memory_path = "~/.deepseek/memory.md"
|
||
|
||
# Parsed but currently unused (reserved for future versions):
|
||
# tools_file = "./tools.json"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Security
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
allow_shell = true
|
||
approval_policy = "on-request" # on-request | untrusted | never
|
||
sandbox_mode = "workspace-write" # read-only | workspace-write | danger-full-access | external-sandbox
|
||
|
||
# auto_allow entries match by command prefix, not raw string.
|
||
# See command_safety.rs for the prefix dictionary.
|
||
#
|
||
# Examples:
|
||
# auto_allow = ["git status"] # auto-approves: git status, git status -s, git status --porcelain
|
||
# # does NOT auto-approve: git push, git checkout
|
||
# auto_allow = ["cargo check", "npm run"]
|
||
#
|
||
# auto_allow = []
|
||
max_subagents = 5 # optional (1-20)
|
||
|
||
# Optional managed policy paths (defaults to /etc/deepseek/*.toml on unix):
|
||
# managed_config_path = "/etc/deepseek/managed_config.toml"
|
||
# requirements_path = "/etc/deepseek/requirements.toml"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Per-provider credentials (peer providers — NIM is first-class, not a flag)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Both providers can be stored at once; `provider = "..."` (top of file) or
|
||
# `/provider deepseek` / `/provider nvidia-nim` switches between them without
|
||
# having to re-enter keys. Env vars override anything set here:
|
||
# DeepSeek: DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_MODEL
|
||
# NIM: NVIDIA_API_KEY (or NVIDIA_NIM_API_KEY), NIM_BASE_URL
|
||
# (or NVIDIA_NIM_BASE_URL / NVIDIA_BASE_URL), NVIDIA_NIM_MODEL
|
||
|
||
# DeepSeek Platform (https://platform.deepseek.com)
|
||
[providers.deepseek]
|
||
# api_key = "YOUR_DEEPSEEK_API_KEY"
|
||
# base_url = "https://api.deepseek.com"
|
||
# model = "deepseek-v4-pro"
|
||
|
||
# NVIDIA NIM-hosted DeepSeek V4 (https://build.nvidia.com)
|
||
[providers.nvidia_nim]
|
||
# api_key = "YOUR_NVIDIA_API_KEY"
|
||
# base_url = "https://integrate.api.nvidia.com/v1"
|
||
# model = "deepseek-ai/deepseek-v4-pro" # or deepseek-ai/deepseek-v4-flash
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Network Policy (#135)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Per-domain allow/deny rules for outbound network calls made by the TUI's
|
||
# tools (`fetch_url`, `web_search`) and the MCP HTTP transport. Stdio MCP
|
||
# servers and direct LLM API calls are unaffected.
|
||
#
|
||
# Precedence: deny wins. A host listed in both `allow` and `deny` is denied.
|
||
#
|
||
# Host-matching rules:
|
||
# - Exact match: `api.deepseek.com` matches only `api.deepseek.com`.
|
||
# - Subdomain wildcard: an entry starting with `.` (e.g. `.example.com`)
|
||
# matches `api.example.com` and `a.b.example.com` but not the apex
|
||
# `example.com`. To cover both, list both. `*.example.com` is also accepted.
|
||
#
|
||
# Defaults are intentionally conservative: when this section is absent, no
|
||
# policy is enforced (mirrors pre-v0.7.0 behavior). To opt in:
|
||
#
|
||
# [network]
|
||
# default = "prompt" # allow | deny | prompt
|
||
# allow = ["api.deepseek.com", "github.com", ".githubusercontent.com"]
|
||
# deny = []
|
||
# audit = true # one line per call to ~/.deepseek/audit.log
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# TUI
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
[tui]
|
||
alternate_screen = "auto" # auto | always | never
|
||
mouse_capture = true # true keeps wheel scrolling inside the TUI; false allows terminal-native drag selection/copy
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Feature Flags
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
[features]
|
||
shell_tool = true
|
||
subagents = true
|
||
web_search = true # enables canonical web.run plus the compatibility web_search alias
|
||
apply_patch = true
|
||
mcp = true
|
||
exec_policy = true
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Retry Configuration
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
[retry]
|
||
enabled = true
|
||
max_retries = 3
|
||
initial_delay = 1.0
|
||
max_delay = 60.0
|
||
exponential_base = 2.0
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Context Compaction
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Auto-compaction is a saved UI setting edited with `/config` (`auto_compact`).
|
||
# There is no config-file `[compaction]` table yet; detailed thresholds are
|
||
# chosen by the TUI from the active model/context budget.
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Capacity Controller (runtime pressure guardrails)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
[capacity]
|
||
enabled = true
|
||
low_risk_max = 0.34
|
||
medium_risk_max = 0.62
|
||
severe_min_slack = -0.25
|
||
severe_violation_ratio = 0.40
|
||
refresh_cooldown_turns = 2
|
||
replan_cooldown_turns = 5
|
||
max_replay_per_turn = 1
|
||
min_turns_before_guardrail = 2
|
||
profile_window = 8
|
||
deepseek_v3_2_chat_prior = 3.9
|
||
deepseek_v3_2_reasoner_prior = 4.1
|
||
fallback_default_prior = 3.8
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Profile Example (for multiple environments)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Select a profile with `deepseek --profile <name>` or `DEEPSEEK_PROFILE=<name>`.
|
||
[profiles.work]
|
||
api_key = "WORK_DEEPSEEK_API_KEY"
|
||
base_url = "https://api.deepseek.com"
|
||
|
||
[profiles.dev]
|
||
api_key = "DEV_DEEPSEEK_API_KEY"
|
||
allow_shell = true
|
||
|
||
[profiles.nvidia-nim]
|
||
provider = "nvidia-nim"
|
||
api_key = "YOUR_NVIDIA_API_KEY"
|
||
base_url = "https://integrate.api.nvidia.com/v1"
|
||
default_text_model = "deepseek-ai/deepseek-v4-pro"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Desktop Notifications (OSC 9 / BEL on long agent-turn completion)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Emits an escape sequence to the terminal when a turn finishes and took longer
|
||
# than `threshold_secs`. Useful when you tab away from the TUI and want an alert.
|
||
#
|
||
# method = "auto" # auto | osc9 | bel | off
|
||
# auto: OSC 9 for iTerm.app / Ghostty / WezTerm, BEL otherwise.
|
||
# osc9: \x1b]9;<msg>\x07 (iTerm2-style; shows macOS notification)
|
||
# bel: plain \x07 beep
|
||
# off: disable entirely
|
||
# threshold_secs = 30 # only notify when the turn took >= this many seconds
|
||
# include_summary = false # include elapsed time + cost in the notification body
|
||
[notifications]
|
||
# method = "auto"
|
||
# threshold_secs = 30
|
||
# include_summary = false
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Workspace Snapshots (#137)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Each turn the TUI takes a `pre-turn:<seq>` and `post-turn:<seq>` snapshot of
|
||
# your workspace into a side-git repo at:
|
||
#
|
||
# ~/.deepseek/snapshots/<project_hash>/<worktree_hash>/.git
|
||
#
|
||
# Your own `.git` is never touched — `--git-dir` and `--work-tree` are always
|
||
# set together when shelling out to git. Use `/restore N` (slash command) or
|
||
# the `revert_turn` tool to roll the working tree back. Conversation history
|
||
# is unaffected.
|
||
#
|
||
# Disk footprint: ~1-2 GB worst case for a 100 MB workspace × 12 turns/day,
|
||
# typically far less thanks to git's content-addressed storage. The session
|
||
# boot prunes anything older than `max_age_days` (default 7).
|
||
#
|
||
# [snapshots]
|
||
# enabled = true # Snapshot workspace pre/post each turn for /restore
|
||
# max_age_days = 7 # Older snapshots pruned at session start
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Hooks (optional)
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Hooks run shell commands on lifecycle events (session start/end, tool calls, etc.).
|
||
# Configure as `[[hooks.hooks]]` under a `[hooks]` table.
|
||
#
|
||
# [hooks]
|
||
# enabled = true
|
||
# default_timeout_secs = 30
|
||
#
|
||
# [[hooks.hooks]]
|
||
# event = "session_start"
|
||
# command = "echo 'DeepSeek TUI session started'"
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# Requirements (admin constraints) example file
|
||
# ─────────────────────────────────────────────────────────────────────────────────
|
||
# allowed_approval_policies = ["on-request", "untrusted", "never"]
|
||
# allowed_sandbox_modes = ["read-only", "workspace-write"]
|