Ctrl K
ComunidadGuías…

docs/features.toml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Codewhale feature registry: the one hand-edited list of user features.
#
# A new command, `[features]` flag, provider or user-visible feature lands
# with its row here in the same change. `crates/tui/tests/feature_registry.rs`
# checks this file against the code and fails on drift:
#
#   cargo test -p codewhale-tui --test feature_registry
#
# Fields
#   id        stable kebab-case id; never reused
#   name      display name
#   summary   one line, at most 120 characters
#   status    stable | experimental | flagged | planned
#               stable       shipped and on by default, no experimental label
#               experimental shipped, labelled experimental or preview
#               flagged      shipped but off until the user turns it on
#               planned      not built; no `since` or `flag`
#   surfaces  per-surface status: tui (the terminal binary and its CLI), web
#             (the local browser client), api (Runtime API `/v1/*`); values
#             are stable | preview | partial | none | planned. A missing key
#             means "not recorded yet", not "absent".
#   since     first release that shipped it ("unreleased" before a release).
#             Optional until backfilled; when set it must be a CHANGELOG
#             heading.
#   flag      a `[features]` key from `crates/runtime/src/features.rs`. Each key
#             is owned by exactly one row, and the row's status follows the
#             flag: off by default -> flagged; on and Stable -> stable; on and
#             Experimental/Beta -> experimental.
#   docs      user doc path (optional `#anchor`); must exist. Missing means
#             the feature has no user doc yet, which is itself a gap to close.
#   owner     code path that owns the behavior; must exist.
#
# Desktop (GPUI app) rows and surfaces are not recorded here yet: that
# repository is private, so its unreleased features stay out of this public
# file until that is decided.

# --- Flag-backed tools (crates/runtime/src/features.rs) ---

[[feature]]
id = "undo-range"
name = "Request range undo"
summary = "/undo select rewinds a chosen request and its file changes; Runtime clients can preview and confirm an exact turn range."
status = "experimental"
surfaces = { tui = "preview" }
since = "unreleased"
docs = "docs/GUIDE.md"
owner = "crates/tui/src/tui/ui/apply.rs"

[[feature]]
id = "unix-uninstall"
name = "Receipt-owned uninstall"
summary = "Remove a receipt-owned release install or print its package manager's command; data kept unless --purge-data."
status = "experimental"
surfaces = { tui = "preview" }
since = "unreleased"
docs = "docs/INSTALL.md"
owner = "crates/cli/src/update/uninstall.rs"

[[feature]]
id = "install-cleanup"
name = "Installation cleanup"
summary = "doctor --all expands diagnostics; --installs lists owners, --fix recovers old copies and --restore reverses it."
status = "stable"
surfaces = { tui = "stable" }
since = "unreleased"
docs = "docs/INSTALL.md#clean-up-old-copies"
owner = "crates/release/src/installs.rs"

[[feature]]
id = "auto-update"
name = "Automatic updates"
summary = "Release-binary installs download updates in the background and apply them at the next start; update --rollback undoes."
status = "stable"
surfaces = { tui = "stable" }
since = "unreleased"
docs = "docs/INSTALL.md#automatic-updates"
owner = "crates/release/src/autoupdate.rs"

[[feature]]
id = "cloud-computer-dispatch"
name = "Cloud computer conversations"
summary = "Dispatch, inspect, continue and stop one account cloud conversation from terminal and desktop, saved whales included."
status = "experimental"
surfaces = { tui = "preview" }
since = "unreleased"
docs = "docs/CLOUD_DISPATCH.md"
owner = "crates/account-cli/src/computer.rs"

[[feature]]
id = "shell-tool"
name = "Shell tool"
summary = "Runs shell commands for the agent through the approval gate and sandbox."
status = "stable"
surfaces = { tui = "stable" }
since = "0.1.0"
flag = "shell_tool"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/shell.rs"

[[feature]]
id = "local-code-execution"
name = "Local code execution"
summary = "Runs Python and Node with the shared execution policy and explicitly approved per-call elevation."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/TOOL_SURFACE.md#local-code-execution"
owner = "crates/engine/src/core/engine/tool_catalog.rs"

