Skip to content

Chat: keyboard shortcuts for project and agent pickers in new chat #9392

Open

Description

@lacherogwu

Summary

  • In the new chat view (Cmd+N), there's no keyboard shortcut to open or move between the project picker and the agent/model picker
  • I have to reach for the mouse every time I want to start a chat in a specific project with a specific agent

Today
Cmd+N opens a new chat. Choosing the project ("No project" chip under the composer) and the agent (icon row in the model picker) needs mouse clicks. Inside the open model menu, Cmd+1..Cmd+5 pick a model, but nothing opens the pickers or switches agents.

Image Image

Proposal

  • A shortcut to open the project picker and one to open the agent/model picker from the composer (e.g. Cmd+P / Cmd+M, or Tab-cycling between chips)
  • Arrow keys / Ctrl+Tab (or Cmd+Left/Right) to move between agent tabs in the model picker
  • List these in Settings → Keyboard Shortcuts so they can be rebound

Related: #5598 (keyboard shortcuts tracker), #3077 (Cmd+K project switching, closed as stale)

Environment
Paradev 2.0.5, macOS 26.6 arm64

Activity

  1. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor

    Summary

    This is a feature request, not a bug. In the new chat / new workspace screen (opened with ⌘N), you can only open the project picker ("No project" chip) and the agent/model picker with the mouse. The request asks for three things: a hotkey for each picker, keyboard movement between agent tabs inside the model picker, and both entries listed (and rebindable) in Settings → Keyboard Shortcuts. The code confirms that no hotkey opens either picker today. One part of the request already works, though: once the model menu is open, Tab / Shift+Tab moves between the agent tabs. Nothing on screen tells you this.

    Affected code

    • The screen ⌘N opens. ⌘N is NEW_WORKSPACE (apps/desktop/src/renderer/hotkeys/registry.ts:257). It opens NewWorkspaceScreen (apps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/NewWorkspaceScreen/NewWorkspaceScreen.tsx).
    • Model picker. The screen already controls its open state: const [modelPickerOpen, setModelPickerOpen] = useState(false) at NewWorkspaceScreen.tsx:692, passed to <ModelPicker open onOpenChange> at :1167 and :1254. Nothing outside a click calls setModelPickerOpen(true).
    • Project picker. ProjectPickerPill (.../DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsx:72,139) keeps its open state private (useState(false) → <Popover open={open}>). The parent cannot open it.
    • Inside the model menu. ModelPanel.tsx:135-174 (.../AgentComposer/components/ModelPicker/components/ModelPanel/ModelPanel.tsx):
      • onPanelKeyDown maps Tab / Shift+Tab to cycleTab(±1), which steps through Favorites plus each agent. Past either end it either wraps around or hands focus to the effort/settings row (onLeave).
      • ⌘1–⌘5 picks a row (SHORTCUT_ROW_LIMIT).
      • The tab buttons have tabIndex={-1} (:264), so ArrowLeft/ArrowRight do nothing on the tablist.
    • Chat hotkeys in Settings. The "Chat" category in the registry (registry.ts:852-881) has only FOCUS_CHAT_INPUT, NEW_CHAT and CHAT_ADD_ATTACHMENT. Only the in-workspace Composer.tsx:292-299 uses them via useHotkey. NewWorkspaceScreen registers no useHotkey at all.

    Root cause

    No defect. These shortcuts were never built:

    • No registry entries exist for opening either picker.
    • ProjectPickerPill keeps its open state internal, so nothing outside it can open it.
    • The agent tablist does not handle arrow keys.

    How to reproduce

    1. Press ⌘N, then put focus in the composer.
    2. No key opens the project chip or the model pill. Settings → Keyboard Shortcuts has no entry for them.
    3. Click the model pill. Tab / Shift+Tab switches agent tabs, but ←/→ does nothing.

    Possible fix

    1. Registry. Add two entries to the "Chat" category in registry.ts, e.g. CHAT_OPEN_MODEL_PICKER and CHAT_OPEN_PROJECT_PICKER, each with a label (and description) written with msg(). That puts them in Settings and makes them rebindable. Watch for conflicts with the proposed keys:
      • ⌘P is already QUICK_OPEN (registry.ts:75-77).
      • ⌘M is the macOS system "Minimize" shortcut.
      • Unused ⌘⇧/⌘⌥ combinations, or ⌘. / ⌘', are safer. registry.test.ts should catch duplicate bindings.
    2. Project picker. Lift its open state: give ProjectPickerPill optional open / onOpenChange props, the same pattern ModelPicker uses.
    3. Wire the hotkeys in NewWorkspaceScreen with useHotkey(..., { enabled: <modal visible> }). They should call setModelPickerOpen(true) and the new project-picker setter. The same model-picker hotkey could also go into the in-workspace Composer.tsx next to CHAT_ADD_ATTACHMENT, since AgentComposer's ModelPicker is controlled there too.
    4. Arrow keys on the tablist. In ModelPanel.onPanelKeyDown, map ArrowLeft/ArrowRight to cycleTab(-1/1), but only when focus is not in the search input. Inside the input, arrows must keep moving the caret. Showing the existing Tab behaviour in the UI, for example a hint in the tab tooltips, would also help.
    5. i18n. New labels need bun run check:i18n and translations in every locales/<locale>/messages.po.

    Test sketch (bun:test)

    • Render ModelPanel with an agentSwitcher of 2+ agents.
    • Fire keyDown with { key: "ArrowRight" } on the panel root, outside the search input.
    • Check that aria-selected moves to the next role="tab" button.

    Related, as the issue says: #5598 (keyboard shortcuts tracker) and #3077.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions