Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
7bef645
feat(web): add extensible command palette
binbandit Mar 15, 2026
17073d5
perf(web): avoid closed-state command palette work
binbandit Mar 15, 2026
869181f
fix(web): align command palette search and shortcut
binbandit Mar 15, 2026
897b9ed
command palette add thread timestamps and projects (#1)
huxcrux Mar 15, 2026
e7ffca4
feat(contracts): add filesystem.browse WS method and request schema
eggfriedrice24 Mar 15, 2026
cefe926
feat(contracts): add browseFilesystem to NativeApi interface
eggfriedrice24 Mar 15, 2026
ea52bb3
feat(server): add filesystem browse endpoint with directory listing
eggfriedrice24 Mar 15, 2026
c6a9033
feat(web): wire browseFilesystem to WS transport
eggfriedrice24 Mar 15, 2026
7bc39e6
feat(web): add project browser with filesystem browsing to command pa…
eggfriedrice24 Mar 15, 2026
1b13b76
fix(web): add windows path support and prevent stale debounce actions…
eggfriedrice24 Mar 15, 2026
f546911
Merge upstream/main into t3code/extensible-command-palette
binbandit Mar 20, 2026
366dae5
Merge upstream/main into t3code/extensible-command-palette
binbandit Mar 20, 2026
a1b5299
feat: update command palette styles and state management
Noojuno Mar 16, 2026
bd703a0
Fix command palette path handling
Noojuno Mar 19, 2026
75258e1
Add command palette project browsing
Noojuno Mar 19, 2026
36a8834
Refactor command palette and fix browser tests
Noojuno Mar 19, 2026
90efe4a
Fix command palette path browsing
Noojuno Mar 20, 2026
b1068fe
Merge branch 'main' into t3code/extensible-command-palette
juliusmarminge Mar 24, 2026
22ffaf3
Improve command palette filesystem browsing
Noojuno Mar 24, 2026
2bf6f66
Improve command palette filesystem browsing
Noojuno Mar 24, 2026
5bb9824
Fix command palette browse-up guard
Noojuno Mar 24, 2026
9af2ae9
Merge remote-tracking branch 'origin/main' into t3code/extensible-com…
Noojuno Mar 24, 2026
5ff0686
fix: use directory path for browse-up check after merge regression
Noojuno Mar 24, 2026
0d90e59
Merge origin/main into t3code/extensible-command-palette
Noojuno Mar 24, 2026
907b4c3
test(web): add command palette regression coverage
Noojuno Mar 24, 2026
39149e8
fix(web,server): harden command palette path handling
Noojuno Mar 25, 2026
9d976b1
refactor(shared): centralize path helper logic
Noojuno Mar 25, 2026
50d149b
fix(web): rank command palette thread matches
Noojuno Mar 25, 2026
587e1f7
fix(web): preserve new-thread shortcut fallback
Noojuno Mar 25, 2026
835e80a
fix(web): require slash before browse mode
Noojuno Mar 25, 2026
cdcf939
refactor(web): simplify command palette item model and extract logic
Noojuno Mar 25, 2026
d836174
refactor(web): inline add-project logic and extract thread sorting
Noojuno Mar 25, 2026
4884b42
Merge remote-tracking branch 'origin/main' into t3code/extensible-com…
Noojuno Mar 25, 2026
65ab9e3
refactor(command-palette): split out filesystem browsing
Noojuno Mar 25, 2026
4bcb1b5
Merge remote-tracking branch 'origin/main' into split/command-palette…
Noojuno Mar 25, 2026
57c5f7d
Merge remote-tracking branch 'origin/main' into t3code/extensible-com…
Noojuno Mar 26, 2026
10d436e
test(web): use merged settings fixture in browser test
Noojuno Mar 26, 2026
d86c11a
Merge remote-tracking branch 'origin/main' into t3code/extensible-com…
Noojuno Mar 29, 2026
0cb4b2b
feat(web): open latest thread from project search
Noojuno Mar 29, 2026
87ee5aa
feat(web): support archived threads in command palette
Noojuno Mar 29, 2026
8e22d9b
fix(web): filter archived threads from command palette search
Noojuno Mar 29, 2026
761a81e
merge origin/main and resolve conflicts
Noojuno Mar 31, 2026
f49a6d0
fix: deduplicate toSortableTimestamp, rename formatRelativeTime, fix …
Noojuno Mar 31, 2026
4909e9b
revert DrainableWorker drain change (pre-existing issue, not introduc…
Noojuno Mar 31, 2026
938771b
refactor(web): consolidate relative time formatting into timestampFormat
Noojuno Mar 31, 2026
2914502
refactor(web): simplify relative time — use main's formatRelativeTime…
Noojuno Mar 31, 2026
e636664
revert DrainableWorker to main's STM-based implementation
Noojuno Mar 31, 2026
9d569bd
cleanup: remove unnecessary as const assertions
Noojuno Mar 31, 2026
0e09795
refactor(web): consolidate thread sorting into threadSort.ts
Noojuno Mar 31, 2026
b889cb2
fix(web): derive isActionsOnly from deferredQuery to match displayed …
Noojuno Mar 31, 2026
0fffcb9
refactor(web): rename "local thread" to "fresh thread" in command pal…
Noojuno Mar 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions KEYBINDINGS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ See the full schema for more details: [`packages/contracts/src/keybindings.ts`](
{ "key": "mod+d", "command": "terminal.split", "when": "terminalFocus" },
{ "key": "mod+n", "command": "terminal.new", "when": "terminalFocus" },
{ "key": "mod+w", "command": "terminal.close", "when": "terminalFocus" },
{ "key": "mod+k", "command": "commandPalette.toggle", "when": "!terminalFocus" },
{ "key": "mod+n", "command": "chat.new", "when": "!terminalFocus" },
{ "key": "mod+shift+o", "command": "chat.new", "when": "!terminalFocus" },
{ "key": "mod+shift+n", "command": "chat.newLocal", "when": "!terminalFocus" },
Expand Down Expand Up @@ -50,6 +51,7 @@ Invalid rules are ignored. Invalid config files are ignored. Warnings are logged
- `terminal.split`: split terminal (in focused terminal context by default)
- `terminal.new`: create new terminal (in focused terminal context by default)
- `terminal.close`: close/kill the focused terminal (in focused terminal context by default)
- `commandPalette.toggle`: open or close the global command palette
- `chat.new`: create a new chat thread preserving the active thread's branch/worktree state
- `chat.newLocal`: create a new chat thread for the active project in a new environment (local/worktree determined by app settings (default `local`))
- `editor.openFavorite`: open current project/worktree in the last-used editor
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/keybindings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export const DEFAULT_KEYBINDINGS: ReadonlyArray<KeybindingRule> = [
{ key: "mod+n", command: "terminal.new", when: "terminalFocus" },
{ key: "mod+w", command: "terminal.close", when: "terminalFocus" },
{ key: "mod+d", command: "diff.toggle", when: "!terminalFocus" },
{ key: "mod+k", command: "commandPalette.toggle", when: "!terminalFocus" },
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there's probably justification for triggering the command pallette even when the terminal is open. I doubt mod+k is gonna be a terminal keyboard shortcut, but I could see myself working in the terminal and wanting to navigate away and it being annoying to click out to focus the window

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah true, this wasn't something i've considered, as I have previously seen the two as two different states of interaction.

  1. Working with the ai and the threads
  2. Working with the terminal and running additional commands rather than asking ai to do it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The main time I would run into it I think is if I'm working on two worktrees of the same thing (like T3 Code).

I will usually have my dev command running into the terminal on the worktree I was last testing, then I'll kill that command and want to navigate to the next worktree I need to check on and run the command there. Being able to Ctrl+K would be useful there (and also how I've been doing it in my command pallette branch)

{ key: "mod+n", command: "chat.new", when: "!terminalFocus" },
{ key: "mod+shift+o", command: "chat.new", when: "!terminalFocus" },
{ key: "mod+shift+n", command: "chat.newLocal", when: "!terminalFocus" },
Expand Down
13 changes: 13 additions & 0 deletions apps/web/src/commandPaletteStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { create } from "zustand";

interface CommandPaletteStore {
open: boolean;
setOpen: (open: boolean) => void;
toggleOpen: () => void;
}

export const useCommandPaletteStore = create<CommandPaletteStore>((set) => ({
open: false,
setOpen: (open) => set({ open }),
toggleOpen: () => set((state) => ({ open: !state.open })),
}));
37 changes: 20 additions & 17 deletions apps/web/src/components/AppSidebarLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useEffect, type ReactNode } from "react";
import { useNavigate } from "@tanstack/react-router";

import { CommandPalette } from "./CommandPalette";
import ThreadSidebar from "./Sidebar";
import { Sidebar, SidebarProvider, SidebarRail } from "./ui/sidebar";

Expand Down Expand Up @@ -28,22 +29,24 @@ export function AppSidebarLayout({ children }: { children: ReactNode }) {
}, [navigate]);

return (
<SidebarProvider defaultOpen>
<Sidebar
side="left"
collapsible="offcanvas"
className="border-r border-border bg-card text-foreground"
resizable={{
minWidth: THREAD_SIDEBAR_MIN_WIDTH,
shouldAcceptWidth: ({ nextWidth, wrapper }) =>
wrapper.clientWidth - nextWidth >= THREAD_MAIN_CONTENT_MIN_WIDTH,
storageKey: THREAD_SIDEBAR_WIDTH_STORAGE_KEY,
}}
>
<ThreadSidebar />
<SidebarRail />
</Sidebar>
{children}
</SidebarProvider>
<CommandPalette>
<SidebarProvider defaultOpen>
<Sidebar
side="left"
collapsible="offcanvas"
className="border-r border-border bg-card text-foreground"
resizable={{
minWidth: THREAD_SIDEBAR_MIN_WIDTH,
shouldAcceptWidth: ({ nextWidth, wrapper }) =>
wrapper.clientWidth - nextWidth >= THREAD_MAIN_CONTENT_MIN_WIDTH,
storageKey: THREAD_SIDEBAR_WIDTH_STORAGE_KEY,
}}
>
<ThreadSidebar />
<SidebarRail />
</Sidebar>
{children}
</SidebarProvider>
</CommandPalette>
);
}
Loading
Loading