Skip to content

[pull] main from lobehub:main - #495

Open
pull[bot] wants to merge 6201 commits into
code:mainfrom
lobehub:main
Open

[pull] main from lobehub:main#495
pull[bot] wants to merge 6201 commits into
code:mainfrom
lobehub:main

Conversation

@pull

@pull pull Bot commented Jan 27, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot locked and limited conversation to collaborators Jan 27, 2026
@pull pull Bot added ⤵️ pull merge-conflict Resolve conflicts manually labels Jan 27, 2026
AmAzing129 and others added 27 commits August 6, 2026 16:46
…orkspace (#17946)

* ✨ feat(desktop): boot the main window straight into the last active workspace

* ✅ test(desktop): type the setLastWorkspaceSlug spy explicitly for tsgo
Move DevDockLayout under CacheHydrationGate so the dev dock and page
content hydrate after the cache gate releases, instead of mounting the
dock layout around unhydrated content.
…tion (#17948)

* ✨ feat(home): add Minimal / Balanced / Full presets to Home customization

Add a preset row to the Home customization panel that applies a whole
visibility set in one click, plus switches for the two main-column
sections that never had one (recent threads, tasks).

Minimal hides every section and the portrait, which leaves nothing to
stack under the composer — the page then drops the dashboard grid for a
single centered block of greeting + composer.

The centering is derived from the switches rather than stored, so a
preset can never disagree with the individual toggles.

* 🐛 fix: import verify drawer from base ui

* 🐛 fix: align verify drawers with base ui props
* 👷 ci: add bundle size gate for web dist and desktop asar

- measure web dist (dist/desktop|auth|workbench) in e2e workflow builds
- measure app.asar in desktop builds (pr-build-desktop, release-desktop-canary)
- baseline stored as workflow artifacts from latest successful canary runs
- PR runs compare against baseline and fail when increase > max(3%, 512KB)
- upsert PR comment with per-entry size report

* 👷 ci: address codex review on size gate

- add result-encoding: string to baseline finder steps (raw run id,
  empty-string check works, graceful degrade no longer broken)
- emit a visible skipped section when baseline/current report is missing
  instead of the misleading comment fallback
- per-gate comment identifiers (web / asar) so e2e and desktop workflows
  no longer overwrite each other's PR comment
Skip lazy chunk fetch on every tab's home screen so startup never
suspends behind DesktopHomeRoute. Document how to measure production
renderer startup without packaging the app.
src/routes must only hold route segments (_layout/index, index, [param]/index);
business logic and UI belong in src/features. Six domains still kept their
implementation inside the route tree, which forced src/features to import back
from @/routes — 67 files depended on route-owned modules such as the resource
store and the home sidebar internals.

Move them out with git mv so history is preserved:

- (desktop)/desktop-onboarding -> features/DesktopOnboarding
- onboarding                   -> features/Onboarding (merged with Classic)
- (mobile)/(home)              -> features/MobileHome
- (main)/resource              -> features/ResourceManager{store,hooks,Layout}
                                  + features/ResourceHome, features/ResourceLibrary
- (main)/home/_layout          -> features/HomeSidebar + features/HomeLayout
- (main)/settings              -> features/Settings

The 386 files those domains held collapse to 15 route segments that only
re-export from features. Router configs keep pointing at route paths.

settings moves as a whole subtree so every internal relative import keeps
resolving; only _layout -> Layout is renamed. Its former Appearance/Terminal
feature folds into appearance/features/Terminal to avoid a case-only collision
on case-insensitive filesystems.

eslint: the home cold-path block loses its now-dead ignore path, and HomeSidebar
gets a block that repeats the shell-router restrictions — flat config replaces
no-restricted-imports instead of merging it, so the sidebar tree would otherwise
lose one of the two constraint sets it had before the move.

Route violations across src/routes drop from 743 to 475; features -> routes
back-references drop from 67 to 16 (all in domains not covered here).
…17984)

* ✨ feat(db): add agent history job tables for async transfer backfill

Generic per-topic job queue (agent_history_jobs / _job_agents / _job_topics)
with a type discriminator, backing the upcoming fast/slow split of agent
transfer: heavy message-scope rewrites drain asynchronously topic-by-topic
instead of inside the transfer transaction. Schema + migration only; the
model/worker/UI land in follow-up PRs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(db): surrogate PKs for job junction tables + idempotent migration DDL

Per review: new tables must not use composite primary keys (surrogate uuid id
+ unique index instead, so the uniqueness scope can evolve without a PK
rebuild), and generated DDL is hardened for replay — CREATE TABLE/INDEX IF NOT
EXISTS, FKs drop-then-add. Verified by running the migration twice against a
dev database (second pass converges as a no-op).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* 🐛 fix(agent): enable channels for heterogeneous agents

* 🐛 fix(agent): keep device-only agent channels hidden
* ✨ feat(sdk): add @lobehub/sdk generated from the OpenAPI spec

Resource-style TypeScript SDK (lobehub.agents.list()) generated from
packages/openapi/openapi.yml via @hey-api/openapi-ts: instantiable LobeHub
root class, 14 resource groups, inlined HTTP runtime (zero npm deps), and a
byte-level drift check (bun scripts/generate-sdk.ts --check) that runs in
local tests and the release workflow only — regular PR CI is not gated.
Publishing is automated by release-sdk.yml on canary pushes touching
packages/sdk/** (plus manual dispatch), versioned 1.0.<UTC timestamp>.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(sdk): rename misleading messages.deleteAll to deleteMany

DELETE /api/v1/messages requires a non-empty messageIds array — it deletes
a selected batch, not all messages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🔨 chore(sdk): make .mjs output deterministic and document SSE streaming

fixedExtension: true pins tsdown output to .mjs/.d.mts regardless of
package.json type, matching the exports the release workflow writes.
README documents parseAs: 'stream' for responses.create with stream: true.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(sdk): preserve per-call HeadersInit values on write methods

The generated write methods spread options.headers into an object literal,
which drops Headers instances and corrupts tuple arrays. generate-sdk.ts now
rewrites the spread to the client's mergeHeaders (normalizing tuple arrays
via new Headers) in both generate and --check modes, with a regression test
covering both HeadersInit shapes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(sdk): normalize HeadersInit at the root and keep form-data Content-Type deletion

Follow-ups to the header-spread rewrite: (1) mergeHeaders itself now
normalizes tuple-array HeadersInit (client defaults and read-method calls
previously degraded to numeric keys); (2) write methods merge into a plain
object instead of a Headers instance, so the 'Content-Type': null sentinel
on form-data methods survives to the final client merge and can delete a
client-default Content-Type. Regression tests cover both paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(sdk): satisfy repo-wide type-check for generator script and upload test

Resolve the defineConfig thenable before spreading/passing to createClient,
and drop fields not present in the files.create body schema from the
form-data regression test. The package tsconfig only covers src/**, so these
scripts/test typings were first caught by the repo-wide type-check in CI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* 🐛 fix(agent): show runtime labels for heterogeneous agents

* 🐛 fix(connect-agent): preserve customized agent names

* 🐛 fix(agent): guard runtime label fallbacks
* ✨ feat(agent): add style presets to profile artwork generation

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 💄 style(agent): split artwork generate button from its style menu

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 💄 style(agent): fold cover actions into one menu and square the flush cover

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…7992)

* 🐛 fix: workspace common issues & account deletion workspace blocker locales

* 🐛 fix: resolve API docs link against active server origin on desktop

* ✅ test: raise copy regression above the 65,535 bind-parameter cap

* 🐛 fix: preserve copied updatedAt in cross-batch FK fixup updates

* 🐛 fix: narrow workspace id type in workspaceUserSettings procedure ctx

* 🐛 fix: route legacy chat-group sidebar assignments through ChatGroupModel

* 🐛 fix: gate legacy chat-group sidebar moves behind resource edit access

* 🐛 fix: honor chat-group edit locks in legacy sidebar move compat

* ✅ test: cover legacy chat-group sidebar moves (routing, edit gate, lock)
arvinxx and others added 30 commits August 15, 2026 08:55
* 🐛 fix(agent-quota): dedupe jittered reset windows

* 🐛 fix: align home tab icon and model tests
* ✨ feat: refine agent sidebar navigation

* 🐛 fix: restore agent document headers

* 🐛 fix: simplify agent document navigation

* 🐛 fix: match agent document back navigation

* 🐛 fix: show agent welcome in document chat

* 🐛 fix: embed full document conversation

* 🐛 fix: consolidate document create actions

* 💄 style: de-emphasize document back link

* ✅ test: mock document create dropdown
* 💄 style(notification): refine inbox item hierarchy

* 💄 style(notification): align item metadata

* 💄 style(notification): align metadata timestamp
🐛 fix: polish acceptance and task workflows
…18327)

* chore: remove internal LOBE-XXX issue references from code comments

Rewrite code comments that referenced internal Linear issue IDs
(LOBE-XXXX) into self-contained descriptions of the scenario, keeping
code semantics unchanged. User-facing locale strings and LOBE_* constant
names are left untouched.

* chore: remove internal LOBE-XXX issue references from SQL migration comments

---------

Co-authored-by: arvinxx <arvinxx@users.noreply.github.com>
Co-authored-by: Your Name <your@email.com>
Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
…he chat default (#18178)

* 🐛 fix(hetero): pin the CLI runtime type on hetero topics instead of the chat default

Topic-scoped model made `topics.model`/`provider` a snapshot of the agent's
pinned chat model, taken at topic creation. Heterogeneous agents have no such
model: the external CLI owns model selection, so `agents.model` is deliberately
left unset and `agents.provider` is NULL on every agent created before the
runtime type started being stamped there. The snapshot read both through the
defaulting selectors, so a blank became the platform chat default and CLI topics
got pinned to `<default provider>/<default model>` — provider-scoped queries
then read them as ordinary chat topics rather than Claude Code / Codex runs.

- snapshotAgentModel pins `heterogeneousProvider.type` for hetero agents and
  leaves `model` to the per-run backfill; non-hetero keeps snapshotting the
  effective (defaulted) model, which is what pins a topic to the model it
  started with. Drops the now-unreachable `if (!model)` guard.
- buildConnectAgentConfig stamps `provider` on the remote platform branch too
  (openclaw / hermes), matching the local CLI branch.
- The hetero session importer pins the agent's runtime type on topics it
  creates; it wrote neither column, leaving every imported CLI session with a
  NULL provider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* 🐛 fix(hetero): pin the CLI runtime type on server-created topics too

The client-side snapshot fix only covered topics the client mints. A Gateway
send with no existing topic goes through `AiAgentService.execAgent`, where the
server creates the row and pinned the agent's chat model/provider — so a hetero
topic came back from the server tagged with the default chat provider and the
wrong pin returned after a refresh.

Detection mirrors the hetero early exit further down (agencyConfig runtime type,
falling back to the legacy hetero model id), evaluated where `model`/`provider`
still hold the agent config: the reuse branch that overrides them only runs for
an existing topic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…tedAt (#18182)

* 🐛 fix(chat): anchor the tool execution timer to the tool message createdAt

The timer's baseline came only from the running `executeToolCall` /
`toolCalling` operation, which exists solely on the client-runtime path and
lives in memory. Heterogeneous agents (Claude Code / Codex) never create one,
and a reload or a >60s unmount drops it, so the timer fell back to mount time
and restarted from zero — a Bash call running for half an hour read as "3.3s".

Fall back to the tool result row's `createdAt`, which is persisted when the
call is issued on both the client-runtime and heterogeneous paths. The
operation still wins when present because it is the truer execution start: on
the human-approval flow the tool row is created when approval is requested, so
its `createdAt` would fold the user's thinking time into the elapsed time.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* ♻️ refactor(chat): derive tool timer from conversation messages

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* 🐛 fix: adapt page actions for document modal

* 💄 style: refine document modal header actions
* ✨ feat: add project list page

* 💄 style: flatten project list layout

* 💄 style: align project status visuals

* 💄 style: tighten project row spacing

* 💄 style: refine project list metadata

* 🐛 fix: preserve project list workspace scope

* ✨ feat: infer project fields from name

* 🐛 fix: fallback unknown project status
Add a dedicated `goals` table so a goal is an independent target entity
instead of a JSONB marker on `tasks.config.goal`.

- goals table owns its definition (title / requirement), budget
  (max_rounds / max_total_cost) and lifecycle state, decoupled from
  task.status
- execution carrier is an optional polymorphic link
  (subject_type / subject_id), so a goal can back a task-driven /goal
  flow today, a conversation-declared goal later, or stand alone —
  no hard dependency on tasks
- add goalStatuses / goalSubjectTypes consts exported via
  `@lobechat/const/goal`
- register goals id namespace (goal_ prefix) and schema export
- add drizzle migration 0141 + snapshot

Co-authored-by: Arvin Xu <arvin.x@lobehub.com>
* ✨ feat(expertise): add data schema

* ♻️ refactor(expertise): tighten lesson section types

* ♻️ refactor(expertise): use UUIDs for internal records

* ♻️ refactor(expertise): require domain owners

* 🐛 fix(expertise): enforce domain consistency

* ♻️ refactor(expertise): regenerate migration after rebase
* 🐛 fix: preserve session on provider key errors

* 🐛 fix: silence expected provider key errors
#18338)

Replace the Home-list dump in the agent/project header popover with a compact
searchable picker, and forward Popover trigger props so the select can open.
* ✨ feat(expertise): add model and ingestion backend

* ♻️ refactor: harden expertise generation and ingestion

* ✅ test: cover expertise scopes and workspace isolation
# 🚀 LobeHub Release (20260816)

**Release Date:** August 16, 2026
**Since v2.2.13:** 363 merged PRs · 21 contributors

> This cycle gives longer-horizon work a durable home: Projects and
Goals land as first-class containers for agent work, seven new CLI
coding agents join the heterogeneous runtime, a Local Sandbox executes
on your machine, and the platform opens up through a generated OpenAPI
spec and SDK.

---

## ✨ Highlights

- **Seven new CLI coding agents** — Cursor, CodeBuddy, Qoder, Kimi Code,
Pi, TRAE, and Grok Build (ACP) join the heterogeneous runtime, plus a
Codex app-server lab. (#18229, #18219, #17965, #18228, #17899, #18292,
#18254, #18275)
- **Local Sandbox** — A local execution environment for devices, with a
real working directory instead of a refusal. (#18143, #18180)
- **Public API & SDK** — `openapi.yml` generated from routes, a new
`@lobehub/sdk` package, expanded v1 endpoints, and scoped API keys.
(#17944, #17980, #18141, #18029)
- **Home customization** — A Customize modal with Minimal / Balanced /
Full presets, a day-paged daily brief, and a task-shaped task mode with
scheduled tasks. (#17912, #17948, #17958, #18173)
- **Desktop split views** — Split tab views, a tab strip reworked for
many-tab use, and a faster cold start. (#18004, #17809, #17811)

---

## 🏗️ Core Agent & Architecture

### Projects & Goals(Alpha)

- Project schema, backend and CLI, workspaces with conversation PoC, and
an identifier column. (#17996, #18006, #18020, #18034)
- Goal creation split from task creation with an explanatory empty
state; goals get their own table and AI-generated acceptance criteria.
(#18047, #18335, #18265)
- Goal launch requires confirmation even in auto-run mode. (#18111)

### Agents & Groups

- Group member permissions with personal model choice on shared
builtins. (#18122)
- Async agent transfer and copy, with history backfill and intact
membership lifecycle. (#17997, #18030, #18082, #18126)
- Sub-agents follow the parent model by default, with thinking controls.
(#17938)
- Agent quota gets a usage calendar and burnout projection. (#18117)

### Context & Memory

- Graph runtime context is injected continuously; container message
tokens count toward the context budget. (#17761, #17839)
- Every memory tool call renders a dedicated card; extraction prompts
align with their schemas. (#17891, #17988)
- Opt-in automatic topic summary workflow. (#17796, #18171)

---

## 📱 Platforms & Integrations

### Heterogeneous CLI Agents

- New runtimes: Cursor CLI with model selection, CodeBuddy, Qoder with
reasoning effort, Kimi Code, Pi, TRAE, and Grok Build over ACP; Codex
app-server session lifecycle completes as a lab. (#18229, #18244,
#18219, #17965, #18160, #18228, #17899, #18292, #18254, #17907, #18275)
- The model selector is driven by a capability table, with local CLI
descriptors centralized as a single source of truth. (#18214, #17979)
- Windows support hardened: CLI spawning, agents behind unknown shims
and stale PATH. (#18095, #18220)
- A heterogeneous error taxonomy classifies terminal errors; cloud auth
failures surface clearly. (#17887, #18040)

### Desktop

- Split tab views, a tab strip reworked for many-tab use, and pinned
tabs that travel. (#18004, #17809, #17857)
- Boot straight into the last active workspace; cold-start critical path
reduced and the local database prewarmed after navigation. (#17946,
#17811, #18218)
- Chromium zoom presets and update downgrades. (#17679, #18012)

### Messaging & Bots

- `/mode` command switches bot conversation mode; recent same-channel
history is injected. (#18197, #16608)
- Proactive messenger push with per-channel notification settings.
(#17791)
- Discord completes deferred forwarded interactions. (#18169)

### Models

- Gemini 3.7 Flash, GLM-5.3 with always-on thinking, Grok 4.6 reasoning
effort, and MiniMax-H3 video with official v2 API. (#18289, #18290,
#18301, #18225, #17827)
- Audio lands in multimodal understanding with input cost estimation;
Cerebras and Groq gain advanced reasoning parameters. (#17904, #17949,
#16469)

---

## 🖥️ User Experience

- Home: mine/team scope and author chips on recent topics, open goals in
the rail, and one-page dashboard scrolling with a persistent recents
cache. (#17908, #18121, #17836)
- Chat: web voice messages, editable opening questions, keyboard-driven
AskUserQuestion with select-to-submit, and a reachable, effective
error-card retry. (#17744, #18003, #17903, #18080)
- Agent identity: an avatar studio with one-click brand-style
generation, profile artwork with style presets, and personal names with
a dice-roll composer. (#18113, #17929, #17986, #17853, #17894)
- Workspace agents organize with labels and a shared sidebar; the
sidebar header becomes an identity switcher. (#17848, #18338)
- Resource library: path-based category routes with a Files category,
origin filtering, and restored document scrolling. (#18083, #18170,
#18345)
- Onboarding: Notion and X understanding sources, streamed generation
progress, and confirmed starter tasks that run immediately. (#18110,
#18118, #18105, #18224)

---

## 🔧 Tooling & API

- OpenAPI spec generated from routes via hono-openapi, shipped as the
generated `@lobehub/sdk`. (#17944, #17980)
- v1 API adds api-keys, evals, mcp-servers, and usage endpoints.
(#18141)
- API key scopes, with workspace keys scoped to member permissions.
(#18029, #18136)
- Jupyter notebook (.ipynb) upload with token-efficient markdown
conversion. (#17855)
- CI gates bundle size for web dist and desktop asar. (#17970)
- Agent tracing visualizes context composition. (#18114)

---

## 🔒 Security & Reliability

- **Security:** custom provider base URLs are validated (#18223);
restricted knowledge bases are soft-hidden from members (#18282);
deleting a connector unlinks remote accounts (#18270); auth cookies
support custom prefixes and subdomain sharing (#18358, #18200).
- **Reliability:** blocking Redis XREAD runs on a dedicated connection
(#17876); file parse cache writes are serialized (#17919); repeated
network-error toasts collapse into one (#17873); runs no longer strand
in `verifying` (#18164); sessions survive provider key errors (#18343).
- **Performance:** PDF parsing drops a 25MB native dependency (#17858);
agent page render cost is cut across sidebars, composer, and topic list
(#17991); recent-topic previews are batched instead of per-topic
subqueries (#17928).

---

## 👥 Contributors

Huge thanks to **21 contributors** who shipped **363 merged PRs** this
cycle.

@sxjeru · @Cyber-Yichen · @northword · @smbslt3 · @hardy-one ·
@orangeboyChen · @nightcityblade · @Max-Reisinger · @Mark-star-dot ·
@ImSingee · @BittuBarnwal7479 · @arvinxx · @Innei · @AmAzing129 ·
@tjx666 · @rdmclin2 · @neko · @lijian · @sudongyuer · @rivertwilight ·
@cy948

---

**Full Changelog**:
v2.2.13...release/weekly-20260816
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

⤵️ pull merge-conflict Resolve conflicts manually

Projects

None yet

Development

Successfully merging this pull request may close these issues.