β¨ feat(agent): add floating chat panel and workspace improvements#13887
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codecov Reportβ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #13887 +/- ##
==========================================
+ Coverage 67.47% 67.52% +0.05%
==========================================
Files 2160 2192 +32
Lines 186030 188724 +2694
Branches 19251 22409 +3158
==========================================
+ Hits 125523 127445 +1922
- Misses 60382 61151 +769
- Partials 125 128 +3
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d264951e79
βΉοΈ 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".
| const toggleConfig = useGlobalStore((s) => s.toggleMobileTopic); | ||
| const switchTopic = useChatStore((s) => s.switchTopic); | ||
| const routeAgentId = params.aid ?? activeAgentId; | ||
| const routeTopicId = params.topicId ?? activeTopicId ?? undefined; |
There was a problem hiding this comment.
Detect agent sub-routes from root path
Deriving routeTopicId from activeTopicId causes non-topic pages like /agent/:aid/profile to be treated as if they were in the current topic context when a topic is cached. That makes isInAgentSubRoute() return false, so navigateToTopic skips router.push(...) and only mutates store state, leaving users stuck on profile/settings instead of returning to chat after clicking a topic in the sidebar.
Useful? React with πΒ / π.
d264951 to
343ceaf
Compare
β¦d routing and styling - Updated ChatBody to maintain scroll ownership while hiding overflow. - Refactored TopicItem to correctly highlight active topics based on routing context. - Added tests for TopicItem to ensure correct active state behavior. - Introduced static styles for FloatingChatPanel to manage layout overflow. Signed-off-by: Innei <tukon479@gmail.com>
1c03bc9 to
c1e2259
Compare
β¦Menu, remove NotebookButton
β¦iews - Introduced a new ViewSwitcher component to toggle between chat, page, and task views in the conversation header. - Updated English and Chinese localization files to include new labels for the view switcher options. - Refactored the conversation header to integrate the ViewSwitcher, enhancing the user interface for better navigation. Signed-off-by: Innei <tukon479@gmail.com>
β¦kspace # Conflicts: # src/routes/(main)/agent/_layout/Sidebar/Topic/List/Item/index.tsx # src/routes/(main)/agent/_layout/Sidebar/Topic/List/Item/useDropdownMenu.tsx # src/routes/(main)/agent/features/Conversation/Header/index.tsx
β¦el to use FloatingSheet component - Updated the @lobehub/ui dependency in package.json to version 5.9.1. - Refactored FloatingChatPanel to utilize the new FloatingSheet component, enhancing its layout and state management. - Introduced a new ChatLayout component for better organization of chat-related UI elements. - Adjusted routing configuration to incorporate the new ChatLayout for agent chat pages. Signed-off-by: Innei <tukon479@gmail.com>
- Introduced TopicCanvas component to serve as a document canvas for topics, integrating an editor and title section. - Added TitleSection component for managing topic titles and emojis, enhancing user interaction with a dedicated UI. - Updated FloatingChatPanel to accommodate the new TopicCanvas, ensuring a cohesive layout in the topic page. - Enhanced tests to verify the integration of TopicCanvas within the topic page route. Signed-off-by: Innei <tukon479@gmail.com>
172ea96 to
3dc3b4d
Compare
β¦ges and improve test accuracy Signed-off-by: Innei <tukon479@gmail.com>
β¦kspace # Conflicts: # src/spa/router/desktopRouter.config.tsx
β¦kspace # Conflicts: # src/features/Conversation/utils/markdown.test.ts
β¦kspace # Conflicts: # src/features/AgentTasks/AgentTaskList/AgentTasksPage.tsx # src/routes/(main)/agent/_layout/Sidebar/Header/Nav.tsx
) * π₯ feat(tasks): drop per-agent /agent/:aid/tasks routes again PR #13887 reintroduced the per-agent Tasks surface (sidebar entry, route files, agentId-scoped breadcrumb/list/board, /agent/:aid/tasks/:taskId navigation) that #14109 had removed in favor of unified /tasks and /task/:id. Restore the unified-only model: drop the agent sidebar Tasks nav item, delete the agent-scoped route files, strip agent-tasks blocks from both desktopRouter configs, and revert the agentId props and per-agent navigate paths in AgentTasksPage / KanbanBoard / Breadcrumb / TaskDetailPage. Preserves #14137's canceled kanban column. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): redirect any agent sub-route before opening new topic handleNewTopic only checked /profile and /channel, so on /agent/:aid/page, /agent/:aid/cron/:cronId or other sub-routes the redirect was skipped and mutate() opened a new topic on a non-chat screen β looking ineffective to the user. Match useTopicNavigation's pattern: derive an agent base path from params (with topicId when present) and treat anything longer than that as a sub-route, so adding new sub-routes never re-introduces this gap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): always push agent chat route before opening new topic The previous fix conditioned the redirect on isInAgentSubRoute, which left the URL untouched on /agent/:aid/:topicId β opening a new topic while the URL still pointed at the previous one. Drop the conditional and always push /agent/:aid: it covers every sub-route (/profile, /channel, /page, /cron/:cronId, β¦) and strips any stale :topicId so the URL matches the freshly opened topic. Restores Nav.test.tsx. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦3887) * β¨ feat(FloatingChatPanel): add single-instance mount guard * β¨ feat(FloatingChatPanel): add inner ChatBody layout * β¨ feat(FloatingChatPanel): add reusable floating conversation panel * β test(FloatingChatPanel): add props wiring smoke tests * Refactor agent topic and page routes * Restore topic page routing for floating chat panel * β¨ feat(FloatingChatPanel): enhance ChatBody and TopicItem for improved routing and styling - Updated ChatBody to maintain scroll ownership while hiding overflow. - Refactored TopicItem to correctly highlight active topics based on routing context. - Added tests for TopicItem to ensure correct active state behavior. - Introduced static styles for FloatingChatPanel to manage layout overflow. Signed-off-by: Innei <tukon479@gmail.com> * chore: help to merge & rebase * chore: align merge with canary β drop pkg.pr.new ui, adopt canary useMenu, remove NotebookButton * β¨ feat: add ViewSwitcher component and update localization for chat views - Introduced a new ViewSwitcher component to toggle between chat, page, and task views in the conversation header. - Updated English and Chinese localization files to include new labels for the view switcher options. - Refactored the conversation header to integrate the ViewSwitcher, enhancing the user interface for better navigation. Signed-off-by: Innei <tukon479@gmail.com> * fix: update @lobehub/ui to version 5.9.1 and refactor FloatingChatPanel to use FloatingSheet component - Updated the @lobehub/ui dependency in package.json to version 5.9.1. - Refactored FloatingChatPanel to utilize the new FloatingSheet component, enhancing its layout and state management. - Introduced a new ChatLayout component for better organization of chat-related UI elements. - Adjusted routing configuration to incorporate the new ChatLayout for agent chat pages. Signed-off-by: Innei <tukon479@gmail.com> * feat: add TopicCanvas and TitleSection components for topic management - Introduced TopicCanvas component to serve as a document canvas for topics, integrating an editor and title section. - Added TitleSection component for managing topic titles and emojis, enhancing user interaction with a dedicated UI. - Updated FloatingChatPanel to accommodate the new TopicCanvas, ensuring a cohesive layout in the topic page. - Enhanced tests to verify the integration of TopicCanvas within the topic page route. Signed-off-by: Innei <tukon479@gmail.com> * β¨ feat(agent-page): bind documentId to URL and introduce HeaderSlot - Add nested /agent/:aid/:topicId/page/:docId route with PageRedirect for bare /page - Introduce useAutoCreateTopicDocument with module-level inflight de-dup - Lift Portal + WorkingSidebar to (chat) layout; keep ChatHeader in left column - Sidebar document clicks on page route navigate to /page/:docId instead of opening Portal - Add HeaderSlot (context + createPortal) as a reusable header injection point - Mount AutoSaveHint via HeaderSlot; register Files hotkey scope in TopicCanvas so Cmd+S triggers manual save - Sync desktopRouter.config.tsx and desktopRouter.config.desktop.tsx - Extend RecentlyViewed plugin to round-trip optional docId segment * Use topic titles for auto-created page documents * Add page-agent init gating and runtime diagnostics * Support current-topic agent documents * Implement Active Topic Document and Disabled Tool Call Filtering - Introduced ActiveTopicDocumentContextInjector to inject context for active topic documents into user messages. - Added DisabledToolCallFilter to remove historical tool calls for disabled tools in the current runtime scope. - Updated MessagesEngine to utilize the new context injectors and filters. - Enhanced tests to verify the correct injection of active topic document context and filtering of disabled tool calls. This update improves the handling of document editing contexts and tool management in the conversation flow. Signed-off-by: Innei <tukon479@gmail.com> * feat: enhance agent document management with LiteXML operations - Updated API names for clarity, changing 'patchDocument' to 'modifyNodes'. - Introduced LiteXML operation schema for document modifications. - Implemented new mutation for modifying document nodes via LiteXML. - Enhanced document retrieval methods to support format options (XML, Markdown, Both). - Added support for editor data snapshots and normalization of diff nodes. - Improved document history management to handle editor data with diff nodes. - Created tests for new features and ensured existing functionality remains intact. Signed-off-by: Innei <tukon479@gmail.com> * π fix: apply agent document xml edits directly * Refine document cache invalidation and editor hydration * π fix: stabilize agent topic hydration * fix: update @lobehub/editor dependency version and clean up test mocks Signed-off-by: Innei <tukon479@gmail.com> * Potential fix for pull request finding 'Useless assignment to local variable' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * π fix(document): preserve pending diff nodes through save path Skip normalizeEditorDataDiffNodes on every autosave so diff nodes awaiting user review survive persistence. Normalization now runs only on explicit Accept/Reject via DiffAllToolbar. Also flip headless litexml ops to delay:true to match the new review flow. * π fix(agent): detect agent sub-route from URL params not cached topic isInAgentSubRoute used routeTopicId (with activeTopicId fallback) as its base path. On /agent/:aid/profile with a cached activeTopicId, the base became /agent/:aid/:cachedTopicId which pathname cannot startsWith, so sub-route detection returned false and sidebar topic clicks only called switchTopic without routing back to chat β users stayed stuck on profile. Derive the sub-route base from params.topicId directly so stale store state cannot mask the check. routeTopicId export keeps the fallback for sidebar highlighting. * π fix(page): repair topic page document recovery * π fix(page-agent): block tool calls when page editor is not mounted scope is topic-bound not route-bound, so navigating from /agent/.../Page to /agent/... keeps scope==='page' and PageAgentIdentifier stayed in the injected plugin list. The LLM could still call initPage / modifyNodes / etc. against a stale editor reference, returning misleading success (e.g. nodeCount=0). Two layers of guard: - PageAgentExecutor wraps `invoke` and returns a structured PAGE_EDITOR_NOT_MOUNTED / kind: 'replan' result when the runtime editor is not mounted, pointing the LLM at lobe-agent-documents. - streamingExecutor drops PageAgentIdentifier from the tool set via the new `composeEnabledTools` pipeline when scope==='page' and the page-agent runtime is not ready. Also extract the tool-set composition (inject merge + runtime drops) out of the ~320-line internal_createAgentState into `mecha/toolSetComposer`, with unit tests. * π fix(chat): unify message stream for /agent/:topicId and /page/:docId Before this change a page-scoped conversation (FloatingChatPanel with scope='page' in the /Page route) partitioned the client message store by scope, so /agent/:topicId and /agent/:topicId/page/:docId each built their own messagesMap slot and SWR cache β but the TRPC getMessages endpoint ignores scope and returned the same messages for both, producing duplicate fetches and a visible message-history split between the two surfaces. Fixes by keeping scope='page' as a capability/surfacing marker only: - messageMapKey: collapse 'page' to the default scope early in toMessageMapContext, so threadId/groupId still win and only the main/page pair actually unifies. - useFetchMessages: build the SWR key from identity fields (agentId, groupId, threadId, topicId) instead of the full ConversationContext, so scope no longer partitions the cache. agentConfigResolver/streamingExecutor/composeEnabledTools still read scope='page' from operation.context for PageAgent injection and initialContext.pageEditor wiring β the capability layer is unchanged. Also fix two pre-existing test regressions surfaced by re-running the impacted suites: - streamingExecutor page-editor initialContext test now mocks pageAgentRuntime.isReady() (required since the PageAgent editor-ready guard landed). - FloatingChatPanel default shell props test updated to match the [180,320,520,800] snap points introduced in 62dc91e. * β»οΈ refactor(FloatingChatPanel): read main slot without changing scope Revert the global messageMapKey/SWR-key changes from b650cdc β the global collapse over-reached and coupled message routing to scope in ways other surfaces don't want. Instead, specialize only the place that actually has the dual-role problem. `scope` should be a capability marker (PageAgent tool + pageEditor initialContext injection), not a message-list partition. Floating panel on /agent/:topicId/page is the only caller that sets scope='page', and its message list should mirror /agent/:topicId β the surfaces share a topic. Local collapse in FloatingChatPanel: compute chatKey with `scope === 'page' ? 'main' : scope`, so messagesMap is read from the main slot. The downstream ConversationContext keeps scope='page' for the capability layer; only the slot lookup is specialized. Kept from b650cdc (unrelated to the revert): - streamingExecutor test mocks pageAgentRuntime.isReady() β required by the PageAgent editor-ready guard in 01ef7bc. - FloatingChatPanel snap-points test matches [180,320,520,800] from 62dc91e. * π fix(FloatingChatPanel): simplify chat key computation for message retrieval Signed-off-by: Innei <tukon479@gmail.com> * π fix(index.desktop.test): update LocationProbe to reflect route changes and improve test accuracy Signed-off-by: Innei <tukon479@gmail.com> * Constrain agent header title under centered switcher * π Fix conversation header view switcher layout * π Fix agent topic path links and cmdk context * π fix(test): align document history fixtures and layout ui mock * π fix(e2e): support dialog-based topic rename * β»οΈ refactor(debug): use scoped debuggers for PR logging --------- Signed-off-by: Innei <tukon479@gmail.com> Co-authored-by: Neko Ayaka <neko@ayaka.moe> Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
) * π₯ feat(tasks): drop per-agent /agent/:aid/tasks routes again PR #13887 reintroduced the per-agent Tasks surface (sidebar entry, route files, agentId-scoped breadcrumb/list/board, /agent/:aid/tasks/:taskId navigation) that #14109 had removed in favor of unified /tasks and /task/:id. Restore the unified-only model: drop the agent sidebar Tasks nav item, delete the agent-scoped route files, strip agent-tasks blocks from both desktopRouter configs, and revert the agentId props and per-agent navigate paths in AgentTasksPage / KanbanBoard / Breadcrumb / TaskDetailPage. Preserves #14137's canceled kanban column. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): redirect any agent sub-route before opening new topic handleNewTopic only checked /profile and /channel, so on /agent/:aid/page, /agent/:aid/cron/:cronId or other sub-routes the redirect was skipped and mutate() opened a new topic on a non-chat screen β looking ineffective to the user. Match useTopicNavigation's pattern: derive an agent base path from params (with topicId when present) and treat anything longer than that as a sub-route, so adding new sub-routes never re-introduces this gap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): always push agent chat route before opening new topic The previous fix conditioned the redirect on isInAgentSubRoute, which left the URL untouched on /agent/:aid/:topicId β opening a new topic while the URL still pointed at the previous one. Drop the conditional and always push /agent/:aid: it covers every sub-route (/profile, /channel, /page, /cron/:cronId, β¦) and strips any stale :topicId so the URL matches the freshly opened topic. Restores Nav.test.tsx. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# π LobeHub v2.1.53 (20260427) **Release Date:** April 27, 2026 **Since v2.1.52:** 194 merged PRs Β· 17 contributors > Introduce Heterogeneous Agent β Claude Code and Codex run as first-class desktop runtimes, paired with a new Agent Signal package, sharper desktop UX, and a wave of flagship model additions. --- ## β¨ Highlights - **Introduce Heterogeneous Agent** β Claude Code and Codex run as first-class desktop agents: subagent rendering, partial-message streaming, multi-turn resume, terminal error surfacing, rich tool inspectors, and runtime polish. (#14162, #13754, #14067, #14001, #13970, #13942) - **Screen capture & Quick Chat tray** β New desktop screen capture overlay (macOS permission-gated) with Quick Chat tray and upload pipeline improvements; chat input auto-focuses on overlay mount. (#13818, #14097, #14105) - **Desktop topic & tab UX** β Dedicated topic popup window with cross-window sync, Cmd+W/Cmd+T tab shortcuts, TabBar polish, recent working directories expanded to 20, and human approval notifications. (#13957, #13983, #13972, #14036, #14092) - **Git workflow built-in** β One-click pull/push from the branch chip, ahead/behind badge, and submodule/worktree repo detection. (#14041, #13980, #13978) - **Agent Signal package** β New `@lobechat/agent-signal` runtime for dynamic memory feedback signals, with OTel metrics and self-iteration in Lab. (#14157, #14170, #14159, #14169, #14187) - **New models** β Claude Opus 4.7 with `xhigh` effort tier, GPT-5.5, DeepSeek V4 Flash/Pro with reasoning slider, Kimi K2.6, MiMo-V2.5/Pro, gpt-image-2, Qwen3.6 Flash/Plus, and Pixverse-c1. (#13903, #14147, #14114, #14004, #14089, #14039, #13923) - **New providers** β OpenCode Zen, OpenCode Go, and Azure OpenAI Router runtime. (#13943, #14064, #13823) - **Mobile settings overhaul** β Full settings menu and responsive profile layout for mobile. (#14019) --- ## ποΈ Heterogeneous Agent - Claude Code runtime, working-directory awareness, and sidebar polish. (#13970) - CC subagent rendering with persistent streamed text; parallel-tool orphan fix. (#14001, #13968, #14024) - Per-step usage persisted to each step assistant message. (#13964) - Per-phase workflow expand defaults; full-expand toggle with three-level expansion. (#14171, #13906) - Hetero-mode actions bar; tool inspector polish. (#13963, #14034, #14030) - Codex desktop integration with rich tool rendering and devtools preview. (#14067, #14100) - Codex terminal error surfacing and CLI output tracing. (#14166) - Tighten `isCanUseVision` default and add aggregator fallback. (#14172) - Persist `ccSessionId` in topic metadata for CC multi-turn resume. (#13902) - CC account card, topic filter, and integration polish. (#13955, #13942, #13950) - Token-level deltas streamed via `--include-partial-messages`. (#13929) --- ## π§ Agent Signal & Self-Iteration - New `@lobechat/agent-signal` package with dynamic feedback signals. (#14157) - AgentSignalRuntime wired through agent-tracing and observability-otel metrics. (#14170, #14159) - Self-iteration feature flag added to Lab; front-side flag check. (#14169, #14186) - Signal policy for receiving memory feedback dynamically. (#14187) --- ## π¬ Conversation - Queue follow-up sends during running CC turns. (#14179) - Persist per-topic chat scroll position; pin user message + fold long messages. (#14191, #14056) - Inline resend when editing last user message. (#14080) - Disable first-block markdown streaming to prevent flicker. (#14193, #13904) - Prevent Markdown stream replay when vlist remounts streaming items. (#14086) - Stop repinning after manual scroll; unify scroll-to-user + spacer hooks. (#14099, #14132) --- ## π± Platforms & Integrations ### Desktop / Electron - Screen capture overlay, Quick Chat tray, and upload pipeline improvements. (#13818) - macOS permission gate for screen capture; auto-focus chat panel input. (#14097, #14105) - Dedicated topic popup window with cross-window sync. (#13957) - TabBar polish: `+` button for new topic, dark theme blend, close icon by default. (#13972, #14203, #13973) - Recent working directories expanded from 5 to 20; submodule/worktree repo detection. (#14036, #13978) - Cmd+W / Cmd+T tab shortcuts and global shortcut consolidation. (#13983, #13880) - Linux icon configuration; human approval desktop notifications. (#14042, #14092) ### Git Workflow - One-click pull/push from branch chip; ahead/behind badge with refactored GitCtr. (#14041, #13980) ### Mobile - Full settings menu and responsive profile layout. (#14019) - Agent route added to mobile router; mobile agent topic route registered. (#14103, #14158) - Session list skeleton row layout corrected. (#14040) ### Bot / Messaging - DM strategy support; bot emoji and markdown render optimization. (#14201, #14091, #14140) - Slack webhook fix; bot platform setup guide reference. (#14052, #14121) --- ## π€ Models & Providers ### New models - **Claude Opus 4.7** with `xhigh` effort tier; strip temperature/top_p. (#13903, #13909) - **GPT-5.5**. (#14147) - **DeepSeek V4** Flash/Pro cards with reasoning slider; cache-hit and Pro discount pricing. (#14114, #14209, #14196, #14131) - **Kimi K2.6** model with LobeHub-hosted card. (#14004, #14006) - **MiMo-V2.5 / V2.5-Pro**. (#14089) - **gpt-image-2**, **Qwen3.6 Flash/Plus**, **Pixverse-c1**. (#14039, #13923) ### New providers - **OpenCode Zen** and **OpenCode Go** with env-var support. (#13943, #14064) - **Azure OpenAI Router** runtime support. (#13823) - Model alias mapping for image and video runtimes. (#13896) - Seedance video models migrated to Dreamina. (#14144) ### Runtime reliability - Sanitize invalid tool_call arguments to unbreak strict providers. (#14033) - Tolerate null `function.name` in streaming tool_call deltas. (#14139) - Preserve Gemini 3 `thoughtSignature` in `call_tools_batch` normalization. (#14032) - Downgrade `image_url` parts when target model lacks vision. (#14029) - Preserve Cloudflare provider error context. (#14136) - Use `safety_identifier` for OpenAI Responses API. (#14148) - Unwrap underlying PG error in `formatErrorEventData`. (#14038) --- ## π₯οΈ User Experience - **Onboarding** β Preset agent naming suggestions, structured hunk ops for `updateDocument`, persona analytics snapshot, footer promotion pipeline, wrap-up button. (#13931, #13989, #13930, #13853, #13934) - **Document workflow** β Agent documents promoted as primary workspace panel; history management and compare workflow; web-crawl docs associated with agent documents. (#13924, #13725, #13893) - **cmdk** β Agent identity surfaced on topic search results; topic/message search scoped to current agent. (#14204, #13960) - **Floating chat panel** and workspace improvements. (#13887) - **Topic completion status** with dropdown action and filter. (#14005) --- ## π§ Tooling - Redis-backed feature flag provider for runtime config. (#14098) - Vite upgraded to 8.0.0 with Rolldown strict execution order. (#12720, #14058) - `@lobechat/model-bank` automated npm release with provenance. (#14015, #14017, #14018) - Skill activation fallback when `activateTools` cannot find identifier. (#14010) - Cron tool: timezone and existing jobs injected into system prompt; clarified `lobe-gtd` and `lobe-cron` descriptions. (#14012, #14013) --- ## π Security & Reliability - **Security:** uuid bumped to v14 (advisory). (#14083) - **Security:** validate avatar URL and scope old-avatar deletion to owner. (#13982) - **Security:** clear OIDC sessions on better-auth signout; return 401 (not 500) for expired OIDC JWT. (#13916, #14014) - **Reliability:** scope pending-approval check to current assistant turn. (#14182) - **Reliability:** sanitize heterogeneous-agent attachment cache filenames. (#13937) - **Reliability:** reduce subagent task status error noise. (#14026) --- ## π₯ Contributors Huge thanks to **17 contributors** who shipped **194 merged PRs** this week. @hardy Β· @shaun0927 Β· @hezhijie0327 Β· @sxjeru Β· @arvinxx Β· @Innei Β· @tjx666 Β· @lijian Β· @neko Β· @rdmclin2 Β· @AmAzing129 Β· @sudongyuer Β· @CanisMinor Β· @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.1.52...v2.1.53
π» Change Type
π Related Issue
π Description of Change
This PR introduces two related agent experience improvements.
FloatingChatPanelwith mount guarding, topic/page routing support, and focused tests.canarystructure after mergingorigin/canaryinto the branch.π§ͺ How to Test
Run
bunx vitest run --silent='passed-only' 'src/routes/(main)/agent/_layout/index.test.tsx' 'src/routes/(main)/agent/features/Conversation/Header/HeaderActions/index.test.tsx' 'src/routes/(main)/agent/features/Conversation/WorkingSidebar/index.test.tsx' 'src/routes/(main)/agent/features/Conversation/WorkingSidebar/ResourcesSection/AgentDocumentsGroup.test.tsx' 'src/routes/(main)/agent/features/Conversation/RightPanel/ResourcesSection/AgentDocumentsGroup.test.tsx'Manually verify floating chat panel entry, topic/page routing, and agent workspace side-panel behavior.
Tested locally
Added/updated tests
No tests needed
πΈ Screenshots / Videos
π Additional Information
src/routes/(main)/agent/features/Conversation/RightPanel/index.test.tsx, still fails because its@lobehub/uimock does not provideShikiLobeTheme. This is pre-existing test scaffolding debt and was not used as the merge gate for this branch.