[[feature]]
id = "subagents"
name = "Sub-agents"
summary = "Delegates bounded work to background child agents with their own budgets."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
since = "0.1.0"
flag = "subagents"
docs = "docs/SUBAGENTS.md"
owner = "crates/engine/src/tools/subagent"

[[feature]]
id = "web-search"
name = "Web search"
summary = "Searches and fetches the web for the agent, including DeepSeek Search (web.run, with the web_search alias)."
status = "stable"
surfaces = { tui = "stable" }
since = "0.1.0"
flag = "web_search"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/web_search.rs"

[[feature]]
id = "apply-patch"
name = "apply_patch"
summary = "Edits files with structured patches the user can review and undo."
status = "stable"
surfaces = { tui = "stable" }
since = "0.1.0"
flag = "apply_patch"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/apply_patch.rs"

[[feature]]
id = "mcp-client"
name = "MCP client"
summary = "Connects MCP servers, exposes permitted tools and records connection status for the model."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
since = "0.1.0"
flag = "mcp"
docs = "docs/MCP.md"
owner = "crates/mcp"

[[feature]]
id = "mcp-tool-approval"
name = "MCP tool approval rules"
summary = "Global per-tool Always, Ask and Off rules stay bound to the current server and preserve required consent."
status = "experimental"
surfaces = { tui = "partial", api = "preview" }
since = "unreleased"
docs = "docs/MCP.md"
owner = "crates/engine/src/core/engine/tool_preparation.rs"

[[feature]]
id = "exec-policy"
name = "Execution policy"
summary = "Decides allow, ask or deny for each tool call from layered permission rules."
status = "stable"
surfaces = { tui = "stable" }
since = "0.1.0"
flag = "exec_policy"
docs = "docs/AUTHORIZATION_ORDER.md"
owner = "crates/execpolicy"

[[feature]]
id = "vision-model"
name = "Vision model"
summary = "Routes image analysis to a separate vision-capable model configured in [vision_model]."
status = "flagged"
surfaces = { tui = "stable" }
since = "0.8.32"
flag = "vision_model"
docs = "docs/CONFIGURATION.md"
owner = "crates/engine/src/vision"

[[feature]]
id = "verify-tool"
name = "verify tool"
summary = "Lets the agent ask for an adversarial self-critique of its own work."
status = "stable"
surfaces = { tui = "stable" }
since = "0.9.2"
flag = "verify_tool"
docs = "docs/CONFIGURATION.md#feature-flags"
owner = "crates/engine/src/tools/verify.rs"

[[feature]]
id = "code-mode"
name = "Code mode"
summary = "execute_tools programs compose MCP, plugin and native tool calls under the normal gate."
status = "experimental"
surfaces = { tui = "stable" }
since = "0.10.0"
flag = "code_mode"
docs = "docs/TOOL_SURFACE.md#code-mode-execute_tools"
owner = "crates/engine/src/tools/codemode.rs"

[[feature]]
id = "extension-host"
name = "Extension host"
summary = "Runs reviewed TypeScript/JavaScript tools, commands and bounded Git review scopes through Engine approvals in a sidecar."
status = "flagged"
surfaces = { tui = "preview", web = "none", api = "preview" }
since = "0.10.1"
flag = "extension_host"
docs = "docs/EXTENSIONS.md"
owner = "crates/engine/src/extension_host"

[[feature]]
id = "finance-host"
name = "Finance host"
summary = "Routes opted-in finance tools through the bundled Native host under the existing permission and sandbox gates."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "finance_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/finance.rs"

[[feature]]
id = "data-host"
name = "Data host"
summary = "Routes opted-in data validation through the bundled Native host with owned input and output bounds."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "data_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/validate_data.rs"

[[feature]]
id = "speech-host"
name = "Speech host"
summary = "Routes opted-in speech tools through the bundled Native host while Rust retains credentials and permissions."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "speech_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/speech.rs"

[[feature]]
id = "pdf-host"
name = "PDF host"
summary = "Routes opted-in PDF extraction through the bundled Native host with the same Rust path and size guards."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "pdf_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/pdf.rs"

