Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6a16c6c
Add project file picker (mod+p) and project content search (mod+shift+f)
jakeleventhal Jul 29, 2026
12d9699
Merge branch 'main' into t3code/rebuild-combined-pull-requests
juliusmarminge Jul 29, 2026
0f7ccee
Address review feedback for the project search overlays
jakeleventhal Jul 29, 2026
d36d813
fix(search): address remaining review feedback
jakeleventhal Jul 29, 2026
2a1487d
fix(search): overscan whole-word candidates
jakeleventhal Jul 29, 2026
a3192a6
Merge remote-tracking branch 'upstream/main' into t3code/rebuild-comb…
jakeleventhal Jul 29, 2026
2d45736
fix(web): block stale content search clicks
jakeleventhal Jul 29, 2026
b76364e
fix(web): center high-line file reveals
jakeleventhal Jul 29, 2026
bca349b
fix(web): prevent comment gutter scroll jump
jakeleventhal Jul 29, 2026
65d45a2
Combine project search overlays into command dialog
jakeleventhal Jul 29, 2026
a253ca4
Share command palette chrome across search overlays
jakeleventhal Jul 29, 2026
205e885
Hide content-search status until needed
jakeleventhal Jul 29, 2026
c7421a2
Merge upstream/main into t3code/rebuild-combined-pull-requests
jakeleventhal Jul 30, 2026
04c228b
fix(server): wait for workspace index warmup
jakeleventhal Jul 30, 2026
e000002
fix(web): cache syntax highlighting fallbacks
jakeleventhal Jul 30, 2026
ce9b3c1
fix(web): avoid replaying file tree reveals
jakeleventhal Jul 30, 2026
59f1738
Merge remote-tracking branch 'upstream/main' into t3code/rebuild-comb…
jakeleventhal Jul 30, 2026
987d7bc
Merge remote-tracking branch 'upstream/main' into t3code/rebuild-comb…
jakeleventhal Jul 30, 2026
3de5d01
fix: preserve invalid case-insensitive regex errors
jakeleventhal Jul 30, 2026
75aa1cd
fix: clear content search pending state
jakeleventhal Jul 30, 2026
051e319
fix(web): make search Escape go back
jakeleventhal Jul 30, 2026
73e373b
fix(web): handle search Escape from any focus
jakeleventhal Jul 30, 2026
1d4e0f3
fix(web): preserve Escape during IME composition
jakeleventhal Jul 30, 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
1 change: 1 addition & 0 deletions apps/server/src/auth/RpcAuthorization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export const RPC_REQUIRED_SCOPES = {
[WS_METHODS.sourceControlPublishRepository]: AuthOrchestrationOperateScope,
[WS_METHODS.projectsListEntries]: AuthOrchestrationReadScope,
[WS_METHODS.projectsReadFile]: AuthOrchestrationReadScope,
[WS_METHODS.projectsSearchContents]: AuthOrchestrationReadScope,
[WS_METHODS.projectsSearchEntries]: AuthOrchestrationReadScope,
[WS_METHODS.projectsWriteFile]: AuthOrchestrationOperateScope,
[WS_METHODS.shellOpenInEditor]: AuthOrchestrationOperateScope,
Expand Down
2 changes: 2 additions & 0 deletions apps/server/src/keybindings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ it.layer(NodeServices.layer)("keybindings", (it) => {
assert.equal(defaultsByCommand.get("thread.jump.1"), "mod+1");
assert.equal(defaultsByCommand.get("thread.jump.9"), "mod+9");
assert.equal(defaultsByCommand.get("modelPicker.toggle"), "mod+shift+m");
assert.equal(defaultsByCommand.get("filePicker.toggle"), "mod+p");
assert.equal(defaultsByCommand.get("projectSearch.toggle"), "mod+shift+f");
assert.equal(defaultsByCommand.get("sidebar.toggle"), "mod+b");
assert.equal(defaultsByCommand.get("rightPanel.toggle"), "mod+alt+b");
assert.equal(defaultsByCommand.get("terminal.splitVertical"), "mod+shift+d");
Expand Down
21 changes: 13 additions & 8 deletions apps/server/src/keybindings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -547,19 +547,24 @@ const make = Effect.gen(function* () {
});
}

const nextConfig = [...customConfig, ...missingDefaults];
const cappedConfig =
nextConfig.length > MAX_KEYBINDINGS_COUNT
? nextConfig.slice(-MAX_KEYBINDINGS_COUNT)
: nextConfig;
if (nextConfig.length > MAX_KEYBINDINGS_COUNT) {
yield* Effect.logWarning("truncating keybindings config to max entries", {
// Startup backfill must never evict persisted user rules: append only
// the defaults that fit and skip the rest.
const availableSlots = Math.max(0, MAX_KEYBINDINGS_COUNT - customConfig.length);
const defaultsToAppend = missingDefaults.slice(0, availableSlots);
const skippedDefaults = missingDefaults.slice(availableSlots);
if (skippedDefaults.length > 0) {
yield* Effect.logWarning("skipping default keybinding backfill at max entries", {
path: keybindingsConfigPath,
maxEntries: MAX_KEYBINDINGS_COUNT,
commands: skippedDefaults.map((rule) => rule.command),
});
}
if (defaultsToAppend.length === 0) {
yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);
return;
}

yield* writeConfigAtomically(cappedConfig);
yield* writeConfigAtomically([...customConfig, ...defaultsToAppend]);
yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);
}),
);
Expand Down
Loading
Loading