β¨ feat(git-status): one-click pull/push from branch chip#14041
Merged
Conversation
Split the ahead/behind indicator out of the BranchSwitcher trigger so βN / βN become standalone action chips: clicking β runs `git pull --ff-only`, clicking β runs `git push`. Each chip swaps to a spinning LoaderIcon while the operation is in flight and refreshes branch / working-tree / ahead-behind state on success. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move GitBranchInfo / GitLinkedPullRequest(Result) / GitBranchListItem / GitWorkingTree(Status|Files) / GitCheckoutResult / GitPullResult / GitPushResult / GitAheadBehind out of system.ts into a sibling git.ts so the system surface stays focused on system/window/theme types. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Use `git push -u origin HEAD` instead of bare `git push` so the one-click push action works on branches whose upstream name differs from the local name (the common `git checkout -b feat/x origin/canary` workflow). Bare `git push` refuses in that case under the default simple policy. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Push chip was reusing the pull upstream in its tooltip, which is wrong when local branch name differs from upstream (e.g. feat/x tracking origin/canary) β the push actually goes to origin/<local-name> per our `git push -u origin HEAD`, not to the upstream. Compute a separate `pushTarget` (`origin/<current-branch>`) and `pushTargetExists` flag in getGitAheadBehind, and switch the push tooltip to use that. When the target doesn't exist yet (one-click creates a new remote branch) show a "(new branch)" variant so the user knows what the click will do. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Swap the lucide LoaderIcon (with hand-rolled CSS spin) for the shared RingLoadingIcon used in Topic items, so the in-flight pull/push chip matches the rest of the app's spinner style. - Reword the new-branch push tooltip from "push N commits to X (new branch)" to "Click to create branch X" β the count is misleading when the remote doesn't exist yet (the action is creating, not catching up), and the shorter copy reads cleaner. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Removed detailed comments about git push behavior.
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8e79ff6ff7
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codecov Reportβ
All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## canary #14041 +/- ##
=========================================
Coverage 66.99% 66.99%
=========================================
Files 2105 2105
Lines 179828 179828
Branches 17827 21287 +3460
=========================================
+ Hits 120475 120477 +2
+ Misses 59230 59228 -2
Partials 123 123
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
Block the opposite sync action while a git sync is running β both chips go disabled whenever pulling or pushing is true. Previously on a diverged branch (ahead > 0 and behind > 0) a user could start pull and still click push before the first finished, launching concurrent git operations against the same worktree and producing lock / non-FF errors plus confusing double toasts for a single intent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Problem: ahead/behind was computed purely against locally-cached refs, so commits pushed to origin elsewhere (GitHub web UI, another machine) never surfaced as βN until the user ran `git fetch` in a terminal. Fix: run `git fetch --no-tags --quiet origin` at the start of getGitAheadBehind with a 10s timeout; ignore failures and fall through to compute against whatever refs we have. SWR's revalidateOnFocus already re-invokes this IPC, so the fetch happens on window re-focus for free β no new UI and no interval polling. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
arvinxx
added a commit
that referenced
this pull request
Apr 27, 2026
# π LobeHub v2.1.53 (20260427) **Release Date:** April 27, 2026 **Since v2.1.52:** 194 merged PRs Β· 17 contributors > Introduce Heterogeneous Agent β Claude Code and Codex run as first-class desktop runtimes, paired with a new Agent Signal package, sharper desktop UX, and a wave of flagship model additions. --- ## β¨ Highlights - **Introduce Heterogeneous Agent** β Claude Code and Codex run as first-class desktop agents: subagent rendering, partial-message streaming, multi-turn resume, terminal error surfacing, rich tool inspectors, and runtime polish. (#14162, #13754, #14067, #14001, #13970, #13942) - **Screen capture & Quick Chat tray** β New desktop screen capture overlay (macOS permission-gated) with Quick Chat tray and upload pipeline improvements; chat input auto-focuses on overlay mount. (#13818, #14097, #14105) - **Desktop topic & tab UX** β Dedicated topic popup window with cross-window sync, Cmd+W/Cmd+T tab shortcuts, TabBar polish, recent working directories expanded to 20, and human approval notifications. (#13957, #13983, #13972, #14036, #14092) - **Git workflow built-in** β One-click pull/push from the branch chip, ahead/behind badge, and submodule/worktree repo detection. (#14041, #13980, #13978) - **Agent Signal package** β New `@lobechat/agent-signal` runtime for dynamic memory feedback signals, with OTel metrics and self-iteration in Lab. (#14157, #14170, #14159, #14169, #14187) - **New models** β Claude Opus 4.7 with `xhigh` effort tier, GPT-5.5, DeepSeek V4 Flash/Pro with reasoning slider, Kimi K2.6, MiMo-V2.5/Pro, gpt-image-2, Qwen3.6 Flash/Plus, and Pixverse-c1. (#13903, #14147, #14114, #14004, #14089, #14039, #13923) - **New providers** β OpenCode Zen, OpenCode Go, and Azure OpenAI Router runtime. (#13943, #14064, #13823) - **Mobile settings overhaul** β Full settings menu and responsive profile layout for mobile. (#14019) --- ## ποΈ Heterogeneous Agent - Claude Code runtime, working-directory awareness, and sidebar polish. (#13970) - CC subagent rendering with persistent streamed text; parallel-tool orphan fix. (#14001, #13968, #14024) - Per-step usage persisted to each step assistant message. (#13964) - Per-phase workflow expand defaults; full-expand toggle with three-level expansion. (#14171, #13906) - Hetero-mode actions bar; tool inspector polish. (#13963, #14034, #14030) - Codex desktop integration with rich tool rendering and devtools preview. (#14067, #14100) - Codex terminal error surfacing and CLI output tracing. (#14166) - Tighten `isCanUseVision` default and add aggregator fallback. (#14172) - Persist `ccSessionId` in topic metadata for CC multi-turn resume. (#13902) - CC account card, topic filter, and integration polish. (#13955, #13942, #13950) - Token-level deltas streamed via `--include-partial-messages`. (#13929) --- ## π§ Agent Signal & Self-Iteration - New `@lobechat/agent-signal` package with dynamic feedback signals. (#14157) - AgentSignalRuntime wired through agent-tracing and observability-otel metrics. (#14170, #14159) - Self-iteration feature flag added to Lab; front-side flag check. (#14169, #14186) - Signal policy for receiving memory feedback dynamically. (#14187) --- ## π¬ Conversation - Queue follow-up sends during running CC turns. (#14179) - Persist per-topic chat scroll position; pin user message + fold long messages. (#14191, #14056) - Inline resend when editing last user message. (#14080) - Disable first-block markdown streaming to prevent flicker. (#14193, #13904) - Prevent Markdown stream replay when vlist remounts streaming items. (#14086) - Stop repinning after manual scroll; unify scroll-to-user + spacer hooks. (#14099, #14132) --- ## π± Platforms & Integrations ### Desktop / Electron - Screen capture overlay, Quick Chat tray, and upload pipeline improvements. (#13818) - macOS permission gate for screen capture; auto-focus chat panel input. (#14097, #14105) - Dedicated topic popup window with cross-window sync. (#13957) - TabBar polish: `+` button for new topic, dark theme blend, close icon by default. (#13972, #14203, #13973) - Recent working directories expanded from 5 to 20; submodule/worktree repo detection. (#14036, #13978) - Cmd+W / Cmd+T tab shortcuts and global shortcut consolidation. (#13983, #13880) - Linux icon configuration; human approval desktop notifications. (#14042, #14092) ### Git Workflow - One-click pull/push from branch chip; ahead/behind badge with refactored GitCtr. (#14041, #13980) ### Mobile - Full settings menu and responsive profile layout. (#14019) - Agent route added to mobile router; mobile agent topic route registered. (#14103, #14158) - Session list skeleton row layout corrected. (#14040) ### Bot / Messaging - DM strategy support; bot emoji and markdown render optimization. (#14201, #14091, #14140) - Slack webhook fix; bot platform setup guide reference. (#14052, #14121) --- ## π€ Models & Providers ### New models - **Claude Opus 4.7** with `xhigh` effort tier; strip temperature/top_p. (#13903, #13909) - **GPT-5.5**. (#14147) - **DeepSeek V4** Flash/Pro cards with reasoning slider; cache-hit and Pro discount pricing. (#14114, #14209, #14196, #14131) - **Kimi K2.6** model with LobeHub-hosted card. (#14004, #14006) - **MiMo-V2.5 / V2.5-Pro**. (#14089) - **gpt-image-2**, **Qwen3.6 Flash/Plus**, **Pixverse-c1**. (#14039, #13923) ### New providers - **OpenCode Zen** and **OpenCode Go** with env-var support. (#13943, #14064) - **Azure OpenAI Router** runtime support. (#13823) - Model alias mapping for image and video runtimes. (#13896) - Seedance video models migrated to Dreamina. (#14144) ### Runtime reliability - Sanitize invalid tool_call arguments to unbreak strict providers. (#14033) - Tolerate null `function.name` in streaming tool_call deltas. (#14139) - Preserve Gemini 3 `thoughtSignature` in `call_tools_batch` normalization. (#14032) - Downgrade `image_url` parts when target model lacks vision. (#14029) - Preserve Cloudflare provider error context. (#14136) - Use `safety_identifier` for OpenAI Responses API. (#14148) - Unwrap underlying PG error in `formatErrorEventData`. (#14038) --- ## π₯οΈ User Experience - **Onboarding** β Preset agent naming suggestions, structured hunk ops for `updateDocument`, persona analytics snapshot, footer promotion pipeline, wrap-up button. (#13931, #13989, #13930, #13853, #13934) - **Document workflow** β Agent documents promoted as primary workspace panel; history management and compare workflow; web-crawl docs associated with agent documents. (#13924, #13725, #13893) - **cmdk** β Agent identity surfaced on topic search results; topic/message search scoped to current agent. (#14204, #13960) - **Floating chat panel** and workspace improvements. (#13887) - **Topic completion status** with dropdown action and filter. (#14005) --- ## π§ Tooling - Redis-backed feature flag provider for runtime config. (#14098) - Vite upgraded to 8.0.0 with Rolldown strict execution order. (#12720, #14058) - `@lobechat/model-bank` automated npm release with provenance. (#14015, #14017, #14018) - Skill activation fallback when `activateTools` cannot find identifier. (#14010) - Cron tool: timezone and existing jobs injected into system prompt; clarified `lobe-gtd` and `lobe-cron` descriptions. (#14012, #14013) --- ## π Security & Reliability - **Security:** uuid bumped to v14 (advisory). (#14083) - **Security:** validate avatar URL and scope old-avatar deletion to owner. (#13982) - **Security:** clear OIDC sessions on better-auth signout; return 401 (not 500) for expired OIDC JWT. (#13916, #14014) - **Reliability:** scope pending-approval check to current assistant turn. (#14182) - **Reliability:** sanitize heterogeneous-agent attachment cache filenames. (#13937) - **Reliability:** reduce subagent task status error noise. (#14026) --- ## π₯ Contributors Huge thanks to **17 contributors** who shipped **194 merged PRs** this week. @hardy Β· @shaun0927 Β· @hezhijie0327 Β· @sxjeru Β· @arvinxx Β· @Innei Β· @tjx666 Β· @lijian Β· @neko Β· @rdmclin2 Β· @AmAzing129 Β· @sudongyuer Β· @CanisMinor Β· @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.1.52...v2.1.53
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.
π» Change Type
π Related Issue
N/A β internal Slack ask: clicking the branch chip's behind/ahead indicator should pull/push without leaving the app.
π Description of Change
Splits the existing
βN / βNindicator out of theBranchSwitchertrigger so each becomes a standalone, clickable action chip:βN(behind) runsgit pull --ff-onlyagainst the configured upstream β fast-forward only, so divergent branches surface git's own error rather than silently merging.βN(ahead) runsgit push -u origin HEAD. Using-u origin HEADinstead of baregit pushso the action works on branches whose local name differs from upstream (the commongit checkout -b feat/x origin/canarycase, wherepush.default=simplewould otherwise refuse). Also handles the new-branch case by creatingorigin/<local-name>and rebinding tracking.Each chip swaps to a
RingLoadingIconwhile the operation is in flight (matches the Topic List spinner), disables itself, and refreshes branch info / working tree / ahead-behind state on success.The push tooltip distinguishes whether
origin/<branch>already exists:Click to push N commits to origin/<branch>Click to create branch origin/<branch>(count + "push" verb dropped because the action is creating, not catching up)To compute that distinction without lying,
getGitAheadBehindnow also returnspushTargetandpushTargetExists, sourced from the local branch name and a remote-ref existence check.Side refactor: extracted all 9 Git-related IPC types out of
packages/electron-client-ipc/src/types/system.tsinto a siblinggit.tsso the system surface stays focused on system/window/theme types. Re-exported from the package barrel β zero call-site changes.π§ͺ How to Test
Backend changes only render on Electron desktop (the
GitStatuschip is gated toisDesktop). Test in the Electron dev build:Behind only (e.g. local up-to-date branch + new commits on remote):
βNchip click should pull, message "Pulled successfully", chip disappears.Ahead only with same-name remote:
βNclick should push, message "Pushed successfully", chip disappears.Ahead only with no matching remote (branched off
origin/canary, never pushed): tooltip should read "Click to create branch origin/"; click should create it and rebind upstream.Diverged (both ahead and behind):
βclick should fail with git's own non-fast-forward error in a toast (no silent merge).During a click: chip swaps to ring spinner, ignores second click, recovers on completion.
Tested locally
Added/updated tests
No tests needed (Electron-only UI; no existing tests for
GitCtrorGitStatus)πΈ Screenshots / Videos
β2andβ3were display-only β clicking the chip opened the BranchSwitcher dropdownπ Additional Information
pushTargetis hardcoded toorigin/<branch>becausegit push -u origin HEADalways targetsorigin. Multi-remote setups where a user pushes to a non-originremote aren't supported by this one-click button β they'd use the terminal anyway.pushAheadcount vsaheadcount: still reusing the sameahead(computed against upstream) for the chip badge. In the typical "branched off canary, no same-name remote" case the count is correct because all branch commits are also new-to-origin; truly divergent multi-remote setups are rare enough not to special-case.