feat(web): add shift-click multi-select for sidebar threads#651
Conversation
Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability)
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
…lk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references.
|
video pls |
|
shift click to me usually does range selection, but this one works the same as cmd clicking by just selecting the one you click? also it uses the same style as the currently active thread so looks like i have more selected than it actually is: CleanShot.2026-03-09.at.17.32.22.mp4 |
I used the same color, so as to not introduce another design style. Can change. Got a color you would like me to use? P.S. If you reach out to me on x: |
|
Here is the latest video. Screen.Recording.2026-03-10.at.11.50.03.am.movFixed the range select, also added a nice little blue highlight color. |
…, and deselect on click away
- avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface
…g#651) * feat(web): add shift-click multi-select for sidebar threads Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability) * fix(web): filter deleted threads from worktree orphan check during bulk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references. * fix(web): fix shift-click range selection, distinct selection styling, and deselect on click away * Preserve thread multi-select on safe sidebar control clicks - avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface --------- Co-authored-by: Julius Marminge <[email protected]>
commit cc2ab000745f71a07220d1ad620b1f23b4f6f430 Author: Stefan Wintergerst <[email protected]> Date: Sat Mar 14 17:03:35 2026 +0100 chore: add .idea/ to .gitignore (#1077) commit 8b8e8b38e57ab782d085e5ecf2ae970f6e796a3f Author: Xanacas <[email protected]> Date: Sat Mar 14 16:51:37 2026 +0100 fix(web): unify focus ring styles across sidebar and app (#1079) Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]> commit 46ea594f02fb5f1e0b82430ddbd07ccf41a77a0d Author: Vitor Buzinaro <[email protected]> Date: Fri Mar 13 22:05:12 2026 -0300 Actions dialog: autofocus script-name field (#912) commit 790fda1a97476e4d7048a521651180ed0ba811c3 Author: 0x1f99d <[email protected]> Date: Sat Mar 14 05:29:22 2026 +1100 feat(github): add issue templates for automatic triage (#896) commit 89ffcf42eb781eddf357c07199607e3d7bccf0c5 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 23:24:42 2026 -0700 Upgrade oxfmt and oxlint tooling versions (#1010) commit 876bbd715ae6aa8e1d663455747e17c92e0a287c Author: Julius Marminge <[email protected]> Date: Thu Mar 12 21:03:21 2026 -0700 Extract reusable clipboard hook and standardize media queries (#1006) Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: codex <[email protected]> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> commit ac0d1f52a087c63819b2b032ac4535d18d3c23af Author: 0x1f99d <[email protected]> Date: Fri Mar 13 14:47:29 2026 +1100 fix(web): defer diff worker startup until diff opens (#934) Co-authored-by: Julius Marminge <[email protected]> commit d0ae0adc9923e51f7027ee16afedb14b3ae7779c Author: 0x1f99d <[email protected]> Date: Fri Mar 13 14:18:20 2026 +1100 fix(web): add default thread env mode setting (#892) Co-authored-by: Julius Marminge <[email protected]> commit 995a26660edbce7cca15da812972c23151a35f3d Author: Jono Kemball <[email protected]> Date: Fri Mar 13 16:18:03 2026 +1300 chore: Upgrade marketing app to Astro 6 (#1005) commit dfd62cfb868935787560b88b0c399f0ce9081a9f Author: dpav02 <[email protected]> Date: Thu Mar 12 22:43:07 2026 -0400 fix(desktop): show dialog after "Check for Updates" menu action (#955) Co-authored-by: Claude Opus 4.6 <[email protected]> commit 64dc07a8e5a6d7e34de4e85a07126a9c04e462d3 Author: Zortos <[email protected]> Date: Fri Mar 13 03:42:59 2026 +0100 Add compact Codex tool-call icons and details to the chat timeline (#988) Co-authored-by: Julius Marminge <[email protected]> commit ae4ae9973cd6cebc7d557e64e876534f15c916fd Author: Jono Kemball <[email protected]> Date: Fri Mar 13 15:30:47 2026 +1300 chore: update @vitejs/plugin-react to 6.0.0 (#1002) commit 36473f7de6f32bb2765e0ad2b08e2a0c2e737d63 Author: Zortos <[email protected]> Date: Fri Mar 13 03:26:14 2026 +0100 feat: replace worktree toggle with discoverable Select dropdown (#1001) Co-authored-by: Julius Marminge <[email protected]> commit a14debc83e04ee4b28d9e3eb830f0cf74d489f93 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Fri Mar 13 00:24:53 2026 +0000 fix: block image uploads during plan mode questions (#621) commit 71a7473a81c75a70bef55844a410e5d7f1e5de10 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Thu Mar 12 23:33:37 2026 +0000 fix: composer @file autocomplete cursor and spacing bugs (#936) commit 5c03fb62c4ede0a347938b796a611d5f6b9d61fb Author: WilgotM <[email protected]> Date: Fri Mar 13 00:28:32 2026 +0100 Add Antigravity to supported editors in Open menu (macOS, Windows, and Linux) (#841) Co-authored-by: Julius Marminge <[email protected]> commit 727c0cfcbf1733edd9f23974f67c755ccbf6eee5 Author: Hugo Blom <[email protected]> Date: Thu Mar 12 23:58:51 2026 +0100 feat: Allow Overriding Timestamp Format in Settings (#855) commit dcd2e5c34fbbf6cba7cdb23caef86568771a78d4 Author: Noah Gregory <[email protected]> Date: Thu Mar 12 16:03:55 2026 -0400 fix: don't restart the app on normal exists in dev runner (#986) Co-authored-by: Julius Marminge <[email protected]> commit 1e276573c2925827691bb9840c21e8e130834aad Author: Kiyotaka <[email protected]> Date: Thu Mar 12 15:00:08 2026 -0500 feat: add fuzzy workspace entry search (#256) Co-authored-by: Julius Marminge <[email protected]> commit db17ff332307e6c80d034e6c13932d4bc253bca3 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:40:08 2026 -0700 fix syntax errors from bad merge commit b496ae839529b910d5a35e9e05d6be704a41b5a5 Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:35:21 2026 +0800 fix: add error logging for code highlighting failures (#951) commit 724f54c2c1f4a1efcd7423a5ff0e3db625629815 Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:32:00 2026 +0800 fix: clean up timeout in PlanSidebar to prevent memory leaks (#949) Co-authored-by: hobostay <[email protected]> commit b6eba3347d7a4153981269b064c4cee3b0166ebb Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:31:19 2026 +0800 fix: add logging for WebSocket errors (#948) Co-authored-by: hobostay <[email protected]> commit 74c22628b3f94b10cf9cef275fef19c5d210deb4 Author: Adam Naji <[email protected]> Date: Thu Mar 12 21:29:07 2026 +0200 chore: update actions/checkout and actions/github-script (#956) Co-authored-by: Julius Marminge <[email protected]> commit 224acebb57815193ef93c2d1861e606a626d23b3 Author: 0x1f99d <[email protected]> Date: Fri Mar 13 06:15:01 2026 +1100 fix(web): add pointer cursor to running stop-generation button (#900) Co-authored-by: Julius Marminge <[email protected]> commit 85c174a6cac04b4fda68f311a904af0435c85807 Author: Alex Schwartz <[email protected]> Date: Thu Mar 12 15:09:41 2026 -0400 fix: Linux icon now shows up (#807) commit 581d242925f80079b8add8433e0b1614bd362d88 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:01:55 2026 -0700 remove triggers commit d9d0216e98062bb69c0b3f7cb67cd9a3c5742216 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:01:27 2026 -0700 fix pr size workflow commit c52ad29b31e890164d0e22443f36c1e39483d3bc Author: Julius Marminge <[email protected]> Date: Thu Mar 12 11:41:13 2026 -0700 Fix mod+N new thread flow and terminal split limits - ensure `chat.new` creates a fresh draft after a promoted draft thread - enforce terminal cap per split group (4) while allowing additional terminal groups - refine sidebar row selected/active styling via shared class-name logic and tests commit fcbf3f3c225ab41c44af3759ae27d8520ced61a4 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 11:19:55 2026 -0700 Fix new-thread shortcuts when terminal is focused - move chat-wide key handling into `_chat` route-level shortcut handler - extract reusable `useHandleNewThread` hook and `isTerminalFocused` helper - update browser WS fixture to support `terminalOpen` RPC shape commit ab0002f99d6fb5555c57bc91f696e6a9f8f4dfd7 Author: Donald Silveira <[email protected]> Date: Thu Mar 12 15:48:23 2026 -0300 update project removal copy (#981) commit f63cda22fa6e9b98de1caec057960dce28248d37 Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:24:10 2026 -0400 fix: improve business logic in prompt editor and fix cursor bugs in Plan mode (#867) Co-authored-by: Julius Marminge <[email protected]> commit b60a34eba46ffb3e97d90a644280ba743870d85d Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:13:37 2026 -0400 fix: fix logo aligment regression on macOS (#960) commit ed4be2c849c56c105dd7ccef6b3b5908ebbc2acd Author: Jono Kemball <[email protected]> Date: Fri Mar 13 07:12:18 2026 +1300 fix: Fix response duration for agent to no longer always be 1ms (#866) commit 5e23e9c7c744724b3d17d4562aa01ce64d25066b Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:10:58 2026 -0400 add Ymit24 to vouched list (#959) commit c3bfcc36b870adbdb01552a7c6b9313a836d7d75 Author: Guilherme Vieira <[email protected]> Date: Thu Mar 12 17:50:49 2026 +0000 feat: add selective file staging to commit dialog (#872) Co-authored-by: Julius Marminge <[email protected]> commit a33cc8c75874bf89050ae90c58c5b6227debd4e2 Author: eggfriedrice <[email protected]> Date: Thu Mar 12 17:44:16 2026 +0000 fix: diff panel unclosable after retainSearchParams middleware (#937) commit a01d712751f8103001b5e728d64c12bc7c3d652a Author: Magnus Buvarp <[email protected]> Date: Thu Mar 12 18:42:17 2026 +0100 fix(web): resolve preferred editor from available editors & introduce `useLocalStorage` helper (#662) Co-authored-by: Julius Marminge <[email protected]> commit 774cff9a74bbd937021e27da524b96dbb7319a7c Author: 0x1f99d <[email protected]> Date: Fri Mar 13 03:10:07 2026 +1100 ci(github): add pull request size labels (#901) commit e3d46b687ce2537b4761ab9ae1c50db6708d3948 Author: Ymit24 <[email protected]> Date: Wed Mar 11 21:21:22 2026 -0500 feat: split out components from ChatView.tsx (#860) Co-authored-by: Christian Smith <[email protected]> commit 8636ea0ec4163714a445cf4b11d53bbf88fd9ee7 Author: Theo Browne <[email protected]> Date: Wed Mar 11 17:16:51 2026 -0700 Add maria-rcks to the list of contributors commit ff6a66dcabfcfcf28c8c8feb126a7b90842d6368 Author: David Balderston <[email protected]> Date: Wed Mar 11 14:05:17 2026 -0700 Use live thread activities for sidebar status pills (#919) commit 2ac735657e2ecf8b227c5e7685d2606063f055cf Author: maria <[email protected]> Date: Wed Mar 11 18:03:49 2026 -0300 chore(release): align package versions before building artifacts (#933) commit bbab1fc891650bcd303f69f873b609ab295b7f4c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Mar 11 17:27:36 2026 +0000 chore(release): prepare v0.0.10 commit 82a50da8b1f72da407a0c596a7be6b62e2ead284 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 18:49:04 2026 -0700 revert formatting on mockServiceWorker.js commit 7ddcb239c5ce4031653afbc404a860ccf5606549 Author: eggfriedrice <[email protected]> Date: Wed Mar 11 01:42:39 2026 +0000 feat: persist diff panel state across thread navigation (#875) commit 9e4e22197045a2d2ba7ba7d7813054e49234f6f1 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 11:55:36 2026 +1100 chore: added `eggfriedrice24` to vouched list (#869) commit e8b0126371a0d72b2a2ad71a4829e452a109a566 Author: eggfriedrice <[email protected]> Date: Tue Mar 10 23:54:47 2026 +0000 fix: checkpoint diffs never resolve (shared PubSub subscription) (#595) commit 90d9a2ad1f1810b27d88f0dfc38304ec5b1de566 Author: ranvier2d2 <[email protected]> Date: Tue Mar 10 20:50:18 2026 -0300 fix: map gitignore to ini for Shiki syntax highlighting (#848) Co-authored-by: Claude Opus 4.6 <[email protected]> commit 065ef922bdd29693738cd72f6e5e737bd93133f8 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 16:21:28 2026 -0700 Require bun fmt for completion and clarify Electron history - Update AGENTS.md task completion requirements to include `bun fmt` - Add an inline note explaining why Electron uses hash history commit 7d115334902046e42e843779f91e275ff1c96a27 Author: Jason Laster <[email protected]> Date: Tue Mar 10 15:54:34 2026 -0700 Stabilize runtime orchestration and fix flaky CI tests (#488) Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: codex <[email protected]> Co-authored-by: Julius Marminge <[email protected]> commit 1031a226f8cf90d358d9768fc0842dcdae61a315 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 15:05:41 2026 -0700 Fix cross-repo PR detection and push remote selection (#788) commit ddd98876b5fe3dcb789a36ab799e6e211a1bcb5a Author: 0x1f99d <[email protected]> Date: Wed Mar 11 08:42:39 2026 +1100 fix: invalidate workspace entry cache after turn completion and revert (#796) commit dfd41da2fdc7e9268fe0e46d3ab29d1f2161b3a2 Author: Adam Naji <[email protected]> Date: Tue Mar 10 23:41:02 2026 +0200 Fix Windows keybindings for font size: use Ctrl+ to increase (#786) commit b37279ca2117a8de4d14256c0c29c4d4429e6aa7 Author: Utkarsh Patil <[email protected]> Date: Wed Mar 11 00:16:49 2026 +0530 fix: prevent Codex overrides footer overflow with long binary paths (#707) commit 13eeb07f5f4b582e2ff824db382ff8917489c5c6 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 10:38:11 2026 -0700 prevent squashing some know errors commit 1e9bac7f6e783fe0498ddeb8392c5f4b50aad19d Author: Jono Kemball <[email protected]> Date: Wed Mar 11 06:23:52 2026 +1300 Sync desktop native theme with web theme setting (#800) commit 1c290767f22f9d8c7d3fa378d9450c8f48184679 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 04:16:37 2026 +1100 fix: use commit as the default git action without origin (#642) * fix(web): avoid push and PR defaults without origin * fmt * object here too --------- Co-authored-by: Julius Marminge <[email protected]> commit 9becb3f40af504244f85823bb19f18bfe507ca49 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 04:14:58 2026 +1100 fix(server): skip auth check when Codex CLI uses a custom model provider (#649) Co-authored-by: Julius Marminge <[email protected]> commit 2c351726ae21a73ac0549500783d5a4de6394214 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 03:46:24 2026 +1100 fix(contracts): align terminal restart input type across IPC, WS, and server (#597) commit 9e891d2e97d65a6e211e3da8ee95807b9a091563 Author: Weld <[email protected]> Date: Tue Mar 10 11:45:39 2026 -0500 Display application version in sidebar and settings (#720) commit b8d07eb852e5ea30717f4079595eb68515e930cf Author: Jono Kemball <[email protected]> Date: Wed Mar 11 05:18:22 2026 +1300 Add downloads page and shared marketing layout (#802) commit 223c3dc8005b583b19c502320f5de929958a7efd Author: Jason Laster <[email protected]> Date: Tue Mar 10 00:17:18 2026 -0700 chore(ci): add and apply `fmt:check` script (#779) * Add formatting conventions * Add a fmt lint check * rely on defaults --------- Co-authored-by: Julius Marminge <[email protected]> commit afb6e89bfdd9164c142162597bb865540b1909d2 Author: 0x1f99d <[email protected]> Date: Tue Mar 10 18:03:37 2026 +1100 feat(web): add shift-click multi-select for sidebar threads (#651) * feat(web): add shift-click multi-select for sidebar threads Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability) * fix(web): filter deleted threads from worktree orphan check during bulk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references. * fix(web): fix shift-click range selection, distinct selection styling, and deselect on click away * Preserve thread multi-select on safe sidebar control clicks - avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface --------- Co-authored-by: Julius Marminge <[email protected]> commit 9309edf4f42c59de6489f0ea1a6b72578d637b9d Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:41:22 2026 -0700 rm test commit d28ced8fd7471302d42e2e272fcbd62f9b1404c8 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:36:22 2026 -0700 Move PR checkout flow to dialog and drop /checkout-pr command - Replace the inline composer PR menu with a dedicated `PullRequestThreadDialog` - Remove `/checkout-pr` from composer slash-command parsing and tests - Fix branch selector virtualization sizing for the checkout-PR row commit 076608021c89afb294f4bdc75d99018936540c95 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:30:17 2026 -0700 Namespace PR worktree branch names under t3code - Change local PR worktree branch format from `pr/<number>-<head>` to `t3code/pr-<number>/<head>` - Update GitManager tests to assert the new branch naming convention commit fb4f9aa58ef67d192c7692dcfcb58c00a8fb7705 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:09:08 2026 -0700 Use repo initial branch in GitCore PR fetch integration test - Return `initialBranch` from test repo setup helper - Replace hardcoded `main` checkout/push/assertions with detected branch name commit de21f4dcd74037dc48d255e06ec27fd58187367b Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:56:48 2026 -0700 Use GitHubCliLive as default test layer - Wire `it.layer` to `GitHubCliLive` in `GitHubCli.test.ts` - Remove redundant `Effect.provide(GitHubCliLive)` calls in individual tests commit 442bc9540ea52e82ad15aee06e52da2c5e16f948 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:52:28 2026 -0700 Normalize remote URL matching and migrate GitHubCli tests - Treat remotes that only differ by trailing slash after `.git` as the same remote - Add a GitCore regression test for trailing-slash remote reuse - Refactor `GitHubCli` tests to `@effect/vitest` layer-based effect tests with reset cleanup commit f7570712a741136999a77d5a8f6490a8c7d9e249 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:46:53 2026 -0700 Avoid fork PR head branch collisions when creating worktrees - create a unique local branch name for cross-repo PR worktrees (`pr/<number>-<head>`) - fetch/set upstream against that local branch instead of overwriting local `main` - add regression tests for fork PRs where head branch is `main` commit 2847655a1a1f8f45d64224ee45b9262a1fc14dfc Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:35:04 2026 -0700 Validate GitHub CLI JSON with Effect Schema decoders - Replace manual JSON parsing with shared schema-based decoding helpers - Normalize PR and repository payloads after decoding for safer typed outputs - Improve invalid JSON error mapping with operation-specific GitHubCliError details commit 268016d872e724bd996fcd585835d169db903814 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:00:02 2026 -0700 Fix PR thread upstream tracking for fork branches - Restore/set upstream tracking when preparing local and reused PR worktrees - Derive fork `owner/repo` from PR URL when GitHub omits `headRepositoryNameWithOwner` - Expand GitManager tests to cover local mode, URL-derived fork identity, and reused worktree upstream recovery commit ac3f22c274e5b116b04220b29d1470e9d39bd0f2 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:57:59 2026 -0700 Inline branch picker filtering and drop PR-only shortcut - move branch filtering logic into `BranchToolbarBranchSelector` - remove unused `filterBranchPickerItems` helper and related tests - keep create-branch option pinned while filtering by query commit b36888e9cc3692f931081a4d09bd58438d5f06eb Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:24:28 2026 -0700 Preserve fork PR upstreams when preparing local and worktree threads - add GitCore helpers to ensure remotes, fetch remote branches, and set upstreams - extend GitHub CLI parsing to include cross-repo PR metadata and repo clone URLs - update GitManager flow and tests to materialize fork heads and keep tracking on fork remotes commit 9bb9023009b0c45c66a609c386cd233855043caf Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:03:24 2026 -0700 Handle branch selection across main and secondary worktrees - add `resolveBranchSelectionTarget` to unify checkout cwd/worktree decisions - reuse existing worktrees when available, including switching back to main repo - update branch selector to use shared logic and add targeted unit tests commit f70cb5de4517e55f62ed2c71e49291d97a7dc927 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:56:11 2026 -0700 Refine branch picker behavior and gate /checkout-pr by thread type - Add shared branch picker filtering logic and tests, including PR-reference-only results - Improve branch selector UX/perf with deferred query filtering, conditional virtualization, and status-based current branch resolution - Only expose and handle `/checkout-pr` for local draft threads in chat and toolbar UI commit 3d3586800ebfbefb97a4a782dae3439e90ba9065 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:00:23 2026 -0700 Add pull-request thread setup for local and worktree modes - Add git APIs to resolve PR refs and prepare PR thread workspaces - Support fetching PR head refs into local branches and reusing existing worktrees - Wire new websocket/contracts/web composer flows for PR-based thread creation - Expand server/web/contracts tests for PR routing and branch/worktree behavior commit 767de271e972b38de0633c04efcd62a929790b3e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:46:38 2026 -0700 Use Effect UUID generator as randomUUID fallback - Replace manual UUID byte formatting fallback in `apps/web/src/lib/utils.ts` - Use `Effect.runSync(Random.nextUUIDv4)` when `crypto.randomUUID` is unavailable commit 9d2c2cae375b6dfc7469c1ada07a109779364846 Author: Hiram Chirino <[email protected]> Date: Mon Mar 9 07:30:00 2026 -0400 fix(web): polyfill crypto.randomUUID for non-secure HTTP contexts Replace direct crypto.randomUUID() calls with a randomUUID() helper in utils.ts that falls back to crypto.getRandomValues() when the browser is not in a secure context (e.g. plain HTTP on a non-localhost address). Signed-off-by: Hiram Chirino <[email protected]> commit dcccca3f7b5d089f9946b866c9a149e94fd4c616 Author: David Balderston <[email protected]> Date: Mon Mar 9 19:38:51 2026 -0700 Fix UI Overflow when Github Action is 'Commit, Create & Push PR' Fixes: #769 * Updated wording for label from 'Commit, Create & Push PR' to 'Commit, Create & PR' to allow for it to fit within the current UI size constraints. wording change commit 4ed89e4ba72e47f7919b3b8e08d375bc912d89e4 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:16:44 2026 -0700 Treat retryable Codex errors as runtime warnings - Map Codex `error` notifications with `willRetry: true` to `runtime.warning` - Keep active turns/sessions running during reconnect warnings - Add adapter and ingestion tests for retry-warning behavior commit 99dbe4ff02d9ee8e5450e96d84e8f96170c64a71 Author: Satyam Bansal <[email protected]> Date: Tue Mar 10 00:41:17 2026 +0530 fix(web): disable add project button for empty path commit 2fc0b01c18ab8ec92eaabb56cfdd92d070cd9a35 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:16:16 2026 -0700 fmt commit 3a86b60680f147ef1420558548354bbfa0253f5b Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:12:42 2026 -0700 Render collapsed plan preview directly as markdown - remove deferred collapsed preview state in `ProposedPlanCard` - always render collapsed preview with `ChatMarkdown` for simpler, consistent display commit eb7c428a2d3438f2ba72fb83c5df750236517a77 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:09:04 2026 -0700 Defer proposed plan rendering until expand in ChatView - Keep long plan cards collapsed with lightweight preview text by default - Render full plan markdown only after explicit expand to reduce thread open slowness - Add tests for preview/strip helpers and browser coverage for expand behavior commit 9fb9467ed1cf296c964a7a7d7a99ab1ad4e5e422 Author: Cursor Agent <[email protected]> Date: Mon Mar 9 22:04:02 2026 +0000 fix: keep suppressProjectClickAfterDragRef true on drag cancel to prevent unintended toggle Co-authored-by: Julius Marminge <[email protected]> Applied via @cursor push command commit e42036485fd7fe19c8536ba3fd59573ebf592349 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:25:06 2026 -0700 Improve project drag collision detection in sidebar - Prefer pointer-based hit testing during project reordering - Fall back to corner-based collision to make drop targeting more reliable commit f9c3aff294e7493751f36504f65089fd2d5586fd Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:13:55 2026 -0700 no longer need experimental for tsconfig aliases commit 3503dbc7d5b22d9947744ee4e2ee2324d9303825 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:12:19 2026 -0700 pin vite commit b5dde6b9d865930bc2b981816dde3f614e892813 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 11:42:13 2026 -0800 Prevent stale click suppression after project drag cancel - Reset post-drag click suppression when drag is canceled - Consume only the synthetic click after drag release, then clear suppression commit a6b22ec1c9b247536111dd2c2e8682f9b3f550c5 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 11:39:29 2026 -0800 Fix project drag clicks and sidebar collapse/scroll behavior - prevent accidental project toggles after drag operations - switch project rows to Collapsible for stable expand/collapse animation - add optional hidden scrollbar mode to ScrollArea and apply it in SidebarContent commit bb49ebf6e54a078f9937f85de338ac5c8fc4a236 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 10:48:07 2026 -0800 Add drag-and-drop project reordering in the sidebar - wire project list to dnd-kit sortable with vertical drag constraints - prevent accidental expand/collapse clicks during drag gestures - update store logic/tests and add dnd-kit dependencies commit 2f5e62602948ba624fa470ea8c9f6e9dc1cb0557 Author: Levi <[email protected]> Date: Mon Mar 9 13:55:22 2026 -0500 Fix project name badge truncation in chat header Remove the hard max-w-28 (112px) cap and shrink-0 on the project name badge so it uses available flex space instead of aggressively truncating. commit 82c0a45ea0334a8ffd5747e080ca693f54921d66 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 13:00:27 2026 -0700 Use Debouncer for composer draft persistence writes - Replace manual timeout/pending-value debounce logic with `@tanstack/react-pacer` `Debouncer` - Keep `removeItem`/`flush` behavior while simplifying and standardizing persistence timing commit e765051f148bf6006e30118eb47f5d33ea9e32be Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:45:34 2026 -0700 Use React Pacer throttler for domain event snapshot sync - Replace manual timeout-based domain event batching with `Throttler` - Keep provider query invalidation batched with trailing 100ms flushes - Cancel throttler and reset invalidation flag during EventRouter cleanup commit f5e4df5cab247021501876358fd72c7196cd96b9 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:28:26 2026 -0700 Use Debouncer for store state persistence - Replace manual timeout debounce logic with `@tanstack/react-pacer`'s `Debouncer` - Persist updates via `maybeExecute` to reduce localStorage write thrashing - Flush pending persistence on `beforeunload` to avoid losing recent state commit 1f47cc6f4e51d236421d45bafabaa3bbf2576c3f Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:23:33 2026 -0700 Remove ProviderHealth onReady callback from service interface - Drop the unused `onReady` hook from `ProviderHealthShape` - Keep startup health status access focused on `getStatuses` commit 074d3af79c3a19e7fc0d4c3ec2f3a6c6b6e46d55 Author: Tim Smart <[email protected]> Date: Mon Mar 9 12:18:33 2026 -0700 cleanup Co-Authored-By: Claude Opus 4.6 <[email protected]> commit 6593645c8092696403f39e7d6eeebeec190385dc Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:26 2026 +0000 perf: run provider health checks in background, notify clients on ready The ProviderHealth layer blocked server startup with two sequential CLI spawns (codex --version + codex login status), each with a 4-second timeout, delaying startup by up to 8 seconds. Run health checks in the background via Effect.runPromise so the layer resolves immediately with a placeholder status. Add an onReady callback to ProviderHealthShape so wsServer can push the resolved statuses to connected clients once checks complete, preventing early-connecting clients from showing "Checking..." indefinitely. commit 296eb82c312b3c36237b51870b9a87249f5c6d83 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:14 2026 +0000 perf: throttle domain event processing with 100ms batch window During active sessions, every domain event triggered a full syncSnapshot (IPC fetch + state rebuild + React re-render cascade) and sometimes a provider query invalidation. Events fire in rapid bursts during AI turns. Replace per-event processing with a throttle-first pattern: schedule a flush on the first event, absorb subsequent events within a 100ms window, then sync once. Provider query invalidation is batched via a flag. Since syncSnapshot fetches the complete snapshot, no events are lost by skipping intermediate syncs. commit 7a377fc5e4d607a475a7d36957689562d5dcccb9 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:02 2026 +0000 perf: debounce Zustand store persistence and deduplicate legacy cleanup The useStore subscriber called persistState on every state mutation, triggering JSON.stringify + localStorage.setItem synchronously. It also ran 8 localStorage.removeItem calls for legacy keys on every fire. Wrap the subscriber with a 500ms debounce so rapid state changes batch into a single write. Move legacy key cleanup behind a one-time flag so it runs only once per page load. Add a beforeunload handler to flush the final state. commit 90e0c2ab15e7034d8e6e0688b3996fd905c03017 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:21:52 2026 +0000 perf: debounce composer draft localStorage writes Every keystroke triggered full JSON serialization of all composer drafts (including base64 image attachments) and a synchronous localStorage write. At normal typing speed this caused 5+ writes/sec, blocking the main thread and creating noticeable input lag. Wrap the Zustand persist storage with a 300ms debounce. In-memory state updates remain immediate; only the serialization and storage write are deferred. A beforeunload handler flushes pending writes to prevent data loss. The removeItem method cancels any pending setItem to avoid resurrecting cleared drafts. Adds unit tests for the DebouncedStorage utility covering debounce timing, rapid writes, removeItem cancellation, flush, and edge cases. commit 7a3d4d1f31e4316eb832f820012bf575aa57669a Author: Cursor Agent <[email protected]> Date: Mon Mar 9 18:57:17 2026 +0000 fix: stabilize onToggleRuntimeMode with useCallback to preserve memo Co-authored-by: Julius Marminge <[email protected]> Applied via @cursor push command commit e354e8697f490c729d7022b28e921f4c12e0a8ae Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:17:43 2026 -0700 Prevent compact diff sidebar from breaking chat composer layout - Add composer footer/action data attributes for targeted width measurement - Enforce a minimum composer width before allowing inline diff sidebar commit 993b5785121765a56628bfd4852591f672b743af Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:13:09 2026 -0700 Use form clientWidth for composer compact footer checks - Measure composer width from the form element in initial and resize paths - Avoid relying on ResizeObserver contentRect width for compact footer layout decisions commit ed518ef19f33bf073f48fe9b24442f063fa1bee7 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:08:07 2026 -0700 Fix provider picker after rebase Co-authored-by: codex <[email protected]> commit 47117a7d85b6696e3ad3ae7d59303b3a60e9eea5 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:56:56 2026 -0700 Inline SidebarInset base classes and remove dead sidebar logic - Replace `SIDEBAR_INSET_BASE_CLASSNAME` with an inline class string in `sidebar.tsx` - Delete the now-unused `sidebar.logic.ts` helper and its focused unit test commit f62381090323ae15ffab480bdeeb868e61274fbf Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:45:16 2026 -0700 Adapt composer footer to compact controls on narrow widths - add shared footer layout breakpoint helper with tests - switch chat composer footer to compact menu when width is constrained - preserve plan sidebar toggle behavior while consolidating footer actions commit e9ffd5752bb56854f8693f4a37dee3b3b7afcd3e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:01:33 2026 -0700 Fix plan composer layout and sidebar flex shrink behavior - add `min-w-0` to chat/flex containers to prevent composer/sidebar overflow - move `BranchToolbar` into the chat column so layout stays aligned with plan sidebar - extract sidebar inset base classes to shared logic and add a regression test for `min-w-0` commit 24122b17629451e4614d34f3b771769e87b99d79 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:28:30 2026 -0700 Stabilize toast stacking offsets to prevent hover flicker - derive toast indices and Y offsets from the filtered visible toasts - pass frontmost height and per-toast layout vars to the viewport/item styles - add unit tests for visible toast layout calculations and height normalization commit 081a6dacdbb623da0b560360384d58cb95a484e5 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:29:20 2026 -0700 Remove fast-tier icons from model selection UI - delete `shouldShowFastTierIcon` and its test - remove Zap icon badges from slash model commands and provider model picker - simplify related ChatView props and memo dependencies commit 9fdb45be1efb0e0b542a0dd78d868de6f71d7d4a Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:13:52 2026 -0700 Remove service tier setting from Codex flow and contracts - Drop `serviceTier` from orchestration/provider contracts and server dispatch paths - Remove service-tier app setting/UI and related resolver logic - Keep fast badge behavior tied to explicit fast-mode boolean commit b946f00f1a31f16a51f9bd1f579baf40c8eaed83 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:42:19 2026 -0700 Show Plan Ready status pill for settled plan threads - add "Plan Ready" sidebar status when a plan-mode turn is settled with a proposed plan - update sidebar logic tests to cover the new status and expanded thread inputs commit b030f69a833802fae9222781ef2dc822dfe81aac Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:14:08 2026 -0700 Show Awaiting Input status in sidebar and extract status logic - add `Sidebar.logic.ts` to centralize thread status pill resolution - show `Awaiting Input` when plan mode is blocked on user responses - add unit tests for unseen completion and status-priority behavior - prevent plan collapse/expand clicks from triggering chat scroll anchoring commit b0e1b3368e47c8b470f988312309a9784421b69a Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:21:32 2026 -0700 Show toast when immediate project add fails - Use a toast error for add-project failures during immediate folder browse - Keep inline add-project error state for non-immediate flows - Include `shouldBrowseForProjectImmediately` in callback dependencies commit ce7b24bfb151cc5dfee54d669c3490611e74119e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:14:18 2026 -0700 Inline Electron project picker check in Sidebar - Replace `shouldOpenProjectFolderPickerImmediately` with direct `isElectron` usage - Remove obsolete `Sidebar.logic.ts` and its tests commit 5c286cab8b87fa5055533c54721cca52ec32050d Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:10:37 2026 -0700 Open project folder picker immediately in Electron - remove mobile-width gating from sidebar project picker behavior - simplify picker logic/tests to depend only on Electron runtime commit 75ca0d4fa41a4b5a85a6aa852dad813fbcbb94db Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:02:56 2026 -0700 Open folder picker immediately on desktop Electron - add `shouldOpenProjectFolderPickerImmediately` to centralize Sidebar behavior - trigger folder browse directly when adding a project in desktop Electron - keep manual path entry for mobile layouts and non-Electron, with tests for all cases commit 8282b11fb55e50147a33e476ee8563ceaf1e75d7 Author: 0x1f99d <[email protected]> Date: Tue Mar 10 02:29:49 2026 +1100 refactor(contracts): remove unused OrchestrationPersistedEvent schema (#601) commit 45744cc7893243b5ad17b153fb250d50ce87d80c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Mar 9 11:17:07 2026 +0000 chore(release): prepare v0.0.9 commit 4b6a0c433cb808a0ebdd30ec48e799b6543d2cc9 Author: Sai Shankar <[email protected]> Date: Mon Mar 9 16:33:13 2026 +0530 fix(web): fix native scrollbar being intercepted by sidebar rail on windows and linux (#618) the rail's 16px hit area at z-20 sits right where the native os scrollbar lives when the sidebar is in offcanvas mode and collapsed. this causes clicks and drags on the scrollbar to toggle the sidebar instead on windows and linux. scoping pointer-events-none to [data-collapsible=offcanvas][data-state=collapsed] fixes the interception without affecting icon mode where the rail needs to stay clickable. commit 304a14de7d6f0b9977c8ecc4bced5b5f359ce02e Author: Theo Browne <[email protected]> Date: Mon Mar 9 04:01:23 2026 -0700 Fix users who installed intel builds on arm macs (#641) commit c585128bbe0311615c58921909467f49600cb85f Author: Theo Browne <[email protected]> Date: Mon Mar 9 01:20:14 2026 -0700 ARM ALWAYS FUCK YOU INTEL commit acd92f9b061b8638ef9cfe974dad19042b3762e8 Author: Theo Browne <[email protected]> Date: Mon Mar 9 01:12:55 2026 -0700 include sourcemaps commit 4088b7ac3cddc1fc92ccf3f99e7a844c629ebad0 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 16:02:15 2026 +1100 fix(desktop): use filesystem-friendly userData directory name (#607) Electron derives the userData path from productName in package.json, which produces directories with spaces and parentheses on all platforms (e.g. ~/.config/T3 Code (Alpha) on Linux). This is hostile to shell usage and violates Linux XDG naming conventions. Override the userData path via app.setPath() before the ready event to use a clean lowercase name (t3code). If the legacy directory already exists it is used as-is so existing users keep their Chromium profile data (localStorage, cookies, sessions, cache). This follows the same pattern VS Code uses — keeping productName for display purposes while explicitly setting the data directory path. Closes #578 commit 8e8904a159e3b29fa1eae0e6f023872ef03a3f63 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 15:55:09 2026 +1100 refactor(web): remove redundant double parse of diff route search params (#598) `rawSearch` is already the output of `parseDiffRouteSearch` via the `useSearch` select transform. The `useMemo` at line 760 re-parsed it through the same function with an unsafe `as Record<string, unknown>` cast, producing an identical result. Use `rawSearch` directly instead. commit 16f3490aee9ab9928ae7ac084117517495155e96 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 15:53:26 2026 +1100 fix(ci): handle draft PR conversions in pr-vouch (#611) commit 651084e8c05bf6da329108b098e4fd81322ee785 Author: Jono Kemball <[email protected]> Date: Mon Mar 9 17:43:35 2026 +1300 fix: fix external link opening in desktop (#599) fixes #434 commit 812bb99f5c182351d0d899c9a88033d61fd7370a Author: Theo Browne <[email protected]> Date: Sun Mar 8 21:43:17 2026 -0700 Add Noojuno to vouched commit 5bc79807ec33f0b7f3633ad6dc54fcedf0de3a73 Author: Jason Laster <[email protected]> Date: Sun Mar 8 22:40:44 2026 -0600 Add an encyclopedia of common terms (#613) commit 8fe21d7583a21a19c98b0e24a64dd0d7029b41b0 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Mar 9 03:43:56 2026 +0000 chore(release): prepare v0.0.8 commit 412331aa61a9a38d61f17755d67ed0f8212920d2 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 14:39:41 2026 +1100 fix(web): add missing v7 key to legacy localStorage cleanup list (#594) When the persisted state key was bumped from v7 to v8 in 689dda59, the v7 key was not added to LEGACY_PERSISTED_STATE_KEYS. Users who ran the app during the ~3-week v7 window retain a stale `t3code:renderer-state:v7` entry in localStorage that is never cleaned up. commit cd1c3df89cfa681622292f7f2a9777f81f8e2f10 Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:36:37 2026 -0700 Add PR vouch workflow with trust-status labels (#602) * Add PR vouch workflow and trust-status labeling - Add `.github/workflows/pr-vouch.yml` to label PRs as trusted, unvouched, or denounced - Add `.github/VOUCHED.td` trust-list file for external contributors - Document automatic `vouch:*` labels and contributor expectations in `CONTRIBUTING.md` * Add vouch entries for trusted GitHub contributors - Append 16 GitHub accounts to `.github/VOUCHED.td` - Update trusted-voucher list used for PR labeling workflows commit 3738373aa5ff0fff074ecb95686ef952c209957e Author: 0x1f99d <[email protected]> Date: Mon Mar 9 14:36:03 2026 +1100 fix(server): use waitForPush in terminal event broadcast test to prevent flaky failure (#606) The terminal RPC test used raw waitForMessage to receive the expected terminal.event push, but a server.configUpdated push from the keybindings file watcher can arrive first depending on OS timing. Replace with the existing waitForPush helper that filters by channel. commit 9b9006fed571dbeb1c810493500a679a49a2ba38 Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:30:01 2026 -0700 Fix release finalize lockfile refresh (#608) * Add checkout and Node setup to release updater publish job - Ensure the updater publish job checks out the target ref - Initialize Node using the repository's package.json version file before downloading artifacts * Fix release finalize lockfile refresh commit 42234b8f7cbe4465370fa0511f3fe26df2a2ae2e Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:12:31 2026 -0700 fix: plan mode ui overhaul (#596) * new plan mode started * review comments * more fixes commit 39f65703e7bd97df787ba45373ed75dddae9bb2f Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:00:15 2026 -0700 Add checkout and Node setup to updater publish workflow job (#605) - Ensure the updater publish job checks out the target ref - Initialize Node using the repository's package.json version file before downloading artifacts commit b7f954a9041ee4524552ad0993e8b7711c86ff8a Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Mon Mar 9 01:58:25 2026 +0000 Fix ChildProcess.spawn failing on Windows for .cmd shims (#495) * fix(scripts): enable shell mode on Windows for .cmd shim resolution On Windows, tools like `bun`, `npm`, `turbo`, and `bunx` are installed as `.cmd` shims. Node's `child_process.spawn` cannot resolve these without `shell: true`, causing `PlatformError: NotFound` on fresh builds where there is no Turbo cache. Add `shell: process.platform === "win32"` to all ChildProcess.make calls in cli.ts, dev-runner.ts, and build-desktop-artifact.ts. Closes #474 * docs: add comments explaining Windows shell spawn requirement * docs: add shell spawn comments to remaining call sites commit a20815ece6ea877a2b82072339f4bced98d757f7 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 12:56:29 2026 +1100 fix(web): align sidebar logo with macOS traffic light buttons (#586) Adjust the Electron sidebar header to properly center the T3 wordmark with the native window controls. The logo was sitting ~2px too low and ~8px too close to the traffic lights. - Reduce wordmark container top margin from mt-2 (8px) to mt-1.5 (6px) - Increase Electron header left padding from 82px to 90px for proper traffic light clearance - Match the desktop update button margin to stay aligned Closes #564 commit 1c43bad705bd1d953fd168aa0b852c8b2d83ee84 Author: Mubin Ansari <[email protected]> Date: Mon Mar 9 07:21:55 2026 +0530 Add `delete` option for project actions (#223) Adds a delete button to the action edit dialog with a confirmation alert. Fixes pingdotgg/t3code#208. commit 18b6590d2e490bd73ba968b094dc221ffb7c0f67 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Mon Mar 9 01:36:52 2026 +0000 feat(desktop): add spellcheck suggestions to context menu (#500) Wire up Electron's context-menu event on webContents to surface dictionary suggestions for misspelled words. Standard edit actions (Cut, Copy, Paste, Select All) appear in all context menus. Related to #473 commit d62ffa7560bffeb2509ed115eed31dd5bc231ca6 Author: Theo Browne <[email protected]> Date: Sun Mar 8 18:27:04 2026 -0700 pr changes pt2 commit 59e2944fb72d8ef8c3b55fec3be766abe48df820 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 12:24:56 2026 +1100 fix(web): add dismiss button to thread error banner (#588) The thread error banner had no way to be dismissed. Users hitting unrecoverable errors (e.g. missing gh CLI during PR creation) were stuck with a persistent error banner and no way to clear it. Add a dismiss (X) button to ThreadErrorBanner using the existing AlertAction component, wired to clear the thread error via setThreadError(id, null). Closes #496 commit 17942787aa06070aa21ad6ae357e08f674383c4d Author: Theo Browne <[email protected]> Date: Sun Mar 8 18:21:31 2026 -0700 fix: settings in sidebar, better add project flow (#584) * improvements * sidebar ui pt2 * back flow * fix back flow commit 5815ba24e2478b2801fab98163e72dd476e5c280 Author: Theo Browne <[email protected]> Date: Sun Mar 8 18:20:05 2026 -0700 Add pull request template with contribution notice and review checklist (#582) * Add PR template with contribution notice and review checklist - Add `.github/pull_request_template.md` - Set expectations that external PRs may not be reviewed or merged - Require clear change rationale plus UI before/after media when applicable * Add contribution policy notice and link detailed guidelines - add CONTRIBUTING.md with clear expectations for external PRs - update README to direct would-be contributors to CONTRIBUTING.md first commit 5de8e9d1ae5dfae3e7ea2bb64c9ecd1420d63821 Author: Noah Gregory <[email protected]> Date: Sun Mar 8 21:03:18 2026 -0400 fix: properly emit update metadata for intel macs (#446) * fix: properly emit update metadata for intel macs * refactor: fix broken parsing of quoted values commit 96e1e3db5eab48d641c80b0af009f2743b585535 Author: Aditya Vardhan Sharma <[email protected]> Date: Mon Mar 9 00:45:40 2026 +0000 feat(marketing): add platform detection for download button (#558) commit 5dd36bc5ad8a1cfdae54005ea5723bc19528cdc5 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun Mar 8 23:52:20 2026 +0000 chore(release): prepare v0.0.5 commit 6271b989bc72a255483aa96ccb2868ef4655341d Author: Patrick Bauer <[email protected]> Date: Mon Mar 9 00:30:25 2026 +0100 fix(web): use wss:// when page is served over HTTPS (#391) When T3 Code web mode is accessed via HTTPS (e.g. through a reverse proxy or Tailscale Serve), the WebSocket connection must use wss:// instead of ws://. Browsers block mixed content — an insecure ws:// connection initiated from an HTTPS page. Fix: derive the WebSocket protocol from window.location.protocol. Co-authored-by: PatrickBauer <[email protected]> commit 57aa6bf16cd0dcfbe9037a5ca29ad61bdd2a857e Author: James <[email protected]> Date: Mon Mar 9 10:29:34 2026 +1100 fix: avoid duplicating streamed assistant completion text (#465) commit 40a7f4b4b1780c24db24a201f5b0860ce9763028 Author: Kainoa Newton <[email protected]> Date: Sun Mar 8 16:27:39 2026 -0700 Rename Open PR action label to View PR (#467) - Update GitActionsControl quick/menu action text for existing pull requests - Align unavailable-state copy and tests with the new label commit cba0f23a9e003a522c0f92f5391f15f0879a98f2 Author: Kainoa Newton <[email protected]> Date: Sun Mar 8 16:27:03 2026 -0700 Remove extra dot from working indicator (#481) - Drop the redundant static bullet before the working status text in `MessagesTimeline` - Keep the animated dots indicator as the sole working-state visual cue commit a7ec0179fb42b12ab7e1fd4c2cabd508c8f8de67 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 22:55:49 2026 +0000 Fix codex binary path setting having no effect (#493) * refactor(contracts): export ProviderStartOptions schema * feat(contracts): add providerOptions to ThreadTurnStartCommand * feat(web): send codex binary/home path settings to server * feat(server): thread providerOptions through to session startup * fix(contracts): define ProviderStartOptions inline to avoid circular dep The import from provider.ts caused a ReferenceError at runtime because of module initialization order in the bundled output. * fix(server): preserve providerOptions across runtime mode changes and session recovery Runtime mode toggles and server restarts silently dropped the custom codex binary/home path, falling back to the default binary. Cache providerOptions per thread in ProviderCommandReactor and persist it in the session binding's runtimePayload so recovery can restore it. Closes #486 commit c97c6b7836ce888b24a157de8eb4aea761028979 Author: Jason Laster <[email protected]> Date: Sat Mar 7 14:12:11 2026 -0700 Enforce minimum Codex CLI version (≥0.37.0) before starting sessions (#404) Add a pre-flight version check that runs `codex --version` and blocks session startup with a clear upgrade message when the installed CLI is below v0.37.0. The check runs both synchronously at session start (codexAppServerManager) and during provider health probes (ProviderHealth), so users get fast feedback in the UI. Introduces `codexCliVersion.ts` with semver parsing, comparison, and formatting helpers shared by both call sites. commit 59b0527c38905784a04bd530f2a4a7d38073c72c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat Mar 7 12:19:51 2026 +0000 chore(release): prepare v0.0.4-alpha.1 commit b74c7a79abbfbb7f6e8c5c4affb20784cea2b11c Author: Theo Browne <[email protected]> Date: Sat Mar 7 04:05:36 2026 -0800 Handle prerelease tags in GitHub release publishing (#344) * Handle prerelease tags when publishing GitHub releases - Derive `is_prerelease` and `make_latest` from the version format in preflight - Mark suffixed versions (for example `1.2.3-alpha.1`) as prereleases - Keep only plain `X.Y.Z` releases marked as latest - Document prerelease/latest behavior in `docs/release.md` * Force desktop auto-updates to stable latest channel - set Electron updater channel to `latest` - disable prerelease and downgrade updates regardless of app version commit f772720d8c2a90448154271d7e4623f40cdf83fc Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat Mar 7 10:38:31 2026 +0000 chore(release): prepare v0.0.4 commit 0763a35fbc60d6209209a5545ab64e1631f43d48 Author: Hwanseo Choi <[email protected]> Date: Sat Mar 7 19:20:17 2026 +0900 Fix `bun run dev:desktop` from not terminating properly on SIGINT/SIGTERM/SIGHUP (#305) * fix: handle turbo shutdown in dev runner * refactor: rely on effect child process shutdown * refactor: inline turbo shutdown timeout * add back sigint sigterm sighup handling * refactor: tighten turbo signal forwarding * refactor: inline dev runner errors * fix: use detached false instead of manual signal forwarding Effect defaults to detached: true on non-Windows, putting turbo in a new process group where terminal signals (Ctrl+C) never reach it. Setting detached: false keeps turbo in the same group, eliminating the need for ~130 lines of manual signal forwarding. * Update scripts/dev-runner.ts Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]> commit e1c33dcd33949c18eb30986ba513c1334064677c Author: Guilherme Barros <[email protected]> Date: Sat Mar 7 11:14:30 2026 +0100 Fix Fish shell PATH detection and clean up lint warnings (#323) * Fix Fish shell PATH detection for Codex * refactor(provider): resolve lint warnings in provider layers * refactor(terminal): simplify thread lock release initialization * test(git): simplify fetch release callback initialization commit 0a902790cacb20d38c6f36fe331ac283a2c74b0f Author: Ahmed R. <[email protected]> Date: Sat Mar 7 04:12:54 2026 -0600 Fix crash when rendering code blocks with unsupported languages (#266 & #210) (#279) The app crashed when displaying code blocks with language identifiers not bundled in Shiki (e.g. "env" from .env file edits). The language string was cast to SupportedLanguages without validation, causing resolveLanguage to throw an unhandled error that killed the thread. Three layers of defense added: - getHighlighterPromise falls back to "text" when Shiki rejects - codeToHtml call wrapped in try/catch with "text" fallback - CodeHighlightErrorBoundary prevents component tree crashes Closes #266 Co-authored-by: Ahmed R <[email protected]> commit 0837c8b639f3fb54c155d824c308c6b03038fa9c Author: Theo Browne <[email protected]> Date: Sat Mar 7 02:06:55 2026 -0800 fix: everything AICodeKing reported (#320) * Guard non-git projects and improve send and diff UX - Skip checkpoint capture/revert and turn diff ingestion for non-git workspaces - Normalize project workspace roots and return clearer request/error messages - Show "No Git" state in chat/diff UI and enrich work log with commands/files - Track send start time so working status shows elapsed duration consistently * Format active working timer in concise h/m/s units - add `formatWorkingTimer` for human-friendly durations in ChatView - show active "Working for" time as `0s`, `1m 5s`, or `2h 3m` instead of ms * more cleanup * Fix active work timing and use temp git workspaces in tests - derive active work start from unsettled turn state instead of always latest turn - update chat view to use shared deriveActiveWorkStartedAt helper - make server/ws tests create temporary workspace roots with .git for project creation commit 5a90b6be9c902df934bada91b543865c197cfb2d Author: JoeEverest <[email protected]> Date: Sat Mar 7 04:51:44 2026 +0300 Tailwind v4 Preflight resets list-style to none on ul/ol elements. Restore disc/decimal markers and add nested list style variants (circle, square, lower-alpha, lower-roman) for visual distinction. commit 42675571c94ef07040f9016df35236d83f26f037 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat Mar 7 00:57:40 2026 +0000 chore(release): prepare v0.0.3 commit e9f00f65caf765239acc713b7c05dd177c3a2983 Author: Theo Browne <[email protected]> Date: Fri Mar 6 16:56:10 2026 -0800 Update README command and support link - switch quickstart command from `npx t3@alpha` to `npx t3` - fix wording in desktop app sentence - replace "Discord link coming soon" with invite link commit 04b95e37c582c81c3fd67748dcae40f4b0a56b90 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 16:27:42 2026 -0800 Change CLI package publish tag from alpha to latest commit 5820e1b6fff6a8ca2a5d9cc1626dfd7bd8dc61fc Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat Mar 7 00:17:26 2026 +0000 chore(release): prepare v0.0.2 commit 8c904ffe340e6a915676fd9b944eeb9366f849f3 Author: Theo Browne <[email protected]> Date: Fri Mar 6 15:53:32 2026 -0800 Add production favicon set for marketing page (#196) - add 16x16, 32x32, and Apple touch icon assets - update `index.astro` head links to reference size-specific favicons commit 9fa9cb4b31766eed28b9a6319ee7f88a52798f71 Author: Theo Browne <[email protected]> Date: Fri Mar 6 15:53:12 2026 -0800 Soften chat composer focus border color (#188) - Reduce focused composer border intensity using `focus-within:border-ring/45` - Keeps drag-over styling behavior unchanged commit 24599aaeed1090d9b1f6529d3a75e71c5ce591e5 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Mar 6 23:08:37 2026 +0000 chore(release): prepare v0.0.0-alpha.22 commit f403b23e9af62e31b05c3444c47fa8762fd82c46 Author: Theo Browne <[email protected]> Date: Fri Mar 6 14:55:24 2026 -0800 Add Shift+Tab shortcut to toggle composer plan mode (#186) - add Shift+Tab keyboard handling in composer to switch chat/plan modes - refactor mode toggle into shared callback used by hotkey and button - add browser test to verify toggling only works when composer is focused commit 39c71a0394ac5fead439ac0cec4a89ef1f6b9389 Author: Theo Browne <[email protected]> Date: Fri Mar 6 14:45:41 2026 -0800 Redesign marketing site with Astro (#187) * marketing site * redesign 1 * more * Redesign marketing site: port to Astro, minimal dark homepage Replace the React/Vite marketing site with a single static Astro page. Dark theme matching the app aesthetic, featuring the production glossy T3 icon, app screenshot, and a clean minimal layout. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix GitHub link to pingdotgg/t3code Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> commit d249e628eef2cd8dcd4c5b9c79c443b77ca4a851 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 13:54:31 2026 -0800 Stage production icons for desktop builds and publish (#168) * Stage production icons for desktop builds and publish - add shared brand asset paths and a Windows .ico asset - stage Linux/Windows icons in desktop artifact builds - override and restore publish favicon during server CLI publish * 'blip' * Fix PR review issues for publish icon staging * Refactor brand assets and harden Windows desktop build setup * Apply remaining server orchestration updates * Fix production mac icon asset Co-authored-by: Theo Browne <[email protected]> --------- Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Theo Browne <[email protected]> commit 40fcb6bdf8d726f35c6d3aec82d0cce6345c9dcd Author: Yash Singh <[email protected]> Date: Fri Mar 6 15:48:37 2026 -0600 fix: restrict spark to non-plus users & fast mode gpt5.4 (#180) * fix: restrict spark to non-plus users & fast mode gpt5.4 * nit * tests * tests --------- Co-authored-by: Theo Browne <[email protected]> commit d58ff5de26b9753c3dbd13cb55e532ccd44ba0d2 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 09:01:10 2026 -0800 Streamline composer behavior during pending approvals - Treat pending approvals as a dedicated composer state - Disable prompt input and hide command menu/image chips while approval is active - Move approval decision buttons into footer actions and simplify the header panel commit e28ad181066edece29f98aa717c01fc9f347e33a Author: Julius Marminge <[email protected]> Date: Fri Mar 6 08:59:10 2026 -0800 Inline pending approvals in composer header Co-authored-by: codex <[email protected]> commit 525411101dc6c2f68e4950875bebb001c80b90f8 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Mar 6 08:08:47 2026 +0000 chore(release): prepare v0.0.0-alpha.21 commit 0f208447ed78ba3bc7a3d7cee17f516bd18a67f2 Author: Julius Marminge <[email protected]> Date: Thu Mar 5 23:52:14 2026 -0800 Prefer base HTML icon for .html files - Override `.html` language mapping to use the generic HTML icon - Add test coverage asserting `index.html` resolves to `file_type_html.svg` commit 71e057345902d9301f9b9d8956f4cf764a6d7fd8 Author: Theo Browne <[email protected]> Date: Thu Mar 5 23:48:17 2026 -0800 @alpha commit c63ea8d25b4d05d32fc061736bc6a0934ac682fb Author: Julius Marminge <[email protected]> Date: Thu Mar 5 23:22:32 2026 -0800 Use project cwd when opening draft threads without worktree - Pass resolved `openInCwd` from ChatView into OpenInPicker - Fall back to project `cwd` when draft thread has no `worktreePath` - Add browser test covering Open action for draft-only snapshot commit b9e529e0b56b995728ff10cd1b643df63b436258 Author: Julius Marminge <[email protected]> Date: Thu Mar 5 23:20:56 2026 -0800 Preserve draft terminal state during snapshot cleanup - add `collectActiveTerminalThreadIds` to keep non-deleted server threads plus local draft threads …
* Add provider-specific model resolution and defaults - Add per-provider model options, defaults, and slug aliases - Add provider-aware model normalization/resolution helpers - Preserve Codex-only constants/functions for backward compatibility - Extend tests to cover Claude aliases and provider-specific fallback behavior * redo contracts a bit * revised plan * Add Claude Code adapter live layer with error mapping tests - introduce `ClaudeCodeAdapter` service and live layer wiring - map runtime/session/request failures into provider adapter error types - add coverage for validation, session-not-found mapping, lifecycle forwarding, and event passthrough * Wire Claude adapter into registry and server provider layer Add provider-service routing coverage for explicit claudeCode sessions. Co-authored-by: codex <[email protected]> * Support provider-aware session selection in reactor Add restart semantics when requested provider changes and cover with tests. Co-authored-by: codex <[email protected]> * Enable Claude provider selection in chat composer Add provider-aware model options and include provider in turn-start dispatch. Co-authored-by: codex <[email protected]> * Add Claude checkpoint and revert reactor coverage Co-authored-by: codex <[email protected]> * Add Claude integration coverage across orchestration flows Co-authored-by: codex <[email protected]> * Make Claude runtime boundary Effect-native Co-authored-by: codex <[email protected]> * Use typed errors for unavailable Claude runtime path Co-authored-by: codex <[email protected]> * unnecessary catch * Inline Claude adapter behavior into live layer Co-authored-by: codex <[email protected]> * Use grouped provider/model select in chat composer Co-authored-by: codex <[email protected]> * Show provider logos in composer model trigger Co-authored-by: codex <[email protected]> * Update Claude model catalog to latest 4.6/4.5 gen Co-authored-by: codex <[email protected]> * Fix Claude model fallback in web store sync Co-authored-by: codex <[email protected]> * Include all provider models in /model slash command Co-authored-by: codex <[email protected]> * Integrate Claude agent SDK into server provider adapter - add `@anthropic-ai/claude-agent-sdk` dependency for `apps/server` - replace placeholder Claude adapter with live session/query/event handling - add comprehensive adapter tests for runtime events, approvals, resume, rollback, and model overrides * Refactor ClaudeCodeAdapter session flow and stream handling - Replace manual prompt async iterator with `Stream.fromQueue(...).toAsyncIterable` - Use `Ref` for shared session context in tool approval callbacks - Simplify timestamp/ID generation and close sessions via queue shutdown * Fix Claude resume cursor to only persist valid session UUIDs - Stop synthesizing `resume` from generated thread IDs - Persist resume session ID from query messages when available - Validate resume/sessionId values as UUIDs before reuse - Add tests for valid UUID resume passthrough and no synthesized resume * Align orchestration integration tests with latestTurn metadata Co-authored-by: codex <[email protected]> * Ignore stale resume cursors and Claude placeholder thread IDs - Do not pass `resumeCursor` when restarting a session after changing providers - Treat synthetic Claude thread IDs (`claude-thread-*`) as unscoped during runtime ingestion - Add tests covering provider-switch restart behavior and Claude turn lifecycle acceptance * Fix ProviderService sendTurn recovery expectation after rebase Co-authored-by: codex <[email protected]> * Stabilize Claude turn event ordering and native event logging - Preserve active turn state when `session.started`/`thread.started` arrive mid-turn - Emit `message.delta` from assistant text when stream deltas are missing, then complete the message - Add Claude native SDK NDJSON observability logging and wire its log path in server layers - Expand ingestion/adapter tests to cover mid-turn lifecycle and delta fallback behavior * Align Claude permissions and provider-specific reasoning effort - Default Claude sessions to bypass permissions when approval policy is `never`, while preserving explicit `permissionMode` - Hide/send reasoning effort only for providers that support it in ChatView - Add coverage for Claude permission-mode derivation and precedence, and update runtime event model docs * Track runtime event sequence and order thread activities by sequence - add per-session `sessionSequence` on provider runtime events and persist activity `sequence` - migrate `projection_thread_activities` with nullable `sequence` column + index - sort server/web activity projections by sequence fallback to timestamp/id - allow provider sessions/turns to start before a real threadId is emitted * Add Cursor CLI stream event schemas and decoding tests - define `CursorAdapter` service contract and Cursor stream-json schema types - add `CursorCliStreamEvent` decoding tests for system/thinking/tool/result/retry events - add implementation plan for Cursor provider integration Co-authored-by: codex <[email protected]> * Add Cursor provider support across backend, contracts, and UI - Accept `cursor` as a first-class provider in orchestration, persistence, and session directory flows - Update model/provider inference and normalization to handle Cursor model aliases - Revamp chat provider/model picker with Cursor-specific trait controls and add coverage in tests * Add Cursor ACP probe script and captured session logs - add `scripts/cursor-acp-probe.mjs` to run ACP protocol probing scenarios - update `package.json` scripts for probe execution - include generated probe summaries/transcripts under `.tmp/acp-probe/` * Revise Cursor provider plan for ACP JSON-RPC integration - Switch plan from `agent -p` stream-json to `agent acp` JSON-RPC transport - Document ACP session, permission, event-mapping, and interrupt/recovery behavior - Update implementation phases, tests, and delivery checklist for ACP-first design * Document Cursor ACP mapping in canonical runtime event spec - Add Cursor ACP raw source types to `RuntimeEventRaw.source` - Define canonical mappings for ACP lifecycle, updates, permissions, and errors - Expand cross-provider equivalence table to include Cursor ACP and renumber sections * Introduce v2 provider runtime event schema and validation tests - Restructure runtime events around a shared base plus typed payloads - Add runtime-branded IDs and new event types (plan, item, request, user-input) - Remove legacy canonical event names from docs and add schema decode/rejection tests * Scope reasoning effort defaults and options by provider - Replace global reasoning constants with provider-scoped effort options/defaults - Update ChatView to use Codex-specific reasoning effort types and default lookup - Expand model contract tests for provider-specific reasoning effort behavior * Unify provider runtime events and add Cursor adapter layer - migrate Claude/Codex/registry adapters to canonical runtime event types and payload shapes - add Cursor layer adapter plus tests and wire it through server layers - update provider contracts/runtime schemas and related adapter tests * Scope composer draft reasoning effort to Codex options - Switch draft store types to `CodexReasoningEffort` - Validate and default effort using Codex-specific option/default constants * Fix effort and provider handling in thread turn start - Only include `effort` in start command when a value is selected - Persist effort selection via composer draft state and hide picker when unavailable - Add optional `provider` to `ClientThreadTurnStartCommand` - Simplify thread model fallback selection in `ChatView` * Respect provider model-switch limits and canonical runtime events - Add provider capability plumbing for `sessionModelSwitch` and use it in session/turn routing - Keep Cursor sessions stable when in-session model switching is unsupported - Ingest canonical runtime events (`content.delta`, `item.*`, `request.*`) with legacy-shape compatibility * Normalize approval request kinds and persist draft provider state - map canonical approval request types to `requestKind` across ingestion and web pending approvals - auto-approve Cursor permission requests when approval policy is `never` - persist per-thread composer provider selection in draft store and use it in ChatView - disable Cursor traits picker while model selection is locked * Handle stale approval responses and cover Cursor resume IDs - Catch provider approval response failures and emit `provider.approval.respond.failed` - Auto-resolve approvals when provider reports unknown pending request IDs - Add tests for Cursor ACP resume via `resumeCursor.acpSessionId` and legacy `sessionId` * Normalize runtime events and tighten orchestration approval flow - migrate fixtures/tests/adapters to canonical provider runtime event payloads - route checkpoint capture off `turn.completed` only and drop legacy `checkpoint.captured` path - stop faking approval resolution when provider reports stale/unknown pending requests * Inject native event loggers into provider adapters - allow Claude/Cursor adapters to accept an injected native event logger - make native event writes effectful/non-blocking so logging cannot break message handling - update adapter tests to assert native observability events via in-memory loggers - fix runtime session ID conversion when resolving canonical event thread IDs * Support provider custom models and fix runtime event mapping - add per-provider custom model settings/options in web settings and chat picker - preserve Codex request type on `serverRequest/resolved` events - validate empty Cursor prompts before turn start and keep tool-call item types consistent - add tests for new adapter and model-settings behavior - add PR event review checklist document * Handle session.state.changed in provider runtime ingestion - Map runtime session state transitions to orchestration session status - Persist error reasons from `session.state.changed` error events - Add coverage for waiting/error/stopped/ready transition handling * Add runtime mode tracking across provider orchestration pipeline - extend provider and orchestration contracts for runtime mode-aware events - persist runtime mode fields in projection thread session storage and migration 006 - update adapters, reactors, projections, websocket/web session logic, and tests - add plan mode deep dive docs and probe artifacts for ACP behavior * Rewrite plan-mode deep dive as implementation blueprint - Reframe doc into a provider-agnostic implementation plan for Codex, Claude, and Cursor - Define canonical mode, plan, and structured user-input models plus capability-driven UI behavior - Add concrete orchestration, adapter, frontend, and test work items for rollout * Clarify Cursor plan-mode semantics and ACP extension mapping - Define Cursor operating mode as binary `default | plan` - Document mapping for `cursor/ask_question`, `cursor/create_plan`, and `cursor/update_todos` - Update capability and fallback guidance based on docs plus probe evidence * Persist thread runtime mode and handle mode-switch session restarts - Add `thread.runtime-mode.set` -> `thread.runtime-mode-set` flow in decider/reactors/projectors - Persist runtime mode on thread/session projections with new DB migrations - Update provider and Codex integration tests to verify thread continuity across mode changes Co-authored-by: codex <[email protected]> * Improve session restart handling and server logging - add structured lifecycle logs for Codex thread open/resume and provider session restarts - introduce persistent server file logging layer and tighten WebSocket server startup/finalizer ordering - preserve env-based boolean overrides in dev runner and stop forcing WS event logging in dev - enrich provider session listing from persisted bindings and fix Claude rate-limit/task-id event mapping - update orchestration and dev-runner tests for runtime-mode restart and env-flag behavior * Migrate provider runtime/session flow to thread-scoped IDs - Replace provider session-id centric plumbing with thread-id based runtime handling across server orchestration and provider layers - Update persistence repositories/migrations and contracts for threadless runtime semantics - Refresh integration/unit tests and web session/store types to match the new runtime model * Add plan interaction mode and user-input request handling - Wire Codex plan mode through turn start, including collaboration settings - Track and answer pending `requestUserInput` prompts instead of auto-empty responses - Persist/project thread `interactionMode` (schema, migration, queries) and update tests/contracts * Persist proposed plans as first-class thread projection data - Add `thread.proposed-plan-upserted` orchestration flow from ingestion through decider/projector - Store proposed plans in a dedicated projection table and include them in snapshot queries - Update provider runtime/web handling and tests to use proposed plans instead of assistant message wrappers * style * Prune internal contract exports and remove checkpoint RPC schemas - Stop exporting internal-only schema constants/types across contracts modules - Remove unused provider checkpoint list/revert/diff RPC contract schemas - Keep public contract surface focused on externally consumed types * Fix post-rebase typecheck regressions Co-authored-by: codex <[email protected]> * Plumb Codex model options through orchestration and composer - Replace ad-hoc `effort` handling with provider `modelOptions` across decider/reactor/adapters - Map Codex `reasoningEffort` and `fastMode` to turn/session params (`effort`, `serviceTier`) - Persist runtime/interaction/model selections from composer and sync them before sending turns - Move model normalization/helpers into `@t3tools/shared/model` with updated contracts/tests * Add GPT-5.4 to Codex model options - include `gpt-5.4` in Codex app model option coverage - only keep truly custom Cursor models in the custom model option list * Remove Cursor adapter from stack base Co-authored-by: codex <[email protected]> * Remove Claude adapter from stack base Co-authored-by: codex <[email protected]> * test: move Claude coverage out of core PR Co-authored-by: codex <[email protected]> * rm tmp * sync lock * Show unavailable providers as coming-soon placeholders - Keep Claude Code and Cursor in provider list as disabled options - Remove unused Claude agent SDK dependency from server - Delete stale plan-mode deep-dive doc * contracts: move Claude schemas out of core Co-authored-by: codex <[email protected]> * model: move Claude catalogs out of core Co-authored-by: codex <[email protected]> * split: move Claude provider surface to sibling stack Co-authored-by: codex <[email protected]> * split: move Claude SDK and plan doc to sibling stack Co-authored-by: codex <[email protected]> * Restore Claude adapter on sibling stack Co-authored-by: codex <[email protected]> * test: restore Claude coverage on sibling stack Co-authored-by: codex <[email protected]> * contracts: restore Claude schemas on sibling stack Co-authored-by: codex <[email protected]> * model: restore Claude catalogs on sibling stack Co-authored-by: codex <[email protected]> * split: restore Claude provider surface on sibling stack Co-authored-by: codex <[email protected]> * split: restore Claude SDK manifest and plan doc Co-authored-by: codex <[email protected]> * build: sync Claude SDK lockfile on sibling stack Co-authored-by: codex <[email protected]> * Squashed commit of the following: commit cc2ab000745f71a07220d1ad620b1f23b4f6f430 Author: Stefan Wintergerst <[email protected]> Date: Sat Mar 14 17:03:35 2026 +0100 chore: add .idea/ to .gitignore (#1077) commit 8b8e8b38e57ab782d085e5ecf2ae970f6e796a3f Author: Xanacas <[email protected]> Date: Sat Mar 14 16:51:37 2026 +0100 fix(web): unify focus ring styles across sidebar and app (#1079) Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]> commit 46ea594f02fb5f1e0b82430ddbd07ccf41a77a0d Author: Vitor Buzinaro <[email protected]> Date: Fri Mar 13 22:05:12 2026 -0300 Actions dialog: autofocus script-name field (#912) commit 790fda1a97476e4d7048a521651180ed0ba811c3 Author: 0x1f99d <[email protected]> Date: Sat Mar 14 05:29:22 2026 +1100 feat(github): add issue templates for automatic triage (#896) commit 89ffcf42eb781eddf357c07199607e3d7bccf0c5 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 23:24:42 2026 -0700 Upgrade oxfmt and oxlint tooling versions (#1010) commit 876bbd715ae6aa8e1d663455747e17c92e0a287c Author: Julius Marminge <[email protected]> Date: Thu Mar 12 21:03:21 2026 -0700 Extract reusable clipboard hook and standardize media queries (#1006) Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <[email protected]> Co-authored-by: Julius Marminge <[email protected]> Co-authored-by: codex <[email protected]> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> commit ac0d1f52a087c63819b2b032ac4535d18d3c23af Author: 0x1f99d <[email protected]> Date: Fri Mar 13 14:47:29 2026 +1100 fix(web): defer diff worker startup until diff opens (#934) Co-authored-by: Julius Marminge <[email protected]> commit d0ae0adc9923e51f7027ee16afedb14b3ae7779c Author: 0x1f99d <[email protected]> Date: Fri Mar 13 14:18:20 2026 +1100 fix(web): add default thread env mode setting (#892) Co-authored-by: Julius Marminge <[email protected]> commit 995a26660edbce7cca15da812972c23151a35f3d Author: Jono Kemball <[email protected]> Date: Fri Mar 13 16:18:03 2026 +1300 chore: Upgrade marketing app to Astro 6 (#1005) commit dfd62cfb868935787560b88b0c399f0ce9081a9f Author: dpav02 <[email protected]> Date: Thu Mar 12 22:43:07 2026 -0400 fix(desktop): show dialog after "Check for Updates" menu action (#955) Co-authored-by: Claude Opus 4.6 <[email protected]> commit 64dc07a8e5a6d7e34de4e85a07126a9c04e462d3 Author: Zortos <[email protected]> Date: Fri Mar 13 03:42:59 2026 +0100 Add compact Codex tool-call icons and details to the chat timeline (#988) Co-authored-by: Julius Marminge <[email protected]> commit ae4ae9973cd6cebc7d557e64e876534f15c916fd Author: Jono Kemball <[email protected]> Date: Fri Mar 13 15:30:47 2026 +1300 chore: update @vitejs/plugin-react to 6.0.0 (#1002) commit 36473f7de6f32bb2765e0ad2b08e2a0c2e737d63 Author: Zortos <[email protected]> Date: Fri Mar 13 03:26:14 2026 +0100 feat: replace worktree toggle with discoverable Select dropdown (#1001) Co-authored-by: Julius Marminge <[email protected]> commit a14debc83e04ee4b28d9e3eb830f0cf74d489f93 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Fri Mar 13 00:24:53 2026 +0000 fix: block image uploads during plan mode questions (#621) commit 71a7473a81c75a70bef55844a410e5d7f1e5de10 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Thu Mar 12 23:33:37 2026 +0000 fix: composer @file autocomplete cursor and spacing bugs (#936) commit 5c03fb62c4ede0a347938b796a611d5f6b9d61fb Author: WilgotM <[email protected]> Date: Fri Mar 13 00:28:32 2026 +0100 Add Antigravity to supported editors in Open menu (macOS, Windows, and Linux) (#841) Co-authored-by: Julius Marminge <[email protected]> commit 727c0cfcbf1733edd9f23974f67c755ccbf6eee5 Author: Hugo Blom <[email protected]> Date: Thu Mar 12 23:58:51 2026 +0100 feat: Allow Overriding Timestamp Format in Settings (#855) commit dcd2e5c34fbbf6cba7cdb23caef86568771a78d4 Author: Noah Gregory <[email protected]> Date: Thu Mar 12 16:03:55 2026 -0400 fix: don't restart the app on normal exists in dev runner (#986) Co-authored-by: Julius Marminge <[email protected]> commit 1e276573c2925827691bb9840c21e8e130834aad Author: Kiyotaka <[email protected]> Date: Thu Mar 12 15:00:08 2026 -0500 feat: add fuzzy workspace entry search (#256) Co-authored-by: Julius Marminge <[email protected]> commit db17ff332307e6c80d034e6c13932d4bc253bca3 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:40:08 2026 -0700 fix syntax errors from bad merge commit b496ae839529b910d5a35e9e05d6be704a41b5a5 Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:35:21 2026 +0800 fix: add error logging for code highlighting failures (#951) commit 724f54c2c1f4a1efcd7423a5ff0e3db625629815 Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:32:00 2026 +0800 fix: clean up timeout in PlanSidebar to prevent memory leaks (#949) Co-authored-by: hobostay <[email protected]> commit b6eba3347d7a4153981269b064c4cee3b0166ebb Author: Qiaochu Hu <[email protected]> Date: Fri Mar 13 03:31:19 2026 +0800 fix: add logging for WebSocket errors (#948) Co-authored-by: hobostay <[email protected]> commit 74c22628b3f94b10cf9cef275fef19c5d210deb4 Author: Adam Naji <[email protected]> Date: Thu Mar 12 21:29:07 2026 +0200 chore: update actions/checkout and actions/github-script (#956) Co-authored-by: Julius Marminge <[email protected]> commit 224acebb57815193ef93c2d1861e606a626d23b3 Author: 0x1f99d <[email protected]> Date: Fri Mar 13 06:15:01 2026 +1100 fix(web): add pointer cursor to running stop-generation button (#900) Co-authored-by: Julius Marminge <[email protected]> commit 85c174a6cac04b4fda68f311a904af0435c85807 Author: Alex Schwartz <[email protected]> Date: Thu Mar 12 15:09:41 2026 -0400 fix: Linux icon now shows up (#807) commit 581d242925f80079b8add8433e0b1614bd362d88 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:01:55 2026 -0700 remove triggers commit d9d0216e98062bb69c0b3f7cb67cd9a3c5742216 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 12:01:27 2026 -0700 fix pr size workflow commit c52ad29b31e890164d0e22443f36c1e39483d3bc Author: Julius Marminge <[email protected]> Date: Thu Mar 12 11:41:13 2026 -0700 Fix mod+N new thread flow and terminal split limits - ensure `chat.new` creates a fresh draft after a promoted draft thread - enforce terminal cap per split group (4) while allowing additional terminal groups - refine sidebar row selected/active styling via shared class-name logic and tests commit fcbf3f3c225ab41c44af3759ae27d8520ced61a4 Author: Julius Marminge <[email protected]> Date: Thu Mar 12 11:19:55 2026 -0700 Fix new-thread shortcuts when terminal is focused - move chat-wide key handling into `_chat` route-level shortcut handler - extract reusable `useHandleNewThread` hook and `isTerminalFocused` helper - update browser WS fixture to support `terminalOpen` RPC shape commit ab0002f99d6fb5555c57bc91f696e6a9f8f4dfd7 Author: Donald Silveira <[email protected]> Date: Thu Mar 12 15:48:23 2026 -0300 update project removal copy (#981) commit f63cda22fa6e9b98de1caec057960dce28248d37 Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:24:10 2026 -0400 fix: improve business logic in prompt editor and fix cursor bugs in Plan mode (#867) Co-authored-by: Julius Marminge <[email protected]> commit b60a34eba46ffb3e97d90a644280ba743870d85d Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:13:37 2026 -0400 fix: fix logo aligment regression on macOS (#960) commit ed4be2c849c56c105dd7ccef6b3b5908ebbc2acd Author: Jono Kemball <[email protected]> Date: Fri Mar 13 07:12:18 2026 +1300 fix: Fix response duration for agent to no longer always be 1ms (#866) commit 5e23e9c7c744724b3d17d4562aa01ce64d25066b Author: Noah Gregory <[email protected]> Date: Thu Mar 12 14:10:58 2026 -0400 add Ymit24 to vouched list (#959) commit c3bfcc36b870adbdb01552a7c6b9313a836d7d75 Author: Guilherme Vieira <[email protected]> Date: Thu Mar 12 17:50:49 2026 +0000 feat: add selective file staging to commit dialog (#872) Co-authored-by: Julius Marminge <[email protected]> commit a33cc8c75874bf89050ae90c58c5b6227debd4e2 Author: eggfriedrice <[email protected]> Date: Thu Mar 12 17:44:16 2026 +0000 fix: diff panel unclosable after retainSearchParams middleware (#937) commit a01d712751f8103001b5e728d64c12bc7c3d652a Author: Magnus Buvarp <[email protected]> Date: Thu Mar 12 18:42:17 2026 +0100 fix(web): resolve preferred editor from available editors & introduce `useLocalStorage` helper (#662) Co-authored-by: Julius Marminge <[email protected]> commit 774cff9a74bbd937021e27da524b96dbb7319a7c Author: 0x1f99d <[email protected]> Date: Fri Mar 13 03:10:07 2026 +1100 ci(github): add pull request size labels (#901) commit e3d46b687ce2537b4761ab9ae1c50db6708d3948 Author: Ymit24 <[email protected]> Date: Wed Mar 11 21:21:22 2026 -0500 feat: split out components from ChatView.tsx (#860) Co-authored-by: Christian Smith <[email protected]> commit 8636ea0ec4163714a445cf4b11d53bbf88fd9ee7 Author: Theo Browne <[email protected]> Date: Wed Mar 11 17:16:51 2026 -0700 Add maria-rcks to the list of contributors commit ff6a66dcabfcfcf28c8c8feb126a7b90842d6368 Author: David Balderston <[email protected]> Date: Wed Mar 11 14:05:17 2026 -0700 Use live thread activities for sidebar status pills (#919) commit 2ac735657e2ecf8b227c5e7685d2606063f055cf Author: maria <[email protected]> Date: Wed Mar 11 18:03:49 2026 -0300 chore(release): align package versions before building artifacts (#933) commit bbab1fc891650bcd303f69f873b609ab295b7f4c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Mar 11 17:27:36 2026 +0000 chore(release): prepare v0.0.10 commit 82a50da8b1f72da407a0c596a7be6b62e2ead284 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 18:49:04 2026 -0700 revert formatting on mockServiceWorker.js commit 7ddcb239c5ce4031653afbc404a860ccf5606549 Author: eggfriedrice <[email protected]> Date: Wed Mar 11 01:42:39 2026 +0000 feat: persist diff panel state across thread navigation (#875) commit 9e4e22197045a2d2ba7ba7d7813054e49234f6f1 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 11:55:36 2026 +1100 chore: added `eggfriedrice24` to vouched list (#869) commit e8b0126371a0d72b2a2ad71a4829e452a109a566 Author: eggfriedrice <[email protected]> Date: Tue Mar 10 23:54:47 2026 +0000 fix: checkpoint diffs never resolve (shared PubSub subscription) (#595) commit 90d9a2ad1f1810b27d88f0dfc38304ec5b1de566 Author: ranvier2d2 <[email protected]> Date: Tue Mar 10 20:50:18 2026 -0300 fix: map gitignore to ini for Shiki syntax highlighting (#848) Co-authored-by: Claude Opus 4.6 <[email protected]> commit 065ef922bdd29693738cd72f6e5e737bd93133f8 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 16:21:28 2026 -0700 Require bun fmt for completion and clarify Electron history - Update AGENTS.md task completion requirements to include `bun fmt` - Add an inline note explaining why Electron uses hash history commit 7d115334902046e42e843779f91e275ff1c96a27 Author: Jason Laster <[email protected]> Date: Tue Mar 10 15:54:34 2026 -0700 Stabilize runtime orchestration and fix flaky CI tests (#488) Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: codex <[email protected]> Co-authored-by: Julius Marminge <[email protected]> commit 1031a226f8cf90d358d9768fc0842dcdae61a315 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 15:05:41 2026 -0700 Fix cross-repo PR detection and push remote selection (#788) commit ddd98876b5fe3dcb789a36ab799e6e211a1bcb5a Author: 0x1f99d <[email protected]> Date: Wed Mar 11 08:42:39 2026 +1100 fix: invalidate workspace entry cache after turn completion and revert (#796) commit dfd41da2fdc7e9268fe0e46d3ab29d1f2161b3a2 Author: Adam Naji <[email protected]> Date: Tue Mar 10 23:41:02 2026 +0200 Fix Windows keybindings for font size: use Ctrl+ to increase (#786) commit b37279ca2117a8de4d14256c0c29c4d4429e6aa7 Author: Utkarsh Patil <[email protected]> Date: Wed Mar 11 00:16:49 2026 +0530 fix: prevent Codex overrides footer overflow with long binary paths (#707) commit 13eeb07f5f4b582e2ff824db382ff8917489c5c6 Author: Julius Marminge <[email protected]> Date: Tue Mar 10 10:38:11 2026 -0700 prevent squashing some know errors commit 1e9bac7f6e783fe0498ddeb8392c5f4b50aad19d Author: Jono Kemball <[email protected]> Date: Wed Mar 11 06:23:52 2026 +1300 Sync desktop native theme with web theme setting (#800) commit 1c290767f22f9d8c7d3fa378d9450c8f48184679 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 04:16:37 2026 +1100 fix: use commit as the default git action without origin (#642) * fix(web): avoid push and PR defaults without origin * fmt * object here too --------- Co-authored-by: Julius Marminge <[email protected]> commit 9becb3f40af504244f85823bb19f18bfe507ca49 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 04:14:58 2026 +1100 fix(server): skip auth check when Codex CLI uses a custom model provider (#649) Co-authored-by: Julius Marminge <[email protected]> commit 2c351726ae21a73ac0549500783d5a4de6394214 Author: 0x1f99d <[email protected]> Date: Wed Mar 11 03:46:24 2026 +1100 fix(contracts): align terminal restart input type across IPC, WS, and server (#597) commit 9e891d2e97d65a6e211e3da8ee95807b9a091563 Author: Weld <[email protected]> Date: Tue Mar 10 11:45:39 2026 -0500 Display application version in sidebar and settings (#720) commit b8d07eb852e5ea30717f4079595eb68515e930cf Author: Jono Kemball <[email protected]> Date: Wed Mar 11 05:18:22 2026 +1300 Add downloads page and shared marketing layout (#802) commit 223c3dc8005b583b19c502320f5de929958a7efd Author: Jason Laster <[email protected]> Date: Tue Mar 10 00:17:18 2026 -0700 chore(ci): add and apply `fmt:check` script (#779) * Add formatting conventions * Add a fmt lint check * rely on defaults --------- Co-authored-by: Julius Marminge <[email protected]> commit afb6e89bfdd9164c142162597bb865540b1909d2 Author: 0x1f99d <[email protected]> Date: Tue Mar 10 18:03:37 2026 +1100 feat(web): add shift-click multi-select for sidebar threads (#651) * feat(web): add shift-click multi-select for sidebar threads Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability) * fix(web): filter deleted threads from worktree orphan check during bulk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references. * fix(web): fix shift-click range selection, distinct selection styling, and deselect on click away * Preserve thread multi-select on safe sidebar control clicks - avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface --------- Co-authored-by: Julius Marminge <[email protected]> commit 9309edf4f42c59de6489f0ea1a6b72578d637b9d Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:41:22 2026 -0700 rm test commit d28ced8fd7471302d42e2e272fcbd62f9b1404c8 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:36:22 2026 -0700 Move PR checkout flow to dialog and drop /checkout-pr command - Replace the inline composer PR menu with a dedicated `PullRequestThreadDialog` - Remove `/checkout-pr` from composer slash-command parsing and tests - Fix branch selector virtualization sizing for the checkout-PR row commit 076608021c89afb294f4bdc75d99018936540c95 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:30:17 2026 -0700 Namespace PR worktree branch names under t3code - Change local PR worktree branch format from `pr/<number>-<head>` to `t3code/pr-<number>/<head>` - Update GitManager tests to assert the new branch naming convention commit fb4f9aa58ef67d192c7692dcfcb58c00a8fb7705 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:09:08 2026 -0700 Use repo initial branch in GitCore PR fetch integration test - Return `initialBranch` from test repo setup helper - Replace hardcoded `main` checkout/push/assertions with detected branch name commit de21f4dcd74037dc48d255e06ec27fd58187367b Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:56:48 2026 -0700 Use GitHubCliLive as default test layer - Wire `it.layer` to `GitHubCliLive` in `GitHubCli.test.ts` - Remove redundant `Effect.provide(GitHubCliLive)` calls in individual tests commit 442bc9540ea52e82ad15aee06e52da2c5e16f948 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:52:28 2026 -0700 Normalize remote URL matching and migrate GitHubCli tests - Treat remotes that only differ by trailing slash after `.git` as the same remote - Add a GitCore regression test for trailing-slash remote reuse - Refactor `GitHubCli` tests to `@effect/vitest` layer-based effect tests with reset cleanup commit f7570712a741136999a77d5a8f6490a8c7d9e249 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:46:53 2026 -0700 Avoid fork PR head branch collisions when creating worktrees - create a unique local branch name for cross-repo PR worktrees (`pr/<number>-<head>`) - fetch/set upstream against that local branch instead of overwriting local `main` - add regression tests for fork PRs where head branch is `main` commit 2847655a1a1f8f45d64224ee45b9262a1fc14dfc Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:35:04 2026 -0700 Validate GitHub CLI JSON with Effect Schema decoders - Replace manual JSON parsing with shared schema-based decoding helpers - Normalize PR and repository payloads after decoding for safer typed outputs - Improve invalid JSON error mapping with operation-specific GitHubCliError details commit 268016d872e724bd996fcd585835d169db903814 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 16:00:02 2026 -0700 Fix PR thread upstream tracking for fork branches - Restore/set upstream tracking when preparing local and reused PR worktrees - Derive fork `owner/repo` from PR URL when GitHub omits `headRepositoryNameWithOwner` - Expand GitManager tests to cover local mode, URL-derived fork identity, and reused worktree upstream recovery commit ac3f22c274e5b116b04220b29d1470e9d39bd0f2 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:57:59 2026 -0700 Inline branch picker filtering and drop PR-only shortcut - move branch filtering logic into `BranchToolbarBranchSelector` - remove unused `filterBranchPickerItems` helper and related tests - keep create-branch option pinned while filtering by query commit b36888e9cc3692f931081a4d09bd58438d5f06eb Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:24:28 2026 -0700 Preserve fork PR upstreams when preparing local and worktree threads - add GitCore helpers to ensure remotes, fetch remote branches, and set upstreams - extend GitHub CLI parsing to include cross-repo PR metadata and repo clone URLs - update GitManager flow and tests to materialize fork heads and keep tracking on fork remotes commit 9bb9023009b0c45c66a609c386cd233855043caf Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:03:24 2026 -0700 Handle branch selection across main and secondary worktrees - add `resolveBranchSelectionTarget` to unify checkout cwd/worktree decisions - reuse existing worktrees when available, including switching back to main repo - update branch selector to use shared logic and add targeted unit tests commit f70cb5de4517e55f62ed2c71e49291d97a7dc927 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:56:11 2026 -0700 Refine branch picker behavior and gate /checkout-pr by thread type - Add shared branch picker filtering logic and tests, including PR-reference-only results - Improve branch selector UX/perf with deferred query filtering, conditional virtualization, and status-based current branch resolution - Only expose and handle `/checkout-pr` for local draft threads in chat and toolbar UI commit 3d3586800ebfbefb97a4a782dae3439e90ba9065 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:00:23 2026 -0700 Add pull-request thread setup for local and worktree modes - Add git APIs to resolve PR refs and prepare PR thread workspaces - Support fetching PR head refs into local branches and reusing existing worktrees - Wire new websocket/contracts/web composer flows for PR-based thread creation - Expand server/web/contracts tests for PR routing and branch/worktree behavior commit 767de271e972b38de0633c04efcd62a929790b3e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 22:46:38 2026 -0700 Use Effect UUID generator as randomUUID fallback - Replace manual UUID byte formatting fallback in `apps/web/src/lib/utils.ts` - Use `Effect.runSync(Random.nextUUIDv4)` when `crypto.randomUUID` is unavailable commit 9d2c2cae375b6dfc7469c1ada07a109779364846 Author: Hiram Chirino <[email protected]> Date: Mon Mar 9 07:30:00 2026 -0400 fix(web): polyfill crypto.randomUUID for non-secure HTTP contexts Replace direct crypto.randomUUID() calls with a randomUUID() helper in utils.ts that falls back to crypto.getRandomValues() when the browser is not in a secure context (e.g. plain HTTP on a non-localhost address). Signed-off-by: Hiram Chirino <[email protected]> commit dcccca3f7b5d089f9946b866c9a149e94fd4c616 Author: David Balderston <[email protected]> Date: Mon Mar 9 19:38:51 2026 -0700 Fix UI Overflow when Github Action is 'Commit, Create & Push PR' Fixes: #769 * Updated wording for label from 'Commit, Create & Push PR' to 'Commit, Create & PR' to allow for it to fit within the current UI size constraints. wording change commit 4ed89e4ba72e47f7919b3b8e08d375bc912d89e4 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 17:16:44 2026 -0700 Treat retryable Codex errors as runtime warnings - Map Codex `error` notifications with `willRetry: true` to `runtime.warning` - Keep active turns/sessions running during reconnect warnings - Add adapter and ingestion tests for retry-warning behavior commit 99dbe4ff02d9ee8e5450e96d84e8f96170c64a71 Author: Satyam Bansal <[email protected]> Date: Tue Mar 10 00:41:17 2026 +0530 fix(web): disable add project button for empty path commit 2fc0b01c18ab8ec92eaabb56cfdd92d070cd9a35 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:16:16 2026 -0700 fmt commit 3a86b60680f147ef1420558548354bbfa0253f5b Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:12:42 2026 -0700 Render collapsed plan preview directly as markdown - remove deferred collapsed preview state in `ProposedPlanCard` - always render collapsed preview with `ChatMarkdown` for simpler, consistent display commit eb7c428a2d3438f2ba72fb83c5df750236517a77 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 15:09:04 2026 -0700 Defer proposed plan rendering until expand in ChatView - Keep long plan cards collapsed with lightweight preview text by default - Render full plan markdown only after explicit expand to reduce thread open slowness - Add tests for preview/strip helpers and browser coverage for expand behavior commit 9fb9467ed1cf296c964a7a7d7a99ab1ad4e5e422 Author: Cursor Agent <[email protected]> Date: Mon Mar 9 22:04:02 2026 +0000 fix: keep suppressProjectClickAfterDragRef true on drag cancel to prevent unintended toggle Co-authored-by: Julius Marminge <[email protected]> Applied via @cursor push command commit e42036485fd7fe19c8536ba3fd59573ebf592349 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:25:06 2026 -0700 Improve project drag collision detection in sidebar - Prefer pointer-based hit testing during project reordering - Fall back to corner-based collision to make drop targeting more reliable commit f9c3aff294e7493751f36504f65089fd2d5586fd Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:13:55 2026 -0700 no longer need experimental for tsconfig aliases commit 3503dbc7d5b22d9947744ee4e2ee2324d9303825 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 14:12:19 2026 -0700 pin vite commit b5dde6b9d865930bc2b981816dde3f614e892813 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 11:42:13 2026 -0800 Prevent stale click suppression after project drag cancel - Reset post-drag click suppression when drag is canceled - Consume only the synthetic click after drag release, then clear suppression commit a6b22ec1c9b247536111dd2c2e8682f9b3f550c5 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 11:39:29 2026 -0800 Fix project drag clicks and sidebar collapse/scroll behavior - prevent accidental project toggles after drag operations - switch project rows to Collapsible for stable expand/collapse animation - add optional hidden scrollbar mode to ScrollArea and apply it in SidebarContent commit bb49ebf6e54a078f9937f85de338ac5c8fc4a236 Author: Julius Marminge <[email protected]> Date: Fri Mar 6 10:48:07 2026 -0800 Add drag-and-drop project reordering in the sidebar - wire project list to dnd-kit sortable with vertical drag constraints - prevent accidental expand/collapse clicks during drag gestures - update store logic/tests and add dnd-kit dependencies commit 2f5e62602948ba624fa470ea8c9f6e9dc1cb0557 Author: Levi <[email protected]> Date: Mon Mar 9 13:55:22 2026 -0500 Fix project name badge truncation in chat header Remove the hard max-w-28 (112px) cap and shrink-0 on the project name badge so it uses available flex space instead of aggressively truncating. commit 82c0a45ea0334a8ffd5747e080ca693f54921d66 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 13:00:27 2026 -0700 Use Debouncer for composer draft persistence writes - Replace manual timeout/pending-value debounce logic with `@tanstack/react-pacer` `Debouncer` - Keep `removeItem`/`flush` behavior while simplifying and standardizing persistence timing commit e765051f148bf6006e30118eb47f5d33ea9e32be Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:45:34 2026 -0700 Use React Pacer throttler for domain event snapshot sync - Replace manual timeout-based domain event batching with `Throttler` - Keep provider query invalidation batched with trailing 100ms flushes - Cancel throttler and reset invalidation flag during EventRouter cleanup commit f5e4df5cab247021501876358fd72c7196cd96b9 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:28:26 2026 -0700 Use Debouncer for store state persistence - Replace manual timeout debounce logic with `@tanstack/react-pacer`'s `Debouncer` - Persist updates via `maybeExecute` to reduce localStorage write thrashing - Flush pending persistence on `beforeunload` to avoid losing recent state commit 1f47cc6f4e51d236421d45bafabaa3bbf2576c3f Author: Julius Marminge <[email protected]> Date: Mon Mar 9 12:23:33 2026 -0700 Remove ProviderHealth onReady callback from service interface - Drop the unused `onReady` hook from `ProviderHealthShape` - Keep startup health status access focused on `getStatuses` commit 074d3af79c3a19e7fc0d4c3ec2f3a6c6b6e46d55 Author: Tim Smart <[email protected]> Date: Mon Mar 9 12:18:33 2026 -0700 cleanup Co-Authored-By: Claude Opus 4.6 <[email protected]> commit 6593645c8092696403f39e7d6eeebeec190385dc Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:26 2026 +0000 perf: run provider health checks in background, notify clients on ready The ProviderHealth layer blocked server startup with two sequential CLI spawns (codex --version + codex login status), each with a 4-second timeout, delaying startup by up to 8 seconds. Run health checks in the background via Effect.runPromise so the layer resolves immediately with a placeholder status. Add an onReady callback to ProviderHealthShape so wsServer can push the resolved statuses to connected clients once checks complete, preventing early-connecting clients from showing "Checking..." indefinitely. commit 296eb82c312b3c36237b51870b9a87249f5c6d83 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:14 2026 +0000 perf: throttle domain event processing with 100ms batch window During active sessions, every domain event triggered a full syncSnapshot (IPC fetch + state rebuild + React re-render cascade) and sometimes a provider query invalidation. Events fire in rapid bursts during AI turns. Replace per-event processing with a throttle-first pattern: schedule a flush on the first event, absorb subsequent events within a 100ms window, then sync once. Provider query invalidation is batched via a flag. Since syncSnapshot fetches the complete snapshot, no events are lost by skipping intermediate syncs. commit 7a377fc5e4d607a475a7d36957689562d5dcccb9 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:22:02 2026 +0000 perf: debounce Zustand store persistence and deduplicate legacy cleanup The useStore subscriber called persistState on every state mutation, triggering JSON.stringify + localStorage.setItem synchronously. It also ran 8 localStorage.removeItem calls for legacy keys on every fire. Wrap the subscriber with a 500ms debounce so rapid state changes batch into a single write. Move legacy key cleanup behind a one-time flag so it runs only once per page load. Add a beforeunload handler to flush the final state. commit 90e0c2ab15e7034d8e6e0688b3996fd905c03017 Author: Chukwudi Nwobodo <[email protected]> Date: Sun Mar 8 06:21:52 2026 +0000 perf: debounce composer draft localStorage writes Every keystroke triggered full JSON serialization of all composer drafts (including base64 image attachments) and a synchronous localStorage write. At normal typing speed this caused 5+ writes/sec, blocking the main thread and creating noticeable input lag. Wrap the Zustand persist storage with a 300ms debounce. In-memory state updates remain immediate; only the serialization and storage write are deferred. A beforeunload handler flushes pending writes to prevent data loss. The removeItem method cancels any pending setItem to avoid resurrecting cleared drafts. Adds unit tests for the DebouncedStorage utility covering debounce timing, rapid writes, removeItem cancellation, flush, and edge cases. commit 7a3d4d1f31e4316eb832f820012bf575aa57669a Author: Cursor Agent <[email protected]> Date: Mon Mar 9 18:57:17 2026 +0000 fix: stabilize onToggleRuntimeMode with useCallback to preserve memo Co-authored-by: Julius Marminge <[email protected]> Applied via @cursor push command commit e354e8697f490c729d7022b28e921f4c12e0a8ae Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:17:43 2026 -0700 Prevent compact diff sidebar from breaking chat composer layout - Add composer footer/action data attributes for targeted width measurement - Enforce a minimum composer width before allowing inline diff sidebar commit 993b5785121765a56628bfd4852591f672b743af Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:13:09 2026 -0700 Use form clientWidth for composer compact footer checks - Measure composer width from the form element in initial and resize paths - Avoid relying on ResizeObserver contentRect width for compact footer layout decisions commit ed518ef19f33bf073f48fe9b24442f063fa1bee7 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 11:08:07 2026 -0700 Fix provider picker after rebase Co-authored-by: codex <[email protected]> commit 47117a7d85b6696e3ad3ae7d59303b3a60e9eea5 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:56:56 2026 -0700 Inline SidebarInset base classes and remove dead sidebar logic - Replace `SIDEBAR_INSET_BASE_CLASSNAME` with an inline class string in `sidebar.tsx` - Delete the now-unused `sidebar.logic.ts` helper and its focused unit test commit f62381090323ae15ffab480bdeeb868e61274fbf Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:45:16 2026 -0700 Adapt composer footer to compact controls on narrow widths - add shared footer layout breakpoint helper with tests - switch chat composer footer to compact menu when width is constrained - preserve plan sidebar toggle behavior while consolidating footer actions commit e9ffd5752bb56854f8693f4a37dee3b3b7afcd3e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 10:01:33 2026 -0700 Fix plan composer layout and sidebar flex shrink behavior - add `min-w-0` to chat/flex containers to prevent composer/sidebar overflow - move `BranchToolbar` into the chat column so layout stays aligned with plan sidebar - extract sidebar inset base classes to shared logic and add a regression test for `min-w-0` commit 24122b17629451e4614d34f3b771769e87b99d79 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:28:30 2026 -0700 Stabilize toast stacking offsets to prevent hover flicker - derive toast indices and Y offsets from the filtered visible toasts - pass frontmost height and per-toast layout vars to the viewport/item styles - add unit tests for visible toast layout calculations and height normalization commit 081a6dacdbb623da0b560360384d58cb95a484e5 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:29:20 2026 -0700 Remove fast-tier icons from model selection UI - delete `shouldShowFastTierIcon` and its test - remove Zap icon badges from slash model commands and provider model picker - simplify related ChatView props and memo dependencies commit 9fdb45be1efb0e0b542a0dd78d868de6f71d7d4a Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:13:52 2026 -0700 Remove service tier setting from Codex flow and contracts - Drop `serviceTier` from orchestration/provider contracts and server dispatch paths - Remove service-tier app setting/UI and related resolver logic - Keep fast badge behavior tied to explicit fast-mode boolean commit b946f00f1a31f16a51f9bd1f579baf40c8eaed83 Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:42:19 2026 -0700 Show Plan Ready status pill for settled plan threads - add "Plan Ready" sidebar status when a plan-mode turn is settled with a proposed plan - update sidebar logic tests to cover the new status and expanded thread inputs commit b030f69a833802fae9222781ef2dc822dfe81aac Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:14:08 2026 -0700 Show Awaiting Input status in sidebar and extract status logic - add `Sidebar.logic.ts` to centralize thread status pill resolution - show `Awaiting Input` when plan mode is blocked on user responses - add unit tests for unseen completion and status-priority behavior - prevent plan collapse/expand clicks from triggering chat scroll anchoring commit b0e1b3368e47c8b470f988312309a9784421b69a Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:21:32 2026 -0700 Show toast when immediate project add fails - Use a toast error for add-project failures during immediate folder browse - Keep inline add-project error state for non-immediate flows - Include `shouldBrowseForProjectImmediately` in callback dependencies commit ce7b24bfb151cc5dfee54d669c3490611e74119e Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:14:18 2026 -0700 Inline Electron project picker check in Sidebar - Replace `shouldOpenProjectFolderPickerImmediately` with direct `isElectron` usage - Remove obsolete `Sidebar.logic.ts` and its tests commit 5c286cab8b87fa5055533c54721cca52ec32050d Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:10:37 2026 -0700 Open project folder picker immediately in Electron - remove mobile-width gating from sidebar project picker behavior - simplify picker logic/tests to depend only on Electron runtime commit 75ca0d4fa41a4b5a85a6aa852dad813fbcbb94db Author: Julius Marminge <[email protected]> Date: Mon Mar 9 09:02:56 2026 -0700 Open folder picker immediately on desktop Electron - add `shouldOpenProjectFolderPickerImmediately` to centralize Sidebar behavior - trigger folder browse directly when adding a project in desktop Electron - keep manual path entry for mobile layouts and non-Electron, with tests for all cases commit 8282b11fb55e50147a33e476ee8563ceaf1e75d7 Author: 0x1f99d <[email protected]> Date: Tue Mar 10 02:29:49 2026 +1100 refactor(contracts): remove unused OrchestrationPersistedEvent schema (#601) commit 45744cc7893243b5ad17b153fb250d50ce87d80c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Mar 9 11:17:07 2026 +0000 chore(release): prepare v0.0.9 commit 4b6a0c433cb808a0ebdd30ec48e799b6543d2cc9 Author: Sai Shankar <[email protected]> Date: Mon Mar 9 16:33:13 2026 +0530 fix(web): fix native scrollbar being intercepted by sidebar rail on windows and linux (#618) the rail's 16px hit area at z-20 sits right where the native os scrollbar lives when the sidebar is in offcanvas mode and collapsed. this causes clicks and drags on the scrollbar to toggle the sidebar instead on windows and linux. scoping pointer-events-none to [data-collapsible=offcanvas][data-state=collapsed] fixes the interception without affecting icon mode where the rail needs to stay clickable. commit 304a14de7d6f0b9977c8ecc4bced5b5f359ce02e Author: Theo Browne <[email protected]> Date: Mon Mar 9 04:01:23 2026 -0700 Fix users who installed intel builds on arm macs (#641) commit c585128bbe0311615c58921909467f49600cb85f Author: Theo Browne <[email protected]> Date: Mon Mar 9 01:20:14 2026 -0700 ARM ALWAYS FUCK YOU INTEL commit acd92f9b061b8638ef9cfe974dad19042b3762e8 Author: Theo Browne <[email protected]> Date: Mon Mar 9 01:12:55 2026 -0700 include sourcemaps commit 4088b7ac3cddc1fc92ccf3f99e7a844c629ebad0 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 16:02:15 2026 +1100 fix(desktop): use filesystem-friendly userData directory name (#607) Electron derives the userData path from productName in package.json, which produces directories with spaces and parentheses on all platforms (e.g. ~/.config/T3 Code (Alpha) on Linux). This is hostile to shell usage and violates Linux XDG naming conventions. Override the userData path via app.setPath() before the ready event to use a clean lowercase name (t3code). If the legacy directory already exists it is used as-is so existing users keep their Chromium profile data (localStorage, cookies, sessions, cache). This follows the same pattern VS Code uses — keeping productName for display purposes while explicitly setting the data directory path. Closes #578 commit 8e8904a159e3b29fa1eae0e6f023872ef03a3f63 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 15:55:09 2026 +1100 refactor(web): remove redundant double parse of diff route search params (#598) `rawSearch` is already the output of `parseDiffRouteSearch` via the `useSearch` select transform. The `useMemo` at line 760 re-parsed it through the same function with an unsafe `as Record<string, unknown>` cast, producing an identical result. Use `rawSearch` directly instead. commit 16f3490aee9ab9928ae7ac084117517495155e96 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 15:53:26 2026 +1100 fix(ci): handle draft PR conversions in pr-vouch (#611) commit 651084e8c05bf6da329108b098e4fd81322ee785 Author: Jono Kemball <[email protected]> Date: Mon Mar 9 17:43:35 2026 +1300 fix: fix external link opening in desktop (#599) fixes #434 commit 812bb99f5c182351d0d899c9a88033d61fd7370a Author: Theo Browne <[email protected]> Date: Sun Mar 8 21:43:17 2026 -0700 Add Noojuno to vouched commit 5bc79807ec33f0b7f3633ad6dc54fcedf0de3a73 Author: Jason Laster <[email protected]> Date: Sun Mar 8 22:40:44 2026 -0600 Add an encyclopedia of common terms (#613) commit 8fe21d7583a21a19c98b0e24a64dd0d7029b41b0 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Mar 9 03:43:56 2026 +0000 chore(release): prepare v0.0.8 commit 412331aa61a9a38d61f17755d67ed0f8212920d2 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 14:39:41 2026 +1100 fix(web): add missing v7 key to legacy localStorage cleanup list (#594) When the persisted state key was bumped from v7 to v8 in 689dda59, the v7 key was not added to LEGACY_PERSISTED_STATE_KEYS. Users who ran the app during the ~3-week v7 window retain a stale `t3code:renderer-state:v7` entry in localStorage that is never cleaned up. commit cd1c3df89cfa681622292f7f2a9777f81f8e2f10 Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:36:37 2026 -0700 Add PR vouch workflow with trust-status labels (#602) * Add PR vouch workflow and trust-status labeling - Add `.github/workflows/pr-vouch.yml` to label PRs as trusted, unvouched, or denounced - Add `.github/VOUCHED.td` trust-list file for external contributors - Document automatic `vouch:*` labels and contributor expectations in `CONTRIBUTING.md` * Add vouch entries for trusted GitHub contributors - Append 16 GitHub accounts to `.github/VOUCHED.td` - Update trusted-voucher list used for PR labeling workflows commit 3738373aa5ff0fff074ecb95686ef952c209957e Author: 0x1f99d <[email protected]> Date: Mon Mar 9 14:36:03 2026 +1100 fix(server): use waitForPush in terminal event broadcast test to prevent flaky failure (#606) The terminal RPC test used raw waitForMessage to receive the expected terminal.event push, but a server.configUpdated push from the keybindings file watcher can arrive first depending on OS timing. Replace with the existing waitForPush helper that filters by channel. commit 9b9006fed571dbeb1c810493500a679a49a2ba38 Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:30:01 2026 -0700 Fix release finalize lockfile refresh (#608) * Add checkout and Node setup to release updater publish job - Ensure the updater publish job checks out the target ref - Initialize Node using the repository's package.json version file before downloading artifacts * Fix release finalize lockfile refresh commit 42234b8f7cbe4465370fa0511f3fe26df2a2ae2e Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:12:31 2026 -0700 fix: plan mode ui overhaul (#596) * new plan mode started * review comments * more fixes commit 39f65703e7bd97df787ba45373ed75dddae9bb2f Author: Theo Browne <[email protected]> Date: Sun Mar 8 20:00:15 2026 -0700 Add checkout and Node setup to updater publish workflow job (#605) - Ensure the updater publish job checks out the target ref - Initialize Node using the repository's package.json version file before downloading artifacts commit b7f954a9041ee4524552ad0993e8b7711c86ff8a Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Mon Mar 9 01:58:25 2026 +0000 Fix ChildProcess.spawn failing on Windows for .cmd shims (#495) * fix(scripts): enable shell mode on Windows for .cmd shim resolution On Windows, tools like `bun`, `npm`, `turbo`, and `bunx` are installed as `.cmd` shims. Node's `child_process.spawn` cannot resolve these without `shell: true`, causing `PlatformError: NotFound` on fresh builds where there is no Turbo cache. Add `shell: process.platform === "win32"` to all ChildProcess.make calls in cli.ts, dev-runner.ts, and build-desktop-artifact.ts. Closes #474 * docs: add comments explaining Windows shell spawn requirement * docs: add shell spawn comments to remaining call sites commit a20815ece6ea877a2b82072339f4bced98d757f7 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 12:56:29 2026 +1100 fix(web): align sidebar logo with macOS traffic light buttons (#586) Adjust the Electron sidebar header to properly center the T3 wordmark with the native window controls. The logo was sitting ~2px too low and ~8px too close to the traffic lights. - Reduce wordmark container top margin from mt-2 (8px) to mt-1.5 (6px) - Increase Electron header left padding from 82px to 90px for proper traffic light clearance - Match the desktop update button margin to stay aligned Closes #564 commit 1c43bad705bd1d953fd168aa0b852c8b2d83ee84 Author: Mubin Ansari <[email protected]> Date: Mon Mar 9 07:21:55 2026 +0530 Add `delete` option for project actions (#223) Adds a delete button to the action edit dialog with a confirmation alert. Fixes pingdotgg/t3code#208. commit 18b6590d2e490bd73ba968b094dc221ffb7c0f67 Author: (CJ) Chukwudi Nwobodo <[email protected]> Date: Mon Mar 9 01:36:52 2026 +0000 feat(desktop): add spellcheck suggestions to context menu (#500) Wire up Electron's context-menu event on webContents to surface dictionary suggestions for misspelled words. Standard edit actions (Cut, Copy, Paste, Select All) appear in all context menus. Related to #473 commit d62ffa7560bffeb2509ed115eed31dd5bc231ca6 Author: Theo Browne <[email protected]> Date: Sun Mar 8 18:27:04 2026 -0700 pr changes pt2 commit 59e2944fb72d8ef8c3b55fec3be766abe48df820 Author: 0x1f99d <[email protected]> Date: Mon Mar 9 12:24:56 2026 +1100 fix(web): add dismiss button to thread error banner (#588) The thread error banner had no way to be dismissed. Users hitting unrecoverable errors (e.g. missing gh CLI during PR creation) were stuck with a persistent error banner and no way to clear it. Add a dismiss (X) button to ThreadErrorBanner using the exi…
…g#651) * feat(web): add shift-click multi-select for sidebar threads Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability) * fix(web): filter deleted threads from worktree orphan check during bulk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references. * fix(web): fix shift-click range selection, distinct selection styling, and deselect on click away * Preserve thread multi-select on safe sidebar control clicks - avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface --------- Co-authored-by: Julius Marminge <[email protected]>
…g#651) * feat(web): add shift-click multi-select for sidebar threads Add support for selecting multiple threads in the sidebar via Cmd/Ctrl+Click (toggle) and Shift+Click (range select), with bulk context menu actions for Delete and Mark Unread. - New threadSelectionStore (Zustand) for ephemeral selection state with anchor-based range selection and no-op guards - Platform-aware modifier detection (Cmd on Mac, Ctrl elsewhere) matching existing isMacPlatform pattern in terminal-links - Extracted deleteThread helper from handleThreadContextMenu for reuse by bulk delete, with deletedThreadIds set for correct fallback navigation during batch operations - Selected threads share the active thread highlight style - Escape key clears selection; plain click clears and navigates - Right-click on selected thread shows bulk menu; right-click on unselected thread clears selection and shows single-thread menu - 22 unit tests covering toggle, range select, clear, remove, and edge cases (cross-project fallback, anchor stability) * fix(web): filter deleted threads from worktree orphan check during bulk delete When bulk-deleting threads that share a worktree, the stale threads closure caused getOrphanedWorktreePathForThread to see the other threads-being-deleted as still alive, suppressing the orphaned worktree cleanup prompt. Filter out deletedThreadIds (keeping the current thread) so the check correctly identifies worktrees that will have no surviving references. * fix(web): fix shift-click range selection, distinct selection styling, and deselect on click away * Preserve thread multi-select on safe sidebar control clicks - avoid clearing selection on mousedown for thread items and marked safe controls - centralize the selection-safe selector and add logic tests for clear vs preserve behavior - simplify thread selection store typing by merging state/actions interface --------- Co-authored-by: Julius Marminge <[email protected]>
Summary
Adds multi-select support for sidebar thread items, enabling bulk actions on threads.
Implementation
New:
threadSelectionStore.tsEphemeral Zustand store (no persistence — selection clears on reload) managing:
selectedThreadIds: ReadonlySet<ThreadId>— the selected setanchorThreadId— stable anchor for shift-click range computationtoggleThread,rangeSelectTo,clearSelection,removeFromSelectionRefactored:
Sidebar.tsxdeleteThreadhelper fromhandleThreadContextMenufor reuse by bulk delete. Accepts an optionaldeletedThreadIdsset so bulk delete correctly finds fallback navigation targets.isMacPlatform(navigator.platform)(same pattern asterminal-links.ts) instead of the naivemetaKey || ctrlKeyapproach, so Ctrl+Click on Mac doesn't conflict with context menu.New:
threadSelectionStore.test.ts22 unit tests covering:
clearSelectionno-op guard (referential stability)removeFromSelectionwith anchor cleanup and no-op when nothing matchesVideo
Screen.Recording.2026-03-10.at.11.50.03.am.mov
Verification
bun lint— 0 errors (2 pre-existing warnings in server package, unrelated)bun typecheck— 7/7 packages passbun run test— all 22 new tests pass; 27 pre-existing failures incomposerDraftStore.test.tsandterminalStateStore.test.ts(localStorage unavailability in test env, confirmed identical before this change)Note
Add shift-click and cmd/ctrl-click multi-select for sidebar threads
Macroscope summarized 970066c.