# 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 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"