Open
Conversation
…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>
…14231) * 🐛 fix(agent): clear stale topic in store when switching agents Switching agents from `/agent/agt_A/tpc_X` to `/agent/agt_B` left the previous topic's messages on screen and made *Start new topic* feel inert. Two fixes: - ChatHydration: replace the `useEffect`-based `useStoreUpdater` with `useLayoutEffect` so the URL→store sync of `activeTopicId` / `activeThreadId` runs before paint. Otherwise Conversation paints one frame against the prior agent's `activeTopicId` and only catches up on the next render. Also handles `null` (rather than `undefined`) so the store actually clears instead of silently retaining the stale id. - AgentPage (desktop + web): drive the topic-popup guard from `useParams().topicId` instead of the store, since URL is the source of truth for which topic to render. Drops the now-unnecessary `Portal` import from the desktop variant. * 🐛 fix(conversation): update context handling and improve thread list visibility logic Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix(topic): update ThreadList to accept topicId prop and improve thread visibility logic Signed-off-by: Innei <tukon479@gmail.com> * ✅ test(topic): align topic item thread list mock * 🐛 fix(agent): show active thread title in conversation header Header `Tags` always read `topicSelectors.currentActiveTopic(s)?.title`, so when navigating into a subtopic (`activeThreadId` set via the `?thread=...` URL sync) the title bar still showed the parent topic's name. Read the matching thread from `s.threadMaps[s.activeTopicId]` when `activeThreadId` is set and fall back to `chat:thread.title` ("Subtopic") for unnamed threads. Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@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>
…eading sentence (#14244) Made-with: Cursor
* fix: bot message callback * fix: add telegram timeout error * Potential fix for pull request finding 'CodeQL / Incomplete multi-character sanitization' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * Potential fix for pull request finding 'CodeQL / Double escaping or unescaping' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
…ierre/trees (#14094) * ✨ feat(explorer-tree): introduce generic ExplorerTree component Scaffold a reusable tree component at `src/features/ExplorerTree/` built on top of `@pierre/trees`. The component exposes a typed `ExplorerTreeNode<TData>[]` input (tree or flat+parentId), path-driven identity hidden behind an adapter, and a minimal imperative handle (startRenaming, focus, select, setExpanded, getSelectedIds). Wired v1 capabilities: - multi-select (default* + onChange), uncontrolled + ref - DnD abstracted as `onMove(MoveEvent)` with canDrag/canDrop gates - declarative right-click menu via `getContextMenuItems` rendered through the library's `renderContextMenu` slot - inline rename via `canRename`/`onCommitRename`/`onRenameError` - trailing row decorations via `getRowDecoration` - built-in icon set driven by file extensions Old `src/features/FileTree/` is tagged `@deprecated` so consumers can migrate gradually (SkillStore, LibraryHierarchy, WorkingSidebar). No consumers migrated in this PR — that is tracked as a follow-up. Design spec: docs/superpowers/specs/2026-04-23-explorer-tree-design.md * 📝 docs: add ResourceManager ExplorerTree refactor design * ♻️ refactor(explorer-tree): use id-based tree contracts * ♻️ refactor(explorer-tree): narrow transitional tree types * ♻️ refactor(explorer-tree): align transitional prop contracts * ♻️ refactor(explorer-tree): remove future-only transitional types * ♻️ refactor(explorer-tree): support controlled id state * 🐛 fix(explorer-tree): suppress controlled sync feedback * 🐛 fix(explorer-tree): reconcile controlled ids on stable paths * ✨ feat(resource): add tree snapshot derivation * ✨ feat(resource): add tree mutation helpers * 🐛 fix(resource): harden tree mutation rollback boundaries * ✨ feat(resource): add tree controller * 🐛 fix(resource): guard tree controller request ordering * ✨ feat(resource): add tree route and bridge modules * 🐛 fix(resource): harden tree route bridge boundaries * ♻️ refactor(explorer-tree): expose row host events * ♻️ refactor(resource): wire hierarchy to ExplorerTree * ♻️ refactor(resource): remove global tree store * 🐛 fix(resource): revalidate tree mutations by source parent * 🐛 fix(spa): prebundle explorer tree dependency * ♻️ refactor(sharedRendererConfig): remove unused dependencies '@pierre/trees' and '@pierre/trees/react' Signed-off-by: Innei <tukon479@gmail.com> * ♻️ revert(resource): remove business integration, keep ExplorerTree component only Revert all ResourceManager business integration while preserving the generic ExplorerTree component implementation: - Restore ResourceManager component files to canary state - Restore src/store/tree/ (deleted by integration commit) - Remove src/features/ResourceManager/tree/ (controller, mutations, bridge) - Keep src/features/ExplorerTree/ (generic component) - Keep @pierre/trees dependency in package.json * ✨ feat(agent): integrate ExplorerTree into agent documents section - Replace flat document list with ExplorerTree for 'documents' filter tab - Convert flat AgentDocument[] to tree nodes via parentId/fileType - Add tree node click handler (navigate/open) and context menu (delete) - Fix height chain: ResourcesSection flex:1 -> AgentDocumentsGroup -> ExplorerTree - Style ExplorerTree via --trees-*-override CSS vars (transparent bg, relaxed density, theme tokens) * ♻️ refactor(resource-manager): remove outdated ExplorerTree design document Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat(agent-documents): wire context menu and DnD via base-ui imperative API - Replace nested antd Menu surface with @lobehub/ui showContextMenu, capturing right-click on the tree host directly so menu actions (rename, create, delete) survive base-ui focus restoration - Fix DnD root drop by routing canDrop through directoryPath instead of hoveredPath, so dragging a nested file onto empty root no longer treats the hovered file row as the target zone * ♻️ refactor(DocumentExplorerToolbar): adjust padding styles for better layout Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat(useDocumentTreeOps): integrate confirmModal for delete confirmation Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix(ExplorerTree): cast through unknown to satisfy antd MenuItem types * ✨ feat(AgentDocumentsGroup.test): add mock for DocumentExplorerTree and update tests for document count Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com>
feat: add agent hono routes
…14506) * ✨ feat: add collapse toggle to onboarding mode switch toolbar The dev-mode actions pill at the bottom-right of the onboarding page covered the operation area below it. Add a chevron toggle so users can collapse the pill down to a single icon button. Collapsed state is persisted in localStorage so it survives reloads. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat: make name and avatar editable in onboarding intervention card Lets the user override the agent's proposed identity in-place before approving — pick a different emoji from the avatar picker, type into the name field, and the edits flow through registerBeforeApprove -> onArgsChange so the actual save uses the user's values. Other changes: - Title is now derived from the live edit state, so adding a missing field flips the wording from "I'll update my name" to "I'll update my name and avatar" without staleness - Subtitle hint ("如果不满意,可以直接修改名字或头像") tells the user the card is interactive - Test covers the edit-flush path: edits to name + emoji are observed via onArgsChange when the framework triggers the beforeApprove flush Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style: redesign intervention approval card as codex-style options Drops the inline approve / reject button row in favor of a numbered two-option layout with a single Submit at the bottom-right, mirroring Codex's approval picker. The reject row's content is the reason input itself (placeholder doubles as the row label) so users can type a follow-up instruction in place; reason flows through to the existing rejectAndContinueToolCall(messageId, reason) action. Behavior: - Default selection is approve; arrow keys (↑/↓) and 1/2 switch options - Enter submits when no input is focused; reject input has its own Enter / ↑ handlers so typing doesn't hijack the picker - Window-level shortcuts skip while any input/textarea/contenteditable is focused, so the main chat composer is never affected - approvalMode='allow-list' adds a "Don't ask again for similar actions" checkbox under option 1, replacing the old split-button dropdown Also tighten the onboarding intervention editHint copy from "如果不满意,可以直接修改名字或头像" to "你可以直接在下方修改名字或头像" (positive framing instead of conditional). i18n changes (default + en-US + zh-CN): - Add optionApprove, rememberSimilar, submit - Repurpose rejectReasonPlaceholder as the inline reject row's placeholder - Drop now-unused approveAndRemember, approveOnce, rejectAndContinue, rejectTitle keys Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style: tighten PickAgents card layout - Move avatar and title into a single row (cardHeader) so the agent template title sits next to the avatar instead of below it; description stays as a multi-line block beneath - Switch card border from colorBorderSecondary to colorFillSecondary so the card outline is visible when sitting on the elevated picker panel - Mirror the row layout in the loading Skeleton so the shimmer matches Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(agent-marketplace): add Inspector for showAgentMarketplace and submitAgentPick The marketplace tool was previously falling back to the generic raw-args "等 N 个参数" header. Add per-API Inspectors: - showAgentMarketplace: title + up to 3 localized category chips (sourced from existing CATEGORY_LABEL_I18N_KEYS in tool namespace); overflow shown as +N - submitAgentPick: title + selected agent count Wire AgentMarketplaceInspectors into builtin-tools/src/inspectors.ts under AgentMarketplaceManifest.identifier and export from the package's agentMarketplace/client surface. i18n adds (default + en-US + zh-CN tool namespace): - agentMarketplace.inspector.pickCount plurals - agentMarketplace.inspector.moreCategories plurals Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style: rename showAgentMarketplace label to "Assemble agent team" The agent narrates intent ("组建 Agent 团队" / "Assemble agent team") rather than describing a UI surface ("打开助手市场" / "Open agent marketplace"), which reads more naturally in the inspector header during onboarding. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style: hide chat/page view switcher in agent conversation header Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(agent-marketplace): render picked agent cards from pluginState Adds a SubmitAgentPick Render that shows a grid of agent cards (avatar + title + description + "already in library" tag) instead of the raw text content the LLM consumes. Also wires the framework so custom-interaction handlers can return structured pluginState alongside toolResultContent. Framework changes: - submitToolInteraction(options) now accepts a pluginState field. After writing toolResultContent, the chat store calls optimisticUpdatePluginState so the message's structured state is available to render components (matching how server-executed builtin tools persist state) - Cloud-side wrapper in Conversation/store/slices/tool/action.ts forwards the new field - customInteractionHandlers.ts SubmitToolInteractionOptions adds pluginState; handleAgentMarketplaceSubmit returns the install summaries via pluginState (same shape that built the LLM-facing text) Marketplace changes: - InstallMarketplaceAgentSummary gains an avatar field; the install helper threads marketAgent.avatar through - New Render/SubmitAgentPick reads pluginState.summaries to draw a responsive card grid (already-in-library entries dimmed + tagged) - Wire AgentMarketplaceRenders through the package's agentMarketplace/client surface and register under AgentMarketplaceManifest.identifier in builtin-tools/src/renders.ts Workflow display labels (collapsed grouped tool row): - Add showAgentMarketplace ("Assembled agent team" / "组建了 Agent 团队") and submitAgentPick ("Picked agents" / "选好了助手") to TOOL_API_DISPLAY_NAMES so the collapsed group no longer falls back to "Show Agent Marketplace" / "Submit Agent Pick" via toTitleCase i18n adds (default + en-US + zh-CN): - tool.agentMarketplace.render.alreadyInLibrary plurals + alreadyInLibraryTag - chat.workflow.toolDisplayName.{showAgentMarketplace,submitAgentPick} Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(web-onboarding): add UpdateDocument render with hunk diff Replace the raw "Updated persona document (id). Applied N hunk(s)." text with a structured per-hunk diff view rendered from args.hunks (no executor state changes — args already carry the patches). For each hunk render a mode label + line range chip and paint the affected text: - replace: removed (red border) → added (green border) - delete: removed only - insertAt: green block + L<line> chip - replaceLines: green block + line range chip - deleteLines: line range chip only (no body) The total hunk count piggy-backs on the first hunk's label row instead of getting its own header (the inspector header chip already shows total + doc type, so a separate render-side header would be redundant). i18n adds builtins.lobe-web-onboarding.updateDocument.hunkMode.{replace, delete,deleteLines,insertAt,replaceLines} across default + en-US + zh-CN. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tainer padding (#14533) 💄 fix(chat-input): fix MentionMenu scroll area clipping with negative margin padding trick
…p 4) (#14486) * refactor: add the cloud hetero execAgent Runtime way * ✨ feat: support session resume for heterogeneous agents (Claude Code / Codex) - Expose `sessionId` getter on `SpawnAgentHandle` (read from `AgentStreamPipeline`) - Pass `sessionId` to `IngestSink.finish()` so CLI reports it via `heteroFinish` - Server stores `heteroSessionId` in topic metadata after each turn - Server reads and passes `resumeSessionId` as `--resume` on subsequent turns - Remove debug `console.log` statements from aiAgent service and sandboxRunner Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: slove some bugs * fix: add the is dev back * 🐛 fix: add async to handleAgentRunRequest in gatewayConnectionSrv Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
) Rewrite the onboarding marketplace install pipeline from a serial per-agent loop to a parallel pipeline anchored on a batched fork call. Multi-select in the picker now finishes in roughly four parallel rounds instead of ~5N sequential round-trips. - forkAgent tRPC now takes { items: AgentForkBatchInput[] } and returns per-item AgentForkBatchResult (discriminated union, best-effort: a single failure does not abort the batch). The upstream market endpoint stays per-id, fanned out via Promise.all on the server. - installMarketplaceAgents fans out dedupe, detail fetch, and createAgent steps via Promise.all/allSettled and consolidates into one batched fork. - ForkAndChat (community single-fork action) wraps its call as a 1-item batch and unwraps the per-item result.
* 💄 style: fill input on follow-up chip click instead of sending Mirrors the NameSuggestions pattern so users can edit a suggested follow-up before sending, matching onboarding interaction conventions. * ✅ test: update FollowUpChips click test for input-fill behavior Mock updateInputMessage + editor (setDocument/focus) instead of sendMessage and assert the new fill-input flow. * 💄 style: move branching action into the message "..." menu Surface "branching" inside the dropdown menu (right after copy) for assistant, assistantGroup, and user messages, instead of as an inline toolbar icon gated behind dev mode. Drops the dev-mode bar override and renames the now-only ACP-related selector binding to isHeteroAgent.
…nto decision agent (#14534) Emit agent document tool outcome events from client-triggered agent document tools with tool attribution so hinted skill documents can be observed by Agent Signal. Hydrate client runtime completion back to the completed assistant message for pre-created assistant turns, allowing same-turn hinted document receipts to match the originating user message. Harden agent document snapshot reads by falling back to markdown content when stale editor data cannot be projected for decision evidence.
…in OpenAI-compat layer (#14546) DeepSeek thinking-mode (deepseek-reasoner / deepseek-v4-*) rejects follow-up turns when assistant history messages omit reasoning_content. Until now this was only enforced in the dedicated DeepSeek runtime's handlePayload; users routing deepseek model ids through any other OpenAI-compatible runtime hit a 400 with "The reasoning_content in the thinking mode must be passed back to the API." Move the safety net into convertOpenAIMessages so any OpenAI-compatible call with a deepseek-named model derives reasoning_content from reasoning.content and forces an empty placeholder for thinking-eligible models. Fixes LOBE-8290 Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.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
…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.
# 🚀 LobeHub Release (20260509) **Release Date:** May 9, 2026 **Since v2.1.56:** 236 merged PRs · 19 contributors > Agent Task System reaches general availability, the Agent Signal pipeline runs nightly self-review with skill-aware policies, the heterogeneous-agent runtime crosses replica boundaries, inline documents become a first-class context source, and bot platforms expand across Messager, Line, and Telegram. --- ## ✨ Highlights - **Agent Task System (GA)** — End-to-end task execution platform: templates, tracking, comment tools, parent reassignment, scheduled cron, and dependency-ordered batch runs. (#14540, #14515, #14517, #14272, #14246, #14418, #14403, #14488) - **Agent Signal nightly self-review** — Wired self-review loop with prompt + DB support, exponential-backoff retry on receipt listing, skill-aware policy, and improved skill-intent detection. (#14543, #14542, #14281, #14409, #14526, #14437) - **Inline documents in KB tool** — BM25 search and `docs_*` read for inline document grounding; agent documents usable as VFS. (#14494, #14222) - **Inline agent cards in chat** — `lobeAgents` markdown tag renders agent profile cards inline; clickable card after `createAgent`. (#14495, #14493) - **Heterogeneous agent runtime** — Cloud hetero exec pipeline steps 3+4 land, persistence recovers across Vercel replicas, server-side ingest/finish handler, and `lh hetero exec` CLI. (#14486, #14539, #14444, #14431) - **Bot platforms expand** — Messager, Line, DM pair policy, and messenger DB tables; Telegram API path restored. (#14442, #14207, #14211, #14496, #14519) - **Visual analysis tool** — New visual understanding tool, with trigger tracking and flattened schema. (#14378, #14399, #14550) - **DeepSeek V4 Pro as OSS default** — OSS deployments ship with DeepSeek V4 Pro by default; DeepSeek Anthropic runtime supported. (#14555, #14312) --- ## 🏗️ Core Agent & Architecture ### Agent Task System - **Task System GA** — End-to-end execution platform now available. (#14540) - **Templates, comments, reparenting** — Template tracking, comment tools, and parent reassignment. (#14515, #14517, #14488) - **Cron + dependency-ordered runs** — Scheduled status with cron editor and dependency-ordered subtask batches. (#14246, #14418, #14272) - **Inspector + chip UI + batch tasks** — Task Inspector/Render registry, batch `createTasks`/`runTasks`, and chip-based agent-documents inspector. (#14403, #14404) - **Recommend templates regardless of brief count** — Recommendations no longer suppressed when briefs are sparse. (#14508) - **Scheduling resilience** — Manual run no longer eats next scheduled tick; recurring tasks survive brief resolution. (#14304, #14348) - **Brief synthesis** — Auto-synthesize topic briefs; brief actions revamp; mute resolved-brief icon on home. (#14324, #14228, #14452) - **Task list & detail polish** — Topic operation ID exposed; task drawer Gateway reconnect. (#14282) ### Agent Signal pipeline - **Nightly self-review wired** — Prompt + DB support for the self-review loop. (#14543) - **Self-review activities push to briefs** — Activities during nightly self-reflection now create briefs. (#14437) - **Skill management policy** — New policy for Skill management running inside Agent Signal. (#14281) - **Skill intent detection & routing** — Improved detection plus direct intent handling when `hintIsSkill`. (#14409, #14526) - **Document tool outcome rendering** — Decision view restores missing document tool outcomes. (#14534) - **Exponential backoff retry** — Listing signal receipts retries with jittered backoff. (#14542) - **Easier-to-use signals** — Structural simplification + recent-activities surface for receipts. (#14290, #14326, #14407) ### Heterogeneous agent runtime - **Cloud hetero exec pipeline (steps 3 + 4)** — Refactor lands the next two stages of the cloud hetero agent execution pipeline. (#14486) - **Persistence recovery on Vercel** — Hetero state recovered across replica boundaries. (#14539) - **Server-side ingest/finish + persistence** — `aiAgent.heteroIngest` / `heteroFinish` handlers. (#14444) - **`lh hetero exec` CLI** — Standalone heterogeneous agent runs from CLI. (#14431) - **Gateway round-trip loading** — `execAgentTask` keeps the input box in loading state through the full round-trip. (#14503) - **Provider SDK type routing** — Provider routing now respects SDK type. (#14520) - **DeepSeek reasoning preserved** — `reasoning_content` preserved in OpenAI-compatible runtime for DeepSeek models. (#14546) ### Knowledge & inline docs - **KB tool BM25 + docs read** — BM25 search and `docs_*` read integrated for inline documents. (#14494) - **Agent documents as VFS** — FS-compatible output for agent documents. (#14222) - **`lobeAgents` markdown tag** — Inline agent cards rendered from a markdown tag. (#14495) - **Clickable agent card after `createAgent`** — Mentions and recommendations become clickable. (#14493) - **ExplorerTree** — Generic tree component built on `@pierre/trees` for reusable explorer surfaces. (#14094) - **Local file mention snapshots** — Mentions can now snapshot local files. (#14278) ### Architecture - **Agent Hono routes** — New agent routes added on Hono. (#14535) - **`/api/agent` migrated to Hono** — Remaining `/api/agent` routes finish their migration. (#14478) - **Agent marketplace merged into web-onboarding** — Reduces package fragmentation. (#14514) - **Producer pipeline extracted** — Shared package for the producer pipeline. (#14425) - **`agentDispatcher.selectRuntimeType`** — New runtime selection abstraction. (#14428) - **pnpm v11 migration** — Workspace consolidated. (#14316) - **Browser-compatible frontmatter parser** — Replaces `gray-matter`. (#14435) --- ## 📱 Platforms & Integrations - **Messager support** — New messager package wired into the chat surface. (#14442) - **Messenger DB tables** — IM bot integration gains its persistence layer. (#14496) - **Line bot** — Initial Line support and downstream optimization. (#14207, #14448) - **DM pair policy** — Group/DM pair-based delivery. (#14211) - **Telegram API restored** — Missing Telegram API path reconnected. (#14519) - **xAI Responses tools stabilized** — Plus unsupported parameter handling. (#14462, #14445) - **Volcengine websearch via ResponseAPI** — Built-in websearch for Volcengine. (#14216) --- ## 🤖 Models & Providers - **DeepSeek V4 Pro default for OSS** — OSS distribution defaults to DeepSeek V4 Pro. (#14555) - **DeepSeek Anthropic runtime** — Anthropic-shape runtime support for DeepSeek. (#14312) - **GPT-5.5 / GPT-5.5 Pro** — New OpenAI tier. (#14142) - **Grok 4.20 / Grok 4.3 / LobeHub-hosted Grok 4.3** — (#14253, #14382, #14446) - **Gemma 4 + provider settings normalization** — (#13313) - **gpt-image-2 + step-image-edit-2** — (#14253, #14329) - **Model bank refresh + original-pricing display** — Batch model updates and pricing surfaces. (#14070, #14391) - **Hunyuan migrated to TokenHub for Hy3 Preview** — (#14108) - **Reject lobehub model ids no longer in the bank** — (#14261) - **Hide runtime-only aliases** — Runtime-only model aliases no longer leak into the model picker. (#14552) --- ## 🖥️ User Experience ### Onboarding - **Shared prefix steps** — Language and privacy extracted as shared prefix steps. (#14538) - **Identity intervention card simplified** — Plus tool result renders cleanup. (#14505, #14506) - **Welcome polish + web-onboarding tool UI** — (#14475) - **Templates fetched from market API** — (#14286) - **Virtual model id for default onboarding model** — (#14311) - **Skip / mode-switch footer behind feature flag** — Footer guarded for desktop and web initialization. (#14560) ### Home & navigation - **Home recents performance** — Recents refresh periodically and inline task status; brief and task-template fetch overhead trimmed. (#14518, #14516) - **Home refactor + skill-connect recommendations** — Restructured home with skill-connect recommendation system. (#14266, #14214) - **Tasks in agent sidebar** — Tasks moved from welcome card into the sidebar list. (#14500) - **Sidebar collapse persists** — Home sidebar collapse state stored. (#14473) - **Agent-specific topic grouping** — Plus improved empty state and agent identity in topic search. (#14225) - **MentionMenu scroll fix** — Mention menu no longer clips inside chat input. (#14533) ### Conversation & chat - **Follow-up chips fill input** — Clicking a follow-up chip now fills the input instead of sending immediately. (#14536) - **Quick-reply chips below assistant messages** — (#14350) - **Inline single-tool assistant group + leading sentence promotion** — (#14244) - **Assistant-group rendering** — Per-segment content overrides flow into MessageContent. (#14504) - **Tool call timer fix** — Timer no longer resets when tool calls collapse or expand. (#14513) - **Streaming re-render reduction** — Reference stabilization and self-subscribing components. (#14470) - **Topic chat drawer feedback input** — (#14392) ### Skills, agents, devtools - **Managed skill folders** — Agent view displays managed skill folders and aligns delete confirmations. (#14553) - **Review tab + bulk git diffs** — New Review tab with bulk diffs; gating uses effective working directory. (#14334, #14512) - **Devtools gallery rebuild** — Plus Review polish, queue-tray images. (#14423) - **Agent mock devtools** — Playback & fixture viewer. (#14436) ### Desktop & CLI - **App tray visibility setting** — (#14463) - **Notification settings in desktop** — (#14491) - **Multimodal input across CLI / shared spawn / desktop** — (#14433) - **CLI bot + userId guide** — (#14258) --- ## 🔧 Tooling - **Visual analysis tool** — New visual understanding tool with flattened schema. (#14378, #14550) - **GitHub marketplace tool UI** — (#14420) - **Drop "Local" prefix and `____builtin` suffix from tool names** — (#14364, #14289) - **Sanitize provider tool names** — Avoids invalid characters from external providers. (#14510) - **Generation moderation context** — Moderation context passed through the generation pipeline. (#14541) - **Visual analysis trigger tracking** — (#14399) - **Claude thinking signature sanitization** — History signatures sanitized when replaying Claude conversations. (#14499) - **Responses input media sanitization** — Assistant media sanitized in Responses input. (#14497) --- ## 🔒 Security & Reliability - **Security:** Removed the `/webapi/proxy` route and dead URL-manifest plugin code to shrink the SSRF surface. (#14549) - **Security:** Sessions revoked after password reset. (#14424) - **Reliability:** Added `prompt_cache_key` to OpenAI chat requests for stable cache hits. (#14349) - **Reliability:** `onFinish` now fires even when the browser tab is backgrounded mid-SSE stream. (#14461) - **Reliability:** Better-auth session refetch preserves user fields rather than overwriting them. (#14531) - **Reliability:** User-memory queries sanitize backticks; user-memory errors now explicitly injected so failures stay visible. (#14524, #14525) - **Reliability:** Auth captcha retries handled; input loading unsticks on `auth_failed` and recoverable `auth_expired`. (#14346, #14419) - **Reliability:** Trace snapshot finalized on error path. (#14440) - **Reliability:** Drop `switchTopic` race under rapid sidebar clicks. (#14115) - **Reliability:** PDF chunking logic fixed to prevent vectorization failure. (#14327) - **Performance:** Marketplace fork uses a batched API for parallel installs. (#14537) - **Performance:** Review tab open latency cut ~9× on large dirty trees. (#14338) --- ## 👥 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
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 : )