✨ feat(explorer-tree): add generic ExplorerTree component built on @pierre/trees#14094
Conversation
|
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: 27aca43712
ℹ️ 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 hasChildrenTree = nodes.some((n) => Array.isArray(n.children)); | ||
| if (hasChildrenTree) { |
There was a problem hiding this comment.
Treat empty
children arrays as flat input
normalizeTree switches to tree mode when any node has a children property (Array.isArray(n.children)), even if those arrays are empty. In flat datasets that include children: [] plus parentId (a common normalized shape), this path ignores parentId entirely and walks every node as a root sibling, which corrupts computed paths/parent IDs and breaks downstream selection/move mapping. The mode check should require actual nested children (or an explicit mode) instead of any array presence.
Useful? React with 👍 / 👎.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #14094 +/- ##
==========================================
- Coverage 68.91% 68.66% -0.26%
==========================================
Files 2551 2563 +12
Lines 222687 223846 +1159
Branches 28070 23431 -4639
==========================================
+ Hits 153474 153694 +220
- Misses 69069 70008 +939
Partials 144 144
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
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
…e/trees' and '@pierre/trees/react' Signed-off-by: Innei <tukon479@gmail.com>
…omponent 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
- 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)
…cument Signed-off-by: Innei <tukon479@gmail.com>
…tive 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
…r layout Signed-off-by: Innei <tukon479@gmail.com>
…ation Signed-off-by: Innei <tukon479@gmail.com>
…nd update tests for document count Signed-off-by: Innei <tukon479@gmail.com>
# 🚀 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
💻 Change Type
🔗 Related Issue
🔀 Description of Change
Introduces a reusable
ExplorerTreecomponent atsrc/features/ExplorerTree/built on top of@pierre/trees. Intended to replace ad-hoc tree UIs across the app (SkillStoreFileTree,LibraryHierarchy, WorkingSidebar resources) with a single typed, virtualized, DnD-capable surface.Public surface (v1)
ExplorerTreeNode<TData>[]— accepts either tree form (children) or flat form (parentId). Consumers put domain fields inTData.defaultExpanded/defaultSelected+onExpandedChange/onSelectedChange; imperative actions throughExplorerTreeHandle(startRenaming,focus,select,deselect,setExpanded,getSelectedIds).onMove(MoveEvent)withcanDrag/canDropgates. v1 limitspositionto'inside'(reorder not derivable from the library'sonDropComplete).getContextMenuItems(node) => MenuProps['items'], rendered inside the library'srenderContextMenuslot with adata-file-tree-context-menu-rootguard.canRename/onCommitRename(node, newName)/onRenameError.getRowDecoration(ctx)(text or icon).@pierre/treesset, extension-driven.Internal structure
adapter/— id ↔ canonical path, tree/flat normalization, sibling-name dedup (Name (2).ext), expand/select remap onnodesprop changes.view/ExplorerTree.tsx— thin shell overuseFileTree+<FileTree>; rename-in-progress guardsresetPathsto avoid losing focus;useLayoutEffect+ structural-equality guards prevent feedback loops.view/ContextMenu.tsx— antd<Menu>wrapper that closes the library's context surface before invoking item actions.Scope
src/features/FileTree/is tagged@deprecatedbut kept working.WorkingSidebar,LibraryHierarchy, and the SkillStoreFileTreeuser will migrate in follow-up PRs once the surface has shaken out in product.Design notes
headerandrenderContextMenuReact slots; norenderLabel/renderRowoverrides; state is model-owned (initial-only, runtime via methods); reorder not supported.@pierre/treesvia llms-full.txt to reconcile the documented API with the installed types (renderRowDecoration,icons.set, etc.).Full design doc in
docs/superpowers/specs/2026-04-23-explorer-tree-design.md(local; not part of this PR).🧪 How to Test
Unit:
bunx vitest run src/features/ExplorerTree/(adapter paths unit-testable).Integration: build does not mount the component yet — verify the existing
FileTreeconsumer still works and that@pierre/treestypes resolve. A hands-on smoke will land with the first consumer migration.📸 Screenshots / Videos
N/A — component is not wired to any UI in this PR.
📝 Additional Information
@pierre/trees@1.0.0-beta.3(license Apache-2.0; core dep ispreact, used only internally by the library's shadow-DOM renderer).