[pull] main from lobehub:main - #495
Open
pull[bot] wants to merge 6201 commits into
Open
Conversation
…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.
…rn process at visible output end (#17968)
…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>
… source of truth (#17979)
* 🐛 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)
* 🐛 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
fix(docker): include swc helpers runtime
#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
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
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 : )