Skip to content

⬆️ chore: upgrade Vite to 8.0.0#12720

Merged
Innei merged 7 commits into
canaryfrom
chore/vite8-upgrade
Apr 22, 2026
Merged

⬆️ chore: upgrade Vite to 8.0.0#12720
Innei merged 7 commits into
canaryfrom
chore/vite8-upgrade

Conversation

@Innei

@Innei Innei commented Mar 5, 2026

Copy link
Copy Markdown
Member

Summary

This PR upgrades the SPA build from Vite 7 to Vite 8 and adopts the associated Rolldown-based production output path.

The evaluation now includes four dimensions:

  1. build-time efficiency
  2. production artifact and initial-load graph characteristics
  3. production runtime metrics
  4. dev first-open metrics

A further follow-up experiment was also performed in this branch:

  • strictExecutionOrder is now disabled only in production builds
  • strictExecutionOrder remains enabled in dev builds

That experiment materially changes the runtime conclusion.

Scope and Caveat

These measurements reflect the entire PR state, not only the package-version bump.

The branch includes, in addition to the Vite 7 -> Vite 8 upgrade:

  • migration from rollupOptions.output to rolldownOptions.output
  • custom codeSplitting.groups
  • production/dev configuration divergence for strictExecutionOrder
  • several lazy-loading / import-path changes in application code

Accordingly, the figures below should be interpreted as PR-level outcomes, not as a pure vendor-version benchmark.

Methodology

Item Method
Build time / peak RSS /usr/bin/time -lp bun run build:spa
Artifact statistics Parsed from emitted dist/desktop
Initial-load graph Parsed from emitted dist/desktop/index.html
Production runtime Desktop Lighthouse, cold-cache, local static serving, 2 runs averaged
Dev first-open metric cold start, fresh Chrome profile, cache disabled, VITE ready -> final app LCP
Dev route under test /desktop-onboarding
Measurement date April 20, 2026

1. Build Metrics

Vite 7 baseline -> initial Vite 8 branch state

Metric Vite 7 baseline Initial Vite 8 state Delta
Build time 47.93s 7.63s -84.1%
Peak RSS 7.49 GiB 4.76 GiB -36.5%

Current branch state after production-only strictExecutionOrder change

Metric Initial Vite 8 state Current branch state Delta
Build time 7.63s 6.64s -13.0%
Peak RSS 4.76 GiB 4.75 GiB ~flat

2. Production Artifact Metrics

Vite 7 baseline -> initial Vite 8 branch state

Metric Vite 7 baseline Initial Vite 8 state Delta
Total files 1291 1277 -1.1%
JS files 1223 1208 -1.2%
Total JS size 60.05 MiB 61.30 MiB +2.1%
Total JS gzip 14.26 MiB 14.61 MiB +2.4%
Largest JS chunk 7.17 MiB 5.53 MiB -22.8%
index.html size 9.42 KiB 24.91 KiB +164.4%
Chunks > 500 KB 32 33 +3.1%
PWA precache entries 1226 1212 -1.1%
PWA precache size 60.07 MiB 61.33 MiB +2.1%

Initial Vite 8 state -> current branch state

Metric Initial Vite 8 state Current branch state
index.html size 25.51 KiB 25.20 KiB
PWA precache entries 1212 1221
PWA precache size 61.33 MiB 61.04 MiB

3. Initial-Load Dependency Graph

The first-load graph was measured from emitted dist/desktop/index.html, i.e. from the actual preload directives shipped to production.

Vite 7 baseline -> initial Vite 8 branch state

Metric Vite 7 baseline Initial Vite 8 state Delta
Initial JS requests 8 192 +2300.0%
Initial JS size 9.53 MiB 19.01 MiB +99.5%
Initial JS gzip 2.64 MiB 4.99 MiB +88.8%
Initial CSS requests 1 3 +200.0%
Initial CSS size 4.11 KiB 13.07 KiB +217.7%
modulepreload count 7 191 +2628.6%

Initial Vite 8 state -> current branch state

Metric Initial Vite 8 state Current branch state
modulepreload count 191 187
Initial JS count 192 188
Initial JS size 19.93 MiB 19.31 MiB
Initial JS gzip 5.23 MiB 5.06 MiB
Initial CSS requests 3 3

Interpretation

  • The initial-load graph remains significantly larger than the Vite 7 baseline.
  • The production-only strictExecutionOrder change trims the graph slightly, but does not by itself resolve the chunk explosion / preload expansion issue.
  • This issue remains a separate follow-up area.

