chore(upstream): isolate remote session cookies and settle pre-cursor gap sources - #481
Merged
Conversation
Long project names and locked workspace labels no longer push the thread title or context strip controls over each other. The locked workspace label now truncates and compacts like the selectable one, the workspace controls keep a minimum width, and label overflow is measured before paint. Pylon keeps the branch selector in the left run beside the workspace controls, so upstream's branch flex-basis hunk has no equivalent here; the overflow measurement loop already skipped zero-width children. Adopted from f47e74004af232f0e3df8dc10093601d1c2c3ea3 (#8851)
The shimmer sweep on an active tool row now fills its masked layer with StyleSheet.absoluteFill and the row clips overflow, so the highlight stays inside the label instead of drawing past it. Partially adopted: the shimmer derivation change (shimmer follows live) was later rewritten by #10173 and #10273, which Pylon already carries. Adopted from 5ce92c2f192040bf77c0211fa33bf03c74c031ef (#8932)
Remote production web servers on the same hostname all used the `t3_session` cookie, and browsers do not scope cookies by port, so one server could overwrite another's browser session. Remote web cookies now take their name from the persisted environment ID, which survives state-directory moves and stays distinct for environments that share an internal path. A valid legacy `t3_session` cookie still authenticates, at the lowest precedence, and the session endpoint migrates it to the new name. Environment identity is split from the full descriptor so `t3 auth`, `t3 pair`, `t3 project` and `t3 connect` load the saved ID without launcher checks. Initialization publishes the ID atomically and repairs an empty ID file through a retained recovery file. Desktop and development cookie names are unchanged. Adopted from c78ae50a5a5fdf8f42d0aaa0103b26ee836f0cfc (#8085)
The web timeline kept its own copy of the tool-group action, summary and lifecycle-marker helpers, which had drifted from the shared client-runtime versions mobile uses: approval activity, viewed-image entries and case-varied "Read file" titles grouped differently on web. Web now imports the shared helpers, matching upstream. The rest of this source (viewed-image asset resolution, the web asset image component, and mobile feed rendering) already landed with the #9023 media preview port. Adopted from ce71c04f0aa9d2e5cd340e2a04cb1b0d5e24419d (#8936)
Each client session requested the full server config twice while connecting: once through `server.getConfig` for bootstrap and again through the config subscription. The session now opens one `subscribeServerConfig` stream, takes its first snapshot as the initial config, and replays that snapshot plus the latest theme and usage-limit source events to the shared config state, so later subscribers never open a duplicate stream. Web opts into environment themes, usage-limit sources and the `/usage-limits` command; mobile opts into usage-limit sources and the command, matching the options each client's config state already subscribes with. A different input still opens its own subscription. If the owned stream fails, dies or ends, the connection supervisor recovers the session instead of serving stale config. The config projection moves to its own module. Servers without a connection probe still fall back to `server.getConfig` for probes, and every server Pylon supports sends a snapshot first. Adopted from b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f (#8367)
`confirmQuit` was a boolean whose enabled state accepted either a hold or a second press without saying so. It is now an explicit mode: Direct quits on the first Cmd/Ctrl+Q press, Hold (the default) quits after a completed hold or a quick second press, and Double press quits on two presses within 500 ms and shows a "Press again" hint after the first. Settings uses a selector, the overlay shows the hint for the selected mode, and the preload and IPC contract carry the mode with each hint. Stored booleans migrate on read, true to Hold and false to Direct, on both browser storage and the desktop settings file, and save back as the mode string. T3 Code writes the same modes to shared browser storage, so those values now decode instead of falling back to the default. The desktop still reads the mode through `readConfirmQuit`, which keeps Hold when the settings file cannot be read. The lenient-decoding tests now use another setting as their unreadable example. Adopted from 9d1879b142a2f5d01383357646a4679d1a2bd202 (#9076)
Thread menus in the sidebar, the legacy sidebar, and the chat header now include Project settings, which opens the thread's project at `/projects/$projectKey` (resolving grouped projects to their logical key). The sidebar project row keeps its own settings entry, the web context menu fallback gains the settings icon those entries use, and mobile is unchanged, as upstream. Adopted from cb007469161ff0db2bc2dc8123c4b30e186aae50 (#8925)
Adopted from cb007469161ff0db2bc2dc8123c4b30e186aae50 (#8925)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
rynfar
added a commit
that referenced
this pull request
Sep 11, 2026
Keep #481's quit shortcut modes, thread-menu project settings, and the environment-ID recovery file in the rewritten pages. Document the RPC session's shared server-config stream against the new base, restore the staged Electron package name, sidebar order and filter rules, POSIX path case sensitivity, and the migrate-dev-db source flag, and describe #479's Antigravity restart, refresh, and send-block behavior. Point AGENTS.md at Pylon's hosted origin and correct the ledger row.
This was referenced Sep 11, 2026
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.
Eighteen upstream commits before the ledger's
reviewed-throughcursor (beae2147a9) had no port and no recorded decision in Pylon. They were not patch-equivalent, their subjects were not in Pylon history, and neither.agents/upstream-review.mdnor its archive named their SHAs or PR numbers. This PR gives every one of them a disposition so the cursor is honest. It also ports the ones Pylon was still missing, including the remote web session cookie fix.Tracking: #414. Frozen upstream head:
6c583620ff7ad3235b135af7107c0543467eecfa. Base:origin/pylonatb66eca91de.How it was ported
Before porting, each source was checked for the same behavior already in Pylon under a different subject: key identifiers and strings from the upstream diff, later upstream rewrites of the same lines, and the archived decisions. Where a later upstream commit Pylon already carries replaced a source, it is recorded as superseded. The rest were cherry-picked with
-xor spliced into Pylon's current files, following upstream's final shape at the frozen head.Sources
8dcb96314c976899e4df6951fb9af03131c2a46f30175a8af0) re-landed the unified composer banners the next day, and Pylon adopted it as #221 (b455a4912a). Pylon hasComposerBanner/ComposerSurfaceand noThreadSyncStatusPill, which matches the frozen head.8b817cbcaad71a53e2ef73f3881067f8aa8094bcc3b8825bf4, Pylond49bc768c7) rewrote the failure icons: severe failures usecircle-alert, and ordinary failures keep the tool icon with a trailing X.7963ac7404ff2196c3e8e4198ecc02a5e742b0a1ad38700ac678b8c8a0310d434a44d94a7ee6a47f.macroscope/check-run-agents/effect-service-conventions.mdis already present through the #9321 rewrite (cb10c155ef)..macroscope/approvability.mdis absent in Pylon and was skipped, following the earlier CS-5/V20 skips.4e8e64fc065a4a72535eee5fe60b689f5b48d35c.coderabbit.yaml, and CodeRabbit posts no checks or reviews on Pylon PRs.5ce92c2f192040bf77c0211fa33bf03c74c031efMaskedViewusesStyleSheet.absoluteFill. Excluded theshimmer: livederivation, which #10173 and #10273 later rewrote and Pylon already carries.f47e74004af232f0e3df8dc10093601d1c2c3ea30df043fd4eaa190eb491a3060836156eb0ae915eauto_reviewconfig; not used here.85b656ff300f71060ad6305c7e1e29a72b442ce9c78ae50a5a5fdf8f42d0aaa0103b26ee836f0cfcce71c04f0aa9d2e5cd340e2a04cb1b0d5e24419dresolveViewedImageAsset,workEntryViewedImagePath,ChatMarkdownAssetImageand mobile feed rendering landed with the #9023 port (8e98cef906). Adopted the remaining part: web's duplicate tool-group helpers are removed in favor of client-runtime's.0947c30e6946b2ad6d6cd518fd44292e75e834e8work-log/presentation.tsalready imports@t3tools/client-runtime/markdown-images.b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f9dbdcece5f488c66f6b9ac516b610f45bbbb676ae9db39ce05) replaced this banner layout with an inline description and details popover. Pylon carries it from the #402 composer batch (3f1594c9a3).9d1879b142a2f5d01383357646a4679d1a2bd202cb007469161ff0db2bc2dc8123c4b30e186aae50692eb1a5792b9930959b19805acf2bf2611318c9854541a04e, Pylon87d7448d35) replaced the panel-triggered refresh with per-PR state shared by the panel and both sidebars.60cef47ec983637ddc68faed7b1488b6f3c3a175Adopted behavior and Pylon adaptations
#8085: remote web session cookies. Remote production web servers on one hostname all used
t3_session, so they overwrote each other's browser sessions. Cookie names now derive from the persisted environment ID. A valid legacyt3_sessionstill authenticates at the lowest precedence, after the current cookie, Bearer and DPoP, and/api/auth/sessionrewrites it under the new name.ServerEnvironmentIdentityis split from the descriptor, sot3 auth,t3 pair,t3 projectandt3 connectload the ID without launcher checks. The ID file is published atomically and repaired throughenvironment-id.recovery. Desktop and development cookie names are unchanged. Pylon's descriptor additions (machine kind, capabilities, agent activity publishing) survive the split. Clients only readsessionCookieNameinformationally. Pairing is unchanged, but a browser whose shared cookie was already overwritten must pair again, as upstream notes.#8367: server config bootstrap. A session opens one
subscribeServerConfigstream, takes its first snapshot as the initial config, and replays that snapshot plus the latest theme and usage-limit-source events to later subscribers. Deduplication needs an exact input match, so web passes{ environmentThemes, usageLimitSources, usageLimitsCommand }and mobile passes{ usageLimitSources, usageLimitsCommand }: the same options theircreateServerEnvironmentAtomssubscriptions already use. This carries Pylon's usage-limit events, matching upstream's frozen head. Probes still fall back toserver.getConfigfor servers without a connection probe, and every supported server sends a snapshot first. The projection moved tostate/serverConfigProjection.ts.RpcSession'smakestays private, as Pylon's workspace audit requires. Pylon's browser-profile preflight still works because it awaitssession.initialConfig. Test fake sessions not touched upstream (serverUsage,threads-atoms,threads-failures) gainedsubscribeServerConfig.#9076: quit shortcut modes.
confirmQuitis now"direct" | "hold" | "double-click"; Hold is the default. Settings uses a selector, the overlay shows a hint for the selected mode, and the preload validates the new hint shape. Legacy booleans decode true to Hold and false to Direct, in both browser storage and the desktop settings file, and save back as the mode string. T3 Code's shared-storage values now decode instead of falling back through #459's lenient path. Desktop still reads the mode throughreadConfirmQuit, which keeps Hold when the file cannot be read. Its test also covers a missing file and Direct. The lenient-decoding tests (contracts, desktop, web) usedconfirmQuit: "hold"as their unreadable example, so they now usediffLayout: "unified", and the web test also checks that a stored"double-click"is read.QuitHold.tsand its tests now match the frozen head, which already includes the #9141/#9485/#9657 fixes Pylon had.docs/user/keybindings.mddescribes the three modes.#8925: Project settings in thread menus. The item appears in the sidebar thread menu, the legacy sidebar's project thread menu and the chat header thread menu (
useThreadActionMenu). It opens/projects/$projectKeywith the logical project key, and the context-menu fallback gains thesettingsicon. That icon was also missing for the existing chat breadcrumb entry. User docs mention the new entry point. Mobile is unchanged, as upstream.#8851, #8932 and #8936 (web grouping): see the table.
Removed from Pylon
confirmQuitand its switch, replaced by modes that keep both previous behaviors (Hold and Direct).toolGroupAction,summarizeToolGroup,omitSupersededLifecycleMarkersandtoolGroupSummaryKind. It had drifted from client-runtime: it lacked approval-activity classification,viewedImagePathreads and case-insensitive "Read file". Web now matches mobile and upstream.RpcSession.layer;layerWithOptionsreplaces it.None of these is a Pylon-original capability.
Verification
t3):EnvironmentAuth,EnvironmentAuthAdmin,EnvironmentAuthPolicy,SessionStore, authutils,ServerEnvironment,cli/pair,bin: 85 passed.server.test.tscookie migration and precedence cases: 3 passed.rpc/session,rpc/client,state/server,serverUsage,threads-atoms,threads-failures,connection/registry,connection/supervisor,operations/commands,pullRequests,shell-sync,sourceControl,threads-pagination,threads-sync,vcs,vcsAction: 213 passed.MessagesTimeline.logic+MessagesTimeline157;clientPersistenceStorage+settingsSearch31;threadActionMenu.logic+contextMenuFallback21;BranchToolbar.logic+ChatHeader+Sidebar.logic251.settings.test.ts: 112 passed. DesktopQuitHold+DesktopClientSettings: 43 passed.t3,@t3tools/client-runtime,@t3tools/web,@t3tools/mobile,@t3tools/contractsand@t3tools/desktop; each output shows its package ran with 0 errors.vp linton changed TS/TSX found no new findings; the two remaining warnings (isSameSidebarThreadRefanduseNavigateunused imports) are already onorigin/pylon.vp fmt --checkpassed on all 69 changed files.git grep -n PRIME_AGENT_DRIVER_KINDis unaffected; no provider registries were touched.No local client pass was run; the orchestrator does one integrated pass later. Upstream UI evidence: #9076 settings selector, #8936 before/after, #8851, #8925, #8932.
Newer upstream commits after the frozen head touch some of the same files (
RpcAuthorization.ts,ServerEnvironment.ts,settings.ts,thread-work-log.tsx) for unrelated features (#10677, #10856, #10839, #10875, #10671, #11014). None is a follow-up to these sources.Ported by Claude Opus 5 in Claude Code.
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.