Skip to content
Kadro
01docs / palette

Command palette

One input for everything in Kadro ADE. ⌘K opens the palette; without a prefix it searches actions, panes, and workspaces together. With > @ or # it narrows to one section. Every keybinding here can be overridden in Settings → Keybindings.

02Open and search

⌘K from anywhere, including the landing screen.

The palette command id is ui.toggleCommandPalette, scope global, default binding ⌘K. It is one of the few commands that stays available even when no workspace is active — you should be able to jump into a workspace without first creating one.

While the palette is open, the global dispatcher blocks every other keystroke from firing commands. The palette itself handles , , , and Esc; ordinary typing goes into its input.

Entries are rebuilt on every keystroke from live store state, not cached, so panes you closed in another modal or workspaces activated elsewhere stay accurate. The cost is negligible at this scale.

03Mode prefixes

Prefix the query with one of three characters to narrow to a single section. Without a prefix, all three sections render with headers; with a prefix, the section header is hidden because the list is homogeneous.

>Actions

Filters to commands only. The full registry minus ui.toggleCommandPalette (no point in toggling the palette from the palette). Each command's when() predicate still runs, so pane-only actions stay hidden on the landing screen.

@Panes

Lists panes in the active workspace only, in natural top-to-bottom, left-to-right order. Cross-workspace pane entries are intentionally omitted — they would require activating one workspace then focusing inside it, a two-step surprise.

#Workspaces

Lists every non-draft workspace ranked by lastOpenedAt. Selecting one activates it. Draft workspaces (mid-creation, no layout yet) are skipped.

04Ranking

Every entry has a haystack — its title plus any keywords — scored against the trimmed query by fuzzyScore. Non-matching entries are dropped; the rest are sorted by score descending.

Equal scores tie-break on rank: actions use their usage count (commandUsageById), workspaces use lastOpenedAt, panes keep natural order. So a command you run frequently floats above one you've never used when both match equally.

JavaScript sort is stable across all modern engines, so the final order is deterministic between renders for the same input.

  • Empty query matches everything — useful as a quick switcher.
  • Section headers render only in default mode; prefix mode is one flat list.
  • Selecting a pane focuses it; selecting a workspace activates it; selecting an action runs the same handler the keyboard path would.
  • Recording happens on confirm via recordCommandUse, so frecency only counts actual invocations.
05Default shortcuts

Defaults registered against the platform-neutral mod modifier — on macOS, Ctrl elsewhere. Resolved at dispatch via resolveKeybindings(), which merges user overrides from keybindingsStore on top of defaults. Collisions resolve last-written-wins; conflicts surface in the Keybindings settings UI.

BindingCommand idLabel
⌘Kui.toggleCommandPalette

Toggle command palette

⌘Nworkspace.new

New workspace

⌘1..⌘9workspace.jumpTo1..9

Jump to workspace 1..9

⌘⇧]workspace.focusNext

Focus next workspace

⌘⇧[workspace.focusPrev

Focus previous workspace

⌘Tpane.new

New pane (with provider picker)

⌘Dpane.splitHorizontal

Split pane horizontally

⌘⇧Dpane.splitVertical

Split pane vertically

⌘⌥Dpane.splitWithPicker

Split pane with provider picker

⌘Wpane.close

Close pane

⌘←/→/↑/↓pane.focusLeft/Right/Up/Down

Directional focus

⌘⌥]pane.focusNext

Focus next pane

⌘⌥[pane.focusPrev

Focus previous pane

⌘⇧↵pane.toggleFullscreen

Toggle pane fullscreen

⌘⌥Rpane.rename

Rename pane

Pane focus, swap, and edge-move actions exist as commands without default bindings — they're invoked programmatically from drag-and-drop on the workspace surface, but you can bind them in Settings → Keybindings if you want a keyboard equivalent.

06Composer

The Team Dashboard composer has its own keys.

In the Team Dashboard cockpit, the bottom-of-screen composer accepts messages addressed to a specific agent (a target chip on the left) or broadcast. It is a separate input from the command palette and uses its own keys: ⌘L focuses the composer from anywhere on the dashboard, ⌘↵ submits the current draft.

Plain behaves contextually: when the mention autocomplete popover is open it selects the highlighted agent; otherwise it submits. ⌘↵ always submits regardless of popover state — that's the canonical send key.

Slash commands (/status, /replan, /review) are parsed but not wired yet; only /stop currently has a handler. The composer reports the unwired ones as "not wired yet" instead of pretending to dispatch them.

Stop reaching for the mouse.

⌘K, type, press ↵. Everything in Kadro ADE is one input away.