4. Production Runtime Metrics

Initial production result on the Vite 8 branch

The earliest Vite 8 production measurement showed a clear runtime regression despite large build-time gains.

Metric Vite 7 baseline Initial Vite 8 state Delta
Performance score 0.315 0.285 -9.5%
FCP 1.86s 5.22s +180.0%
LCP 17.22s 19.32s +12.2%
Speed Index 6.11s 9.73s +59.2%
TBT 862ms 829ms -3.9%
TTI / Interactive 17.22s 19.87s +15.4%
CLS 0.0023 0.0089 worse
Requests 258 226 -12.4%
Total byte weight 26.28 MiB 27.70 MiB +5.4%
Main-thread work 1661ms 1681ms +1.2%

Production-only strictExecutionOrder experiment

Current branch state disables strictExecutionOrder only in production. Under the same Lighthouse path, this substantially changes the runtime result.

Metric Initial Vite 8 state Current branch state Delta
Performance score 0.285 0.595 +108.8%
FCP 5.22s 0.07s -98.6%
LCP 19.32s 1.45s -92.5%
Speed Index 9.73s 3.11s -68.0%
TBT 829ms 1001ms +20.8%
Interactive 19.87s 1.32s -93.3%
CLS 0.0089 0.0301 worse
Requests 226 228 +0.9%
Total byte weight 29.05 MiB 28.43 MiB -2.1%
Main-thread work 1681ms 1610ms -4.2%

Interpretation

  • The runtime regression appears highly sensitive to strictExecutionOrder in production.
  • The current branch removes most of the previously observed runtime regression in the Lighthouse benchmark.
  • However, CLS is worse in the current experiment and should be treated as an explicit follow-up risk.
  • The chunk-explosion issue still exists and should still be investigated independently.

5. Memory Attribution

The build-memory figure is an overall process RSS measurement, not a standalone Rolldown-process number.

Process-tree sampling during pnpm run build:spa showed:

Process Peak RSS
node .../vite/bin/vite.js build ~4.97 GiB
node ... pnpm ... build:spa:raw ~116 MiB
node ... pnpm ... build:spa ~113 MiB
node ... cross-env ... ~49 MiB
standalone rolldown process observed none

Implication:

  • Rolldown is currently accounted for inside the main Node build process at the OS-process level.
  • The benchmark therefore supports overall build-memory improvement, but not a clean Node-vs-Rolldown split.

6. Dev First-Open Metrics

A corrected dev benchmark was added for the first browser open after Vite becomes ready.

Corrected methodology

  1. start the Vite command
  2. wait for terminal VITE ... ready in ...
  3. open the browser immediately
  4. measure until the final app page reaches LCP

For DevBundle, the Bundling in progress placeholder is explicitly ignored; the measurement stops only after the real app page appears and its LCP stabilizes.

Results

Variant Terminal ready Browser open -> final LCP Total start -> final LCP
Vite 7 0.62s 29.72s 30.38s
Vite 8 default 0.58s 21.72s 22.44s
Vite 8 + DevBundle 0.49s 15.78s 16.29s

Relative change

Comparison Delta
Vite 8 default vs Vite 7 -26.1% total
Vite 8 + DevBundle vs Vite 7 -46.4% total
Vite 8 + DevBundle vs Vite 8 default -27.4% total

Interpretation

  • The earlier Route-ready ~16s observation was a measurement-harness error and should be ignored.
  • Under the corrected methodology, all three variants have similar terminal-ready times (all below 1s).
  • The dominant difference is the browser-side first-open path after the terminal is ready.
  • In this benchmark, Vite 8 is clearly better than Vite 7, and DevBundle is the strongest result.

7. Upstream Follow-up Concern

Even after the corrected dev benchmark, the dev first-open path is still much slower than the production build itself.

Using the current branch production build time:

Metric Time
Production build:spa 6.64s
Vite 8 default dev first-open 22.44s
Vite 8 + DevBundle dev first-open 16.29s

That implies:

  • Vite 8 default dev first-open is about 3.4x slower than the production build
  • Vite 8 + DevBundle dev first-open is about 2.5x slower than the production build

This remains counterintuitive enough to deserve explicit upstream attention.

Current Conclusion

