Repository navigation
chore(sync): merge pingdotgg/t3code main and new adopted heads - #361
Merged
Merged
Conversation
…ers (pingdotgg#25011) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ects (pingdotgg#25070) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…een effects (pingdotgg#25071) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
pingdotgg#25072) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…buses and mirrors (pingdotgg#25073) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…tView effects (pingdotgg#25006) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…nd grows back (pingdotgg#25076) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… service (pingdotgg#25150) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ons nobody uses (pingdotgg#25152) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…session For devices opened elsewhere (a device pool, cloud, or remote host), install the cached dev client for this checkout's fingerprint through the caller's agent-device session, from the caller's workspace (agent-device scopes session ownership to it). It never builds; without a shared build it names the next step. --abi picks the Android build, --metro opens it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Generated android/ios projects and the Expo config's extra section (env- specific values a dev client reads from Metro) changed the hash per machine, so a Linux VM never found a Mac's build in the shared cache. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A link's agents run as the receiving environment's user, so at full access the fence only ever stopped T3's own tools, never what the agent could do. It also kept a host from driving machines it fully trusts: answering a pending question or steering a thread the user started there, updating a project, or running the project's setup script in a worktree it launched. The stamp now records the access the link was paired with, and only a link below full access is fenced. Its work still carries linkOrigin, so clients keep showing where it came from. Stamps from before access was recorded stay fenced. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
delegate_task takes target.environmentId (and optionally target.projectId). The child then runs as an ordinary thread in the linked environment, launched through the link with a key derived from the caller's clientRequestId, in the project there with this thread's repository unless one is named. The parent here records the task with delegated_task.remote.request: its node, subagent row and turn item, with remoteChild instead of a local child thread. RemoteDelegation follows the thread there and completes the task with delegated_task.remote.complete, which reuses the parent half of a local finalize, so the parent wakes as it would for a local child. Open remote tasks are followed again at startup. A revoked or expired link fails the task with that reason; any other error backs off, up to five minutes. task_status and mode=wait answer from the row, task_cancel interrupts the thread there and completes the task as cancelled, and restart recovery no longer treats a remote task as abandoned provider work. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Read failed-run activity and prefer that run's error over an earlier assistant reply. Keep successful replies unchanged and retrieve long errors in full without taking diagnostics from a later run. Add failed-run, pagination, run-isolation and successful-recovery regressions for the existing review on pingdotgg#16719. Implemented with GPT-6.1-Sol through Codex in T3 Code on behalf of Lenoridev.
When the task's run on the linked environment ended, the follower completed the task with that run's reply, even while the thread there still waited on its own subagents, background tasks or a completion delivery that would wake it for the real answer. A local task waits for that work and takes its result from the run that answered after it. t3_thread_wait takes an optional untilDelegatedWorkSettled. With it, the wait also blocks until delegatedTaskProgress reports result_available for the thread, waking on task, provider-thread and run updates, and reports that result run as resultRun. The follower passes it and reads the result from resultRun. Both fields are optional: an older peer ignores the input and answers as before, and the follower then falls back to the launched run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…there Stop on a parent skipped a remote task that already had its result, so follow-up work on its thread in the linked environment (a message sent there with t3_thread_send, or a run that started after the result) kept running. A local child is stopped on every Stop, result or not, and cancelling a finished remote task already stops its thread there. Stop now records the owed stop with an internal delegated_task.remote.stop command: it sets remoteChild.stoppedThere to false and counts the stop, leaving the status, result and completion delivery alone. The follower, restarted from the live event tail or by the startup scan, sends that stop under a key per count and records it as "stopped"; a "ran-out" report never clears it. One follower runs per task, and a request while it runs makes it look once more. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es keep the cause delegate_task with environmentId launched in the linked project's checkout even when isolation "worktree" was asked for. A worktree there would branch from a commit this checkout has and the other may not, so the call is refused before launching, pointing at t3_thread_launch with a worktree workspaceStrategy. Recording the task or its cancellation no longer builds the caller's message from the dispatch error; the cause goes to the log and the caller gets a fixed message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
delegate_task to a linked environment launches an ordinary thread there, marked delegatedFrom, so a client connected to both machines listed it in the sidebar as well as in the parent's lineage panel. Its approvals and questions also never reached the parent here. Lists now treat such a thread as a subagent when the client also lists the thread that delegated it: the web sidebar and its project ordering, mobile's thread lists, and notifications leave it out. A parent here is flagged, and shows the "subagent needs input" banner, when the task or one of its own subagents there asks. A task whose parent the client cannot list (that machine switched off, or the parent gone) stays listed on its own, so its work is never out of reach. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RemoteDelegation.start resumes every open remote task at once, and each follower read its parent's whole subagent list to find one task, then held it across a wait of up to ten minutes. A parent with 1,441 tasks (35 MB of payload) and 122 open ones made every restart decode ~170k records and hold 8 GB, so the server ran out of heap seconds after starting and crash-looped. getThreadRecords now takes a subagentIds filter. Followers, and task_status waits that re-read on every parent subagent.updated, read just their task. Against a copy of the affected database the startup fan-out drops from 8.2 GB retained over 21.6 s to 8 MB over 61 ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mes (pingdotgg#25260) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…but fork dependencies use
…iew and clock hooks
…ore keeping the fork side
Yarden-zamir
enabled auto-merge
October 26, 2026 04:18
…eeds larger runners
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cause
Fork Sync run 40262460560 stopped on merge conflicts in 16 files.
Conflicts and resolution
18 hunks in 15 files:
appInit.tsx: the fork theme fonts, plus upstream's newstartAgentOpenedPreviews.CommandPalette.tsx: the fork guard (find does nothing in a terminal thread), plus upstream's thread key check.ThreadNotificationCoordinator.tsx,ServerBrowser.ts: imports from both sides.ServerBrowser.test.ts: both tests.StorageSettings.tsx: the fork reclamation summary with upstream'snowMs.client-runtime/state/terminal.ts: the fork resumableattachStream, inside upstream's newatomsobject.projectScriptEditor.tsx: upstream now remounts the form per request and starts each field fromrequest.initial. The fork fields (global, preview overlay, run in background, global shortcut) do the same.ProjectSetupScriptRunner.ts: upstream's simplerstripTerminalControl, still exported for the fork terminal provider.DesktopBrowserHost.ts: upstream'sdropRelay(tab), then the fork presentation replay.CloudAuthProvider.tsx: took upstream's cloud account service. It attaches once and has no unmount teardown. So the fork mounted-bridge counter, which kept the Android assistant panel from ending the app's session, is no longer needed.ThreadFeed.tsx: upstream's render-time jump to a message, plus the fork message link target and its note.ThreadDetailScreen.tsx,ThreadTerminalRouteScreen.tsx,ConnectionsNewRouteScreen.tsx: the fork imports with upstream's.pnpm-lock.yaml: rebuilt withlockfile.py. The added integrity lines equal upstream's. Upstream also dropped 12 packages that fork dependencies still use, so they stay at their old integrity.Adopted upstream pull requests
Each new head is a rebase onto newer upstream with lint and API fixes. Compared with
git range-diff, they bring no new behavior. They are merged with merge commits, andmergedHeadfollows:decodeEffect,asSome, dropped unused parameters,readOnlyreads).070_PeerLinksand071_PeerLinkFence. Fork main still registers neither.*.fork.test.tsfiles, or where upstream deleted the test.Fork fixes
Fork right panel (
useThreadRightPanel.tsx): it still passed three inputs that upstream'suseAgentOpenedPreviewsdropped. It also repeated two effects that upstream moved intofollowPreviewSessions. Both are removed, as upstream did inChatView.useRelativeTimeTickwas removed upstream:ForkChangelogDialogandLinkedEnvironmentsSettingsnow useuseNowMinute.New lint and Effect rules in fork code:
succeedSome/succeedNone,orElseSucceedandforEach.DocumentTextis provided in the fork test layers that now need it.Upstream's new file preview browser test (
AttachmentFilePreview.browser.test.tsx, 130 tests):vi.waitFordefault.ubuntu-24.04runner, which took about 6 minutes for the suite.apps/web/src/forkExcludedUpstreamTests.ts, as the server list already does for its tests. The entry names its reason and when to remove it.docs/fork/operations.mdsays so.Upstream changes in fork areas
83 files changed on both sides. A review of the behavior changes found the right panel fix above. Checked and fine:
Checks
checks.py: typecheck, migration check, adopted pull request check, format and lint on all fork files pass.fork_tests.py: 176 fork test files pass locally (117 root and 59 web).apps/serverfork test files are left to Fork CI.Fork repair skill changes
lockfile.pyaccepts a rebuild that keeps packages upstream dropped, when fork dependencies still use them. It names how many stay. Tested intest_scripts.py.git range-diff, and take the head's version of adopted files that the fork does not change.