Part of #2061 (foundation). Depends on the action registry.
Problem
Users need to declare their slot bindings somewhere durable. The hotbar is a personal-preferences surface, so it belongs in the existing user config file, not a separate JSON.
Desired behavior
Add a [[hotbar]] table array to ~/.deepseek/config.toml, loaded via the existing config pipeline in `crates/config/src/lib.rs`.
[[hotbar]]
slot = 1
label = "voice" # optional; defaults to action.short_label()
action = "voice.toggle"
[[hotbar]]
slot = 2
action = "session.compact"
Validation
- `slot` must be 1–8. Out of range → warn + skip.
- Duplicate `slot` → last-wins + warn.
- Unknown `action` id → keep binding, render cell as `?`, warn at load.
Defaults
Ship a sensible default set so an unconfigured user sees a populated bar (voice, compact, plan, agent, yolo, palette, sidebar.toggle, trust.toggle).
Acceptance criteria
Part of #2061 (foundation). Depends on the action registry.
Problem
Users need to declare their slot bindings somewhere durable. The hotbar is a personal-preferences surface, so it belongs in the existing user config file, not a separate JSON.
Desired behavior
Add a
[[hotbar]]table array to~/.deepseek/config.toml, loaded via the existing config pipeline in `crates/config/src/lib.rs`.Validation
Defaults
Ship a sensible default set so an unconfigured user sees a populated bar (voice, compact, plan, agent, yolo, palette, sidebar.toggle, trust.toggle).
Acceptance criteria