Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add a shortcut to archive a thread - #2699

Closed
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread
Closed

Add a shortcut to archive a thread#2699
atimmer wants to merge 1 commit into
pingdotgg:mainfrom
atimmer:feature/add-shortcut-for-archiving-single-thread

Conversation

@atimmer

@atimmeratimmer commented May 14, 2026

Copy link
Copy Markdown

What Changed

Add thread.archiveCurrent so the current thread can be archived without leaving the keyboard.

  • Bind mod+shift+a when the in-app terminal is not focused.
  • Add “Archive current thread” to the command palette.
  • Reuse the sidebar archive flow so success navigates to a fresh draft and failures show an error toast.
  • Ignore repeated keydown events so holding the shortcut archives exactly once.

Why

The existing Cmd+1, Cmd+2, etc. shortcuts make switching threads fast, but stale threads still require pointer interaction to archive. This keeps the entire switch-and-clean-up workflow on the keyboard.

UI Changes

Before

Searching for archive on upstream main returns no matching command.

Before — upstream main command palette has no Archive thread action

After

Searching for archive on this PR shows “Archive current thread” with ⇧⌘A.

After — PR #2699 command palette shows Archive current thread with Shift-Command-A

Interaction

The shortcut archives the active thread and navigates to a fresh draft.

archive-shortcut.mp4

Verification

Automated

  • vp check — passed
  • vp run typecheck — passed
  • vp test run apps/web/src/lib/chatGlobalShortcuts.test.ts packages/contracts/src/keybindings.test.ts packages/shared/src/keybindings.test.ts — 121 tests passed

Manual GUI verification

Verified in a disposable, paired T3 Code environment at head 3759679409cf:

  • Active thread + mod+shift+a: archived once and navigated to a fresh draft.
  • Command palette: “Archive current thread” is visible and archives successfully.
  • New-draft route: shortcut is a no-op with no toast or browser side effect.
  • In-app terminal focused: shortcut does not archive the thread.
  • Held shortcut/repeat stream: exactly one archive event and no spurious failure toast.
  • Running thread: “Failed to archive thread — Cannot archive a running thread.” toast appears.
  • Three selected sidebar threads: context menu shows “Archive (3)”; all three archive with no error toast.

Evidence is captured locally as before-command-palette.png, after-command-palette.png, after-archive-shortcut.png, after-archive-toast.png, terminal-focus-noop.png, hold-chord-single-archive.png, multi-select-selected.png, multi-select-archive-result.png, and archive-shortcut.mp4.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Focused UX and keybinding wiring reusing existing archive behavior; no auth or data-model changes.

Overview
Adds thread.archiveCurrent so users can archive the active thread from the keyboard without using the sidebar.

mod+shift+a is registered as the default binding (when the terminal is not focused), documented in user keybindings, and validated in contracts/shared tests. Chat route global shortcuts handle the command by calling attemptArchiveThread on the routed thread; draft routes no-op.

attemptArchiveThread is moved into useThreadActions (archive + failure toast), replacing duplicated logic in the sidebar. The command palette gains Archive current thread when a server thread is active, wired to the same helper.

shouldIgnoreChatGlobalShortcutEvent centralizes ignoring defaultPrevented and repeat keydowns so holding the chord does not archive multiple times.

Reviewed by Cursor Bugbot for commit 959d9a7. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread.archiveCurrent keyboard shortcut to archive the active thread

  • Adds a default keybinding mod+shift+a for thread.archiveCurrent (when terminal is not focused) via keybindings.ts and the contracts schema in keybindings.ts.
  • The global shortcut handler in _chat.tsx calls attemptArchiveThread on the current thread, skipping repeated or already-handled keydown events via the new shouldIgnoreChatGlobalShortcutEvent guard.
  • The command palette in CommandPalette.tsx surfaces an "Archive current thread" action when a thread is active, advertising the same shortcut.
  • attemptArchiveThread is extracted into useThreadActions.ts and shows a stacked toast on non-interruption failures; the sidebar now consumes it via props instead of its own local implementation.

Macroscope summarized 959d9a7.

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels May 14, 2026
@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9998881e-63ed-49f7-ad1f-d125316951ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

macroscopeapp[bot]
macroscopeappBot previously approved these changes May 14, 2026
@macroscopeapp

macroscopeappBot commented May 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a new keyboard shortcut for archiving threads. An unresolved review comment identifies that the new shortcut bypasses the archive confirmation dialog, creating inconsistent behavior for users who have that setting enabled. This behavioral inconsistency warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge
juliusmarmingeforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e8f77a4 to d1c0b29CompareJune 16, 2026 18:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 16, 2026 18:35

Dismissing prior approval to re-evaluate d1c0b29

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 16, 2026
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from d1c0b29 to 6f587edCompareJuly 8, 2026 13:43
@atimmer

Copy link
Copy Markdown
Author

@juliusmarminge I was on a holiday, but I have now force pushed from my local fork to bring this PR to mergable status.

Comment threadapps/web/src/routes/_chat.tsx Outdated
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 6f587ed to 64279d3CompareJuly 8, 2026 14:08
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:09

Dismissing prior approval to re-evaluate 64279d3

Comment threadapps/web/src/routes/_chat.tsx
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 14:15

Dismissing prior approval to re-evaluate fe54216

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
Comment threadapps/web/src/routes/_chat.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from ed5cc7b to e064cd7CompareJuly 22, 2026 07:35
Comment threadapps/web/src/components/Sidebar.tsx
@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from e064cd7 to 3759679CompareJuly 22, 2026 09:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 22, 2026 09:25

Dismissing prior approval to re-evaluate 3759679

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

event.stopPropagation();
if (!routeThreadRef) return;
void attemptArchiveThread(routeThreadRef);
return;

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.

Archive shortcut skips confirmation

Medium Severity

The new thread.archiveCurrent shortcut and command-palette action call attemptArchiveThread directly, so they never consult confirmThreadArchive. Sidebar archive and multi-select still prompt when that setting is on, so users who enabled archive confirmation can still archive the current thread immediately from the keyboard or Cmd+K.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 3759679. Configure here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This is intended

@atimmer
atimmerforce-pushed the feature/add-shortcut-for-archiving-single-thread branch from 3759679 to 959d9a7CompareJuly 23, 2026 11:09
@atimmer

Copy link
Copy Markdown
Author

Rebased onto current main and ported to the new command-palette bus architecture, since the palette context this originally hooked into was replaced upstream. The archive action now registers in the current palette action list, with toast/error handling consolidated in useThreadActions. Same shortcut and behavior: mod+shift+a.

@atimmer

Copy link
Copy Markdown
Author

Closing this, because I use the new settled workflow and that has a keyboard shortcut after #8089

@atimmeratimmer closed this Aug 28, 2026
@atimmer
atimmer deleted the feature/add-shortcut-for-archiving-single-thread branch August 28, 2026 21:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@atimmer