[[feature]]
id = "ocr-host"
name = "OCR host"
summary = "Routes opted-in image OCR through the bundled Native host under existing media and permission guards."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "ocr_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/image_ocr.rs"

[[feature]]
id = "github-host"
name = "GitHub host"
summary = "Routes opted-in GitHub operations through the bundled Native host while Rust retains credentials and approvals."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "github_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/github"

[[feature]]
id = "web-search-host"
name = "Web search host"
summary = "Routes opted-in web search through the bundled Native host with the existing Rust credential and network gates."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "web_search_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/web/adapter.rs"

[[feature]]
id = "web-extract-host"
name = "Web extract host"
summary = "Routes opted-in web extraction through the bundled Native host with owned URL and response bounds."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "web_extract_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/web/extract.rs"

[[feature]]
id = "review-host"
name = "Review host"
summary = "Routes opted-in review tools through the bundled Native host while Rust retains route and permission authority."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
flag = "review_host"
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/review_host.rs"

# --- Working with the agent ---

[[feature]]
id = "modes"
name = "Modes"
summary = "Plan and Work modes; Plan is a stop on the Shift+Tab dial, Operate parses as Work; a finished plan offers work."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/MODES.md"
owner = "crates/config/src/app_mode.rs"

[[feature]]
id = "permission-postures"
name = "Permission postures"
summary = "One Shift+Tab dial: Ask, Accept Edits (default), Plan, Auto-Review, Full Access; cards default to Deny."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/MODES.md#permission-posture"
owner = "crates/execpolicy/src/approval_mode.rs"

[[feature]]
id = "sandbox"
name = "Command sandbox"
summary = "Seatbelt on macOS; verified bubblewrap on Linux by default. Sandboxed PTYs require util-linux setsid."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/SANDBOX.md"
owner = "crates/sandbox/src"

[[feature]]
id = "providers"
name = "Providers"
summary = "Provider routes including Tinker, Runcrate and Tencent TokenHub, with scoped facts, limits and price estimates."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/PROVIDERS.md"
owner = "crates/config/assets/provider_descriptors.json"

[[feature]]
id = "model-routing"
name = "Auto model routing"
summary = "Picks a model per turn under Auto; /router sets up the router."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/CONFIGURATION.md#auto-model-routing-auto-autorouter"
owner = "crates/engine/src/model_routing.rs"

[[feature]]
id = "model-catalog-refresh"
name = "Model catalog refresh"
summary = "Refresh public model facts and exact provider rosters during use; failures retain the last good snapshot."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
since = "0.10.3"
docs = "docs/CATALOG_REFRESH.md"
owner = "crates/engine/src/models_dev_live.rs"

[[feature]]
id = "output-limit-answer-recovery"
name = "Answerless output-limit recovery"
summary = "Opt-in bounded answer retries after an output-limit stop, including Fleet, with request-scoped nudge receipts."
status = "flagged"
surfaces = { tui = "preview", api = "preview" }
since = "unreleased"
docs = "docs/CONFIGURATION.md#reasoning-only-recovery-reasoning_only"
owner = "crates/engine/src/core/engine/turn_loop/continuation.rs"

[[feature]]
id = "fleet"
name = "Fleet"
summary = "Runs and supervises groups of worker agents with receipts and a pre-spend check."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/FLEET.md"
owner = "crates/engine/src/fleet"

[[feature]]
id = "environment-placement"
name = "Environment-aware Fleet placement"
summary = "Places Fleet tasks by environment requirements and connects explicitly configured workers through Tailscale."
status = "experimental"
surfaces = { tui = "preview", api = "preview" }
docs = "docs/ENVIRONMENTS.md#environment-aware-fleet-placement-preview"
owner = "crates/engine/src/fleet/placement.rs"

[[feature]]
id = "workflows"
name = "Workflows"
summary = "Checked-in .workflow.js scripts coordinate agents step by step."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/WORKFLOW_AUTHORING.md"
owner = "crates/workflow"

[[feature]]
id = "automatic-workflows"
name = "Automatic workflows"
summary = "Turns a broad request into a compact Workflow plan without writing a script."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/AUTOMATIC_WORKFLOWS.md"
owner = "crates/engine/src/tools/workflow"

