Skip to content

Approval Modes

Every tool call the engine wants to make goes through an approval gate. The approval mode controls how strict that gate is. There are three modes: Default, Auto-edit, and Force.

The active mode is shown in the status bar at all times. See Status Bar Anatomy for how the mode segment and the · FORCE badge render.

Every tool call that touches the filesystem, runs a shell command, makes a network request, or performs any other side effect shows an interactive approval card in the transcript. You see what the tool wants to do and choose to allow or deny before the engine proceeds.

This is the mode you use when you want to stay in control of every action. It is also the safe starting point for unfamiliar codebases or tasks where the scope of changes is not yet clear.

File read and write operations are approved automatically. Shell execution and network requests still show the interactive approval card.

Use Auto-edit when you trust the editing work but still want to gate network and shell activity. It reduces interruptions for tasks that are primarily reading and editing files.

All tool calls are approved without prompting. The engine runs the full agent loop without stopping for any confirmation.

When Force mode is active, the status bar shows · FORCE in warning color after the mode label so the state is never ambiguous at a glance.

In the Workspace, Shift+Tab cycles through the three modes in order:

Default → Auto-edit → Force → Default → …

The mode label in the status bar updates immediately on each press. A brief flash in the composer area confirms the transition (approximately 0.5 seconds at the default render rate).

Shift+Tab overrides the global “previous surface” binding while the Workspace has focus, so it cycles modes rather than switching tabs.

You can also switch mode with the /mode slash command, which opens the same cycle interactively.

Set the default mode for all sessions in your config:

[default]
approval_mode = "auto_edit" # "default" | "auto_edit" | "force"

The value is read at startup. You can still cycle modes interactively during the session; the config value is the starting point, not a lock.

Passing --force at the command line overrides the mode to Force for the entire run and adds the · FORCE badge to the status bar:

Terminal window
wayland-core --force "Refactor all the error types in src/"

--force has two aliases that work identically:

Terminal window
wayland-core --yolo "..."
wayland-core --dangerously-skip-permissions "..."

The flag is read from Cli at main.rs:247-248 and passed into the TUI engine at boot. The badge is rendered by the status bar widget when app.config.force is true (statusbar.rs:196-204).

--auto-approve skips the confirmation prompt for tool calls but is distinct from --force. The mode label in the status bar reflects the configured approval_mode value; --auto-approve does not change it to Force or add the · FORCE badge.

ActionDefaultAuto-editForce
File readsApprovedAuto-approvedAuto-approved
File writes and editsApproval cardAuto-approvedAuto-approved
Shell executionApproval cardApproval cardAuto-approved
Network requestsApproval cardApproval cardAuto-approved

“Approval card” means the tool call pauses and shows an interactive card in the transcript. You press y (or a) to allow, n to deny. On multi-card approval queues, A approves all remaining cards and N denies all remaining cards without showing each individually.

When you approve a tool call in Default or Auto-edit mode, you can choose the scope of that approval:

  • Once: allows this single call, then reverts to prompting.
  • Always (tool-name scope): allows every future call to the same tool by name for the rest of the session without prompting again.
  • Always (prefix scope): allows every future call whose tool name matches a prefix, for broader patterns.

The ToolApprovalManager reaps stale Always entries after 300 seconds of inactivity (TTL reaper). Scope choices are not persisted across sessions; they apply only to the current run.

Relationship between —force and the mode cycle

Section titled “Relationship between —force and the mode cycle”

--force at boot and the interactive mode cycle are independent mechanisms that interact in a defined way:

  • --force sets app.config.force = true and adds the · FORCE badge. This flag is immutable for the session.
  • The interactive mode cycle (Shift+Tab) changes app.mode among Default, Auto-edit, and Force. This change is visible in the mode label but does not clear the · FORCE badge.
  • When --force is active, the mode cycle still works. You can cycle to Default from the status bar’s perspective, but the · FORCE badge remains and the underlying force flag stays set. The effective behavior remains Force regardless of what the mode label shows.

In practice: if you start with --force, the mode cycle is cosmetic for that session. The badge is the authoritative indicator that all gates are open.

--force applies in all three run modes, not just the TUI:

Terminal window
# One-shot
wayland-core --force "Run the test suite and fix any failures"
# Headless JSON-stream
wayland-core --force --json-stream

In headless JSON-stream mode there is no status bar, but the config_changed event the host receives at startup reflects the force state, so a host application can observe the mode.