Repository navigation
feat(web): update providers on all connected machines (upstream) - #992
Merged
Merged
Conversation
Adapts upstream 0a04cc50de (#14678) to Pylon's grouped provider update UI. Settings > Providers gains an "Update all connected environments" action that shows the reviewed targets (machine and provider) before anything runs, then sends environment-addressed serverEnvironment.updateProvider commands concurrently through the shared per-environment update hook, so each environment keeps its own outcome row and retry. Adopts upstream's ProviderUpdateRun aggregate formatter, adapted so interrupted requests and results without a terminal snapshot are reported instead of dropped. Read-only, still-checking, loading and disconnected environments are listed as not included; manual-only providers, differing instance update commands, and Prime Agent (owned by Prime maintenance) are listed for manual follow-up. Per-environment launch popover and individual instance updates are unchanged. Mobile is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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. |
Review follow-ups for the all-environments provider update action: - The per-environment update hook now resolves at its 6-minute expiry with timed-out runs, so a hung request no longer wedges the bulk run (summary toast, running state, and reopen behavior). - A server "already running" rejection (shared contract reason) is treated as in progress elsewhere: unfinished in the summary, not a failed row. - A per-row retry closes the run's summary toast so it never reports a failure the retry fixed. - A run that finishes while the dialog is closed returns the next opening to review instead of a stale progress view. - Hook-level regression tests for request-version fencing, duplicate calls, timeout-then-late-result, and already-running handling. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Oct 3, 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.
Problem
Pylon could update providers one instance at a time in Settings, or one local environment at a time from the launch popover (Windows + WSL). There was no single action covering every connected machine, including SSH, relay and tunnel environments. Upstream #14678 added a compact global "Update all" button. The maintainer chose to extend Pylon's grouped UI instead (decision brief in #981).
Source
0a04cc50def48121b9ece038c7df8b7fa789074b(#14678)ProviderUpdateRunformatter is adopted and changed to report interruptions. Upstream'sProviderUpdatesAction.tsxis not ported;ProviderUpdateAllEnvironmentsActionreplaces it.What changed
serverEnvironment.updateProviderper candidate instance. Sends run concurrently across environments; within an environment they go through the existing serial config lane. A synchronous ref guard stops a double click. The commands, scopes and server paths are the existing ones.EnvironmentUpdateRowand the logic extracted intouseEnvironmentProviderUpdates, keeping its request-version fencing, 6-minute transport-hang expiry and terminal-only result persistence. One toast summarizes the run with a line per problem, labelled by machine and provider.ProviderUpdateEnvironmentRowsnow uses the extracted hook, so the launch popover behaves as before.docs/user/updating.mdhas a new "Update providers" section.Pylon adaptations vs upstream
failed/unchanged). Mixed results read "did not finish".primarySessionStateAtom, now exported). Other environments use the/api/auth/sessionscopes for their credential (providerOperateAccess.ts). Sessions are read only for connected environments that have outdated providers. Read-only and pending environments are never dispatched. The server'sRpcAuthorization(orchestration:operate) remains authoritative.enabled: false) is ignored. Managed maintenance commands are never sent.canOneClickUpdateProviderCandidate(one representative per driver; all instances must share one update command) using each environment's own instance IDs. Duplicate-target rejection and installer serialization stay withproviderMaintenanceRunnerandproviderMaintenanceCommandCoordinator. There are no backend changes.No contract, wire schema, migration, event or projection changes.
Verification
vp test run src/components/ProviderUpdateLaunchNotification.logic.test.ts src/components/ProviderUpdateEnvironmentRows.test.tsx src/components/settings/ProviderUpdateAllEnvironments.test.tsx src/components/settings/ProviderSettingsPanel.logic.test.ts: 4 files, 81 tests passed.vp test run src/components/settings/ProviderSettingsPanel.environment.test.tsx: 20 passed.vp run -F @t3tools/web typecheck:tsc --noEmitran inapps/web, exit 0.vp linton the changed files: no new findings. Two existing warnings remain: a ref read during render in the rows component, and an effectsetStateinProviderSettingsPanel.vp fmt --checkon the changed files: clean.New coverage:
unchangedcounted as failed; transport and disconnect errors; empty run.Not verified
providerOperateAccess.ts) has no direct unit test. Its resolution delegates to the existing testedresolvePrimaryOperateAccess/resolveRemoteOperateAccess.Review follow-ups (
8d00a32b1c)SERVER_PROVIDER_UPDATE_ALREADY_RUNNING_REASON); the server literal is unchanged, so older servers still match.providerMaintenanceRunner.test.ts: 16 passed.@t3tools/web,t3and@t3tools/contractsall exit 0.Part of upstream cycle #981.
🤖 Generated with Claude Code