[[feature]]
id = "goals"
name = "Goals"
summary = "/goal keeps the agent on one objective across turns; optional [goal] judges can independently check complete or blocked."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/CONFIGURATION.md#goal-loop-goal"
owner = "crates/engine/src/tools/goal.rs"

[[feature]]
id = "thread-scheduled-turns"
name = "Reminders into the same thread"
summary = "send_later, automations and /v1/triggers deliver scheduled turns; a run parked on a human answer pauses its wall clock."
status = "experimental"
surfaces = { api = "preview" }
since = "unreleased"
docs = "docs/RUNTIME_API.md"
owner = "crates/engine/src/automation_manager.rs"

[[feature]]
id = "task-suggestions"
name = "Suggested tasks"
summary = "The tasks tool's suggest action offers the person a task as a Start/Hide card; it starts nothing and needs no approval."
status = "experimental"
surfaces = { desktop = "preview" }
since = "unreleased"
owner = "crates/engine/src/tools/tasks.rs"

[[feature]]
id = "todos"
name = "Todo list"
summary = "The agent keeps a visible todo list for multi-step work."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/TOOL_SURFACE.md"
owner = "crates/engine/src/tools/todo.rs"

[[feature]]
id = "composer-queue-steer"
name = "Queue and steer"
summary = "Queue messages while a turn runs, or steer the running turn."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/KEYBINDINGS.md"
owner = "crates/tui/src/commands/groups/core/queue.rs"

[[feature]]
id = "receipts"
name = "Receipts"
summary = "/receipts lists files, commands, calls, approvals and failures; the API serves the same receipt as JSON or Markdown."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
since = "0.10.1"
docs = "docs/RECEIPTS.md"
owner = "crates/engine/src/receipts.rs"

[[feature]]
id = "preview-request"
name = "Request preview"
summary = "/preview-request shows the redacted outbound request and bounded route-omission facts without sending it."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/PREVIEW_REQUEST.md"
owner = "crates/engine/src/request_manifest.rs"

[[feature]]
id = "present-handoff"
name = "Present final files"
summary = "Declare existing workspace files as final deliverables with a read-only handoff receipt."
status = "experimental"
surfaces = { tui = "preview", api = "partial" }
since = "unreleased"
owner = "crates/engine/src/tools/present.rs"

[[feature]]
id = "read-media"
name = "read_media"
summary = "Reads and preprocesses images for vision-capable models with size and privacy guards."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/READ_MEDIA.md"
owner = "crates/engine/src/tools/read_media.rs"

[[feature]]
id = "clipboard-image-preview"
name = "Clipboard image paste preview"
summary = "Attaches an image from the clipboard and previews it as a truecolor cell thumbnail above the composer."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/READ_MEDIA.md"
owner = "crates/tui/src/tui/image_preview.rs"

[[feature]]
id = "clipboard-image-prune"
name = "Pasted image cleanup"
summary = "codewhale sessions prune-images reports pasted clipboard images no saved session still names; --apply deletes them."
status = "experimental"
surfaces = { tui = "preview" }
since = "unreleased"
docs = "docs/READ_MEDIA.md#pasted-image-storage"
owner = "crates/engine/src/session_image_prune.rs"

[[feature]]
id = "memory"
name = "User memory"
summary = "Opt-in local store of preferences and conventions that persists across sessions."
status = "flagged"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/MEMORY.md"
owner = "crates/memory"

# --- Extending Codewhale ---

[[feature]]
id = "skills"
name = "Skills"
summary = "Trusted instruction packages with bundle policy, invocation controls and shared, configurable index limits."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/SKILLS.md"
owner = "crates/skills/src"

[[feature]]
id = "plugins"
name = "Plugins"
summary = "Installs, reviews and trusts plugin bundles, reports their status, and restores missing reviewed runtime snapshots."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/PLUGINS.md"
owner = "crates/plugins/src"

[[feature]]
id = "computer-use"
name = "Computer Use"
summary = "Reviewed app control: one approval covers background and foreground use, fresh targets, bounded batches."
status = "experimental"
surfaces = { tui = "preview", api = "preview" }
docs = "docs/PLUGIN_BUNDLES.md"
owner = "crates/plugins/src/marketplace"

[[feature]]
id = "script-tools"
name = "Script tools"
summary = "Scripts in ~/.codewhale/tools become approval-gated tools; [tools.overrides] disables built-ins, never replaces them."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/CONFIGURATION.md#script-tools-and-overrides"
owner = "crates/engine/src/tools/plugin.rs"

[[feature]]
id = "claude-plugin-compat"
name = "Claude plugin compatibility"
summary = "Loads Claude Code plugin bundles and skill folders where their features are supported."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/CLAUDE_PLUGIN_COMPAT.md"
owner = "crates/plugins/src/agent_plugin.rs"

[[feature]]
id = "claude-settings-import"
name = "Claude settings import"
summary = "/import-claude plans a reviewable import of Claude Code settings and servers."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/net/src/import_claude.rs"

[[feature]]
id = "hooks"
name = "Hooks"
summary = "Runs user commands on session and tool events, with an execution receipt after shell tools."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/HOOKS.md"
owner = "crates/hooks"

[[feature]]
id = "lsp"
name = "LSP diagnostics"
summary = "Feeds language-server diagnostics to the agent; custom servers can be added."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/LSP_PHP_CUSTOM.md"
owner = "crates/lsp/src"

[[feature]]
id = "runtime-api"
name = "Runtime API"
summary = "Local API: replay-safe thread creation, events, approvals, project trust, workspace leases, Unix sockets, device tokens."
status = "stable"
surfaces = { api = "stable" }
docs = "docs/RUNTIME_API.md"
owner = "crates/app-server/src/runtime_api.rs"

[[feature]]
id = "runtime-watch-events"
name = "Attested watch events"
summary = "Master-bearer watch turns retain typed non-person provenance, exact replay and read-only operation recovery."
status = "experimental"
surfaces = { api = "preview" }
since = "unreleased"
docs = "docs/RUNTIME_API.md"
owner = "crates/app-server/src/runtime_api.rs"

[[feature]]
id = "compatibility-tool-free-turns"
name = "Compatibility turn admission"
summary = "Initialized local controls use the held Runtime for tool-free turns, loaded-thread paging, names; clients use HTTP/SSE."
status = "stable"
surfaces = { api = "stable" }
since = "0.10.2"
docs = "docs/RUNTIME_API.md#compatibility-execution-limits"
owner = "crates/app-server/src/lib.rs"

[[feature]]
id = "runtime-provider-keys"
name = "Runtime provider keys"
summary = "Runtime API provider keys: durable or process-only memory, with a session-only policy that disables stored fallback."
status = "stable"
surfaces = { api = "stable" }
since = "0.10.2"
docs = "docs/RUNTIME_API.md#put-v1providersidkey--write-only-credential"
owner = "crates/app-server/src/runtime_api/secrets.rs"

[[feature]]
id = "headless-exec"
name = "Headless exec"
summary = "codewhale exec runs one headless turn from a script and streams JSON."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/RUNTIME_API.md"
owner = "crates/app-server/src/exec_agent.rs"

[[feature]]
id = "github-review"
name = "GitHub PR review"
summary = "codewhale review --pr N writes an advisory review; posting to GitHub is opt-in."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/GITHUB_APP.md"
owner = "crates/engine/src/tools/github"

# --- Interface ---

[[feature]]
id = "web-client"
name = "Local browser client"
summary = "codewhale web opens the embedded browser client on 127.0.0.1 over the Runtime API."
status = "stable"
surfaces = { web = "stable" }
docs = "docs/WEB.md"
owner = "crates/app-server/src/runtime_web"

[[feature]]
id = "keybindings"
name = "Keybindings"
summary = "Terminal key bindings, documented from the keybinding catalog."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/KEYBINDINGS.md"
owner = "crates/engine/src/keybinding_table.rs"

[[feature]]
id = "settings"
name = "Settings"
summary = "/config and codewhale config edit settings declared once in the settings schema."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
docs = "docs/CONFIGURATION.md"
owner = "crates/config/src/settings_schema.rs"