Dimension Current assessment
Build efficiency Strong improvement
Peak build memory Clear improvement
Largest single chunk Improvement
Total artifact size Slightly larger than Vite 7 baseline
Initial-load graph Still significantly inflated vs Vite 7
Production runtime Strongly improved after production-only strictExecutionOrder change
Dev first-open Better than Vite 7; DevBundle best
Remaining concern Initial graph expansion and dev-vs-build asymmetry

Bottom Line

The evaluation now supports the following consolidated view:

  • build-side efficiency improved materially with Vite 8 / Rolldown
  • the initial production runtime regression was real in the earlier branch state
  • disabling strictExecutionOrder only in production removes most of that runtime regression in the current Lighthouse benchmark
  • the chunk explosion / preload expansion issue still exists and remains the most visible unresolved loading-side problem
  • dev first-open metrics are improved versus Vite 7, but the dev cold-start path is still unexpectedly slower than the production build and should be treated as a follow-up concern

@vercel

vercel Bot commented Mar 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lobehub Ready Ready Preview, Comment Apr 22, 2026 11:29am

Request Review

@sourcery-ai

sourcery-ai Bot commented Mar 5, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Upgrades the build pipeline to Vite 8, removes the node polyfills plugin in favor of explicit Buffer imports and a standalone buffer dependency, introduces a lightweight PrismJS mock via Vite aliases to avoid bundling the full library, and fixes a few lint issues in existing providers and utilities.

Class diagram for PrismJS mock implementation

classDiagram
  class PrismTokenContent {
  }

  class PrismToken {
    +string alias
    +PrismTokenContent content
    +number length
    +string type
    +PrismToken(type string, content PrismTokenContent, alias string, matched string)
  }

  class Hooks {
    +function add()
    +Record_string_unknown all
    +function run()
  }

  class PrismMock {
    +boolean disableWorkerMessageHandler
    +Hooks hooks
    +Record_string_unknown languages
    +boolean manual
    +PrismToken Token
    +tokenize(code string) Array_string_or_PrismToken
  }

  class GlobalThis {
    +Prism PrismMock
  }

  PrismMock "1" o-- "1" Hooks
  PrismMock "1" o-- "1" PrismToken
  GlobalThis "1" o-- "1" PrismMock
Loading

File-Level Changes

