Skip to content

feat(web): keep unsent drafts one click away in the sidebar - #5777

Merged
t3dotgg merged 6 commits into
mainfrom
t3code/sidebar-draft-thread-view
Aug 9, 2026
Merged

t3dotgg merged 6 commits into
mainfrom
t3code/sidebar-draft-thread-view

Conversation

@t3dotgg

@t3dotgg t3dotgg commented Aug 9, 2026 •

Copy link
Copy Markdown
Member

Preview:
image

Starting a new thread, ducking into another thread to grab context, then trying to get back to the draft was a mess. There was no way to navigate back, so you would hit New Thread again — which silently reset the draft's branch, worktree, and env mode, and overwrote its model and permission mode with whatever thread you were just viewing. The typed text survived; everything else did not.

Now any draft you have invested in (typed text or attachments) shows as a row at the top of the sidebar, above pinned. Clicking it is a plain navigation back to the draft, so every setting comes back exactly as you left it.

The semantics:

  • A row appears once you navigate away from a draft. A fresh draft you are still typing has no row.
  • Opening a draft keeps its row (active highlight), frozen at the moment you entered — no per-keystroke repainting. It updates when you leave.
  • Send or discard removes the row. Discard is a hover X on the row.
  • New-thread surfaces (button, hotkeys, / landing, palette) always mint a fresh draft when the current one has content. They only reuse empty drafts, so sessions do not pile up. The sidebar rows are the only way back to an invested draft.
  • The store keeps invested drafts alive (unmapped) when the per-project draft mapping moves to a fresh one, instead of deleting them. Content-less unmapped sessions get GC'd at persist time.

Screenshot

