🚀 release: 20260509#14563
Conversation
* feat: support pair dm policy * feat: add enum descriptions * chore: optimize labels and copy * chore: update i18n * fix: lint error * chore: update bot docs * fix: peek paring request and so on issues
📝 docs(skills): record contributor roster in version-release skill - Add Contributor Ordering section with the canonical LobeHub team roster (10 handles) and a flat-list rule (community first, team after, sorted by PR count desc). - Note the git-author-name vs GitHub-handle pitfall (e.g. YuTengjing -> @tjx666) and how to verify via gh CLI. - Drop commits count from the changelog template's metadata and contributors lines; reword the contributors intro to a "Huge thanks to N contributors" pattern. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…sk drawer Gateway reconnect (#14208) * 💄 style(task): right-align subtask assignee avatar and make it clickable Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(brief): standardize result brief actions to mark-as-done + edit Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(brief): align decision brief icon with kanban pending-review column Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(brief): rename result brief primary action to "Confirm complete" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(tasks): wire passive Gateway WS reconnect for the task topic drawer The task topic drawer rendered messages from the DB but never connected to the Gateway, so a running task showed only the initial prompt and the empty assistant placeholder. Server already writes runningOperation into topic metadata; expose it through TaskDetailActivity and reuse the main agent reconnect hook so the drawer establishes the WebSocket on open. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(brief): mute Check icon on resolved success tag Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(recent): exclude system-trigger topics from the Recent sidebar The Recent SQL union pulled every topic regardless of trigger, so cron, eval, task_manager, and task-runner topics leaked into the main "最近" list alongside ordinary chats. Filter them in the topics SELECT, and align the long-stale `TopicTrigger.RunTask` constant with the literal `'task'` that TaskRunnerService actually writes (the const was unused so no DB migration is needed). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ag in subtasks (#14226) ✨ feat(tasks): drop custom actions on result briefs & show trigger tag in subtasks - Result briefs render a fixed single-button UI, so reject custom actions at brief creation time and remove the unused defaults / lifecycle actions. - Surface automation trigger (heartbeat / schedule) on subtask rows by threading the fields through TaskService → TaskDetailSubtask → tree. - Polish: tree title flex/overflow fix, QueueTray send icon swapped to ArrowUp. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…eep-link (#14228) * ✨ feat(tasks/progress): align workspace progress visibility with chat input Switch the right-side ProgressSection to selectCurrentTurnTodosFromMessages so it appears and disappears in lockstep with the TodoProgress bar above ChatInput, instead of lingering on stale historical todos. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(tasks): promote tasks entry into top-level header nav Place the Tasks entry directly under Home in the sidebar header alongside Search/Home, instead of letting it float inside the customizable body list. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(tasks/comment): use filled background for the task detail comment input Switch the task detail comment input from a bordered card on `colorBgElevated` (which read as outline-only in light mode) to a `colorFillTertiary` filled card so it looks consistently filled in both light and dark themes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♿ fix(tasks/progress): restore keyboard toggle & uncap expanded list Address two regressions introduced when ProgressSection moved off Accordion: - Re-add keyboard/ARIA semantics on the toggle (role=button, tabIndex, aria-expanded, aria-controls, Enter/Space handler) so keyboard and screen-reader users can collapse/expand the panel. Toggle now lives on the header row only, so clicking todos no longer collapses the panel. - Replace the `max-height: 600px` cap with the `grid-template-rows: 0fr → 1fr` pattern, letting the list grow to its natural height. Long todo plans are no longer clipped; the parent sidebar (already `overflow-y: auto`) handles scrolling. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(tasks/documents): auto-pin agent-created documents to current task Why: taskDocuments table and TaskModel.pinDocument exist with pinnedBy='agent', but the agent-documents runtime never called pinDocument, so documents written during a task were never linked to that task's workspace. How: In agentDocumentsRuntime factory, read context.taskId and pin the new documentId after createDocument / createTopicDocument / copyDocument / upsertDocumentByFilename. Idempotent via the existing (taskId, documentId) unique constraint. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(tasks/artifacts): render task-level artifacts on the detail page Why: The taskDocuments table now auto-populates when an agent writes a doc, and the backend already serves the workspace tree (own task + descendants) via getTaskDetail. The detail page just wasn't rendering it yet. How: New TaskArtifacts component reads activeTaskWorkspace and shows a collapsible tree (file/folder + size + source-task tag). Selectable is off for now — click-through interaction will land in a follow-up. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(tasks/lifecycle): deliver onTopicComplete webhook via QStash The hook was registered without `delivery: 'qstash'`, defaulting to plain fetch. The target route `/api/workflows/task/on-topic-complete` is mounted under `qstashAuth()`, which rejects unsigned requests with 401 in production. `HookDispatcher.fetchDeliver` only logs failures, so the webhook silently failed — leaving topic.status stuck at 'running' forever for every heartbeat (and regular) task in production. Same fix applied to all four agentEvalRun webhook registrations for consistency, even though those routes are currently unauthenticated. LOBE-8303 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(desktop/notification): deep-link notification click to source chat Resolve the SPA path (group / 1:1 topic / agent root) from the conversation context when posting a desktop notification, and forward it through the existing main-broadcast `navigate` pipeline so clicking the notification brings the user back to the originating chat instead of just focusing the window. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(tasks): move tasks tab back into the customizable sidebar Removes 'tasks' from the fixed header nav and re-adds it as a default, user-reorderable item under the body sidebar (alongside pages / recents). Reverts the header-promotion from 287a3ac in favor of letting users place / hide the tab themselves. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(tasks/detail): introduce TaskBriefCard, polish topic row layout - Split a dedicated TaskBriefCard for the detail timeline so brief styling there can diverge from the daily-brief card without conditionals. - Promote the agent avatar (with profile popup) to the TopicCard header, drop the redundant author chip and calendar icon next to the timestamp. - Move the dashed divider from BriefCardSummary into BriefCard so any consumer of the summary block doesn't get an unexpected leading rule. - Tighten card padding (CommentCard / TopicCard) to align with the timeline rhythm. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(agent/header): round segmented control items in ViewSwitcher Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ⬆️ chore: upgrade desktop electron to 41.3.0 * 🐛 fix: patch ant design icons vitest resolution * 🐛 fix: require fixed ant design icons version
…+ better error message (#14230) * 🔖 chore(release): release version v2.1.53 [skip ci] * fix(cli): improve gen status/download error message for wrong asyncTaskId * docs(cli-skill): clarify asyncTaskId vs generationId in gen status/download * fix(builtin-skills): clarify asyncTaskId vs generationId in gen status/download * fix(cli): distinguish asyncTaskId not found vs generationId not found in error message * Update package.json --------- Co-authored-by: lobehubbot <i@lobehub.com>
* 🐛 fix(topic): drop switchTopic race under rapid sidebar clicks Share the single-click debounce timer at module level so a click on any topic cancels a pending click from another, and add an epoch guard in ChatTopicActionImpl.switchTopic so stale refresh continuations cannot flip activeTopicId back to a superseded topic. Fixes LOBE-7785 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(topic): yield before refresh so switchTopic epoch can skip stale fetches The post-await epoch check was dead code: nothing followed the await. Yield a microtask before the refresh so queued switchTopic sync bodies can bump #switchTopicEpoch first, then bail the superseded caller before its SWR mutate ever fires. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
#14198) Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <copilot@github.com> Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
Co-authored-by: Copilot <copilot@github.com> Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
…rio [skip ci] (#14242) 📝 docs(version-release): add hotfix example and patch scenario note Made-with: Cursor
…4160) * 🐛 fix(send-message): forward topic-list filter to server response Without this, sending a message refreshes `topicDataMap` with an unfiltered list, so completed/cron topics flash back into the sidebar until the next SWR revalidation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(topic): preserve filter fields in internal_updateTopics internal_updateTopics rewrote topicDataMap[key] from scratch and dropped excludeStatuses / excludeTriggers, so #getTopicFilter returned undefined on the second sendMessageInServer call and stopped forwarding the filter to the server — completed/cron topics could leak in until SWR revalidated. Carry the filter fields forward from currentData, matching loadMoreTopics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: add the lobehub cli oidc expreis should refresh aksk * fix: add the buffer seconds
* ✨ feat(task): support scheduled status for cron-driven automation Adds the new `scheduled` task status to the type system, lifecycle, and UI so cron-driven tasks can park between ticks instead of falling back to `paused`. Replaces the SchedulerTab placeholder with a real cron editor (frequency / weekday / time / timezone / max runs) and surfaces the schedule config through TaskDetailData. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(task): show full execution history in detail `findWithHandoff` defaulted to a limit of 4, which fits the prompt-build case but truncated the activity feed in the task detail UI to the latest 4 runs. Make `limit` required and pass 100 from the detail service so scheduled tasks display their full run history. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(QueueTray): use elevated surface tokens Switch the queue tray's border to colorFillSecondary and its background to colorBgElevated so it visually sits above the chat input rather than blending into the page background. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… scrapes (#14239) * ♻️ refactor(recent): rewrite queryRecent in Drizzle, exclude web-tool scrapes - Replace raw SQL UNION with Drizzle's typed unionAll (topicArm/documentArm/taskArm) - Hoist filter lists into named constants (SYSTEM_TOPIC_TRIGGERS, TOOL_DOCUMENT_SOURCE_TYPES, TASK_FINAL_STATUSES) for readability - Recent now excludes documents whose sourceType is in ('file', 'web') so web-browsing tool scrapes stop leaking in alongside file uploads - Add RecentModel test coverage * 🐛 fix(recent): widen TOOL_DOCUMENT_SOURCE_TYPES to const tuple for inArray Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com> Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
…3585) * 🐛 fix(utils): preserve JPEG format when compressing uploaded images Images with dimensions > 1920px were always re-encoded as PNG regardless of original format, inflating small JPEGs (100–200 KB) to 1 MB+ because PNG is lossless while JPEG is lossy. Fix: pass file.type to compressImage(), encode JPEG inputs as JPEG at 0.85 quality (not PNG), and derive File MIME type from the data URL instead of hardcoding 'image/png'. PNG and WebP inputs still compress to PNG as before. Fixes #13485 * ✅ test(utils): add tests for JPEG format preservation in compressImage Per @tjx666's request on #13585. Adds explicit coverage for the JPEG format-preservation behaviour: - compressImage with type='image/jpeg' calls toDataURL with quality 0.85 - compressImage with type='image/png' calls toDataURL without a quality arg - compressImage with no type defaults to PNG - compressImageFile preserves JPEG inputs as image/jpeg (regression fence for the previously hardcoded 'image/png' MIME type in dataUrlToFile) - compressImageFile keeps WebP inputs as PNG (documents the fallback) The existing PNG tests are preserved to guard against regression in the lossless path. --------- Co-authored-by: octo-patch <octo-patch@github.com> Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
* 🔥 chore: remove agent_task feature flag and graduate task feature Drop the agent_task / enableAgentTask gate that was guarding the agent task rollout. The feature is now permanently enabled, so all flag checks, disabled-state redirects, and disabled-only fallback UI (SuggestQuestions, CommunityAgents) are removed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(brief): create regular task instead of cron job from template card The "Add task" button on DailyBrief recommendation cards was creating an agentCronJob (scheduled recurring job). Switch to taskService.create via the createTask store action so it creates a one-off inbox task and refreshes the task list, matching user expectation that the click adds a task rather than a schedule. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(task): support schedule fields on task.create The brief recommendation card needs to create a recurring scheduled task in one shot (template carries `cronPattern`). Extend `task.create` to accept `automationMode`, `schedulePattern`, `scheduleTimezone`, and thread them through the service + store action. The model already accepts these via NewTask, and the central schedule-dispatch sweep picks the task up once status is dispatchable. TaskTemplateCard now creates a schedule-mode task with the template's cron pattern and the user's local timezone, restoring the recurring behavior previously provided by AgentCronJob. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 i18n(home): shorten brief.title from "Daily brief" to "Brief" Daily-frequency tasks are no longer the only source feeding the section (scheduled, manual, and on-demand briefs all flow through it now), so the more general label fits better. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(task-list): show skeleton instead of blank while task list loads Both the list view (TaskList) and kanban view (KanbanBoard / KanbanColumn) returned null until isInit, leaving the page empty during the first SWR fetch. Render a TaskItemSkeleton (default + compact variants) to keep the layout stable and signal that data is loading. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(git-status): toggle review panel on diff-stat click Clicking the diff-stat chip used to always open the review panel — if the panel was already showing review, the click was a no-op. Switch to a toggle: clicking again with the review tab active closes the panel, matching the implicit expectation that the chip is the entry/exit control for that view. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✅ test(brief): update TaskTemplateCard test for createTask flow Card now calls useTaskStore.createTask with schedule fields instead of agentCronJobService.create. Replace the agentCronJob service mock with a useTaskStore mock exposing createTask, and assert the schedule-mode payload (automationMode + schedulePattern + scheduleTimezone) on the success path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(brief): jump to task detail after creating from template The success toast asked users to look in the inbox agent for the new scheduled task; navigating directly to the task detail is a clearer landing for what they just confirmed. Drop the toast and route to `/task/<identifier>` once createTask resolves. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…x steps (#14538) * ♻️ refactor(onboarding): extract language and privacy as shared prefix steps Move the language-selection and privacy/telemetry consent out of the classic flow into a shared prefix that runs at /onboarding before branching into either the agent or classic experience. Welcome decoration is merged with language selection on a single screen, dropping the total step count by one. Shared-prefix completion is derived from raw stored settings (s.settings.general.responseLanguage and telemetry), so no new schema fields are introduced and existing consumers that rely on the merged-default telemetry value are unaffected. Branch routing remains automatic (feature flag + isDesktop check) and is now encapsulated in deriveOnboardingBranchPath. Both branch routes guard against entering before the shared prefix is complete. MAX_ONBOARDING_STEPS drops from 5 to 3 (FullName, Interests, ProSettings). * ♻️ refactor(onboarding): use original Telemetry + ResponseLanguage as shared steps Revert the merged welcome+language design. The shared prefix now reuses the original two classic steps as-is: - Step 1: TelemetryStep (welcome decoration + privacy/telemetry consent) - Step 2: ResponseLanguageStep (language selection) Also suppress the mode-switch + skip footer on the bare /onboarding path so it only appears once the user has entered the agent or classic branch. * 🐛 fix(onboarding): persist shared-prefix step in URL to survive locale-triggered remounts Use react-router's useSearchParams to keep the active shared step in the URL (?step=2). Local useState was lost when switching language for the first time because i18next's first-time resource load triggers a remount up the tree; the URL param survives any remount. * 🐛 fix(onboarding): unblock branch redirect when user accepts default telemetry Derive commonStepsCompleted from responseLanguage alone. setSettings strips fields whose value matches DEFAULT_COMMON_SETTINGS, so accepting the default telemetry: true left s.settings.general.telemetry undefined and the derive selector never flipped to true — the redirect to the branch never fired. Step 2 (language) implies step 1 was completed because the flow is sequential, so checking responseLanguage alone is sufficient and robust against the default-strip behavior. * 🐛 fix(onboarding): redirect after step 2 by deriving completion from responseLanguage only setSettings strips fields that match defaultSettings, so writing telemetry=true (the default) never persists to s.settings.general. That made commonStepsCompleted permanently false even after the user finished both steps, blocking the redirect to the branch flow. Drop telemetry from the derive check. Step 1 completion is already tracked via the URL ?step=2 marker; step 2 completion is the only event that needs to flip commonStepsCompleted, signalled by writing responseLanguage (which always differs from the default since DEFAULT_COMMON_SETTINGS has no responseLanguage entry). * 🔨 chore(scripts): add reset-onboarding script for redoing the flow Takes an email, clears users.onboarding, agent_onboarding, full_name, interests and removes responseLanguage + telemetry from user_settings.general so the user re-enters the shared-prefix onboarding from step 1. Usage: pnpm workflow:reset-onboarding <email> bunx tsx scripts/resetOnboarding/index.ts <email> * 🐛 fix(signup): add refs for email and password inputs to improve focus handling Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix(onboarding): skip responseLanguage auto-fill while onboarding is in progress useInitUserState's onSuccess callback auto-fills general.responseLanguage from navigator.language whenever the field is missing. For new users this fired immediately after signup, which made commonStepsCompleted (which derives from responseLanguage being set) flip to true on first load, and CommonOnboardingPage's early-redirect skipped past the shared prefix straight into /onboarding/agent. Gate the auto-fill on onboarding.finishedAt or agentOnboarding.finishedAt being set, so legacy users who finished onboarding without responseLanguage still get the safety-net detection, but in-progress users keep the field undefined until they explicitly choose it on the language step. * 🐛 fix(onboarding): refresh welcome message locale until conversation starts ensureWelcomeMessage previously only created the welcome on first call and skipped on subsequent ones, leaving stale welcomes locked to the locale that was active when the topic was first created. After the shared-prefix refactor users pick their language earlier than they used to, so the welcome that was generated during the auto-detect phase never gets re-translated. Now the welcome content is rewritten in-place to match the current responseLanguage as long as no user reply has been recorded yet (message count <= 1). Once the conversation has started, the welcome is left as part of the chat history. * 🐛 fix(onboarding): update welcome message handling to render client-side and avoid persisting during onboarding Signed-off-by: Innei <tukon479@gmail.com> * Refactor onboarding user profile handling: remove responseLanguage field - Removed responseLanguage from SaveUserQuestionInput and related schemas. - Updated onboarding logic to no longer save or request responseLanguage. - Adjusted related components and services to reflect the removal of responseLanguage. - Enhanced user info handling to include displayName and fullName from OAuth. - Updated tests to align with the new onboarding structure. Signed-off-by: Innei <tukon479@gmail.com> * refactor(onboarding): update locale handling to use i18n's resolved language Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix(onboarding): remap legacy 5-step classic currentStep on shared-prefix mount Mid-flow legacy users with persisted currentStep authored under the old 5-step classic flow (Telemetry, FullName, Interests, Language, ProSettings) would silently skip required profile steps after the renumbering: old step 2 (FullName) rendered Interests, old step 3 (Interests) rendered ProSettings. Apply a one-time remap (2->1, 3->2, >=4->MAX) when Common mounts, gated by isUserStateInit and onboarding.finishedAt absence so it fires only for in-flight legacy users. Idempotent for new-schema values. * refactor(onboarding): implement AGENT_ONBOARDING_ENABLED master switch for onboarding flow Signed-off-by: Innei <tukon479@gmail.com> * refactor(onboarding): standardize AGENT_ONBOARDING_ENABLED naming in tests Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com>
…#14553) * 🐛 fix: display managed skill folders and align delete confirms * 🐛 fix: allow recovery for orphan managed skill bundles * ✅ test: cover agent document group recovery paths * 🐛 fix: render empty state for hidden skill indexes * ✅ test: relax agent signal hydration timeout
* 🐛 fix: recover hetero persistence state across Vercel replicas Three-part fix for multi-replica split-brain on Vercel serverless: 1. Flush accumulated content to DB after every ingest batch so a replica switch mid-accumulation doesn't lose text chunks. 2. Persist `heteroCurrentMsgId` to topic.metadata on every step boundary so new replicas restore the correct currentAssistantMessageId. 3. Restore toolMsgIdByCallId from DB on state creation so tool_results landing on a different replica than their tool_use are still matched. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: add the test fixed * fix: slove the some topic problem --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…code (#14549) * 🐛 fix(security): remove /webapi/proxy and dead URL-manifest plugin code Closes #14530. The /webapi/proxy endpoint was an unauthenticated open HTTP proxy. All client callers were dead except NewAPI provider's browser-side pricing fetch, which now silently falls back to no-pricing since `parsePricingResponse` already handles non-OK responses. Removes: - /webapi/proxy route + API_ENDPOINTS.proxy - toolService.getToolManifest (+ packages/utils/src/toolManifest.ts) - src/features/PluginDevModal/UrlManifestForm.tsx - uploadService.getImageFileByUrlWithCORS - non-MCP branch in customPlugin reinstall (silently returns for legacy URL-manifest plugin data) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🔥 chore(model-runtime): drop /webapi/proxy hop in NewAPI pricing fetch The browser branch routed pricing requests through /webapi/proxy to bypass CORS. Now that the proxy is removed, fetch the upstream pricing endpoint directly — if CORS or any other error blocks it, fall through to the existing null fallback (NewAPI just renders without enriched pricing). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✅ test(model-runtime): drop console.debug assertion in NewAPI pricing fetch The pricing-network-error case used to assert that console.debug was called; with the log removed, just assert the graceful fallback (no pricing on the resulting model). Also tightens an adjacent branch-coverage test that ESLint flagged for a useless assignment. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ✨ Refine agent document skill trees and delete confirms * 🐛 fix: improve receipt card accessibility
…esktop & init checks (#14560) - Only show the skip-and-switch footer when all conditions are met: AGENT_ONBOARDING_ENABLED, not desktop, server config initialized, and runtime enableAgentOnboarding flag is on - Fix typo: swichMode → switchMode - Expand tests with hoisted mocks covering each visibility condition
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9756daba2d
ℹ️ 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".
🚀 Desktop App Build Completed!Version: 📦 Release Download · 📥 Actions Artifacts Build Artifacts
Warning Note: This is a temporary build for testing purposes only. |
…14576) `pnpm init` writes `devEngines.packageManager: { version: "^11.0.9" }` into the generated package.json. corepack@latest rejects ranges in this field with "Invalid package manager specification ... expected a semver version", causing the subsequent `pnpm add pg drizzle-orm` to exit 1. Skip init and write a minimal package.json directly so corepack has nothing to validate.
🐳 Database Docker Build Completed!Version: Pull ImageDownload the Docker image to your local machine: docker pull lobehub/lobehub:pr-release-weekly-20260509-27ec11cImportant This build is for testing and validation purposes. |
🚀 LobeHub Release (20260509)
Release Date: May 9, 2026
Since v2.1.56: 236 merged PRs · 19 contributors
✨ Highlights
docs_*read for inline document grounding; agent documents usable as VFS. (✨ feat(kb-tool): integrate BM25 search and docs_* read for inline documents #14494, ✨ feat(cli,server,database): now agent document can be used as vfs, offer fs compatible output #14222)lobeAgentsmarkdown tag renders agent profile cards inline; clickable card aftercreateAgent. (✨ feat: add lobeAgents markdown tag for inline agent card rendering #14495, ✨ feat(agent-management): render clickable agent card after createAgent #14493)lh hetero execCLI. (♻️ refactor: implement cloud hetero agent exec pipeline (step 3 + step 4) #14486, 🐛 fix: recover hetero persistence state across Vercel replicas #14539, ✨ feat(hetero-agent): server-side aiAgent.heteroIngest / heteroFinish + persistence handler #14444, ✨ feat(cli): addlh hetero execfor standalone heterogeneous agent runs #14431)🏗️ Core Agent & Architecture
Agent Task System
createTasks/runTasks, and chip-based agent-documents inspector. (✨ feat(builtin-tool-task): add Inspector + Render, batch createTasks/runTasks #14403, 💄 fix(builtin-tool-agent-documents): wire Inspectors into registry, switch to chip UI #14404)Agent Signal pipeline
hintIsSkill. (⚡️ perf(server,agent-signal): improved skill intent detection #14409, 🐛 fix(agent-signal,types,prompts,server): should handle skill intent directly when hintIsSkill on, and reroute the source signal, or otherwise it will be hard to have skill triggers #14526)Heterogeneous agent runtime
aiAgent.heteroIngest/heteroFinishhandlers. (✨ feat(hetero-agent): server-side aiAgent.heteroIngest / heteroFinish + persistence handler #14444)lh hetero execCLI — Standalone heterogeneous agent runs from CLI. (✨ feat(cli): addlh hetero execfor standalone heterogeneous agent runs #14431)execAgentTaskkeeps the input box in loading state through the full round-trip. (🐛 fix(gateway): keep input loading on through execAgentTask round-trip #14503)reasoning_contentpreserved in OpenAI-compatible runtime for DeepSeek models. (🐛 fix(model-runtime): preserve reasoning_content for deepseek models in OpenAI-compat layer #14546)Knowledge & inline docs
docs_*read integrated for inline documents. (✨ feat(kb-tool): integrate BM25 search and docs_* read for inline documents #14494)lobeAgentsmarkdown tag — Inline agent cards rendered from a markdown tag. (✨ feat: add lobeAgents markdown tag for inline agent card rendering #14495)createAgent— Mentions and recommendations become clickable. (✨ feat(agent-management): render clickable agent card after createAgent #14493)@pierre/treesfor reusable explorer surfaces. (✨ feat(explorer-tree): add generic ExplorerTree component built on @pierre/trees #14094)Architecture
/api/agentmigrated to Hono — Remaining/api/agentroutes finish their migration. (♻️ refactor(agent): migrate remaining/api/agentroutes to Hono #14478)agentDispatcher.selectRuntimeType— New runtime selection abstraction. (♻️ refactor(chat): introduce agentDispatcher.selectRuntimeType (LOBE-8519) #14428)gray-matter. (🐛 fix(changelog): replace gray-matter with browser-compatible frontmatter parser #14435)📱 Platforms & Integrations
🤖 Models & Providers
grok-4.3for xAI #14382, 💄 style: add grok-4.3 to LobeHub-hosted xAI models #14446)step-image-edit-2support #14329)🖥️ User Experience
Onboarding
Home & navigation
Conversation & chat
Skills, agents, devtools
Desktop & CLI
🔧 Tooling
____builtinsuffix from tool names — (♻️ refactor(local-system,cloud-sandbox): drop "Local" prefix from tool names #14364, ♻️ refactor(context-engine): drop____builtinsuffix from tool names #14289)🔒 Security & Reliability
/webapi/proxyroute and dead URL-manifest plugin code to shrink the SSRF surface. (🐛 fix(security): remove/webapi/proxyand dead URL-manifest plugin code #14549)prompt_cache_keyto OpenAI chat requests for stable cache hits. (🐛 fix: add prompt_cache_key for OpenAI chat requests #14349)onFinishnow fires even when the browser tab is backgrounded mid-SSE stream. (🐛 fix: onFinish never called when browser tab is backgrounded during SSE streaming #14461)auth_failedand recoverableauth_expired. (🐛 fix: handle auth captcha retries #14346, 🐛 fix(gateway): unstick input loading on auth_failed + recoverable auth_expired #14419)switchTopicrace under rapid sidebar clicks. (🐛 fix(topic): drop switchTopic race under rapid sidebar clicks #14115)👥 Contributors
Huge thanks to 18 contributors who shipped 236 merged PRs this cycle.
@hezhijie0327 · @sxjeru · @yueyinqiu · @octo-patch · @hardy-one · @Coooolfan · @CanYuanA · @BillionClaw · @arvinxx · @tjx666 · @Innei · @neko · @AmAzing129 · @rdmclin2 · @lijian · @sudongyuer · @rivertwilight · @cy948
Plus @lobehubbot for i18n and translation maintenance.
Full Changelog: v2.1.56...release/weekly-20260509