[[feature]]
id = "whats-new-notice"
name = "What's new after an update"
summary = "Says once, on the first start after an update, what changed and links that version's release notes."
status = "stable"
surfaces = { tui = "stable" }
since = "0.10.2"
docs = "docs/CONFIGURATION.md#whats-new-after-an-update"
owner = "crates/tui/src/whats_new.rs"

[[feature]]
id = "themes"
name = "Themes"
summary = "/theme picks a built-in theme; user themes follow a JSON schema."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/schemas/user-theme.schema.json"
owner = "crates/palette"

[[feature]]
id = "chat-color"
name = "Chat color"
summary = "/color gives one chat's composer box its own color, kept with that session."
status = "stable"
surfaces = { tui = "stable" }
since = "0.10.2"
docs = "docs/GUIDE.md"
owner = "crates/tui/src/commands/groups/session/color.rs"

[[feature]]
id = "localization"
name = "Localization"
summary = "Interface text in 15 locales, including tool activity, file receipts and language-aware transcript caches."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/LOCALIZATION.md"
owner = "crates/localization"

[[feature]]
id = "voice"
name = "Voice input"
summary = "/voice, /voicecontrol and /voicesend use the selected ASR backend without switching providers."
status = "stable"
surfaces = { tui = "stable", api = "stable" }
owner = "crates/engine/src/voice.rs"

[[feature]]
id = "pet"
name = "Pet"
summary = "Shared whale activity and reply views; desktop and app-server turns can follow an idle existing companion."
status = "stable"
surfaces = { tui = "stable", api = "partial" }
owner = "crates/tui/src/tui/pet_watch"
docs = "docs/PET_MODE.md"

[[feature]]
id = "overview"
name = "Home dashboard"
summary = "/overview shows the home dashboard."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/PROVIDERS.md"
owner = "crates/tui/src/commands/groups/core/home.rs"

[[feature]]
id = "account-login"
name = "Account login"
summary = "Cancellable account sign-in inside the TUI; account sign-out preserves local model connections and work."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/commands/groups/config/config.rs"

[[feature]]
id = "account-computer-files"
name = "Account computer files"
summary = "Save computer files as account versions, restore with revision checks, and download verified bytes."
status = "experimental"
surfaces = { tui = "preview" }
since = "0.10.2"
owner = "crates/account-cli/src/lib.rs"

[[feature]]
id = "context-anchors"
name = "Context anchors"
summary = "/anchor pins a fact that survives compaction."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/commands/groups/core/anchor.rs"

[[feature]]
id = "window-pin"
name = "Pin window"
summary = "/pin keeps the terminal window on top."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/commands/groups/core/pin.rs"

[[feature]]
id = "structured-copy"
name = "Structured copy"
summary = "/structcopy copies one session object as redacted JSON."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/commands/groups/session/structcopy.rs"

[[feature]]
id = "conversation-export"
name = "Conversation export"
summary = "/export saves a redacted conversation as Markdown, HTML or JSON, to the clipboard or an auto-named file."
status = "stable"
surfaces = { tui = "stable" }
since = "unreleased"
docs = "docs/GUIDE.md#exporting-a-conversation"
owner = "crates/tui/src/commands/groups/session/export.rs"

[[feature]]
id = "live-thinking"
name = "Live thinking"
summary = "/verbose toggles live model thinking in the transcript."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/commands/groups/config/mod.rs"

[[feature]]
id = "local-model-reasoning"
name = "Local model reasoning compatibility"
summary = "The vLLM Chat route sends reviewed model-template effort values instead of assuming a universal ladder."
status = "stable"
surfaces = { tui = "stable", web = "stable", api = "stable" }
since = "unreleased"
docs = "docs/LOCAL_MODEL_REASONING.md"
owner = "crates/config/src/local_reasoning.rs"

[[feature]]
id = "workbar"
name = "Workbar"
summary = "/workbar places the tasks, agents and context bar on any edge or hides it."
status = "stable"
surfaces = { tui = "stable" }
owner = "crates/tui/src/tui/sidebar.rs"

