Searching for an old conversation should not change how the rest of the workspace is organized. A project tree answers where work belongs; a search result answers where a particular piece of work can be found. Treating both as the same list makes switching between them harder than it needs to be.

AIClaw introduced a centered search-and-command panel in 3.9.2. The published 3.10.0 release retains that interaction and moves its search button into the sidebar header. This article covers that shipped behavior, using source pinned to 3.10.0.

Keep the project tree in place

The command panel is a separate Vue component, teleported to the document body. Its backdrop and dialog sit above the workspace instead of replacing project groups with matching conversations.

With an empty query, it offers actions for the current context: start a conversation, rename or archive the selected conversation, create a project, or navigate to a settings category. Rename and archive appear only when there is a current conversation; starting another conversation is disabled while the runtime is unavailable.

Typing filters those command labels and descriptions locally. Conversation results are added separately after the session search returns. Each result includes a workspace label, with extra directory detail when the existing grouping helper provides it. Selecting a result uses the normal conversation-opening action.

The panel does not rebuild project assignments or introduce a second grouping system. Closing it leaves the sidebar available in its existing organization.

Debounce the request, not the local commands

The query watcher clears the previous timer and resets the active selection. For a nonempty query, it schedules the session search after 200 milliseconds. Locally available commands can still match while the conversation search is pending.

The renderer store forwards the query through the existing session-search bridge. It only applies returned results, errors, and loading changes when the stored keyword still equals the keyword associated with that request.

This keeps a response for a different, older keyword from replacing the current results. It is a keyword check, not a unique request-generation check: it does not distinguish two overlapping requests for the same text. Nor does clearing the query cancel an IPC request that has already started.

When the component unmounts, it clears its pending debounce timer and resets session-search state. Those are concrete cleanup guarantees; they should not be described as transport-level cancellation.

A modal interaction needs a return path

The sidebar shortcut handler opens the same panel for Command-K and Control-K. It ignores composing input, already-handled events, and the shortcut when another modal dialog is present.

Opening from the search button records that button as the return target. Opening from the keyboard records the element that had focus. The panel focuses its search input on mount. On unmount, it restores the previous element only if that element remains connected and focus is still within the closing panel or has fallen back to the document body. It does not deliberately take focus away from an unrelated control the user has reached.

Arrow keys move the selected row while focus stays in the input, and Enter executes that row. The markup exposes the dialog, combobox, listbox, and active option relationship. Tab handling wraps the dialog's eligible input and buttons at its boundaries.

Escape closes the panel and stops propagation. This matters because the sidebar also handles Escape: dismissing search should not immediately collapse the navigation underneath it. Clicking the backdrop also dismisses the panel when no command is being executed.

These are keyboard behaviors implemented by the component, not a claim of comprehensive assistive-technology certification.

Reuse the existing actions and failure states

Command execution uses a busy flag to block duplicate execution. Failures remain visible inside the panel instead of being treated as a successful navigation. While a command is running, its controls are disabled and the ordinary dismissal paths are blocked.

Rename delegates to the existing rename form. Archive delegates to the existing archive action and remains a recoverable archive, rather than becoming a new deletion operation. The panel is an entry point to application actions, not a shell-command launcher or a natural-language agent task.

What the checks establish

For this article, I checked a clean checkout at the public 3.10.0 commit, verified the panel's bytes against GitHub's tag-pinned source, rebuilt the desktop app, and ran the release's desktop work UI smoke script. All 375 checks passed.

The relevant checks exercise opening from the header and both keyboard shortcuts, arrow selection, Tab wrapping, Enter into rename, returning focus after cancellation, Escape dismissal, workspace labels in search results, opening a conversation, and backdrop dismissal without changing the workspace groups.

The suite runs an Electron renderer with controlled host responses. It provides interaction regression evidence, not a real-model workflow, a large-history search benchmark, or a screen-reader acceptance test. The broader local validation in the release notes is separate evidence; it was not all rerun for this article.

The improvement is a clear separation of jobs: the sidebar keeps the workspace organized, while a temporary panel helps the user find a conversation or invoke a known action.