Change Details Files
Upgrade Vite configuration and plugin setup for Vite 8 and introduce PrismJS mocking via module aliases.
  • Switch rollup input path resolution in Vite config to use path.resolve instead of resolve from url.
  • Add Vite resolve.alias entries mapping prismjs and prismjs/components/* imports to a new mocks/prismjs.ts stub file.
  • Remove vite-plugin-node-polyfills usage from the shared renderer plugin configuration.
vite.config.ts
plugins/vite/sharedRendererConfig.ts
mocks/prismjs.ts
Replace Vite node polyfills with explicit Buffer usage and add buffer as a runtime dependency.
  • Add buffer as a production dependency in package.json and pin Vite to version 8.0.0-beta.16.
  • Add explicit import { Buffer } from 'buffer/' in modules that rely on Buffer for encoding/decoding.
  • Ensure code paths using Buffer continue to function without the polyfill plugin.
package.json
packages/utils/src/imageToBase64.ts
packages/utils/src/trace.ts
src/features/DevPanel/CacheViewer/schema.ts
Fix minor lint and style issues in provider and context builder code.
  • Adjust private 172.x IP detection regex to use a non-capturing group to satisfy linting/style rules.
  • Wrap thrown errors with a cause option when local image fetching fails for better error chaining.
  • Change debug logging from console.log to console.info in Replicate provider.
  • Mark unused options parameter as _options in OpenAI context builder to appease unused-variable lint rules.
packages/model-runtime/src/providers/replicate/index.ts
packages/model-runtime/src/core/contextBuilders/openai.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've left some high level feedback:

  • For the Prism mock, consider giving hooks.add and hooks.run realistic call signatures (e.g., accepting the expected hook name and callback/args) instead of no-arg functions so existing hook usage won’t accidentally throw due to missing parameters at runtime.
  • Now that vite-plugin-node-polyfills is removed and Buffer is provided via explicit buffer/ imports, it may be safer to centralize this in a small shared helper (e.g., utils/buffer.ts re-exporting Buffer) and use that everywhere to avoid scattered direct imports and reduce the chance of missing a call site.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- For the Prism mock, consider giving `hooks.add` and `hooks.run` realistic call signatures (e.g., accepting the expected hook name and callback/args) instead of no-arg functions so existing hook usage won’t accidentally throw due to missing parameters at runtime.
- Now that `vite-plugin-node-polyfills` is removed and `Buffer` is provided via explicit `buffer/` imports, it may be safer to centralize this in a small shared helper (e.g., `utils/buffer.ts` re-exporting `Buffer`) and use that everywhere to avoid scattered direct imports and reduce the chance of missing a call site.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@codecov

codecov Bot commented Mar 5, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 46.42857% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 66.80%. Comparing base (eb99190) to head (66c13a8).
⚠️ Report is 41 commits behind head on canary.

Additional details and impacted files
@@             Coverage Diff             @@
##           canary   #12720       +/-   ##
===========================================
- Coverage   83.69%   66.80%   -16.90%     
===========================================
  Files         539     2100     +1561     
  Lines       36805   179092   +142287     
  Branches     6081    21105    +15024     
===========================================
+ Hits        30804   119637    +88833     
- Misses       5877    59331    +53454     
  Partials      124      124               
Flag Coverage Δ
app 59.39% <47.36%> (?)
database 92.25% <ø> (?)
packages/agent-runtime 79.72% <ø> (ø)
packages/context-engine 83.18% <ø> (ø)
packages/conversation-flow 92.40% <ø> (ø)
packages/file-loaders 87.02% <ø> (ø)
packages/memory-user-memory 74.74% <ø> (ø)
packages/model-bank 99.86% <ø> (ø)
packages/model-runtime 84.21% <28.57%> (-0.01%) ⬇️
packages/prompts 69.08% <ø> (ø)
packages/python-interpreter 92.90% <ø> (ø)
packages/ssrf-safe-fetch 0.00% <ø> (ø)
packages/utils 87.97% <100.00%> (+0.01%) ⬆️
packages/web-crawler 88.66% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
Store 66.27% <100.00%> (∅)
Services 51.96% <100.00%> (∅)
Server 66.75% <ø> (∅)
Libs 51.25% <0.00%> (∅)
Utils 80.09% <0.00%> (-13.38%) ⬇️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Innei Innei marked this pull request as draft March 5, 2026 09:30
@Innei Innei changed the title ⬆️ chore: upgrade Vite to 8.0.0-beta.16 and remove node polyfills plugin ⬆️ chore: upgrade Vite to 8.0.0 Mar 12, 2026
@Innei Innei force-pushed the chore/vite8-upgrade branch from 58ec823 to 1b04566 Compare April 14, 2026 12:26
@Innei Innei force-pushed the chore/vite8-upgrade branch from 1b04566 to b1715e1 Compare April 14, 2026 12:33
@Innei

Innei commented Apr 20, 2026

Copy link
Copy Markdown
Member Author

Update: added a dev-environment cold-start metric for the first browser open.

Methodology

  • Route: /desktop-onboarding
  • Cold-start mode: vite --force
  • Browser state: fresh Chrome profile, cache disabled
  • Metric definition: time from starting the Vite command to the final LCP of the first browser navigation
  • Reported as:
    • route-ready: time until the target route can be opened as a real page
    • nav LCP: LCP measured from browser navigation start
    • total: route-ready + nav LCP
  • Samples: 2 valid runs per variant

Results

Variant Route-ready Nav FCP Nav LCP Total start -> LCP
Vite 7 1.61s 13.79s 30.50s 32.11s
Vite 8 default 16.83s 0.07s 5.96s 22.79s
Vite 8 + DevBundle 16.09s 0.10s 1.42s 17.51s

Relative change

Comparison Delta
Vite 8 default vs Vite 7 -29.0% total
Vite 8 + DevBundle vs Vite 7 -45.5% total
Vite 8 + DevBundle vs Vite 8 default -23.2% total

Interpretation

  • Under this cold-start dev metric, Vite 8 improves the end-to-end first-open experience materially versus Vite 7.
  • The main shape of the improvement is different from production build metrics:
    • Vite 8 increases the route-openable wait before the first browser navigation.
    • However, once the page is actually opened, browser-side paint/LCP becomes much faster.
  • DevBundle provides the best overall result in this measurement set.

Note

The terminal VITE ready in ... banner stayed below ~0.5s in all three cases. The dominant difference in this benchmark therefore comes from route-level first-open work rather than the CLI-ready banner itself.

@Innei

Innei commented Apr 20, 2026

Copy link
Copy Markdown
Member Author

Experiment update: I tested production runtime metrics again after disabling strictExecutionOrder only in production builds, while keeping it enabled in dev.

Change under test

Production output now uses:

  • strictExecutionOrder: false

Dev output still uses:

  • strictExecutionOrder: true

This isolates the production-only effect of strictExecutionOrder without changing dev-mode behavior.

Verification path

  • rebuilt production bundle with bun run build:spa
  • served the rebuilt dist/desktop via local static server under /_spa/
  • reran the same desktop Lighthouse cold-cache path as before
  • samples: 2 runs averaged

Build-side side effect

Metric Previous Vite 8 prod strictExecutionOrder off in prod
Build time 7.63s 6.64s
Peak RSS 4.76 GiB 4.75 GiB

Runtime metrics

Metric Previous Vite 8 prod strictExecutionOrder off in prod Delta
Performance score 0.285 0.595 +108.8%
FCP 5.22s 0.07s -98.6%
LCP 19.32s 1.45s -92.5%
Speed Index 9.73s 3.11s -68.0%
TBT 829ms 1001ms +20.8%
Interactive 19.87s 1.32s -93.3%
CLS 0.0089 0.0301 worse
Total byte weight 29.05 MB 28.43 MB -2.1%
Requests 226 228 +0.9%
Main-thread work 1681ms 1610ms -4.2%

Initial-load graph impact

This change did not materially fix the initial graph by itself, but it did move it slightly in the right direction:

Metric Previous Vite 8 prod strictExecutionOrder off in prod
modulepreload count 191 187
Initial JS count 192 188
Initial JS size 19.93 MiB 19.31 MiB
Initial JS gzip 5.23 MiB 5.06 MiB
index.html size 25.51 KiB 25.20 KiB

Interpretation

This experiment suggests that the runtime regression is highly sensitive to strictExecutionOrder in production.

The chunk explosion / initial-load graph is still present and should still be investigated independently, but this isolated switch alone appears to remove most of the observed runtime regression in the current Lighthouse benchmark.

Caveat: the runtime delta here is large enough that it is worth sanity-checking further, but the two reruns were internally consistent.

@Innei Innei force-pushed the chore/vite8-upgrade branch from 42bd558 to 139ef8b Compare April 20, 2026 11:44
} from './mecha';
import { type FetchOptions } from './types';

const defaultProvider = ModelProvider.OpenAI;
import { type FetchOptions } from './types';

const defaultProvider = ModelProvider.OpenAI;
const providersWithDeploymentName = new Set<string>([
@Innei Innei marked this pull request as ready for review April 21, 2026 15:58

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've reviewed this pull request using the Sourcery rules engine

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2c69dee8d5

ℹ️ 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".

Comment thread plugins/vite/sharedRendererConfig.ts
@github-actions

github-actions Bot commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

🐳 Database Docker Build Completed!

Version: pr-chore-vite8-upgrade-b3236fe
Build Time: 2026-04-22T11:31:52.600Z
🔗 View all tags on Docker Hub: https://hub.docker.com/r/lobehub/lobehub/tags

Pull Image

Download the Docker image to your local machine:

docker pull lobehub/lobehub:pr-chore-vite8-upgrade-b3236fe

Important

This build is for testing and validation purposes.

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Desktop App Build Completed!

Version: 0.0.0-nightly.pr12720.8929
Build Time: 2026-04-22T11:58:21.935Z

📦 Release Download · 📥 Actions Artifacts

Build Artifacts

Platform File Size
macOS (Apple Silicon) LobeHub-Nightly-0.0.0-nightly.pr12720.8929-arm64-mac.zip 142.78 MB
macOS (Apple Silicon) LobeHub-Nightly-0.0.0-nightly.pr12720.8929-arm64.dmg 137.14 MB
macOS (Intel) LobeHub-Nightly-0.0.0-nightly.pr12720.8929-mac.zip 151.04 MB
macOS (Intel) LobeHub-Nightly-0.0.0-nightly.pr12720.8929-x64.dmg 144.00 MB
Windows LobeHub-Nightly-0.0.0-nightly.pr12720.8929-setup.exe 129.23 MB
Linux LobeHub-Nightly-0.0.0-nightly.pr12720.8929.AppImage 159.58 MB

Warning

Note: This is a temporary build for testing purposes only.

@Innei Innei merged commit 31d76cc into canary Apr 22, 2026
38 of 39 checks passed
@Innei Innei deleted the chore/vite8-upgrade branch April 22, 2026 11:59
@arvinxx arvinxx mentioned this pull request Apr 27, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trigger:build-desktop Trigger Desktop build trigger:build-docker Trigger Docker image build

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant