From a17459e8a93a7be1f8261166034c245dd9794a0a Mon Sep 17 00:00:00 2001 From: Justyn Leung Date: Fri, 7 Aug 2026 06:20:15 -0400 Subject: [PATCH 1/7] fix(mobile): avoid iOS terminal reset on clear (#5440) --- apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift b/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift index 659837fc7abd..cee4d0427c60 100644 --- a/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift +++ b/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift @@ -535,6 +535,12 @@ public final class T3TerminalView: ExpoView, UITextFieldDelegate { return } + if buffer.isEmpty { + feedData(Data("\u{1B}[3J\u{1B}[H\u{1B}[2J".utf8)) + lastAppliedBuffer = "" + return + } + if buffer.hasPrefix(lastAppliedBuffer) { let suffix = String(buffer.dropFirst(lastAppliedBuffer.count)) feedData(Data(suffix.utf8)) From 33a03c8a7bf4a398f410c9e6def903531237958a Mon Sep 17 00:00:00 2001 From: Tyler Saari <73684839+StoneCotton@users.noreply.github.com> Date: Fri, 7 Aug 2026 06:21:31 -0400 Subject: [PATCH 2/7] fix(mobile): pad scroll views above Android nav bar (#5415) --- apps/mobile/src/features/connection/ConnectionsRouteScreen.tsx | 2 +- apps/mobile/src/features/threads/NewTaskRouteScreen.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/mobile/src/features/connection/ConnectionsRouteScreen.tsx b/apps/mobile/src/features/connection/ConnectionsRouteScreen.tsx index 45132fd9ced9..464477ffc874 100644 --- a/apps/mobile/src/features/connection/ConnectionsRouteScreen.tsx +++ b/apps/mobile/src/features/connection/ConnectionsRouteScreen.tsx @@ -58,8 +58,8 @@ export function ConnectionsRouteScreen() { contentInsetAdjustmentBehavior="automatic" showsVerticalScrollIndicator={false} className="flex-1" - contentInset={{ bottom: Math.max(insets.bottom, 18) + 18 }} contentContainerStyle={{ + paddingBottom: Math.max(insets.bottom, 18) + 18, paddingHorizontal: 20, paddingTop: 16, }} diff --git a/apps/mobile/src/features/threads/NewTaskRouteScreen.tsx b/apps/mobile/src/features/threads/NewTaskRouteScreen.tsx index f59218259288..bc044d905b47 100644 --- a/apps/mobile/src/features/threads/NewTaskRouteScreen.tsx +++ b/apps/mobile/src/features/threads/NewTaskRouteScreen.tsx @@ -235,10 +235,9 @@ export function NewTaskRouteScreen({ route }: StaticScreenProps Date: Fri, 7 Aug 2026 12:22:49 +0200 Subject: [PATCH 3/7] fix(mobile): keep Android chat text from showing through the composer (#5582) --- .../src/features/threads/ThreadComposer.tsx | 18 +++++++++++++++--- .../@react-native__gradle-plugin@0.85.3.patch | 13 +++++++++++++ pnpm-lock.yaml | 7 ++++--- pnpm-workspace.yaml | 1 + 4 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 patches/@react-native__gradle-plugin@0.85.3.patch diff --git a/apps/mobile/src/features/threads/ThreadComposer.tsx b/apps/mobile/src/features/threads/ThreadComposer.tsx index aab896efe038..1b026964c929 100644 --- a/apps/mobile/src/features/threads/ThreadComposer.tsx +++ b/apps/mobile/src/features/threads/ThreadComposer.tsx @@ -21,6 +21,7 @@ import { Image, Platform, Pressable, + StyleSheet, useColorScheme, View, type ViewStyle, @@ -698,11 +699,22 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer style={{ paddingTop: isExpanded ? 8 : 6, paddingBottom: (props.bottomInset ?? 0) + (isExpanded ? 8 : 6), - experimental_backgroundImage: isDarkMode - ? "linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 55%, rgba(0,0,0,0.9) 100%)" - : "linear-gradient(to bottom, rgba(255,255,255,0) 0%, rgba(255,255,255,0.6) 55%, rgba(255,255,255,0.9) 100%)", }} > + {/* The backdrop gradient lives on a plain View: Reanimated's Animated.View + silently drops experimental_backgroundImage on Android, which left this + strip fully transparent and the feed text legible through the composer. */} + Date: Fri, 7 Aug 2026 06:29:06 -0400 Subject: [PATCH 4/7] fix(mobile): repair Clerk auth navigation headers (#5140) Co-authored-by: codex --- .../settings/SettingsAuthRouteScreen.tsx | 10 +-- pnpm-lock.yaml | 68 +++++++++---------- pnpm-workspace.yaml | 16 ++--- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx b/apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx index f6f92f5fc845..e4efdf70c317 100644 --- a/apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx +++ b/apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx @@ -2,7 +2,7 @@ import { useAuth } from "@clerk/expo"; import { AuthView, UserProfileView } from "@clerk/expo/native"; import { StackActions, useNavigation } from "@react-navigation/native"; import { NativeStackScreenOptions } from "../../native/StackHeader"; -import { useEffect } from "react"; +import { useCallback, useEffect } from "react"; import { View } from "react-native"; import { hasCloudPublicConfig } from "../cloud/publicConfig"; @@ -21,16 +21,18 @@ export function SettingsAuthRouteScreen() { function ConfiguredSettingsAuthRouteScreen() { const { isLoaded, isSignedIn } = useAuth({ treatPendingAsSignedOut: false }); + const navigation = useNavigation(); + const handleHostBack = useCallback(() => navigation.goBack(), [navigation]); return ( <> - + {isLoaded ? ( isSignedIn ? ( - + ) : ( - + ) ) : null} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2f8d1b155da..9b9999931837 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,7 +36,7 @@ catalogs: overrides: '@clerk/backend': 3.14.0 - '@clerk/clerk-js': 6.25.12 + '@clerk/clerk-js': 6.25.13 '@clerk/clerk-js>@base-org/account': '-' '@clerk/clerk-js>@coinbase/wallet-sdk': '-' '@clerk/clerk-js>@solana/wallet-adapter-base': '-' @@ -45,9 +45,9 @@ overrides: '@clerk/clerk-js>@wallet-standard/core': '-' '@clerk/electron': 0.0.24 '@clerk/electron-passkeys': 0.0.3 - '@clerk/expo': 4.1.2 - '@clerk/react': 6.12.9 - '@clerk/shared': 4.25.9 + '@clerk/expo': 4.2.0 + '@clerk/react': 6.12.10 + '@clerk/shared': 4.25.10 '@effect/atom-react': 4.0.0-beta.103 '@effect/platform-bun': 4.0.0-beta.103 '@effect/platform-node': 4.0.0-beta.103 @@ -196,8 +196,8 @@ importers: specifier: ^0.7.1 version: 0.7.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3) '@clerk/expo': - specifier: 4.1.2 - version: 4.1.2(expo-auth-session@56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.18)(expo-crypto@56.0.4(expo@56.0.12))(expo-secure-store@56.0.4(expo@56.0.12))(expo-web-browser@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3) + specifier: 4.2.0 + version: 4.2.0(expo-auth-session@56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.18)(expo-crypto@56.0.4(expo@56.0.12))(expo-secure-store@56.0.4(expo@56.0.12))(expo-web-browser@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3) '@effect/atom-react': specifier: 4.0.0-beta.103 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.3)(scheduler@0.27.0) @@ -516,8 +516,8 @@ importers: specifier: 0.0.24 version: 0.0.24(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@clerk/react': - specifier: 6.12.9 - version: 6.12.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: 6.12.10 + version: 6.12.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@dnd-kit/core': specifier: ^6.3.1 version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -1692,8 +1692,8 @@ packages: resolution: {integrity: sha512-WsphTvDFHDuQilKI7dyVE5qmt7USu8qSrujAq6SqpEHbVFfNBfINDNuzxlF9M2skOTfHFfgiTE8Jjb1egIBGLg==} engines: {node: '>=20.9.0'} - '@clerk/clerk-js@6.25.12': - resolution: {integrity: sha512-N91mFKenMF5e+LRQ0NsqFb8bw+icbwnF8MzjzS4cux72xG4Gekh772tiLIetbURe44Srgjw5lj8jkWbt+yH/FA==} + '@clerk/clerk-js@6.25.13': + resolution: {integrity: sha512-QXhNzo0BjVSEItBsj9ukreofsi9XSrR5OJpB03ZDMb0QwWB5oXDHBBukC7DyHNmWt+dNHq01k4XUmA6cCvnNjA==} engines: {node: '>=20.9.0'} '@clerk/electron-passkeys-darwin-arm64@0.0.3': @@ -1737,8 +1737,8 @@ packages: react-dom: optional: true - '@clerk/expo@4.1.2': - resolution: {integrity: sha512-ZyGozbbizcGwEyK0CEXsPHnHnQoaa2CbTsXAqWBygzKEZyFjLjCHwQsQBKj6WgjAgn8mtw2ByIP9qLpItZffgw==} + '@clerk/expo@4.2.0': + resolution: {integrity: sha512-S2TYZn1Tltm/gXfe9J1NCuLRCmQX/3gfD0c+i/B1RWGbIJpSZX7KGRzvW70ABaqrK9IUcribLVmMN6unmpuCtQ==} engines: {node: '>=20.9.0'} peerDependencies: '@clerk/expo-google-signin': '>=0.1.0' @@ -1776,15 +1776,15 @@ packages: react-dom: optional: true - '@clerk/react@6.12.9': - resolution: {integrity: sha512-lQ1UOJhHGDweLCDf4IgT5r3rgkch1Gx21hNqK2/kOohJrJd/XM89fq2F7VK9Kg/Byc14TsfCh64Dm8ej2MyRWw==} + '@clerk/react@6.12.10': + resolution: {integrity: sha512-VDYyCyzRdMsNW6qQsMp1+L2VOXxFwpLfWBxOWPvUNOYCruecnAZjUYEJWS+E+i5MAPhSew9HjuweS4bO0FclTQ==} engines: {node: '>=20.9.0'} peerDependencies: react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 - '@clerk/shared@4.25.9': - resolution: {integrity: sha512-nw3maGzqPrwmUKjGffOM9Zvw24IyOllq0TkQGzsTfQX312WLu2u5CNvjKntMb6Ok6kXa1Zdc77zmPLn1/EAIFA==} + '@clerk/shared@4.25.10': + resolution: {integrity: sha512-Vjqk74nQGJ8y+cm+eSshoBzRvBhIzuKLOs3Gt13gEHdyQ6yV798Dl2SrBKt0jw2u6I1tOcD3s8/i9P4yJYo0dw==} engines: {node: '>=20.9.0'} peerDependencies: react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 @@ -11511,16 +11511,16 @@ snapshots: '@clerk/backend@3.14.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@clerk/shared': 4.25.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/shared': 4.25.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) standardwebhooks: 1.0.0 tslib: 2.8.1 transitivePeerDependencies: - react - react-dom - '@clerk/clerk-js@6.25.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@clerk/clerk-js@6.25.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@clerk/shared': 4.25.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@clerk/shared': 4.25.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@stripe/stripe-js': 5.6.0 '@swc/helpers': 0.5.21 '@tanstack/query-core': 5.100.14 @@ -11535,9 +11535,9 @@ snapshots: - react - react-dom - '@clerk/clerk-js@6.25.12(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@clerk/clerk-js@6.25.13(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@clerk/shared': 4.25.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/shared': 4.25.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@stripe/stripe-js': 5.6.0 '@swc/helpers': 0.5.21 '@tanstack/query-core': 5.100.14 @@ -11573,9 +11573,9 @@ snapshots: '@clerk/electron@0.0.24(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@41.5.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@clerk/clerk-js': 6.25.12(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@clerk/react': 6.12.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@clerk/shared': 4.25.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/clerk-js': 6.25.13(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/react': 6.12.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/shared': 4.25.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) electron: 41.5.0 react: 19.2.6 tslib: 2.8.1 @@ -11584,11 +11584,11 @@ snapshots: electron-store: 8.2.0 react-dom: 19.2.6(react@19.2.6) - '@clerk/expo@4.1.2(expo-auth-session@56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.18)(expo-crypto@56.0.4(expo@56.0.12))(expo-secure-store@56.0.4(expo@56.0.12))(expo-web-browser@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)': + '@clerk/expo@4.2.0(expo-auth-session@56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.18)(expo-crypto@56.0.4(expo@56.0.12))(expo-secure-store@56.0.4(expo@56.0.12))(expo-web-browser@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)': dependencies: - '@clerk/clerk-js': 6.25.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@clerk/react': 6.12.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@clerk/shared': 4.25.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@clerk/clerk-js': 6.25.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@clerk/react': 6.12.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@clerk/shared': 4.25.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@expo/config-plugins': 56.0.9(typescript@6.0.3) base-64: 1.0.0 expo: 56.0.12(8895228379997a2a064f9644cda56ed0) @@ -11607,21 +11607,21 @@ snapshots: - supports-color - typescript - '@clerk/react@6.12.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@clerk/react@6.12.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@clerk/shared': 4.25.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@clerk/shared': 4.25.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tslib: 2.8.1 - '@clerk/react@6.12.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@clerk/react@6.12.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@clerk/shared': 4.25.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@clerk/shared': 4.25.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) tslib: 2.8.1 - '@clerk/shared@4.25.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@clerk/shared@4.25.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/query-core': 5.100.14 dequal: 2.0.3 @@ -11631,7 +11631,7 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@clerk/shared@4.25.9(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@clerk/shared@4.25.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: '@tanstack/query-core': 5.100.14 dequal: 2.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 131f1161db9f..27d86fd17849 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -24,12 +24,12 @@ allowBuilds: catalog: "@clerk/backend": 3.14.0 - "@clerk/clerk-js": 6.25.12 + "@clerk/clerk-js": 6.25.13 "@clerk/electron": 0.0.24 "@clerk/electron-passkeys": 0.0.3 - "@clerk/expo": 4.1.2 - "@clerk/react": 6.12.9 - "@clerk/shared": 4.25.9 + "@clerk/expo": 4.2.0 + "@clerk/react": 6.12.10 + "@clerk/shared": 4.25.10 "@effect/atom-react": 4.0.0-beta.103 "@effect/openapi-generator": 4.0.0-beta.103 "@effect/platform-bun": 4.0.0-beta.103 @@ -53,11 +53,11 @@ catalog: minimumReleaseAgeExclude: - "@clerk/backend@3.14.0" - - "@clerk/clerk-js@6.25.12" + - "@clerk/clerk-js@6.25.13" - "@clerk/electron@0.0.24" - - "@clerk/expo@4.1.2" - - "@clerk/react@6.12.9" - - "@clerk/shared@4.25.9" + - "@clerk/expo@4.2.0" + - "@clerk/react@6.12.10" + - "@clerk/shared@4.25.10" - "@distilled.cloud/aws@0.30.2" - "@distilled.cloud/axiom@0.30.2" - "@distilled.cloud/cloudflare@0.30.2" From bfc69e4b4de12cd9867972dc802936acfb219b74 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Fri, 7 Aug 2026 12:35:07 +0200 Subject: [PATCH 5/7] Bump mobile app version to 1.0.2 (#5588) --- apps/mobile/app.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 9a51373cfd05..c684689fb264 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -161,7 +161,7 @@ const config: ExpoConfig = { slug: "t3-code", platforms: ["ios", "android"], scheme: variant.scheme, - version: "1.0.1", + version: "1.0.2", runtimeVersion: { // Fingerprint (not appVersion) so an OTA only reaches binaries whose native // project — native deps, config plugins, AND patches/ — matches the update. From 61b51ae0e343afc42ba0424d4d74b4f9a216d620 Mon Sep 17 00:00:00 2001 From: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:24:11 +0530 Subject: [PATCH 6/7] feat(web): click the pin icon to unpin a thread (#5578) --- apps/web/src/components/SidebarV2.tsx | 45 ++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/apps/web/src/components/SidebarV2.tsx b/apps/web/src/components/SidebarV2.tsx index 590ca9cb583d..409d6bef9e45 100644 --- a/apps/web/src/components/SidebarV2.tsx +++ b/apps/web/src/components/SidebarV2.tsx @@ -403,8 +403,12 @@ const SidebarV2Row = memo(function SidebarV2Row(props: { snoozeSupported: boolean; // Renders the pin glyph. Pinned cards keep the full settle/snooze quick // actions: settling clears the pin server-side, and snoozing hides the - // card until wake with the pin intact underneath. Pin/unpin themselves - // live in the context menu only. + // card until wake with the pin intact underneath. The glyph is also the + // in-row pin state cue (the pinned block has no header), so it always + // shows while pinned; it only becomes a clickable unpin quick-action once + // the pinning capability is confirmed, and stays a passive marker while + // the descriptor is not loaded. Pinning itself lives in the context menu. + pinningSupported: boolean; isPinned: boolean; // Compact wake countdown ("2h") for rows in the snoozed shelf. snoozeWakeLabelText: string | null; @@ -432,6 +436,7 @@ const SidebarV2Row = memo(function SidebarV2Row(props: { onUnsettle: (threadRef: ScopedThreadRef) => void; onSnooze: (threadRef: ScopedThreadRef, preset: SnoozePreset) => void; onUnsnooze: (threadRef: ScopedThreadRef) => void; + onUnpin: (threadRef: ScopedThreadRef) => void; onAcknowledgeWoke: (threadRef: ScopedThreadRef, visitedAt: string) => void; onChangeRequestState: (threadKey: string, state: "open" | "closed" | "merged" | null) => void; }) { @@ -450,6 +455,7 @@ const SidebarV2Row = memo(function SidebarV2Row(props: { onThreadClick, onUnsettle, onUnsnooze, + onUnpin, renamingTitle, thread, variant, @@ -704,6 +710,14 @@ const SidebarV2Row = memo(function SidebarV2Row(props: { }, [onUnsnooze, threadRef], ); + const handleUnpinClick = useCallback( + (event: ReactMouseEvent) => { + event.preventDefault(); + event.stopPropagation(); + onUnpin(threadRef); + }, + [onUnpin, threadRef], + ); const handleSnoozePreset = useCallback( (preset: SnoozePreset) => { onSnooze(threadRef, preset); @@ -1001,11 +1015,23 @@ const SidebarV2Row = memo(function SidebarV2Row(props: { )} {props.isPinned ? ( - + props.pinningSupported ? ( + + ) : ( + + ) ) : null} {/* The visible state owns this slot's width: status at rest, actions on hover/keyboard focus or while the popover is open. Keeping @@ -3080,6 +3106,10 @@ export default function SidebarV2() { serverConfigs.get(thread.environmentId)?.environment.capabilities .threadSnooze === true } + pinningSupported={ + serverConfigs.get(thread.environmentId)?.environment.capabilities + .threadPinning === true + } isPinned={section === "pinned"} snoozeWakeLabelText={ section === "snoozed" && thread.snoozedUntil != null @@ -3120,6 +3150,7 @@ export default function SidebarV2() { onUnsettle={attemptUnsettle} onSnooze={attemptSnooze} onUnsnooze={attemptUnsnooze} + onUnpin={attemptUnpin} onAcknowledgeWoke={acknowledgeWoke} onChangeRequestState={handleChangeRequestState} /> From 239ef1c54df2f657912ccb5b8e25193d49d90417 Mon Sep 17 00:00:00 2001 From: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:24:36 +0530 Subject: [PATCH 7/7] fix(web): show the correctly matching shortcut in new thread button's tooltip (#5594) --- apps/web/src/components/SidebarV2.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/SidebarV2.tsx b/apps/web/src/components/SidebarV2.tsx index 409d6bef9e45..81d883508085 100644 --- a/apps/web/src/components/SidebarV2.tsx +++ b/apps/web/src/components/SidebarV2.tsx @@ -2816,11 +2816,13 @@ export default function SidebarV2() { openCommandPalette({ open: "new-thread-in" }); }, [isMobile, newThreadContext, projectGroups.length, setOpenMobile]); - // Same resolution as v1: prefer the local-thread binding, fall back to - // chat.new, no platform gating — web users have working shortcuts too. + // The button mirrors chat.new: in multi-project setups both route through + // the command palette's "New thread in..." picker, and in single-project + // setups both create immediately. chat.newLocal always creates directly, so + // it is only a correct label when chat.new is unbound. const newThreadShortcutLabel = - shortcutLabelForCommand(keybindings, "chat.newLocal") ?? - shortcutLabelForCommand(keybindings, "chat.new"); + shortcutLabelForCommand(keybindings, "chat.new") ?? + shortcutLabelForCommand(keybindings, "chat.newLocal"); return ( <>