[[feature]]
id = "terminal-dock"
name = "Terminal dock"
summary = "/workbar terminal shows workspace PTYs with live output, human input, session selection and a fresh shell; macOS/Linux."
status = "stable"
surfaces = { tui = "stable" }
since = "0.10.2"
owner = "crates/tui/src/tui/work_surface/terminal.rs"

# --- Operations and platforms ---

[[feature]]
id = "telemetry"
name = "Telemetry"
summary = "Anonymous aggregate usage counts, disclosed at first launch, with a saved off switch."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/TELEMETRY.md"
owner = "crates/telemetry"

[[feature]]
id = "docker"
name = "Docker image"
summary = "Runs Codewhale in a container, with an opt-in toolbox image."
status = "stable"
surfaces = { tui = "stable" }
docs = "docs/DOCKER.md"
owner = "Dockerfile"

[[feature]]
id = "termux"
name = "Android (Termux)"
summary = "arm64 release archive for Termux on Android."
status = "experimental"
surfaces = { tui = "preview" }
docs = "docs/TERMUX.md"
owner = ".github/workflows/release-artifacts.yml"

[[feature]]
id = "harmonyos-native"
name = "HarmonyOS (native)"
summary = "Signed arm64 release archive for native HarmonyOS and OpenHarmony."
status = "experimental"
surfaces = { tui = "preview" }
docs = "docs/HarmonyOS.md"
owner = ".github/workflows/release-artifacts.yml"

[[feature]]
id = "chatgpt-plan-sign-in"
name = "Sign in with ChatGPT"
summary = "Official OAuth and the selected account catalog serve ChatGPT plan requests, with distinct token-verification errors."
status = "experimental"
surfaces = { tui = "preview", api = "partial", web = "none" }
since = "0.10.1"
docs = "docs/PROVIDERS.md#sign-in-with-chatgpt"
owner = "crates/runtime/src/oauth.rs"

[[feature]]
id = "plugin-oauth-providers"
name = "Reviewed plugin OAuth providers"
summary = "Reviewed plugins sign in with /connect <id> and out with /disconnect; the host owns PKCE, models and approvals."
status = "experimental"
surfaces = { tui = "preview", api = "partial", web = "none" }
since = "0.10.1"
docs = "docs/PLUGIN_PROVIDERS.md"
owner = "crates/plugins/src/providers.rs"

[[feature]]
id = "orcarouter-sign-in"
name = "Sign in with OrcaRouter"
summary = "OrcaRouter provider: sk-orca- API key or OAuth 2.0 + PKCE sign-in, plus a live chat model catalog."
status = "experimental"
surfaces = { tui = "preview", api = "preview", web = "none" }
since = "0.10.1"
docs = "docs/PROVIDERS.md"
owner = "crates/runtime/src/oauth.rs"

# Community marketing website, separate from the Runtime's local web client.
[[feature]]
id = "merch-interest"
name = "Merch interest list"
summary = "The community website collects private merch opt-ins, material preferences and optional item-price feedback."
status = "experimental"
surfaces = { tui = "none", web = "none", api = "none" }
since = "unreleased"
docs = "web/lib/merch/README.md"
owner = "web/components/merch-interest.tsx"

[[feature]]
id = "local-whale-voice"
name = "Local whale voice"
summary = "Edit SOUL.md for a local whale and inspect the personality captured for each turn."
status = "experimental"
surfaces = { tui = "preview", api = "preview" }
since = "unreleased"
docs = "docs/RUNTIME_API.md#local-whale-voice"
owner = "crates/engine/src/whale_soul.rs"

[[feature]]
id = "profile-constitution"
name = "Profile constitution"
summary = "Account preferences are captured per turn and previewed by the Engine."
status = "experimental"
surfaces = { tui = "preview", api = "preview" }
since = "0.10.1"
docs = "docs/RUNTIME_API.md#profile-constitution"
owner = "crates/engine/src/profile_constitution.rs"

[[feature]]
id = "plugin-shell-install"
name = "Plugin shell installation"
summary = "codewhale install uses the reviewed bundle installer with local, GitHub and version-pinned npm sources."
status = "experimental"
surfaces = { tui = "preview" }
since = "0.10.2"
docs = "docs/PLUGINS.md"
owner = "crates/plugins/src/mutation.rs"