(Theo: paste the sidebar screenshot here — the session can't attach images.)


Built by Claude Fable 5 running in Claude Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches composer draft lifecycle (remap, persist, project clear) and new-thread routing; wrong edge cases could orphan drafts or reset user work, but behavior is covered by new store tests and is mostly client-side UX state.

Overview
Invested composer drafts (prompt or attachments) now appear as rows at the top of the sidebar, above pinned threads. Each row shows project + preview, navigates to /draft/$draftId, and can be discarded with a hover control. The open draft’s row uses a frozen snapshot so typing doesn’t repaint the sidebar; performance is isolated via a memoized SidebarDraftBlock and a count-only subscription for empty state.

Draft store semantics change so remapping a project to a new draft keeps the previous session when it has user content (unmapped but listed in the sidebar); empty drafts are still GC’d. Persist only keeps sessions that are mapped, promoting, or have content. Project removal sweeps all sessions for that project, including unmapped invested drafts. getDraftSessionByProjectRef prefers the mapped draft over older unmapped ones.

New-thread flows (useHandleNewThread) only reuse empty stored drafts; invested drafts are left alone and a fresh draft is minted, with extra race guards so concurrent navigation/remap/content doesn’t clobber the winner.

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

Summary by CodeRabbit

  • New Features

    • Added a sidebar section for unsent drafts, including project, model, session, prompt, and attachment previews.
    • Drafts can be reopened, navigated, or discarded directly from the sidebar.
    • The currently open draft remains stable while edits are in progress.
  • Bug Fixes

    • Drafts containing text or attachments are now preserved more reliably.
    • Starting a new thread no longer replaces an existing draft with user content.
    • Empty drafts are cleaned up while meaningful drafts remain available.

Note

Add unsent composer drafts with user content to the sidebar

  • Adds SidebarDraftBlock and SidebarDraftRow components to Sidebar.tsx that render unsent drafts above pinned threads, with click-to-navigate and inline discard.
  • Adds composerDraftHasUserContent predicate to composerDraftStore.ts to identify drafts with non-empty prompt, attachments, contexts, or comments (model/mode selections excluded).
  • Persistence now drops empty, unmapped, non-promoting draft sessions; remapping a project preserves the previous draft if it has user content instead of deleting it.
  • New-thread actions in useHandleNewThread now mint a fresh draft rather than reusing any draft that already has user content.
  • Uses a count-only store subscription in the sidebar to avoid full re-renders while the user is typing in a draft composer.

Macroscope summarized ba18319.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The change preserves composer drafts containing user content, prevents new-thread actions from reusing them, and adds scoped draft display, navigation, discard actions, and empty-state handling to the sidebar.

Changes

Composer draft lifecycle

Layer / File(s) Summary
Draft content detection and persistence
apps/web/src/composerDraftStore.ts, apps/web/src/composerDraftStore.test.ts
The store detects meaningful composer content, preserves invested drafts during project remapping, filters persisted metadata, and prioritizes mapped project drafts. Tests cover empty-draft removal and content preservation.
New-thread draft selection
apps/web/src/hooks/useHandleNewThread.ts
New-thread creation reuses only empty drafts. Drafts with prompts or attachments remain separate from new-thread initialization.
Sidebar draft display and navigation
apps/web/src/components/Sidebar.tsx
The sidebar renders scoped drafts with context and previews, supports navigation and discard actions, preserves the active draft snapshot, and hides the empty state when drafts exist.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Sidebar
  participant composerDraftStore
  participant DraftRoute
  Sidebar->>composerDraftStore: Read scoped drafts with user content
  composerDraftStore-->>Sidebar: Return draft context and preview data
  Sidebar->>DraftRoute: Navigate to /draft/$draftId
  DraftRoute->>composerDraftStore: Load selected draft
Loading

Possibly related issues

  • pingdotgg/t3code/5534 — Addresses the same objective of making unsent composer drafts visible and manageable in the sidebar.

Suggested reviewers: juliusmarminge, maria-rcks, shivamhwp

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the primary change: keeping unsent drafts accessible from the sidebar.
Description check ✅ Passed The description clearly explains the change, rationale, behavior, UI impact, and testing risk, although it omits the template checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/sidebar-draft-thread-view

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

❤️ Share

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

@github-actions github-actions Bot added vouch:trusted Author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 9, 2026
Comment thread apps/web/src/components/Sidebar.tsx Resolved
Comment thread apps/web/src/components/Sidebar.tsx Resolved
Comment thread apps/web/src/components/Sidebar.tsx Resolved
Comment thread apps/web/src/composerDraftStore.ts Resolved

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
apps/web/src/composerDraftStore.test.ts (1)

852-867: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for the persistence filter.

This test proves the in-memory survival of an invested draft. The reload half is untested. partializeComposerDraftStoreState now drops unmapped sessions that are neither promoting nor backed by persisted composer content. A test that partializes state after this remap would lock in two behaviors: the unmapped invested session survives, and an unmapped empty session does not.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/composerDraftStore.test.ts` around lines 852 - 867, Add
persistence coverage to the remapping test using
partializeComposerDraftStoreState: after remapping, verify the unmapped invested
draft with prompt content remains in the partialized state, while an unmapped
empty draft session is excluded. Reuse the existing draft/thread setup and
persistence state symbols rather than changing the in-memory assertions.
apps/web/src/components/Sidebar.tsx (1)

1808-1833: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract the draft-visibility rule into one shared predicate.

This selector reimplements the row filter in SidebarDraftBlock at lines 576-600. Both apply the same three rules: the session is not promoting, the composer has user content, and the project is in scope. The comment states this copy only "approximates" the block's filter. Two independent copies of one visibility rule will drift as the rule changes.

Export a single predicate next to composerDraftHasUserContent and call it from both sites. The rule is client-agnostic, so packages/client-runtime is also a candidate home if desktop and mobile surface draft rows later.

As per coding guidelines: "shared logic belongs in packages/client-runtime when appropriate".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/components/Sidebar.tsx` around lines 1808 - 1833, Extract the
shared draft-row visibility predicate alongside composerDraftHasUserContent,
preferably in packages/client-runtime, covering promotion status, user content,
and project scope. Export and reuse it in both the visibleDraftSessionCount
selector and SidebarDraftBlock, removing the duplicated filter logic while
preserving existing behavior.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/components/Sidebar.tsx`:
- Around line 461-517: Update handleKeyDown for the outer draft-row button so it
only handles Enter or Space when event.currentTarget equals event.target,
ignoring keyboard events originating from the nested discard button. Preserve
the existing navigation behavior for direct row activation and leave
handleDiscard unchanged.

---

Nitpick comments:
In `@apps/web/src/components/Sidebar.tsx`:
- Around line 1808-1833: Extract the shared draft-row visibility predicate
alongside composerDraftHasUserContent, preferably in packages/client-runtime,
covering promotion status, user content, and project scope. Export and reuse it
in both the visibleDraftSessionCount selector and SidebarDraftBlock, removing
the duplicated filter logic while preserving existing behavior.

In `@apps/web/src/composerDraftStore.test.ts`:
- Around line 852-867: Add persistence coverage to the remapping test using
partializeComposerDraftStoreState: after remapping, verify the unmapped invested
draft with prompt content remains in the partialized state, while an unmapped
empty draft session is excluded. Reuse the existing draft/thread setup and
persistence state symbols rather than changing the in-memory assertions.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 13ae9532-d26d-4702-bc90-12e8dd57bb49

📥 Commits

Reviewing files that changed from the base of the PR and between 886195e and 4742b0c8ba179d28f058dfc06cec8ece2b025921.

📒 Files selected for processing (4)
  • apps/web/src/components/Sidebar.tsx
  • apps/web/src/composerDraftStore.test.ts
  • apps/web/src/composerDraftStore.ts
  • apps/web/src/hooks/useHandleNewThread.ts

Comment thread apps/web/src/components/Sidebar.tsx Resolved
@github-actions

github-actions Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 11.3 KiB 11.3 KiB −6 B (−0.1%) 15.1 KiB ✅
Codex Thread snapshot wire 5.5 KiB 5.5 KiB +1 B (+0.0%) 7.3 KiB ✅
Codex Live turn WebSocket wire 5.9 KiB 5.9 KiB −7 B (−0.1%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 49.7 KiB 49.7 KiB 0 B (0.0%) 66.4 KiB ✅
Codex Live turn messages 16 16 0 (0.0%) 21 ✅
Claude Total thread wire 11.3 KiB 11.3 KiB +1 B (+0.0%) 15.1 KiB ✅
Claude Thread snapshot wire 5.5 KiB 5.5 KiB −1 B (−0.0%) 7.3 KiB ✅
Claude Live turn WebSocket wire 5.9 KiB 5.9 KiB +2 B (+0.0%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 50.6 KiB 50.6 KiB 0 B (0.0%) 66.4 KiB ✅
Claude Live turn messages 16 16 0 (0.0%) 21 ✅

Baseline: ddaa6af · PR result: ba18319 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment thread apps/web/src/composerDraftStore.ts Resolved
@macroscopeapp

macroscopeapp Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR introduces a new sidebar feature for displaying and interacting with unsent drafts, including new React components, state management for frozen draft snapshots, and changes to draft lifecycle behavior. New user-facing features with this scope warrant human review.

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

t3dotgg and others added 4 commits August 8, 2026 20:03
Drafts with typed text or attachments now show as rows above the pinned
block, frozen while open, gone on send/discard. New-thread surfaces always
mint a fresh draft instead of resurrecting (and resetting) an invested one;
the store keeps invested drafts alive unmapped when the per-project mapping
moves.

Co-Authored-By: Claude Fable 5 <[email protected]>
Header reads project · env mode · branch; the model still travels with
the draft, it just doesn't earn a slot in a row this small.

Co-Authored-By: Claude Fable 5 <[email protected]>
Env mode and branch ate the header, especially with long project names.
The settings still travel with the draft; the row just stops advertising
them.

Co-Authored-By: Claude Fable 5 <[email protected]>
- Keyboard activation of the discard button now discards instead of
  navigating (row keydown ignores events from the nested button).
- navigateToDraft clears the selection anchor unconditionally so a later
  shift-click doesn't range from a stale anchor.
- clearProjectDraftThreadId sweeps every session for the project, not just
  the first — invested drafts left unmapped by a remap no longer outlive
  project removal. Regression test added.
- Rebase note: the mint-path raced-draft guard from main now only reuses a
  draft registered during the await, so it can't resurrect the invested
  draft this feature deliberately declines to reuse.

Co-Authored-By: Claude Fable 5 <[email protected]>
@t3dotgg
t3dotgg force-pushed the t3code/sidebar-draft-thread-view branch from 4f4f858 to 81a40cf Compare August 9, 2026 03:05
Comment thread apps/web/src/composerDraftStore.ts Resolved
- Persist-time GC now keys off real user content, so an unmapped session
  whose draft holds only ambient model/mode data no longer survives as an
  invisible zombie.
- The empty-draft reuse path re-checks the mapping and content after its
  await: a concurrent invocation's fresh draft can no longer be evicted by
  a stale continuation remapping back to the old draft.

Co-Authored-By: Claude Fable 5 <[email protected]>

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit be716b7. Configure here.

Comment thread apps/web/src/composerDraftStore.ts Resolved
partialize now computes kept sessions first and filters both maps with the
same predicate, so a dropped session's model/mode-only composer entry
can't persist forever keyed to nothing.

Co-Authored-By: Claude Fable 5 <[email protected]>
@t3dotgg
t3dotgg merged commit 05eb051 into main Aug 9, 2026
17 checks passed
@t3dotgg
t3dotgg deleted the t3code/sidebar-draft-thread-view branch August 9, 2026 03:29
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 9, 2026
## What's Changed
* chore: vouch gfsaaser24 by @t3dotgg in pingdotgg/t3code#5761
* chore: vouch saphid by @t3dotgg in pingdotgg/t3code#5763
* fix(server): stop Codex threads with queued follow-ups by @t3dotgg in pingdotgg/t3code#5762
* fix(web): usage page loses the cost quality panel, gains a back button by @t3dotgg in pingdotgg/t3code#5756
* feat(server): agents can now open the images you paste into chat by @t3dotgg in pingdotgg/t3code#5757
* fix(web): pinned reorder no longer reshuffles while writes land by @t3dotgg in pingdotgg/t3code#5767
* feat(web): overhaul project settings into a real settings page by @t3dotgg in pingdotgg/t3code#5768
* fix(web): usage totals no longer jump while devices report in by @t3dotgg in pingdotgg/t3code#5772
* fix(server): settle no longer leaves monitors and dev servers running by @t3dotgg in pingdotgg/t3code#5774
* feat: pick worktree or current checkout per project by @t3dotgg in pingdotgg/t3code#5766
* fix(web): sidebar rows show the branch again, not a truncated plan step by @t3dotgg in pingdotgg/t3code#5776
* feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data by @t3dotgg in pingdotgg/t3code#5773
* feat(web): keep unsent drafts one click away in the sidebar by @t3dotgg in pingdotgg/t3code#5777


**Full Changelog**: pingdotgg/t3code@v0.0.33-nightly.20260809.1039...v0.0.33-nightly.20260809.1040

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.33-nightly.20260809.1040
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 10, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 10, 2026
## What's Changed
* fix(mobile): reconnects no longer shift the thread list by @t3dotgg in pingdotgg/t3code#5372
* feat(web): drag pinned threads into your own order by @t3dotgg in pingdotgg/t3code#5581
* chore(ci): vouch StiensWout by @t3-code[bot] in pingdotgg/t3code#5637
* feat(desktop): remember recently used sites in the Browser panel by @chrisdeeming in pingdotgg/t3code#5270
* chore: vouch chrisdeeming by @t3-code[bot] in pingdotgg/t3code#5641
* feat(web): make sidebar artwork theme-aware by @maria-rcks in pingdotgg/t3code#5636
* fix(web): reconnect the composer seam for remote non-Git projects by @caezium in pingdotgg/t3code#5633
* fix(web): show Stop button while input is pending by @ipanasenko in pingdotgg/t3code#5554
* feat(web): fold plan mode and token-by-token output into Legacy features by @t3dotgg in pingdotgg/t3code#5664
* feat: sidebar v2 is now the default sidebar by @t3dotgg in pingdotgg/t3code#5672
* fix(server): stop PR status lookups amplifying GitHub rate limits by @t3dotgg in pingdotgg/t3code#5673
* fix(web): delay transient reconnect warnings by @t3-code[bot] in pingdotgg/t3code#5670
* fix(web): inherit terminal size in simple typography by @chrisdeeming in pingdotgg/t3code#5628
* fix(server): stop the reaper from silently killing live background subagents by @t3dotgg in pingdotgg/t3code#5677
* fix(desktop): zoom shortcuts no longer die when the preview browser has focus by @t3dotgg in pingdotgg/t3code#5691
* feat(mobile): one sheet for model and thread settings by @t3dotgg in pingdotgg/t3code#5625
* feat(usage): usage page reading provider transcripts across environments by @t3dotgg in pingdotgg/t3code#5684
* fix(web): usage chart no longer makes Claude look like the bigger spender by @t3dotgg in pingdotgg/t3code#5697
* fix(web): persist diff view mode by @leorivastech in pingdotgg/t3code#5731
* feat(web): show how many subagents are running at a glance by @t3dotgg in pingdotgg/t3code#5745
* fix(web): add missing cursor-pointer styling to dropdowns and interactive buttons by @naMqe-h in pingdotgg/t3code#5716
* fix(server): stop Claude resume handshakes from completing turns that never ran by @gfsaaser24 in pingdotgg/t3code#5710
* chore: vouch gfsaaser24 by @t3dotgg in pingdotgg/t3code#5761
* chore: vouch saphid by @t3dotgg in pingdotgg/t3code#5763
* fix(server): stop Codex threads with queued follow-ups by @t3dotgg in pingdotgg/t3code#5762
* fix(web): usage page loses the cost quality panel, gains a back button by @t3dotgg in pingdotgg/t3code#5756
* feat(server): agents can now open the images you paste into chat by @t3dotgg in pingdotgg/t3code#5757
* fix(web): pinned reorder no longer reshuffles while writes land by @t3dotgg in pingdotgg/t3code#5767
* feat(web): overhaul project settings into a real settings page by @t3dotgg in pingdotgg/t3code#5768
* fix(web): usage totals no longer jump while devices report in by @t3dotgg in pingdotgg/t3code#5772
* fix(server): settle no longer leaves monitors and dev servers running by @t3dotgg in pingdotgg/t3code#5774
* feat: pick worktree or current checkout per project by @t3dotgg in pingdotgg/t3code#5766
* fix(web): sidebar rows show the branch again, not a truncated plan step by @t3dotgg in pingdotgg/t3code#5776
* feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data by @t3dotgg in pingdotgg/t3code#5773
* feat(web): keep unsent drafts one click away in the sidebar by @t3dotgg in pingdotgg/t3code#5777
* feat(web): project icons can be chosen manually by @t3dotgg in pingdotgg/t3code#5775
* fix(server): one greedy agent process no longer takes down the whole server by @t3dotgg in pingdotgg/t3code#5788
* ci: label-gated hosted-web preview deploys by @t3dotgg in pingdotgg/t3code#5465
* Add cross-platform mobile usage dashboard by @juliusmarminge in pingdotgg/t3code#5743
* fix(web): preserve desktop route during Clerk auth by @wobsoriano in pingdotgg/t3code#5770
* fix(web): match create theme and import theme buttons to the standard outline style by @UtkarshUsername in pingdotgg/t3code#5860
* fix(server): favicon resolution no longer pins the event loop by @murenovich in pingdotgg/t3code#5538
* fix(shared): bound the file-link label so bracket runs stop rescanning by @tsouth89 in pingdotgg/t3code#5782
* fix(web): thread title button no longer eats the drag area by @nathangerday in pingdotgg/t3code#5857
* fix(web): unify usage page chrome by @t3-code[bot] in pingdotgg/t3code#5823
* fix(shell): add ~/.local/bin to the Windows CLI resolver so native-installed providers are found by @arhxam in pingdotgg/t3code#5074
* fix(web): match settings search shortcut styling to command palette's by @UtkarshUsername in pingdotgg/t3code#5841
* fix(mobile): long-pressing a thread row no longer navigates into the thread by @juliusmarminge in pingdotgg/t3code#5901
* fix(server): usage no longer double-counts forked Codex sessions by @t3dotgg in pingdotgg/t3code#5887
* fix(server): sandbox user-provided SVGs by @t3dotgg in pingdotgg/t3code#5916
* fix(web): match usage titlebar text styling by @t3-code[bot] in pingdotgg/t3code#5897
* Move project settings to contextual project routes by @juliusmarminge in pingdotgg/t3code#5923
* Retain thread sidebar data when navigating to /settings so back navigation is instant by @juliusmarminge in pingdotgg/t3code#5930
* Automate production mobile EAS releases by @juliusmarminge in pingdotgg/t3code#5609
* Add settings and usage breadcrumbs by @juliusmarminge in pingdotgg/t3code#5929
* fix(web): correct model picker trigger padding by @Chrono-byte in pingdotgg/t3code#5935
* fix(web): show worktree icon in sidebar v2 by @tris203 in pingdotgg/t3code#5909
* fix(web): enable restore defaults after theme mix changes by @Lucenx9 in pingdotgg/t3code#5928
* fix(web): trait menu closes after you pick a level by @t3dotgg in pingdotgg/t3code#5879
* fix(web): align project name with headline by @carterwsmith in pingdotgg/t3code#5864
* fix(web): update pills use readable theme foregrounds by @chrisdeeming in pingdotgg/t3code#5938
* fix(web): use themed confirmation dialogs by @StiensWout in pingdotgg/t3code#5624
* fix(web): use import/export-appropriate icons for theme buttons by @UtkarshUsername in pingdotgg/t3code#5964
* fix(mobile): detect PowerShell cmdlet errors in work log rows by @myacoub91 in pingdotgg/t3code#5726
* fix(mobile): stop Android user bubbles with code blocks from overlapping by @Brechard in pingdotgg/t3code#5659
* fix(mobile): parse EAS fingerprint JSON by @juliusmarminge in pingdotgg/t3code#5991

## New Contributors
* @chrisdeeming made their first contribution in pingdotgg/t3code#5270
* @wobsoriano made their first contribution in pingdotgg/t3code#5770
* @murenovich made their first contribution in pingdotgg/t3code#5538
* @tsouth89 made their first contribution in pingdotgg/t3code#5782
* @nathangerday made their first contribution in pingdotgg/t3code#5857
* @carterwsmith made their first contribution in pingdotgg/t3code#5864
* @myacoub91 made their first contribution in pingdotgg/t3code#5726

**Full Changelog**: pingdotgg/t3code@v0.0.32...v0.0.33

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.33
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 10, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 11, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 11, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 12, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 12, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
0xgeorgemathew added a commit to 0xgeorgemathew/t3trade that referenced this pull request Aug 13, 2026
* fix(web): settle button now works on hover, not just right-click (pingdotgg#4905)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(clients): disable add project while disconnected (pingdotgg#4834)

* fix(composer): hide default Codex service tier (pingdotgg#4784)

* docs: link iOS and Android app store downloads (pingdotgg#4902)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): align remote server update action (pingdotgg#4731)

* fix(connect): suggest a serve command that matches how you ran connect (pingdotgg#4897)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): stop shared content errors in Personal Team builds (pingdotgg#4943)

* perf(mobile): sends respond instantly, thread opens stop freezing (pingdotgg#4882)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): show Codex fast mode as a bolt (pingdotgg#4947)

* docs: seed worktrees with a copy of real userdata instead of banning it (pingdotgg#4949)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): support dragged images in the composer (pingdotgg#4953)

* fix(mobile): stop long iOS threads from jumping while scrolling up (pingdotgg#4867)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): keep worktree default when switching a draft's machine (pingdotgg#4964)

Co-authored-by: Claude Fable 5 <[email protected]>

* perf(mobile): reconnect environments immediately on resume (pingdotgg#4878)

* feat(web): pasting a huge screenshot now compresses it instead of erroring (pingdotgg#4967)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): regenerate thread titles from sidebar (pingdotgg#4810)

* fix(web): show server update progress through reconnect (pingdotgg#4903)

* feat(search): find threads by conversation content (pingdotgg#4959)

* fix: marketing site Vercel builds no longer die after ~100 deploys (pingdotgg#4975)

Co-authored-by: Claude Fable 5 <[email protected]>

* docs: split user and maintainer docs, fix 100+ stale claims (pingdotgg#4807)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): server updates no longer look like warnings (pingdotgg#4992)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(connect): reboots no longer strand the relay link, 403s now say why (pingdotgg#4988)

Co-authored-by: Claude Fable 5 <[email protected]>

* Add project file picker (⌘P) and project content search (⇧⌘F) (pingdotgg#4855)

Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* Check for mobile app updates on launch (pingdotgg#4958)

Co-authored-by: codex <[email protected]>

* fix(mobile): support pre-Liquid-Glass iOS bottom toolbar (pingdotgg#4984)

* fix(server): restore PR detection without HOME (pingdotgg#4985)

* fix(web): fill fast mode icon (pingdotgg#5004)

* fix: cache project favicons across web and mobile (pingdotgg#4767)

* perf(ci): cut stale runs and redundant setup (pingdotgg#4802)

* chore(mobile): bump app version to 1.0.1

Co-Authored-By: Claude Fable 5 <[email protected]>

* style(web): make scroll-to-end pill translucent (pingdotgg#5036)

* fix(ci): drop sparse-checkout from EAS workflows

actions/checkout implements sparse-checkout with --filter=blob:none, so
the runner repo is a partial clone missing the .repos/ blobs. eas-cli
archives the project via `git clone --depth 1 file://<workspace>`,
which upload-pack cannot serve from a partial clone and exits 128
(pingdotgg#4802 broke both EAS build workflows this way).

Co-Authored-By: Claude Fable 5 <[email protected]>

* fix(desktop): bump Clerk Electron SDK to 0.0.24 and register t3code:// scheme on Linux (pingdotgg#5015)

Co-authored-by: Claude Fable 5 <[email protected]>

* perf(server): cache default branch name and origin existence across status refreshes (pingdotgg#5008)

* feat(shared): support shorthand (major-only) versions in the semver helpers (pingdotgg#5027)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(mobile): remove unnecessary photo library permission (pingdotgg#4929)

* fix(shared): lenient JSON parser deletes commas inside string values (pingdotgg#5025)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(mobile): default bare IP pairing to HTTP (pingdotgg#4990)

* fix(mobile): restore iOS Threads branding (pingdotgg#4862)

* chore: add mobile issue template area (pingdotgg#4895)

* fix(desktop): link release notes from the update downloaded toast (pingdotgg#4771)

Co-authored-by: Claude Opus 5 <[email protected]>

* fix(mobile): accept Android clipboard images in composer (pingdotgg#4836)

* fix(mobile): show the correct build channel in Android's Threads page header (pingdotgg#4861)

* fix(contracts): decode growing config unions forward-compatibly (pingdotgg#5055)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): server model, worktree, and origin preferences now apply to new tasks (pingdotgg#5064)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(ci): repair the mobile showcase screenshots workflow (pingdotgg#5057)

* fix(ci): capture iPad App Store screenshots in landscape (pingdotgg#5065)

* fix(oxlint-plugin): Resolve the oxlint bin without assuming a pnpm layout (pingdotgg#5066)

* feat(cli): `npx t3 pair` - generate QR code from a running server (pingdotgg#4955)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): self-update no longer rolls itself back on restart (pingdotgg#5095)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(ci): rotate iPad showcase captures without Simulator UI scripting (pingdotgg#5094)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): render terminals with libghostty-vt (pingdotgg#4860)

Co-authored-by: Claude Fable 5 <[email protected]>

* refactor: move the canonical libghostty-vt vendor to the repository root (pingdotgg#5102)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(mobile): add thread snoozing (pingdotgg#5053)

* feat(mobile): make settled threads collapsible (pingdotgg#5056)

* follow-up normalization after pingdotgg#4700. (pingdotgg#4498)

Co-authored-by: T3 Code Test <[email protected]>

* feat(web): search threads from the sidebar (pingdotgg#4769)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): add settings sidebar search (pingdotgg#4682)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix: threads with open PRs no longer auto-settle (pingdotgg#5151)

* fix(server): bound thread catch-up replay and stop full-DB snapshot hydration (pingdotgg#5147)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): follow branch drift in dedicated worktrees so PRs link to their thread (pingdotgg#5159)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): make remote updates rollback-safe (pingdotgg#5181)

* fix(web): stop settle controls overlapping the status label (pingdotgg#4574)

* fix: normalize app icon glyph sizing (pingdotgg#5202)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(server): surface cloudflared FTL/PNC relay logs as warnings, not debug (pingdotgg#5076)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(server): stop npx service updates from silently leaving the old server running (pingdotgg#5217)

Co-authored-by: Claude <[email protected]>

* feat: fold legacy models into separate menus (pingdotgg#5190)

* fix(desktop): claim the t3code:// scheme default on Linux at startup (pingdotgg#5054)

* fix(web): polish interface spacing (pingdotgg#5252)

* fix(desktop): Niri/Hyprland - Linux secret storage backend (pingdotgg#2916)

Co-authored-by: Julius Marminge <[email protected]>

* fix(web): match loading screen to dark theme (pingdotgg#5303)

* fix(web): blink the terminal cursor again (pingdotgg#5314)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(terminal): protect held Ctrl/Cmd+W close shortcut (pingdotgg#5322)

* fix(server): strip replayable terminal queries from history (pingdotgg#5319)

* fix(contracts): decode ServerProviders forward-compatibly (pingdotgg#5327)

Co-authored-by: Rodrigo Brechard <[email protected]>

* fix(web): simplify chat code blocks (pingdotgg#5301)

* fix(web): align multiline error alert controls (pingdotgg#5304)

* Upgrade Effect to beta.103 (pingdotgg#5331)

* fix(web): increase tooltip z-index to overlay popovers and menus (pingdotgg#5326)

* fix(server): use a Cursor todo's title when its content is blank (pingdotgg#5073)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(ssh): isolate managed tunnel processes (pingdotgg#4347)

* fix(server): scrub AppImage XDG_DATA_DIRS and GSETTINGS_SCHEMA_DIR from terminals (pingdotgg#5075)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(mobile): show correct provider icons for Grok, Cursor, and OpenCode (pingdotgg#4586)

* fix(web): stop the chat timeline reading through the provider status banner (pingdotgg#5353)

* fix(desktop,web): contain renderer memory growth and recover from renderer OOM crashes (pingdotgg#5148)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): generate durable thread titles (pingdotgg#5357)

* fix(web): better right panel (new diffs styling) (pingdotgg#5260)

* fix(server): keep regenerated titles on topic (pingdotgg#5365)

* refactor(server): make title prompts plaintext (pingdotgg#5368)

* feat(web): configurable fonts and sizes under Settings → Appearance (pingdotgg#5103)

Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* feat(sidebar-v2): thread pinning for sidebar v2 (pingdotgg#5312)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): make pairing QR codes actually scannable, with endpoint choice (pingdotgg#5360)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(desktop,web): improve in-app browser shortcuts and URL behavior (pingdotgg#4703)

* fix(web): prevent legacy model picker layout shift (pingdotgg#5349)

* fix(server): allow remote updates with database migrations (pingdotgg#5374)

* fix(mcp): unblock Kimi models in OpenCode with preview tools (pingdotgg#5128)

* fix(web): clear main branch lint warnings (pingdotgg#5384)

* fix(mobile): preserve grouped project workspaces (pingdotgg#4642)

Co-authored-by: T3 Code Test <[email protected]>

* fix(mobile): prevent Android thread search crash (pingdotgg#5386)

* fix(web): truncate long project switcher names (pingdotgg#5348)

* fix(mobile): avoid double dividers between thread sections (pingdotgg#5391)

Co-authored-by: T3 Code Test <[email protected]>

* fix(web): keep the composer command menu anchored to the composer (pingdotgg#5336)

* fix(web): restore terminal link hover styles (pingdotgg#5382)

* fix(ci): isolate releases from shared API rate limits (pingdotgg#5394)

* fix(web): keep model picker shortcuts in sync (pingdotgg#5400)

* fix(web): keep terminal font settings reliable (pingdotgg#5397)

* Enrich terminal font previews (pingdotgg#5428)

* fix(web): preserve terminal font size when splitting (pingdotgg#5444)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* Prevent terminal loading flash (pingdotgg#5432)

* fix: reconnect faster after remote server updates (pingdotgg#5404)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat: native subagent & workflow observability (pingdotgg#5219)

Co-authored-by: Claude Fable 5 <[email protected]>

* perf(server): stop shipping full MCP tool results in thread payloads (pingdotgg#5482)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): closed plan sidebar stays closed when returning to a thread (pingdotgg#5484)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix: respect time format for sidebar snooze (pingdotgg#4438)

* fix(web): calm one-row server update status and banner

The version-skew banner is no longer an amber warning: it reads
"Server update available" with the raw versions (unreadable for
nightlies) moved to a tooltip. The in-flight rail (Download/Install/
Resume) becomes a single status row, "Downloading…" then
"Restarting…", since the wire installing stage is a sub-second
launcher handoff and "resuming" meant nothing to most people.

Co-Authored-By: Claude Fable 5 <[email protected]>

* fix(server): keep the managed tunnel across remote update restarts

Measured on a live update: the server was back in ~9s but stayed
unreachable for ~96s, because releasing the tunnel on shutdown forces
the replacement tunnel's hostname route through 1-2 minutes of edge
propagation. An update handoff always brings a server right back
(new version or rollback), so the tunnel is never orphaned; skip the
release when the launcher state file records a pending update. The
next boot respawns the connector from the stored config against the
same tunnel and is reachable as soon as it connects.

Co-Authored-By: Claude Fable 5 <[email protected]>

* test(server): use the launcher state writer in release tests

Co-Authored-By: Claude Fable 5 <[email protected]>

* fix(server): release the tunnel when an explicit stop interrupts an update

A pending update in the launcher state is not proof a replacement
server is coming: `t3 service uninstall` or `systemctl stop` during
the pending window also tears the server down, permanently. The
launcher now writes a stop marker before signalling its child on an
explicit stop and clears it on the next start; the shutdown tunnel
release keeps the tunnel only for pending updates without the marker.

Co-Authored-By: Claude Fable 5 <[email protected]>

* fix(server): clean up interrupted update trials

* fix(server): order explicit service shutdown

* fix(web): make update version tooltips accessible

* fix(server): separate trial cleanup from handoff retention

* fix(server): drop superseded tool updates from snapshots

A tool.updated row is the in-flight snapshot of a call; once the call
completes, the tool.completed row carries the final state and both
clients fold every matching update into it. Shipping the updates buys
nothing: 47k such rows exist in one real database, and a single thread
carries 3,291 of them.

Filter them out of thread snapshots, mirroring the existing
context-window dedup. Matching is per turn and only against a LATER
completion, so a revert that discards the completing turn cannot leave
a call unrepresented, and a later update under the same identity (the
next call, still in flight) survives. Live events are untouched.

Rows are matched on the same identity the clients collapse by: an
explicit data.toolCallId when the adapter emits one, otherwise the
itemType/title/detail triple. No tool lifecycle row in the real db
carries a toolCallId, so the fallback does the work.

Co-Authored-By: Claude Fable 5 <[email protected]>

* docs(server): pin interleaved-collapse divergence as intentional with test

Bugbot flagged that clients collapse only adjacent lifecycle rows, so
dropping a superseded update separated by an interleaved parallel call
diverges from full-history rendering. Measured on a real database: 1.5%
of dropped rows (553/36,581), all pure in-flight state whose final result
the retained completion still shows, and zero dropped rows carry a
client-merged payload field their completion lacks (verified across all
49,515 update rows). Documents the tradeoff and adds a test pinning it.

Co-Authored-By: Claude Fable 5 <[email protected]>

* fix(trading): a covered position is not deaf, and does not need a metronome

A PnL line is a directional level in dollars, and a confirmed reduce-only
stop is a level the exchange enforces. Coverage counted neither, so the
observed mission — short, target armed, stop resting — was judged deaf and
woken every three bars to conclude "hold".

Coverage now reads pnl_above as the winning side and pnl_below/pnl_giveback
as the losing side (direction from the position's sign), and a fully
confirmed stop as losing-side coverage. A position covered on both sides
gets the slow sanity backstop (10x the tight floor, clamped [15m, 2h]) — a
thesis-drift check — instead of the tight floor, which stays for the
genuinely deaf case it was built for.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(trading): a waiting plan's unarmed trigger levels come back on the wake

A flat mission is allowed to wait, but waiting is a decision with content:
"come back if price reaches 1899" is a trigger, and a trigger that lives
only in prose wakes nothing. The runtime does not arm it — predicates come
from MarketWatch, never from a condition's description — so it reports the
gap instead. A flat, waiting wakeup now carries `unarmedEntryConditions`:
the entry levels the plan named with no watch within 10 bps of them.

The tool descriptions learned the hierarchy to match (prefer condition
watches; arm a waiting plan's levels in the turn you publish it), and the
toolkit's char budget was paid for out of existing wordiness.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(trading): a stop may be trailed, but only inside the envelope it was approved with

`modify_stop` puts the stop anywhere on the losing side of the mark, and an
unconfirmed replacement escalates to a forced close — so routine trailing was
the one thing the primitive was least suited to. `trading_adjust_stop` is the
bounded version: the same replaceProtection path, with the policy in front of
it.

The rules the server enforces, none negotiable by prompt: risk never grows past
the entry's approved stop; a step is at most min(0.5xATR, 25% of the stop
distance); the agent's own ATR is cross-checked against the server's; the stop
stays outside max(2xhalf-spread, 0.35xATR) and no further than halfway from
entry to target; a stop past entry never crosses back; one adjustment per three
bars and eight per position.

The policy is pure and pinned by its own tests. An accepted move goes out as an
ordinary modify_stop intent, so the confirm-before-cancel sequence and its
§17.5 escalation are the ones every stop move already takes, and lands as
`trading.mission.stop-adjusted` with a durable row the chart's step-line can
later be drawn from.

The toolkit's description budget moves from 10,000 to 11,200: the twentieth
tool pays for itself, since an agent that cannot read the eight refusal codes
just retries the same refused move.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(trading): the wake that arrives one ATR before the exchange decides

`trading_adjust_stop` gave the harness a bounded way to move the stop; nothing
gave it the moment to use it. A protected position's next scheduled event was
the stop itself, which is the exchange taking the decision rather than the
agent making one.

The proximity watch is that moment: a `price_cross` at `stop + 1.0xATR` for a
long, mirrored for a short, `armedReason: "stop_proximity"`. It is armed from
the two places a confirmed stop comes into existence -- `protectIncrease` at
entry and `modifyStop` on every replacement -- so the level always follows the
stop actually resting. Re-arming goes through `replacesWatchId`, so a mission
never carries more than one and the old level dies in the same transaction the
new one is written in.

The reactor was already the only place that sees a confirmed stop, and it
already holds the gateway the ATR is measured with; reading the strategy's
primary timeframe off its stored JSON keeps its layer exactly as wide as it
was, which is why `ensureNotDeaf` -- the other candidate, and the one with no
market data at all -- is left alone.

Arming is best-effort: it runs after the protection it describes is confirmed,
and a position with a live stop and no proximity watch is protected, just less
forewarned. It never fails the execution that armed it. A level already through
the mark arms nothing and cancels any stale one, since a watch that was true
before it was written is an immediate wake, not coverage.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(web): the schedule a mission is already keeping, made visible

Lands two threads of work in one commit because they were written
interleaved in the same three files and cannot be honestly separated
after the fact:

- plan 23's web follow-through: chart condition and fill-marker geometry,
  position-read freshness (current/delayed/stale) with its banner, the
  price and review charts rebuilt on the shared geometry, and the thread
  panel's run rows.
- plan 24 phase B (§3): the "Up next" strip — deriveUpNextItems turns the
  mission's own watches, protection, and in-flight executions into one
  ordered list of future events, rendered as UpNextPill rows above the
  composer. No new RPCs and no new server state; every item is derived
  from the read model the panel already holds.

The server change is the projection carrying the fields the strip reads.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(web): a pill you can click, and the rule it was talking about

The "Up next" strip names price levels the chart is already drawing, but
the two surfaces had no link: finding "wake @ 1899" among four unlabelled
rules was left to the eye. Clicking a pill now lights up its level.

The join is findLevelAtPrice, in the geometry module where the levels
live. It compares with a relative tolerance, because a PnL watch is
divided back into a price on both paths and the two results are equal
only up to float drift. It does not snap to a merely nearest level: the
strip can name a price the chart's domain does not reach, and lighting
the closest rule would point at a price nobody clicked. That case
flashes nothing.

A nonce keys the overlay so a second click on the same pill flashes
again, and the highlight clears itself before the next mission poll — a
rule that outlived the click would read as chart state rather than as an
answer. Pills with no price on a chart stay plain spans.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(web): the whole reassessment queue on the axis, not just its next item

The chart drew one future tick — the nearest scheduled reassessment, which is
the same appointment the header already counts down. A mission that has
republished a few times holds several at once, and the shape of that queue is
the reading: three minutes apart and all armed by the staleness floor is a loop
idling, one at the funding timestamp is a plan waiting.

deriveChartTimeMarkers returns every armed reassessment, soonest first, capped
at five with the last slot collapsing into a +N tick at the furthest moment.
Only the nearest carries a caption — five captions in one gutter collide — and
staleness-floor ticks are drawn muted and sparser than the ones the harness
chose, so the backstop never looks like an intention.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(trading): the mission's history, joined once so no client has to

The read model was entirely current state: the watches armed now, the position
held now, the stop resting now. None of it can say the stop walked up behind a
winner in four steps, or that the last five wakes were the staleness floor
rearming itself — and those are the readings the chart's past axis and the
thread's wake rows exist for.

missionTimeline[] on OrchestrationTradingMission: newest-first, capped at 50,
joined at read time from the three tables that already keep the facts —
trading_harness_runs for wakes, trading_stop_adjustments (migration 050, landed
with the adjust-stop tool) for stop steps, momentum_strategy_versions for
publishes. No migration, and no history copied into the projection row, for the
same reason the execution surfaces are joined rather than stored: the row must
stay rebuildable from the domain tables alone.

Each source is queried with its own limit before the merge, so a mission that
woke two hundred times cannot crowd out its four stop steps. A run that never
started is filed under when it was created — the question the axis answers is
when the mission was woken, not when a provider got round to it — and a failed
run says so in its label, because that is a turn the mission was owed and did
not get.

Co-Authored-By: Claude Opus 5 <[email protected]>

* feat(web): the mission's turns, as a rug along the bottom of its own chart

The axis carried the future — a scheduled reassessment standing in the gutter —
and nothing of the past. So a chart could show a mission that had woken eleven
times in twenty minutes and look identical to one that had woken once, and the
question the operator actually has, "has this loop been doing anything", had no
answer on the surface built to answer it.

`missionTimeline` from the projection becomes a rug of ticks along the bottom
edge: wakes coloured by cause, publishes in foreground, stop moves and failed
runs in loss-red. A rug rather than full-height rules on purpose — twenty
verticals would fence the price line in behind the very thing they annotate,
and the shape of the trade is meant to be the only saturated thing on screen.

Capped at twenty, dropping the oldest: the projection sends newest-first, so a
rug trimmed from the front would stop before the events that just happened.
Anything older than the window's first candle is dropped rather than pinned to
the left edge, the same rule the fill markers follow.

Co-Authored-By: Claude Opus 5 <[email protected]>

* fix(web): clarify auto permission fallback (pingdotgg#5431)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(acp): keep unknown approvals actionable (pingdotgg#5430)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(mobile): stop thread messages reading through pending cards (pingdotgg#5450)

Co-authored-by: Claude Opus 5 <[email protected]>

* fix(web): align composer inline chips with prompt text (pingdotgg#5495)

* fix(web): clear woke state on explicit thread actions (pingdotgg#5486)

* fix(server): skip origin fetch when creating worktrees in repos without an origin remote (pingdotgg#5556)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): update tooltip no longer dismisses when scrolling release notes (pingdotgg#5547)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): stop showing commit/push/PR notices as errors in the work log (pingdotgg#5559)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): show remote environment for non-Git projects (pingdotgg#5555)

* fix(server): stopping a Claude thread no longer shows an ede_diagnostic error (pingdotgg#5557)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): show one toast when snoozing threads in bulk (pingdotgg#5560)

* fix(server): let stopped threads settle immediately (pingdotgg#5553)

* feat: paginate thread loading with user-anchored turn windows (pingdotgg#5493)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Co-authored-by: t3-turbo-simulation <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Theo Browne <[email protected]>

* fix(server): settle stopped Claude subagents (pingdotgg#5568)

* fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)

Co-authored-by: Claude <[email protected]>

* test(server): catch client transfer regressions in CI (pingdotgg#5350)

* fix(web): stop the "requests are slow" warning from firing on every provider update (pingdotgg#5570)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): keep agent panel rows stable (pingdotgg#5569)

* docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): per-device provider settings (pingdotgg#4479)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(mobile): invisible T3 Connect devices can now be seen and removed (pingdotgg#5563)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix: add missing space before 'GitHub releases page' link on download page (pingdotgg#4511)

* fix(web): stop the sidebar "Working" label from pulsing (pingdotgg#5580)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* feat(web): add modular theme library (pingdotgg#5226)

Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(web): reading a thread clears Done; Woke is dismissible (pingdotgg#5579)

Co-authored-by: Claude Fable 5 <[email protected]>

* perf(dev): faster cold-start for dev web serving (pingdotgg#5584)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(dev): Improve instructions for --share (pingdotgg#5586)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): improve keyboard avoiding (pingdotgg#5451)

* fix(web): live background-work banner no longer hides behind the update notice (pingdotgg#5595)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): stabilize chat timeline positioning (pingdotgg#5449)

Co-authored-by: codex <[email protected]>

* feat(server): record runtime mode per turn and on mode changes (pingdotgg#5593)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* feat(web): thread actions from the chat header title (pingdotgg#5592)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

* fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)

* fix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)

* fix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)

Co-authored-by: codex <[email protected]>

* Bump mobile app version to 1.0.2 (pingdotgg#5588)

* feat(web): click the pin icon to unpin a thread (pingdotgg#5578)

* fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)

* chore(release): prepare v0.0.32

* fix(mobile): reconnects no longer shift the thread list (pingdotgg#5372)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* feat(web): drag pinned threads into your own order (pingdotgg#5581)

Co-authored-by: Claude Fable 5 <[email protected]>

* chore(ci): vouch StiensWout (pingdotgg#5637)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* feat(desktop): remember recently used sites in the Browser panel (pingdotgg#5270)

* chore: vouch chrisdeeming (pingdotgg#5641)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* feat(web): make sidebar artwork theme-aware (pingdotgg#5636)

* fix(web): reconnect the composer seam for remote non-Git projects (pingdotgg#5633)

* fix(web): show Stop button while input is pending (pingdotgg#5554)

* feat(web): fold plan mode and token-by-token output into Legacy features (pingdotgg#5664)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat: sidebar v2 is now the default sidebar (pingdotgg#5672)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): stop PR status lookups amplifying GitHub rate limits (pingdotgg#5673)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): delay transient reconnect warnings (pingdotgg#5670)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(web): inherit terminal size in simple typography (pingdotgg#5628)

* fix(server): stop the reaper from silently killing live background subagents (pingdotgg#5677)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(desktop): zoom shortcuts no longer die when the preview browser has focus (pingdotgg#5691)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(mobile): one sheet for model and thread settings (pingdotgg#5625)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(usage): usage page reading provider transcripts across environments (pingdotgg#5684)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): usage chart no longer makes Claude look like the bigger spender (pingdotgg#5697)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): persist diff view mode (pingdotgg#5731)

* feat(web): show how many subagents are running at a glance (pingdotgg#5745)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): add missing cursor-pointer styling to dropdowns and interactive buttons (pingdotgg#5716)

* fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)

Co-authored-by: t3-turbo-simulation <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>

* chore: vouch gfsaaser24 (pingdotgg#5761)

* chore: vouch saphid (pingdotgg#5763)

* fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)

* fix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(server): agents can now open the images you paste into chat (pingdotgg#5757)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): overhaul project settings into a real settings page (pingdotgg#5768)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat: pick worktree or current checkout per project (pingdotgg#5766)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): project icons can be chosen manually (pingdotgg#5775)

* fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* ci: label-gated hosted-web preview deploys (pingdotgg#5465)

Co-authored-by: Claude Fable 5 <[email protected]>

* Add cross-platform mobile usage dashboard (pingdotgg#5743)

* fix(web): preserve desktop route during Clerk auth (pingdotgg#5770)

* fix(web): match create theme and import theme buttons to the standard outline style (pingdotgg#5860)

* fix(server): favicon resolution no longer pins the event loop (pingdotgg#5538)

* fix(shared): bound the file-link label so bracket runs stop rescanning (pingdotgg#5782)

Co-authored-by: tsouth89 <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): thread title button no longer eats the drag area (pingdotgg#5857)

* fix(web): unify usage page chrome (pingdotgg#5823)

* fix(shell): add ~/.local/bin to the Windows CLI resolver so native-installed providers are found (pingdotgg#5074)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(web): match settings search shortcut styling to command palette's (pingdotgg#5841)

* fix(mobile): long-pressing a thread row no longer navigates into the thread (pingdotgg#5901)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): usage no longer double-counts forked Codex sessions (pingdotgg#5887)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): sandbox user-provided SVGs (pingdotgg#5916)

* fix(web): match usage titlebar text styling (pingdotgg#5897)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* Move project settings to contextual project routes (pingdotgg#5923)

* Preserve back navigation when opening settings (pingdotgg#5930)

Co-authored-by: codex <[email protected]>

* Automate production mobile EAS releases (pingdotgg#5609)

* Add settings and usage breadcrumbs (pingdotgg#5929)

* fix(web): correct model picker trigger padding (pingdotgg#5935)

* fix(web): show worktree icon in sidebar v2 (pingdotgg#5909)

* fix(web): enable restore defaults after theme mix changes (pingdotgg#5928)

Co-authored-by: Simone <[email protected]>

* fix(web): trait menu closes after you pick a level (pingdotgg#5879)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): align project name with headline (pingdotgg#5864)

* fix(web): update pills use readable theme foregrounds (pingdotgg#5938)

* fix(web): use themed confirmation dialogs (pingdotgg#5624)

* fix(web): use import/export-appropriate icons for theme buttons (pingdotgg#5964)

* fix(mobile): detect PowerShell cmdlet errors in work log rows (pingdotgg#5726)

* fix(mobile): stop Android user bubbles with code blocks from overlapping (pingdotgg#5659)

Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(mobile): parse EAS fingerprint JSON (pingdotgg#5991)

Co-authored-by: codex <[email protected]>

* feat(trading): entry quotes, exits, and the receipts that make a run provable

Adds the execution-harness pieces the trading run was missing across
contracts, server, and web:

contracts: decision, exit, policy, quote, recovery, replay, and
setupEvidence modules in packages/trading-contracts, with tests.
server: TradingQuoteService, TradingExitService, TradingRunTelemetry,
TradingExecutionReceipts, TradingExecutionSequence, TradingReplayFixtures,
RetryTransient, TradingSessionProfile; migrations 051-053 for run
decisions, entry quotes, and execution sequences.
web: TradingAssetPicker and a MissionLivePanel state refactor; drops the
now-unused missionLockedProviderMessages path.

* chore(deps): bump packageManager to pnpm 11.21.0, regenerate lockfile

* docs(upstream): backfill PATCH_LEDGER for plans 21-25; ignore local working dirs

* test(server): follow trading_execute's quote-id shape and use a namespaced fs import

The coercion test still asserted the pre-quote trading_execute schema, which
d1a245a replaced with {missionId, quoteId}; its numeric fields now live on
trading_quote_entry, so the nested-number case moves there and execute keeps a
pass-through case. Also satisfies namespace-node-imports in the profile test.
Both were red before the v0.0.33 sync started, so the sync stays attributable.

* docs(upstream): record the v0.0.33 baseline and every seam the sync touched

The renumber policy is now exercised rather than proposed: upstream's six new
migrations took fork ids 054-059, and the ledger says why the test bounds move
with them. Also records the seams that only appear once upstream deletes a file
the fork edited (SidebarV2), and the two Effect beta.103 API breaks.

---------

Co-authored-by: Theo Browne <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Wout Stiens <[email protected]>
Co-authored-by: Max Katz <[email protected]>
Co-authored-by: Jake Leventhal <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>
Co-authored-by: Gabriel De Andrade <[email protected]>
Co-authored-by: maria <[email protected]>
Co-authored-by: Utkarsh Patil <[email protected]>
Co-authored-by: Arham Amin <[email protected]>
Co-authored-by: Elaine Lyons <[email protected]>
Co-authored-by: Simone <[email protected]>
Co-authored-by: Alex <[email protected]>
Co-authored-by: Max Anderson <[email protected]>
Co-authored-by: Simon Doba <[email protected]>
Co-authored-by: Aditya Vardhan Sharma <[email protected]>
Co-authored-by: Mike Olson <[email protected]>
Co-authored-by: shivam <[email protected]>
Co-authored-by: T3 Code Test <[email protected]>
Co-authored-by: Illia Panasenko <[email protected]>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: naMqe <[email protected]>
Co-authored-by: Yukun Shan <[email protected]>
Co-authored-by: Rushikesh Gaikwad <[email protected]>
Co-authored-by: Bilal Bakr <[email protected]>
Co-authored-by: Fllip <[email protected]>
Co-authored-by: Hwanseo Choi <[email protected]>
Co-authored-by: Hugo Blom <[email protected]>
Co-authored-by: Carlos Rico-Ospina <[email protected]>
Co-authored-by: Gabe Fletcher <[email protected]>
Co-authored-by: t3-turbo-simulation <[email protected]>
Co-authored-by: Mateleo <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Jay Meistrich <[email protected]>
Co-authored-by: Justyn Leung <[email protected]>
Co-authored-by: Tyler Saari <[email protected]>
Co-authored-by: Pavlo Trinko <[email protected]>
Co-authored-by: Chris Deeming <[email protected]>
Co-authored-by: Henry Zhang <[email protected]>
Co-authored-by: Leonel Rivas <[email protected]>
Co-authored-by: Robert Soriano <[email protected]>
Co-authored-by: Matt Urenovich <[email protected]>
Co-authored-by: Tyler <[email protected]>
Co-authored-by: tsouth89 <[email protected]>
Co-authored-by: nathangerday <[email protected]>
Co-authored-by: Ellie Gummere <[email protected]>
Co-authored-by: Tristan Knight <[email protected]>
Co-authored-by: Simone <[email protected]>
Co-authored-by: Carter Smith <[email protected]>
Co-authored-by: Mina Yacoub <[email protected]>
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 13, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 13, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 13, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 13, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 14, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 15, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
awtprod added a commit to awtprod/t3-code that referenced this pull request Aug 16, 2026
* feat: pick worktree or current checkout per project (pingdotgg#5766)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): project icons can be chosen manually (pingdotgg#5775)

* fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* ci: label-gated hosted-web preview deploys (pingdotgg#5465)

Co-authored-by: Claude Fable 5 <[email protected]>

* Add cross-platform mobile usage dashboard (pingdotgg#5743)

* fix(web): preserve desktop route during Clerk auth (pingdotgg#5770)

* fix(web): match create theme and import theme buttons to the standard outline style (pingdotgg#5860)

* fix(server): favicon resolution no longer pins the event loop (pingdotgg#5538)

* fix(shared): bound the file-link label so bracket runs stop rescanning (pingdotgg#5782)

Co-authored-by: tsouth89 <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): thread title button no longer eats the drag area (pingdotgg#5857)

* fix(web): unify usage page chrome (pingdotgg#5823)

* fix(shell): add ~/.local/bin to the Windows CLI resolver so native-installed providers are found (pingdotgg#5074)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(web): match settings search shortcut styling to command palette's (pingdotgg#5841)

* fix(mobile): long-pressing a thread row no longer navigates into the thread (pingdotgg#5901)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): usage no longer double-counts forked Codex sessions (pingdotgg#5887)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): sandbox user-provided SVGs (pingdotgg#5916)

* fix(web): match usage titlebar text styling (pingdotgg#5897)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* Move project settings to contextual project routes (pingdotgg#5923)

* Preserve back navigation when opening settings (pingdotgg#5930)

Co-authored-by: codex <[email protected]>

* Automate production mobile EAS releases (pingdotgg#5609)

* Add settings and usage breadcrumbs (pingdotgg#5929)

* fix(web): correct model picker trigger padding (pingdotgg#5935)

* fix(web): show worktree icon in sidebar v2 (pingdotgg#5909)

* fix(web): enable restore defaults after theme mix changes (pingdotgg#5928)

Co-authored-by: Simone <[email protected]>

* fix(web): trait menu closes after you pick a level (pingdotgg#5879)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): align project name with headline (pingdotgg#5864)

* fix(web): update pills use readable theme foregrounds (pingdotgg#5938)

* fix(web): use themed confirmation dialogs (pingdotgg#5624)

* fix(web): use import/export-appropriate icons for theme buttons (pingdotgg#5964)

* fix(mobile): detect PowerShell cmdlet errors in work log rows (pingdotgg#5726)

* fix(mobile): stop Android user bubbles with code blocks from overlapping (pingdotgg#5659)

Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(mobile): parse EAS fingerprint JSON (pingdotgg#5991)

Co-authored-by: codex <[email protected]>

* chore(release): prepare v0.0.33

* feat: multi-provider pull requests page with in-app reviews (pingdotgg#4849)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: maria <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: codex <[email protected]>

* perf(desktop): probe the Windows shell environment concurrently (pingdotgg#5878)

Co-authored-by: tsouth89 <[email protected]>

* feat(web): add duplicate action to the T3 Code default theme (pingdotgg#6013)

* fix(web): improve built-in theme contrast (pingdotgg#6000)

* fix(ci): extend release publish timeout (pingdotgg#6034)

* Allow Android tablets to rotate (pingdotgg#5613)

* fix(web): account for Windows window controls in PR page header (pingdotgg#6049)

* feat: add three-hour snooze option (pingdotgg#5914)

* fix(mobile): keep chat composer above the Android gesture bar (pingdotgg#5988)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): OpenCode model parsing drops models with a slash in the JSON body (pingdotgg#5072)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(web): persist sidebar shelf collapse state (pingdotgg#5136)

Co-authored-by: Illia Panasenko <[email protected]>

* perf(web): skip base64 for oversized image candidates (pingdotgg#5220)

* fix(server): skip Linux libc detection on Windows/macOS (pingdotgg#5354)

* fix(server): advertise 256-color TERM on Windows terminals (pingdotgg#5693)

* fix(server): handle unborn HEAD in VCS status (pingdotgg#5944)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(pull-requests): route self-hosted GitLab remotes (pingdotgg#6061)

* feat: add ability to create a new thread in the current project with shift+click and show shortcut in tooltip (pingdotgg#5994)

Co-authored-by: shivam <[email protected]>

* feat(web): add Copy Thread ID to the sidebar and chat header thread context menu (pingdotgg#5574)

Co-authored-by: shivam <[email protected]>

* fix(mobile): stabilize thread composer and interactions (pingdotgg#5986)

Co-authored-by: codex <[email protected]>
Co-authored-by: Thuong Tin <[email protected]>
Co-authored-by: Kapish14 <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>

* Add hourly past-24-hour usage view (pingdotgg#6170)

* fix(mobile): guard App Store release versions (pingdotgg#6177)

Co-authored-by: codex <[email protected]>

* fix(web): restore typography font sizes to defaults (pingdotgg#6172)

* feat(web): make environment artwork theme aware (pingdotgg#6183)

Co-authored-by: codex <[email protected]>

* fix(shared): normalize a bare Windows drive root the same as C:\ / C:/ (pingdotgg#6189)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* fix(shared): detect Azure DevOps SSH remotes (ssh.dev.azure.com) (pingdotgg#6187)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

* feat(web): add back buttons for the pull requests and usage pages in the sidebar footer (pingdotgg#6031)

Co-authored-by: shivam <[email protected]>

* fix(web): render dropdowns above toasts (pingdotgg#6165)

Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): thread error banner dismiss survives reconnect and rerenders (pingdotgg#6123)

* fix(web): use a clearer pull action icon (pingdotgg#6194)

* feat(web): use OKLCH for theme palettes (pingdotgg#6036)

* fix(web): use upload icon for disabled push action (pingdotgg#6207)

* feat(web): add Open VSX theme search (pingdotgg#5654)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): clean up composer resize animation (pingdotgg#6209)

* feat(web): compact sidebar footer actions (pingdotgg#6210)

* fix(web): keep sidebar wordmark visible at minimum width (pingdotgg#6246)

* feat(mobile): add thread title regeneration (pingdotgg#6253)

* chore: add dara to vouched (pingdotgg#6259)

* fix(web): align the composer model picker (pingdotgg#6252)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <[email protected]>

* fix(mobile): keep ordered lists inside user bubbles (pingdotgg#6154)

Co-authored-by: shivam <[email protected]>

* feat(web): a better right panel empty state (pingdotgg#6258)

* fix(web): align mobile onboarding header (pingdotgg#6293)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <[email protected]>

* fix(connect): preserve CLI OAuth parameters through browser sign-in (pingdotgg#6285)

* fix(web): prevent changed files header overlap (pingdotgg#6314)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <[email protected]>

* fix(web): theme Clerk surfaces (pingdotgg#6300)

* feat(web): reset sidebar width on double click (pingdotgg#6320)

* fix(web): align update toast release notes link (pingdotgg#6322)

Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <[email protected]>
Co-authored-by: Exotic <[email protected]>

* fix(web): render tooltips above dropdowns (pingdotgg#6241)

* fix(web): open modified PR clicks in browser (pingdotgg#6278)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <[email protected]>

* Fix mobile command popover glass rendering (pingdotgg#6370)

* test(mobile): seed snoozed showcase threads (pingdotgg#5155)

* fix(web): preserve appearance mode when changing themes (pingdotgg#6343)

* feat(connect): deregister account environments from any client (pingdotgg#4844)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* feat(web): pull request surfaces — filters & qualifiers, all-server listing, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)

Co-authored-by: Julius Marminge <[email protected]>

* fix(web): cmd+click sidebar PR numbers open in the browser (pingdotgg#6378)

* feat(web): project favicon and workspace icons in command subtitles (pingdotgg#6330)

Co-authored-by: Cursor <[email protected]>

* web/settings: fix source control scan on relay environments (pingdotgg#6230)

* fix(web): make reset zoom hover visible (pingdotgg#6385)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <[email protected]>

* fix(web): keep the typed prompt when a draft changes repo (pingdotgg#6393)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): keep diff file lists scrollable past expanded files (pingdotgg#6423)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): align Codex collaboration prompts (pingdotgg#6432)

* fix(web): keep turn minimap stable as composer grows (pingdotgg#6414)

* fix(web): keep pull request panel within viewport (pingdotgg#6451)

* Add bil0000 to VOUCHED contributors list (pingdotgg#6462)

* fix: ignore pull request actions in latency tracker (pingdotgg#6476)

Co-authored-by: Julius Marminge <[email protected]>

* Remove rebase requirement before opening PR (pingdotgg#6479)

* fix(mobile): extend blockquotes across wrapped lines (pingdotgg#6482)

* fix(mobile): prevent invalid HTML entities from crashing markdown (pingdotgg#6495)

Co-authored-by: Simone <[email protected]>

* fix(web): avoid Clerk close button overlap (pingdotgg#6442)

Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <[email protected]>

* fix(web): show unlinked icon when viewport aspect ratio is unlocked (pingdotgg#6509)

* fix(web): scope pull request errors to their environment (pingdotgg#6490)

Co-authored-by: Julius Marminge <[email protected]>

* fix(mobile): show a real settings cog in the Android sidebar header (pingdotgg#6520)

Co-authored-by: Claude Opus 5 <[email protected]>

* fix(web): restore default stage artwork colors (pingdotgg#6535)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <[email protected]>

* fix(web): align sidebar wordmark label (pingdotgg#6086)

* fix(web): align the snoozed thread wake icon (pingdotgg#6215)

* feat: allow disabling auto-settle on merge (pingdotgg#5880)

* Nest mobile task settings in bottom sheets (pingdotgg#6224)

Co-authored-by: codex <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>

* chore(mobile): bump app version to 1.0.4

Co-authored-by: codex <[email protected]>

* fix(web): simplify the desktop-managed server update banner copy (pingdotgg#6549)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): show background policy tooltips sooner (pingdotgg#6506)

* feat(desktop): add favicons to the Browser panel (pingdotgg#5644)

* fix(preview): only show browser-ready local servers (pingdotgg#6021)

* perf(build): stop unpacking node_modules wholesale from the Windows asar (pingdotgg#5877)

Co-authored-by: tsouth89 <[email protected]>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <[email protected]>
Co-authored-by: Shivam Sharma <[email protected]>

* fix: avoid stale Live Activities when publishing is disabled (pingdotgg#6325)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): add breathing room between the git progress overlay and the app bar (pingdotgg#6587)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): keep thread rename open during IME composition (pingdotgg#6281)

* refactor(mobile): name the iOS nav bar height fallback (pingdotgg#6589)

Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(mobile): preserve keyboard suggestions while typing (pingdotgg#6323)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): prevent OTA update restart crashes (pingdotgg#6324)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): align every titlebar control cluster on one shared inset (pingdotgg#6592)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(mobile): steer active turns by default (pingdotgg#6543)

* fix(web): clarify desktop update status (pingdotgg#6504)

* fix(server): terminal subprocess polling no longer floods the PID space (pingdotgg#6377)

* fix(web): add copying terminal selection with ctrl+c in the web app (pingdotgg#5638)

* perf(desktop): speed up Windows update installation (pingdotgg#6169)

* fix(web): style sidebar action tooltips (pingdotgg#6371)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <[email protected]>

* refactor(web): simplify global styling (pingdotgg#6381)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(server): handle files named HEAD in git status (pingdotgg#6397)

Co-authored-by: Simone <[email protected]>

* feat(packaging): maintain AUR packages in-repo (pingdotgg#4128)

* fix(web): bound OKLCH gamut mapping (pingdotgg#6485)

Co-authored-by: Simone <[email protected]>

* feat(web): open remote environments in your local editor over SSH (pingdotgg#6572)

Co-authored-by: Claude Fable 5 <[email protected]>

* feat(web): refresh workspace layouts and tool activity

* revert: refresh workspace layouts and tool activity (pingdotgg#6657)

* Sync upstream with public-safe fixtures

Squash the reviewed upstream sync into a public-safe history while preserving its final tree.

* feat(web): older chat timestamps show the date, not just the time (pingdotgg#6654)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): align pull request action menu rows (pingdotgg#6534)

Co-authored-by: Nickolas Kyryliuk <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): restore selected themes in dark mode (pingdotgg#6665)

* fix(web): improve Codex usage graph contrast (pingdotgg#6669)

* docs: route feature requests to Discussions

- Disable feature-request issue templates
- Direct contributors to Ideas discussions for proposals

* fix(desktop): app zoom no longer zooms the preview browser (pingdotgg#6649)

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(server): keep provider notification consumers alive past startSession (pingdotgg#6538)

Co-authored-by: tsouth89 <[email protected]>

* fix(server): treat removed Bitbucket permissions endpoint as unknown, not blocking (pingdotgg#6525)

* fix(ssh): let cold remote servers finish starting (pingdotgg#6168)

* fix(web): preserve Claude insight line breaks (pingdotgg#4344)

* feat(web): accept file drops across the chat workspace (pingdotgg#6636)

* fix(web): widen ordered-list marker gutter for 3+ digit item numbers (pingdotgg#6527)

* fix(server): bound thread activity hydration (pingdotgg#6153)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(web): restore the Archive action in the default sidebar thread menu (pingdotgg#6526)

* fix(web): open diff files from nested projects (pingdotgg#6174)

* fix(mobile): use tryOpenExternalUrl for markdown links in ThreadFeed (pingdotgg#5872)

Co-authored-by: codex <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(web): open the file a bare filename reference names (pingdotgg#6297)

Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(server): stop the provider title mirror from overwriting real thread titles (pingdotgg#5941)

* fix(shared): match source-control providers by DNS label (pingdotgg#6175)

* feat(desktop): Chrome-style hold-to-quit (pingdotgg#5508)

* fix(gitlab): submit review comments on context lines (pingdotgg#6348)

* fix(marketing): keep Grok mark clear of mobile hero copy (pingdotgg#4542)

* fix(mobile): recover the QR pairing scanner when camera access is denied (pingdotgg#6487)

* fix(web): keep a long path from running under the folder picker button (pingdotgg#4823)

Co-authored-by: Sy-D <[email protected]>
Co-authored-by: Claude Opus 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(terminal): right-click paste works in the terminal (pingdotgg#5240)

* fix(mobile): explain iOS-only settings on Android (pingdotgg#4981)

* fix(web): stop counting a workflow coordinator as a working agent (pingdotgg#6672)

* fix(web): keep floating preview anchored after panel closes (pingdotgg#6547)

* fix(web): unstick /connect after in-modal sign-in by redirecting to the authorize endpoint (pingdotgg#5133)

* fix(web): keep send reachable while a turn is running on mobile (pingdotgg#4781)

Co-authored-by: AMohamedAakhil <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): reject unsupported composer image types at attach time (pingdotgg#6574)

* Make ClaudeTextGeneration tests hermetic on Windows (pingdotgg#4508)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): show command output in work log (pingdotgg#4083)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): reserve sibling column width when resizing the right panel (pingdotgg#6279)

* fix(web): replace whitespace in new ref names with dashes (pingdotgg#6270)

* fix(client-runtime): branch list no longer resets while paging through refs (pingdotgg#5858)

* fix(web): support Shift+Insert terminal paste (pingdotgg#5982)

* fix(web): keep the composer glass aligned with the context strip at any interface font size (pingdotgg#5703)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(codex): keep background memory out of chats (pingdotgg#5468)

* fix(server): treat a missing Codex rollout as a recoverable resume error (pingdotgg#6671)

* fix(web): hide provider Update toast action while an update is running (pingdotgg#6544)

Co-authored-by: Cursor <[email protected]>

* fix(desktop): agent shells inherit a UTF-8 locale on macOS (pingdotgg#6236)

* fix(server): ignore Claude command lifecycle messages (pingdotgg#6606)

* docs: mention Bitbucket user read scope needed by auth probe (pingdotgg#6291)

Co-authored-by: Gerwin Bisschop <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): return valid preview action results (pingdotgg#5966)

Co-authored-by: duncan-vc <[email protected]>

* fix(claude): make "Always allow for session" stick, and only for the session (pingdotgg#5041)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(ssh): surface a failed remote t3 install instead of a silent 0-byte server.log (pingdotgg#5132)

* perf(server): persist the wire projection for streaming tool.updated data (pingdotgg#6675)

Co-authored-by: mInrOz <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>

* fix(web): stop wrapping partial code block selections in markdown fences (pingdotgg#5069)

* fix(web): hide T3 Connect toggle in web app settings (pingdotgg#5068)

* fix(web): show provider account accent badge in sidebar rows and hover card (pingdotgg#5980)

Co-authored-by: Claude Fable 5 <[email protected]>

* fix(server): wait for concurrent SQLite writers instead of failing with SQLITE_BUSY (pingdotgg#5134)

* fix(web): reject oversized prompts before provider turn start (pingdotgg#6602)

* feat(web): collapse the question prompt from its header (pingdotgg#6773)

Co-authored-by: Claude Opus 5 <[email protected]>

* fix(shared): degrade an unknown system time zone to UTC in usage windows (pingdotgg#6670)

* fix(claude): discover repo-local .agents/skills in skill discovery (pingdotgg#5488)

* fix(server): let slow provider CLIs raise their discovery probe budget (pingdotgg#6223)

Co-authored-by: Julius Marminge <[email protected]>

* fix(web): retain terminal PR badges after checkout switch (pingdotgg#4755)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): show selected model in context window tooltip (pingdotgg#4772)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): scale command details with code font (pingdotgg#6510)

* fix(web): preserve XML-like tags in user messages (pingdotgg#4133)

Co-authored-by: codex <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(desktop): route mouse thumb buttons to the in-app browser (pingdotgg#4459)

Co-authored-by: Claude Opus 4.8 <[email protected]>

* fix(web): keep the final segment of directory paths with a trailing separator (pingdotgg#5460)

Co-authored-by: jorvarea <[email protected]>

* Keep block code plain when copying from rendered markdown (pingdotgg#4468)

* fix(web): add web app manifest so installed app keeps its scope (pingdotgg#4306)

* Skip user hooks during Claude capability probes (pingdotgg#4466)

* fix(mobile): use Android monospace font family (pingdotgg#4609)

* fix(desktop): timestamps follow the OS locale instead of en-US (pingdotgg#6190)

* fix(web): keep multi-select questions open after the first click (pingdotgg#6646)

* fix(web): stop clipping the changed-files expand hover on Windows (pingdotgg#6545)

Co-authored-by: Cursor <[email protected]>

* fix(server): allow long-running git pushes (pingdotgg#6499)

* fix(desktop): keep probing backend readiness while the process is alive (pingdotgg#5526)

* fix(server): allow install scripts in npm-global provider updates (pingdotgg#5646)

* fix: detect SSH remotes with non-git user prefixes (e.g. gitlab@) (pingdotgg#3649)

* fix(web): describe what Ultracode does in the Reasoning picker (pingdotgg#6092)

* fix(server): settle pending user-input requests when a Claude session stops (pingdotgg#5127)

Co-authored-by: Capxul Agent <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(server): stop replaying a command receipt for a different aggregate (pingdotgg#5246)

* fix(server): settle snoozed threads immediately (pingdotgg#5379)

* fix(mobile): prevent crash on sign out in settings (pingdotgg#4899)

* fix(mobile): local-checkout threads record their branch so PR badges show (pingdotgg#4986)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): contain long approval commands (pingdotgg#6503)

* feat(web): make right panel maximize bindable (pingdotgg#5091)

* fix(server): respect inherited OPENCODE_CONFIG_CONTENT (pingdotgg#4242)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(marketing): detect Mac chip on homepage download button (pingdotgg#4197)

Co-authored-by: Claude Opus 4.8 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* Keep the server alive when a response write hits a dead socket (pingdotgg#4470)

* Limit physical key fallback to non-Latin layout output (pingdotgg#4469)

* fix: restore CLAUDE.md symlink target (pingdotgg#3929)

* fix(clients): default clone destination to folder plus repo name (pingdotgg#5989)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* fix(web): keep timestamp date and time in the same locale (pingdotgg#7081)

Co-authored-by: codex <[email protected]>

* feat(desktop): add signal macOS DMG installer background (pingdotgg#6201)

Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: codex <[email protected]>

* feat(web): send PR line requests to agent (pingdotgg#6597)

* fix(web): restore dark theme palette (pingdotgg#6663)

Co-authored-by: maria <[email protected]>

* refactor(web): simplify advanced theme controls (pingdotgg#7107)

* fix(web): keep highlighted command menu items clear of the scroll fade (pingdotgg#7132)

Co-authored-by: Claude Fable 5 <[email protected]>

* test: remove redundant and stale tests (pingdotgg#6267)

* fix: repair typecheck errors left by the upstream/main merge

Fixes surfaced by a full repo-wide typecheck after merging upstream/main
and origin/main into sync-upstream-continue:

- apps/web/src/components/SidebarV2.tsx: add missing isRunning field
- apps/web/src/components/settings/BetaSettingsPanel.tsx: replace removed
  useSidebarV2Enabled hook with useClientSettings selector
- apps/web/src/components/settings/SettingsFontPreviews.tsx: drop obsolete
  onCopy callback (GhosttyTerminalSurface now handles copy natively)
- apps/mobile/src/lib/threadActivity.ts: remove duplicate
  MOBILE_TERMINAL_UPDATE_STATUSES/isTerminalBypassUpdate/isAgentInternalActivity
  block left by a silent (non-conflict-marked) merge duplication
- apps/mobile/src/features/threads/ThreadComposer.tsx: remove duplicate
  handleEfficiencyMenuAction, same cause
- apps/mobile/src/features/threads/ThreadDetailScreen.tsx: stop passing
  activeThreadBusy to ThreadComposer, which no longer accepts it
- apps/mobile/src/features/home/HomeScreen.tsx: remove dead
  shouldShowConnectionStatus/WorkspaceConnectionStatus/connectionStatus
  references (connection state now surfaces via the header title slot)
- apps/mobile/src/features/home/HomeRouteScreen.tsx: fix settings-sheet
  navigation params, drop the now-removed onOpenEnvironments prop
- apps/mobile/src/features/settings/SettingsUsageRouteScreen.tsx: use the
  fork's UsageQuerySummary/UsageQueryTokenTotals types instead of upstream's
  UsageSummary/UsageTokenTotals, matching what the usage RPC actually returns
- packages/contracts/src/ipc.ts: drop DesktopBridge.confirm, superseded by
  LocalApi.dialogs.confirm; every desktop-side implementation had already
  dropped it independently
- apps/desktop/src/window/DesktopApplicationMenu.test.ts: drop the
  now-invalid confirm mock to match
- apps/desktop/src/preview/Manager.ts: remove a duplicate
  FrameCaptureConsumer/FrameCaptureSession/PictureInPictureSession block
- apps/server/src/environment/RemoteOpenTargets.ts: fix service tag to the
  fork's @awtprod/command-center/... convention
- apps/server/src/persistence/Layers/ProjectionThreads.ts: restore the
  upsertProjectionThreadRow query, which a conflict resolution had mangled
  into an invalid mix of INSERT and SELECT clauses
- apps/mobile/package.json, patches/@[email protected]: fix
  @legendapp/list version pin and repair a patch file left with unresolved
  nested conflict markers from a rename/rename conflict

Full repo-wide `vp run -r typecheck` now passes clean across all 16
workspace packages.

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* fix: repair pre-existing SQL and test bugs surfaced by running the full suite

- apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts: three
  activity-listing queries selected correlated_message_id in their outer
  SELECT but never in the inner bounded subquery (two cases) or not at all
  (listPinnedThreadActivityRowsByThread), causing "no such column" SQL
  errors and schema decode failures. Pre-existing in HEAD before this
  merge, just never exercised until the full test suite ran clean of
  conflict markers.
- packages/contracts/src/settings.test.ts: removed a test asserting that
  decoding drops the sidebarV2Enabled/sidebarV2ConfiguredByUser keys —
  contradicted the adjacent "ClientSettings sidebar v2" tests and the
  real schema, which keeps both fields alive alongside legacySidebarEnabled
  for BetaSettingsPanel.tsx.
- packages/contracts/src/settings.ts: fixed the legacySidebarEnabled
  comment to describe the fields as coexisting, not superseding.
- apps/web/src/browserFaviconStore.test.ts, browserHistoryStore.test.ts:
  switched their `~/state/session` mocks to importOriginal() + override,
  so the real environmentSession export (now used transitively via
  state/server.ts) stays available instead of being dropped entirely.

Full repo-wide `vp run -r test` passes (aside from two known-flaky
poll-based tests that pass in isolation but time out under full
concurrent load, unrelated to this merge).

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* fix(server): update stale npm-global test expectation for --allow-scripts

Upstream added the --allow-scripts=<package> flag to npm-global provider
update commands; this test's expectation was the only one in the file
that hadn't been updated to match (the other three assertions in the same
file already expect the flag).

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* test(server): skip a deadlocking git-push timeout test pending investigation

"allows pushes to run longer than the default command timeout" hangs until
the test timeout regardless of how long that timeout is (confirmed at both
120s and 180s), merged verbatim from upstream commit 86fb47a and
untouched by any conflict resolution in this sync. Needs its own look at
how pushCurrentBranch's command-timeout override interacts with TestClock;
skipping for now so it doesn't block the suite.

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* fix: keep usage dashboard current (#25)

Co-authored-by: atryan <[email protected]>

* fix(web): keep usage totals current by default (#26)

Co-authored-by: atryan <[email protected]>

* feat(desktop): run local threads without leaving a remote primary (#27)

* fix(web): switch new threads between connected computers

* feat(desktop): keep Windows available with a remote primary

* docs: explain local execution with a remote primary

---------

Co-authored-by: atryan <[email protected]>

* fix(web): open usage on the past 24 hours (#28)

* fix(web): open usage on the past 24 hours

* fix(server): resolve native Codex npm runtimes

---------

Co-authored-by: atryan <[email protected]>

* fix(desktop): stop remote-primary mode from launching a local backend (#30)

Co-authored-by: atryan <[email protected]>

* fix(web): keep visible usage dashboards current (#31)

Co-authored-by: atryan <[email protected]>

* Fix/codex isolation missing auth (#32)

* fix(web): open usage on the past 24 hours

* fix(server): resolve native Codex npm runtimes

* fix(desktop): stop remote-primary mode from launching a local backend

* fix(server): bypass identity wrapper for isolated Codex

* fix(server): accept enforced Codex read denials

* fix(server): stop isolation probe from scanning host processes

* fix(server): fail closed when Codex isolation finds no credentials

`prepareCommandCenterCodexHome` only copied `auth.json` into the isolated
home when the source home had one, and never checked the result. A source
home without credentials produced a working session that failed on its
first model call with an opaque provider 401 naming neither the missing
file nor the home Command Center actually read.

Require credentials in the isolated home before returning the layout, and
name the resolved source path in the error.

Seed `auth.json` in the fixtures that relied on the previous fail-open
behavior; they cover home layout and profile injection, not auth.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>

* fix(server): surface Codex sandbox permission requests

Codex 0.147 asks to widen its sandbox with
`item/permissions/requestApproval`. No handler was registered, so the
request fell through to `handleUnknownServerRequest` and was answered
with a JSON-RPC "method not found". Codex reports that as
`user rejected MCP tool call`, so the turn failed with an approval the
user was never shown and could not answer.

Register the handler and map the method through to a real approval
prompt. The request carries an arbitrary path list (each read/write/deny)
plus a network toggle, so the decision is classified on the requested
permissions rather than on the tool that triggered them — a read-only
tool can still ask for write.

`autoApproveReadOnlyPermissions` (off by default) grants an escalation
without prompting only when every entry is a read: any write, sandbox
denial, legacy write list, or network enable still prompts. Auto-grants
are scoped to the turn, never the session.

The approval channel carries only accept/decline, so the granted profile
is the requested one echoed back on accept and an empty profile on
refusal, mirroring how ClaudeAdapter replays SDK permission suggestions.

Requests are surfaced with the `file-change` kind: ingestion derives the
kind from the canonical request type alone, and a kind that varied per
request would disagree between the opened and resolved activities. A
request with no kind renders no prompt in web or mobile while the server
still opens a pending row, which parks the thread unanswerable.

The persisted activity keeps only `detail`, so the requested paths are
folded into it — otherwise the prompt cannot be reviewed.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>

---------

Co-authored-by: atryan <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* style(web): wrap an over-long condition in useLiveRefresh (#34)

`vp check` fails on sync-upstream because this line exceeds the print width,
which blocks CI for every PR targeting the branch. Formatter-only change: the
condition is re-wrapped, with no behaviour difference.

Co-authored-by: atryan <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(dev): stop a stray system `vp` from silently killing dev servers (#33)

dev-runner spawns `vp` by bare name with `extendEnv: false`, so resolution
depended entirely on the PATH it inherited. When node_modules/.bin was absent
from that PATH, an unrelated /usr/bin/vp (atfs/ShapeTools) won the lookup and
failed in the worst possible way: it printed `basename: unrecognized option
'--filter=...'`, started no dev server, and exited 0. The launcher reported
success while the stack was already gone.

Pin the repo's node_modules/.bin ahead of the inherited PATH so `vp` always
means this repo's toolchain, whatever environment we were launched from.

Co-authored-by: atryan <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>

* fix(web): drop stale ComposerPrimaryActions.test.ts duplicate

The upstream sync left both .ts and .tsx test files for the same
component; they collide on case-insensitive filesystems (Windows/macOS
CI) and release-smoke's path-collision check fails the build. The .tsx
version is upstream's current file and is a strict superset of the
stale fork-only .ts copy.

---------

Co-authored-by: Theo Browne <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Robert Soriano <[email protected]>
Co-authored-by: Utkarsh Patil <[email protected]>
Co-authored-by: Matt Urenovich <[email protected]>
Co-authored-by: Tyler <[email protected]>
Co-authored-by: tsouth89 <[email protected]>
Co-authored-by: nathangerday <[email protected]>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Arham Amin <[email protected]>
Co-authored-by: codex <[email protected]>
Co-authored-by: Ellie Gummere <[email protected]>
Co-authored-by: Tristan Knight <[email protected]>
Co-authored-by: Simone <[email protected]>
Co-authored-by: Simone <[email protected]>
Co-authored-by: Carter Smith <[email protected]>
Co-authored-by: Chris Deeming <[email protected]>
Co-authored-by: Wout Stiens <[email protected]>
Co-authored-by: Mina Yacoub <[email protected]>
Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Rodrigo Brechard <[email protected]>
Co-authored-by: Bilal Bakr <[email protected]>
Co-authored-by: maria <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Jono Kemball <[email protected]>
Co-authored-by: Pavlo Trinko <[email protected]>
Co-authored-by: Alex <[email protected]>
Co-authored-by: Illia Panasenko <[email protected]>
Co-authored-by: Taras <[email protected]>
Co-authored-by: bkntr <[email protected]>
Co-authored-by: yassiEmp <[email protected]>
Co-authored-by: Guilherme Vieira <[email protected]>
Co-authored-by: shivam <[email protected]>
Co-authored-by: Thuong Tin <[email protected]>
Co-authored-by: Kapish14 <[email protected]>
Co-authored-by: Exotic <[email protected]>
Co-authored-by: Nick Anisimov <[email protected]>
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Gianmarco <[email protected]>
Co-authored-by: Cursor <[email protected]>
Co-authored-by: Dominic Roy <[email protected]>
Co-authored-by: Dominic Roy <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Adamulek123 <[email protected]>
Co-authored-by: Paul van Dyk <[email protected]>
Co-authored-by: Taylor Bombay <[email protected]>
Co-authored-by: Rakshith Bhat <[email protected]>
Co-authored-by: David Hu <[email protected]>
Co-authored-by: t3-code[bot] <t3-code[bot]@users.noreply.github.com>
Co-authored-by: Michael Charles Aubrey <[email protected]>
Co-authored-by: Dara Adedeji <[email protected]>
Co-authored-by: atryan <[email protected]>
Co-authored-by: Nickolas Kyryliuk <[email protected]>
Co-authored-by: Lars Nieuwenhuis <[email protected]>
Co-authored-by: Guilherme Barros <[email protected]>
Co-authored-by: Yukun Shan <[email protected]>
Co-authored-by: David Balderston <[email protected]>
Co-authored-by: mohamedmastouri-hue <[email protected]>
Co-authored-by: Ulises Britos <[email protected]>
Co-authored-by: Nicolas Layne <[email protected]>
Co-authored-by: JJ <[email protected]>
Co-authored-by: Simon Doba <[email protected]>
Co-authored-by: Sy-D <[email protected]>
Co-authored-by: Daniel Vernon <[email protected]>
Co-authored-by: Rishet11 <[email protected]>
Co-authored-by: Akshar Patel <[email protected]>
Co-authored-by: Torben Wetter <[email protected]>
Co-authored-by: BootesVoid <[email protected]>
Co-authored-by: AMohamedAakhil <[email protected]>
Co-authored-by: mohammed shazeb <[email protected]>
Co-authored-by: Mihnea Peteu <[email protected]>
Co-authored-by: LikoKiko Tech <[email protected]>
Co-authored-by: Vividh Mahajan <[email protected]>
Co-authored-by: Jorge Pineda <[email protected]>
Co-authored-by: abhwshek <[email protected]>
Co-authored-by: aoright <[email protected]>
Co-authored-by: Williawar <[email protected]>
Co-authored-by: Mark Griffin <[email protected]>
Co-authored-by: Linus Boehm <[email protected]>
Co-authored-by: Naveed Iqbal <[email protected]>
Co-authored-by: Gerwin <[email protected]>
Co-authored-by: Gerwin Bisschop <[email protected]>
Co-authored-by: duncan-vc <[email protected]>
Co-authored-by: duncan-vc <[email protected]>
Co-authored-by: Joaquin Navarro <[email protected]>
Co-authored-by: Martin Bergo <[email protected]>
Co-authored-by: mInrOz <[email protected]>
Co-authored-by: Tai Nguyen <[email protected]>
Co-authored-by: Vitaly Iegorov <[email protected]>
Co-authored-by: Ostap <[email protected]>
Co-authored-by: Jaroslav Brtis <[email protected]>
Co-authored-by: Roshan Mhatre <[email protected]>
Co-authored-by: Carlos Jimenez <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: sebbonit <[email protected]>
Co-authored-by: nqrwhal <[email protected]>
Co-authored-by: CursedApple <[email protected]>
Co-authored-by: John Surles <[email protected]>
Co-authored-by: Akos Balogh <[email protected]>
Co-authored-by: jorvarea <[email protected]>
Co-authored-by: jorvarea <[email protected]>
Co-authored-by: Aditya Garud <[email protected]>
Co-authored-by: Alex Brodsky <[email protected]>
Co-authored-by: Harshith Goka <[email protected]>
Co-authored-by: Paul <[email protected]>
Co-authored-by: RaitP1 <[email protected]>
Co-authored-by: Dev Talan <[email protected]>
Co-authored-by: Luis Gustavo Couto Wacker <[email protected]>
Co-authored-by: JackatDJL <[email protected]>
Co-authored-by: delltrak <[email protected]>
Co-authored-by: Aaron Abu Usama <[email protected]>
Co-authored-by: Capxul Agent <[email protected]>
Co-authored-by: Kevin Bravo <[email protected]>
Co-authored-by: shubhu <[email protected]>
Co-authored-by: Zeus-Deus <[email protected]>
Co-authored-by: El-Hussein Abdelraouf <[email protected]>
Co-authored-by: Jono <[email protected]>
Co-authored-by: Mahdi Ben Messaoud <[email protected]>
Co-authored-by: Ngo Quoc Viet <[email protected]>
Co-authored-by: Inaya Yousfi <[email protected]>
Co-authored-by: Eddy Naboulet <[email protected]>
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 18, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 18, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 18, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 19, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 20, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
yngatech-nightly Bot pushed a commit to incognitojam/styal that referenced this pull request Aug 21, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 27, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
incognitojam added a commit to incognitojam/styal that referenced this pull request Aug 28, 2026
Upstream `pingdotgg#5777` introduced draft-session rows in the sidebar using an
amber `SquarePenIcon`, while our thread-row unsent-draft indicator (#23)
still used `PencilIcon` — two glyphs for the same "unsent composer
content" concept. This swaps the thread-row indicator to `SquarePenIcon`
so drafts read consistently, keeping the muted colour treatment (rather
than upstream's amber) since on a thread row it's a quiet status flag
alongside the terminal and PR badges, not a block asking for a decision.
Size (`size-3.5`) and hover behaviour are unchanged.

| Before | After |
| --- | --- |
|
![before](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/before.png)
|
![after](https://raw.githubusercontent.com/yngatech/t3code/assets/pr-69-draft-icon/after.png)
|

Screenshots show the indicator on the "Fix flaky nightly changelog test"
row (a thread with unsent composer text) while another thread is open.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant