Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .fork/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ Upstream's v2 orchestrator ([#2829](https://github.com/pingdotgg/t3code/pull/282

`inbox-order.patch` adds an Inbox order setting (web Settings → General, mobile Settings → Threads → Beta) for the Working section's time-ordered inbox. Oldest first lists threads by when each last needed you, longest-waiting on top, so the inbox works as a queue.

`agent-self-snooze.patch` fixes upstream [#18985](https://github.com/pingdotgg/t3code/issues/18985): an agent that snoozed its own thread was woken by finishing that same turn. The snooze now applies when the turn completes, the same way upstream already defers an agent settling its own thread. Drop it once upstream fixes #18985.

The workflow typechecks the web app and lints the patched files. When a patch conflicts, regenerate it from a clean checkout of the failing upstream tag. To leave the fork entirely, disable the LaunchAgent described below and install an official T3 Nightly. Fork installation/removal does not require deleting T3 data.

## macOS installation and signing
Expand Down
374 changes: 374 additions & 0 deletions .fork/patches/agent-self-snooze.patch

Large diffs are not rendered by default.

716 changes: 376 additions & 340 deletions .fork/patches/home-agent.patch

Large diffs are not rendered by default.

225 changes: 134 additions & 91 deletions .fork/patches/inbox-order.patch

Large diffs are not rendered by default.

80 changes: 31 additions & 49 deletions .fork/patches/right-panel-maximize-any-width.patch
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 6a410116c68c0d4f4dec81590099db06acaf67d8 Mon Sep 17 00:00:00 2001
From 575b09e4c3937570b7de3559c4845f0c0a2b669b Mon Sep 17 00:00:00 2001
From: Jefferson-Butler1 <jefferson.butler@icloud.com>
Date: Tue, 6 Oct 2026 10:01:54 -0700
Subject: [PATCH] feat(web): maximize the right panel at any window width
Expand All @@ -7,23 +7,23 @@ Below the 980px breakpoint the right panel only opened as a sheet, so it
could not be maximized. A maximized panel now renders inline and fills the
workspace at any width, and the sheet shows the maximize control.
---
apps/web/src/components/ChatView.tsx | 29 +++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
apps/web/src/components/ChatView.tsx | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx
index f87663989a..0a6d9d6d68 100644
index 98b3172d0c..dccb0f0ebe 100644
--- a/apps/web/src/components/ChatView.tsx
+++ b/apps/web/src/components/ChatView.tsx
@@ -2049,7 +2049,7 @@ export default function ChatView(props: ChatViewProps) {
>({});
const [pendingUserInputQuestionIndexByRequestId, setPendingUserInputQuestionIndexByRequestId] =
useState<Record<string, number>>({});
@@ -1323,7 +1323,7 @@ export default function ChatView(props: ChatViewProps) {
window.addEventListener("dragend", clearWorkspaceFileDrag);
return () => window.removeEventListener("dragend", clearWorkspaceFileDrag);
}, [isWorkspaceFileDragActive]);
- const shouldUsePlanSidebarSheet = useMediaQuery(RIGHT_PANEL_INLINE_LAYOUT_MEDIA_QUERY);
+ const isNarrowRightPanelLayout = useMediaQuery(RIGHT_PANEL_INLINE_LAYOUT_MEDIA_QUERY);
const isMobileViewport = useMediaQuery("max-sm");
const [workspaceLayoutElement, setWorkspaceLayoutElement] = useState<HTMLDivElement | null>(null);
const threadPanelPopoverAnchorRef = useRef<HTMLElement | null>(null);
@@ -2487,6 +2487,9 @@ export default function ChatView(props: ChatViewProps) {
@@ -1688,6 +1688,9 @@ export default function ChatView(props: ChatViewProps) {
panelAnimationDurationMs,
);
const rightPanelPresent = rightPanelPresence.present;
Expand All @@ -33,7 +33,7 @@ index f87663989a..0a6d9d6d68 100644
const rightPanelControlsInPanel =
shouldUsePlanSidebarSheet && rightPanelPresent && rightPanelOpen;
const rightPanelControlsAtRoot = rightPanelPresent && !shouldUsePlanSidebarSheet;
@@ -2496,8 +2499,6 @@ export default function ChatView(props: ChatViewProps) {
@@ -1697,8 +1700,6 @@ export default function ChatView(props: ChatViewProps) {
activePreviewMiniPlayer?.source ?? null,
renderedRightPanelSurface,
);
Expand All @@ -42,45 +42,27 @@ index f87663989a..0a6d9d6d68 100644
const inlineRightPanelOwnsTitleBar = rightPanelOpen && !shouldUsePlanSidebarSheet;
const [threadPanelPresentation, setThreadPanelPresentation] =
useState<ThreadPanelPresentation>("inline");
@@ -5437,7 +5438,7 @@ export default function ChatView(props: ChatViewProps) {
threadKey,
new Set(sessions.filter((session) => deviceFor(session) !== undefined).map(key)),
);
- if (!previous || shouldUsePlanSidebarSheet) return;
+ if (!previous || isNarrowRightPanelLayout) return;
for (const session of sessions) {
if (previous.has(key(session))) continue;
const device = deviceFor(session);
@@ -5467,7 +5468,7 @@ export default function ChatView(props: ChatViewProps) {
activeThreadRef,
autoShowFloatingPreview,
deviceStateLoaded,
- shouldUsePlanSidebarSheet,
+ isNarrowRightPanelLayout,
deviceState.sessions,
deviceState.devices,
]);
@@ -5703,7 +5704,7 @@ export default function ChatView(props: ChatViewProps) {
}
if (!clientSettingsHydrated) return;

- const proactivePanelsEnabled = settings.proactivePanelsEnabled && !shouldUsePlanSidebarSheet;
+ const proactivePanelsEnabled = settings.proactivePanelsEnabled && !isNarrowRightPanelLayout;
const eligibleLink =
proactivePanelsEnabled &&
shouldOpenProactivePullRequest(previousTargetKey, proactivePullRequestsKey);
@@ -5794,7 +5795,7 @@ export default function ChatView(props: ChatViewProps) {
visiblePullRequestCount,

settings.proactivePanelsEnabled,
- shouldUsePlanSidebarSheet,
+ isNarrowRightPanelLayout,
@@ -3677,7 +3678,7 @@ export default function ChatView(props: ChatViewProps) {
serverBrowserAvailable: activeEnvironmentServerBrowser,
panelSurfaces: rightPanelState.surfaces,
miniPlayerSource: activePreviewMiniPlayer?.source ?? null,
- sheetLayout: shouldUsePlanSidebarSheet,
+ sheetLayout: isNarrowRightPanelLayout,
});
const openFileSurface = (relativePath: string) => {
if (!activeThreadRef || !activeProject) return;
@@ -3712,7 +3713,7 @@ export default function ChatView(props: ChatViewProps) {
const activeRunningTurnId = activeRuntime?.activeRunId ?? null;
useProactivePanels({
threadRef: isServerThread ? activeThreadRef : null,
- enabled: settings.proactivePanelsEnabled && !shouldUsePlanSidebarSheet,
+ enabled: settings.proactivePanelsEnabled && !isNarrowRightPanelLayout,
settingsHydrated: clientSettingsHydrated,
threadDetailLoading,
]);
const closePreviewPanel = () => {
@@ -5962,13 +5963,13 @@ export default function ChatView(props: ChatViewProps) {
runningTurnId: activeRunningTurnId,
@@ -3872,13 +3873,13 @@ export default function ChatView(props: ChatViewProps) {
};
const toggleThreadPanelStable = useStableCallback(toggleThreadPanel);
// A thread started for a link the OS opened shows its browser maximized, like a browser window.
useEffect(() => {
- if (!canMaximizeRightPanel) return;
+ if (!rightPanelOpen) return;
Expand All @@ -95,8 +77,8 @@ index f87663989a..0a6d9d6d68 100644
useRightPanelStore.getState().setMaximized(activeThreadRef, !rightPanelMaximized);
};
const toggleRightPanelMaximizedStable = useStableCallback(toggleRightPanelMaximized);
@@ -11879,7 +11880,13 @@ export default function ChatView(props: ChatViewProps) {
// the sheet opens.
@@ -8578,7 +8579,13 @@ export default function ChatView(props: ChatViewProps) {
inlineSize={previewPanelInlineSize}
layoutControls={
rightPanelOpen ? (
- <div className="mr-px flex items-center">{panelToggleControls}</div>
Expand Down
24 changes: 12 additions & 12 deletions .fork/patches/thread-links-any-environment.patch
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From b0ff2c733da394c913d1d53472bb8d40daa7e932 Mon Sep 17 00:00:00 2001
From 84c75419570d6e8f00ae5c617cc45fbb0808627c Mon Sep 17 00:00:00 2001
From: Jefferson-Butler1 <jefferson.butler@icloud.com>
Date: Thu, 15 Oct 2026 12:24:45 -0700
Subject: [PATCH] fix(web,mobile): thread links open threads on other machines
Expand All @@ -14,10 +14,10 @@ in every connected environment.
3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/apps/mobile/src/features/threads/ThreadFeed.tsx b/apps/mobile/src/features/threads/ThreadFeed.tsx
index a0cb6ee339..20ff96940f 100644
index 84fb8d84d6..4f4af09e65 100644
--- a/apps/mobile/src/features/threads/ThreadFeed.tsx
+++ b/apps/mobile/src/features/threads/ThreadFeed.tsx
@@ -209,7 +209,7 @@ import {
@@ -212,7 +212,7 @@ import {
} from "../../state/assets";
import { useAtomQueryRunner } from "../../state/use-atom-query-runner";
import { usePreparedConnection } from "../../state/session";
Expand All @@ -26,15 +26,15 @@ index a0cb6ee339..20ff96940f 100644
import { useThreadSelection } from "../../state/use-thread-selection";
import { composerDocumentAttachmentRecord } from "../../lib/composerContext";
import * as Option from "effect/Option";
@@ -1790,7 +1790,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) {
const linkedThreadId = parseThreadLinkHref(href);
if (linkedThreadId) {
navigation.navigate("Thread", {
- environmentId: String(props.environmentId),
+ environmentId: String(readThreadLinkEnvironmentId(linkedThreadId, props.environmentId)),
threadId: String(linkedThreadId),
});
return;
@@ -1789,7 +1789,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) {
const linkedThreadId = parseThreadLinkHref(href);
if (linkedThreadId) {
navigation.navigate("Thread", {
- environmentId: String(props.environmentId),
+ environmentId: String(readThreadLinkEnvironmentId(linkedThreadId, props.environmentId)),
threadId: String(linkedThreadId),
});
return;
diff --git a/apps/mobile/src/state/entities.ts b/apps/mobile/src/state/entities.ts
index 144325fb2d..a47aaa6713 100644
--- a/apps/mobile/src/state/entities.ts
Expand Down
1 change: 1 addition & 0 deletions .fork/series
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ right-panel-maximize-any-width.patch
home-agent.patch
inbox-order.patch
thread-links-any-environment.patch
agent-self-snooze.patch