[[feature]]
id = "herdr-agent-state"
name = "Herdr agent state"
summary = "Reports idle, working or blocked to the Herdr multiplexer and reopens the session after a restart."
status = "stable"
since = "0.10.2"
surfaces = { tui = "stable" }
owner = "crates/tui/src/tui/herdr.rs"

[[feature]]
id = "instruction-budgets"
name = "Instruction budgets"
summary = "Global and project standing instructions get separate token budgets, with every trim or skip reported."
status = "stable"
since = "unreleased"
surfaces = { tui = "stable" }
docs = "docs/CONFIGURATION.md#instruction-budget-instruction_budget-6526"
owner = "crates/engine/src/project_context/budget.rs"

[[feature]]
id = "github-action-review"
name = "GitHub Action review"
summary = "Generate pinned workflows for automatic or authorized mention reviews; publish findings with recorded evidence."
status = "experimental"
since = "unreleased"
surfaces = { tui = "preview" }
docs = "docs/GITHUB_ACTION.md"
owner = "scripts/github-action/review.mjs"

[[feature]]
id = "telegram-agent"
name = "Telegram agent bridge"
summary = "Use an Engine from Telegram with durable prompt recovery, human-owned approvals and retained replies."
status = "experimental"
since = "unreleased"
surfaces = { api = "preview" }
docs = "integrations/telegram-bridge/README.md"
owner = "integrations/telegram-bridge/src/index.mjs"

[[feature]]
id = "dingtalk-agent"
name = "DingTalk agent bridge"
summary = "Connect an internal DingTalk app to the same Engine with scoped identity and durable message recovery."
status = "experimental"
since = "unreleased"
surfaces = { api = "preview" }
docs = "integrations/dingtalk-bridge/README.md"
owner = "integrations/dingtalk-bridge/src/index.mjs"

[[feature]]
id = "compaction-archive-recall"
name = "Compaction archive recall"
summary = "context_archive_search and context_archive_get read the pre-compaction transcript a summary replaced."
status = "experimental"
since = "unreleased"
surfaces = { tui = "preview" }
owner = "crates/engine/src/tools/context_archive.rs"

[[feature]]
id = "usage-statistics"
name = "Usage statistics"
summary = "Read-only native usage subtotals and execution diagnostics; missing coverage stays explicit."
status = "experimental"
surfaces = { tui = "partial" }
since = "unreleased"
docs = "docs/CONFIGURATION.md#usage-and-execution-statistics"
owner = "crates/cli/src/metrics.rs"

[[feature]]
id = "cache-call-receipts"
name = "Per-call cache receipts"
summary = "/cache calls shows bounded native receipts with frozen prices, selected currency and missing cache telemetry."
status = "experimental"
surfaces = { tui = "partial" }
since = "unreleased"
docs = "docs/CONFIGURATION.md#usage-and-execution-statistics"
owner = "crates/tui/src/commands/contract/debug_diagnostics.rs"

[[feature]]
id = "local-proxy-fallback"
name = "Local proxy fallback"
summary = "Long-lived clients go direct while a loopback proxy port refuses connections, then resume proxying."
status = "experimental"
surfaces = { tui = "partial", api = "partial" }
since = "unreleased"
docs = "docs/INSTALL.md#a-local-proxy-that-closed-after-the-session-started"
owner = "crates/net/src/proxy.rs"

[[feature]]
id = "rate-limit-recovery"
name = "Bounded HTTP rate-limit retries"
summary = "Bound HTTP transport retries for 429 independently of network retries and honor provider reset minima."
status = "experimental"
surfaces = { tui = "preview", web = "partial", api = "partial" }
owner = "crates/engine/src/llm_client/rate_limit.rs"
docs = "docs/rate-limit-retries.md"

[[feature]]
id = "custom-responses-profile"
name = "Custom Responses profile"
summary = "A custom provider with wire = responses can name an allowlisted responses_profile; omitted means standard."
status = "stable"
surfaces = { tui = "stable" }
since = "unreleased"
docs = "docs/CONFIGURATION.md"
owner = "crates/config/src/provider_toml.rs"