β¨ feat(skills): drag skill chips + register agent-document skills#15095
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: 39ffca7b1e
βΉοΈ 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".
Codecov Reportβ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #15095 +/- ##
===========================================
- Coverage 83.41% 70.79% -12.62%
===========================================
Files 475 3123 +2648
Lines 35685 309838 +274153
Branches 6946 27987 +21041
===========================================
+ Hits 29765 219346 +189581
- Misses 5758 90325 +84567
- Partials 162 167 +5
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
β¦at input Pick a project skill from the right Skills panel and drop it onto the chat input to insert a `/<skill-name>` action tag β the same end state as picking it from the `/` slash menu. - `SKILL_DRAG_MIME` lives in `@lobechat/const` so both the producer (sidebar) and the consumer (input drop handler) share one source of truth. - `skillDragData.ts` owns the drag payload and a custom drag image: a themed "icon + name" chip centered above the cursor. The native drag image is suppressed by an invisible 1Γ1 ghost β the OS bakes its own drop shadow into it which no CSS can remove. Token values are resolved via `getComputedStyle` against the dragged row so the chip stays themed even though it mounts on `document.body`. - `useSkillDrop` listens on the input container and only reacts to the `application/x-lobe-skill` MIME, so it never interferes with the file-upload drop zone (which keys off `Files`). - `ProjectLevelSkills` and `SkillsGroup` wire drag-start with the `projectSkill` category, matching the existing slash-menu behaviour (markdown serializes to `/<skill-name>`). Agent-document skills (the ζΊθ½δ½ Skills group) are not wired here β they need to be registered as first-class skills in the runtime registry first; that work is tracked separately. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
39ffca7 to
30b3d7a
Compare
β¦ mention menu - zh-CN: workingPanel.skills.* and resources.filter.skills now use ζθ½ (covers the Space tab pill plus the agent/project skill section headers) - Wire SkillStore tab and ChatInput mention categories through t() instead of hardcoded English labels; add mention.category.* keys for the five @-menu groups (Agents / Members / Topics / Skills / Tools) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦gistry
Agent-document skill bundles (the "ζΊθ½δ½ Skills" panel group, stored as
isSkillBundle documents in agent_document) become first-class runtime
skills end-to-end, so the slash menu / drag chip / model activation all
share one source of truth.
Identifier convention: `agent-document:<filename>` (where `<filename>`
is the bundle's slug β `validateSkillName`-validated on the server). The
prefix prevents collisions with builtin / DB skill names; mirrors the
`project:<name>` convention used for filesystem project skills.
Server:
- `aiAgent/index.ts` SkillEngine assembly: query
`agentDocumentsService.getAgentDocuments(resolvedAgentId)`, filter
`isSkillBundle`, and merge into the skills array so the model sees
them in `<available_skills>`.
- `toolExecution/serverRuntimes/skills.ts` factory: when an `agentId`
is in the request context, load the bundles + their SKILL.md index
children and shape them as `BuiltinSkill` entries, then concat with
`filterBuiltinSkills(builtinSkills)` before constructing
`SkillsExecutionRuntime`. The runtime resolves builtins by `name`
with no DB lookup β so `activateSkill('agent-document:<filename>')`
now returns the SKILL.md content for free, no `SkillRuntimeService`
extension needed. `source: 'builtin'` on these entries is a
type-system carrier shape, not a claim that they're real builtins.
Client:
- New tool-store slice `agentDocumentSkills` (per-agent scoped, cleared
on agent switch). `useFetchAgentDocumentSkills(agentId)` is the SWR
hook that keeps the registry hydrated; shares the SWR key with the
working-sidebar panel so we never double-fetch.
- `useInstalledSkillsAndTools` now reads from the new slice and triggers
the SWR hook with the active agent's id, so the `/` menu and any
consumer that goes through that hook see agent-doc skills alongside
builtin / lobehub / market / user skills.
- `AgentDocumentsGroup` wires `onSkillDragStart` on its SkillsList: the
payload uses the runtime identifier (`agent-document:<filename>`),
while the chip label keeps the human-readable title.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦render <skill> tags Three intertwined fixes around the agent-document skill registry that the earlier commit (331eed1) shipped half-baked: 1. **Prefix renamed `agent-document:` β `agent-skills:`** and extracted to `@lobechat/const` (`AGENT_SKILLS_IDENTIFIER_PREFIX`, `buildAgentSkillIdentifier`, `parseAgentSkillIdentifier`). The new prefix mirrors the unified VFS skill namespace path `./lobe/skills/agent/skills/<name>` flattened to one token, and single-sourcing it through const stops drift between the server resolver and the client drag wiring. 2. **`AgentDocumentsService.getAgentSkills(agentId)`** β one place to query bundles, filter `isSkillBundle`, resolve the `SKILL.md` index child, and build the runtime identifier. Both the SkillEngine assembly in `aiAgent/index.ts` and the `SkillsExecutionRuntime` factory in `serverRuntimes/skills.ts` call it instead of each re-implementing the prefix + bundle β index lookup (which was how the two sides drifted last round). 3. **`<skill>` / `<tool>` markdown plugins** (`plugins/Skill`, `plugins/Tool`) so the chat bubble renders these tags as the same chip the editor uses, instead of leaving the literal `<skill name="β¦" />` text in the message. Fixes a pre-existing bug that affected all registered skills (builtin / lobehub / DB / agent- document) β only the bare-text `projectSkill` flavour rendered correctly before because it serializes to `/<name>` instead. Note: the client drag wiring in `AgentDocumentsGroup.tsx` and the client tool-store slice action import the new const helpers, but landing the *category* refactor (`'skill'` β `'agentSkill'`) and the shared `@/features/SkillsList` extraction is intentionally kept out of this commit so it can ship with its own ActionTag work. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦ category - New src/features/SkillsList/ bundle: SkillsList moved here from AgentDocumentsExplorer, joined by a shared SkillSection wrapper (optional collapsible sectionHeader prop unifies the Accordion / flat-header variants) and a useProjectSkills hook (SWR + open handlers). - AgentDocumentsGroup / ProjectLevelSkills / SkillsGroup now consume that bundle and drop ~340 lines of duplicated SWR + section UI. - ActionTag gains an 'agentSkill' UI category (types, mention card, style, en/zh editor copy) so agent-document skill chips render with their own tooltip / label while still serializing as <skill name="agent-skills:..." /> on the wire β the runtime keys off the identifier prefix, so no new XML tag is needed. The XML reader detects the prefix on parse to keep the chip's category across save/reload. - AgentDocumentsGroup drag uses category='agentSkill', backed by the shared buildAgentSkillIdentifier helper. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦ error
Adapter previously surfaced overload (`api_error_status: 529` /
`overloaded_error`) as a plain `{ error, message }` payload, so the
executor fell through to the unstructured branch and the UI rendered
the raw text instead of a typed `HeterogeneousAgentSessionError`. Add
a dedicated `overloaded` code + StatusGuide state with a Retry action
so the common transient failure has a recoverable, branded surface.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦oke every skill drag `writeSkillDragData` also set `text/plain` to the chip label, and `setSkillDragImage` swapped in a custom cursor-following preview. The combination races the Lexical chat input's own drop handling: it reacts to `text/plain` and the suppressed-native-image sequence intermittently aborts the dragstart, leaving `useSkillDrop` to never fire. Net result was that every skill drag (project + agent-document) silently failed. Strip both back to the minimum that's known to work: - `writeSkillDragData` writes only the custom `application/x-lobe-skill` MIME + `effectAllowed = 'copy'`. Drops on non-editor targets now do nothing instead of degrading to plain text β acceptable trade-off. - Native browser drag image is back. The OS drop shadow on the ghost is ugly but not a regression worth losing the drag for. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦ools The earlier commit (331eed1) wired the agent-document skill registry into `useInstalledSkillsAndTools` by calling the SWR hook directly off the tool-store selector: useToolStore((s) => s.useFetchAgentDocumentSkills)(activeAgentId); That extra hook indirection β invoking a function selected out of zustand on each render of the slash-menu consumer β was throwing / breaking React's hook tracking at render time. The slash menu and every drag-into-input flow rely on `useInstalledSkillsAndTools` resolving cleanly, so the breakage cascaded into `/skills` not rendering and every skill drag silently failing. Revert to the pre-331eed1e9c shape: only the four already-working sources (builtin / lobehub / market / user) feed the slash + mention list. Agent-document skills are still in the tool store (server side registers them in SkillEngine via `agent-skills:<filename>`) β they just won't show up in the `/` autocomplete until we hydrate the slice through a safer path (e.g. an effect in the agent route root, or shared SWR from the panel). Drag from the working sidebar continues to work because the wiring is local to `AgentDocumentsGroup`, not to `useInstalledSkillsAndTools`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
β¦ cursor) Brings back the cursor-following white rounded chip (icon + name) and suppresses the native OS drag ghost. Earlier reverted along with the `text/plain` fallback when we were narrowing down the drag breakage, but the real culprit turned out to be the `useFetchAgentDocumentSkills` hook indirection in `useInstalledSkillsAndTools` (fixed in 1ccdfc5), not the drag-image code itself. `text/plain` stays removed β that one really does race with Lexical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
# π LobeHub Release (20260528) **Release Date:** May 28, 2026 **Since v2.2.0:** 220 merged PRs Β· 15 contributors > This cycle brings heterogeneous "platform agents" you can dispatch to local or remote devices, a rebuilt onboarding flow, document-centric chat, and a unified model-runtime error model β with new DeepSeek V4 and Gemini 3.5 Flash support along the way. --- ## β¨ Highlights - **More Hetero Agents (OpenClaw / Hermes)** β Create heterogeneous agents and dispatch them to local or remote devices through the device gateway, with an execution-target switcher in the composer and persistent CLI sessions. (#15065, #15179, #15022) - **iMessage on Desktop** β New iMessage setup and bridge on desktop, plus bot attachments across every platform. (#15228, #15227, #15029) - **Skills in the Composer** β Drag skill chips into chat, trigger installed skills from the slash menu mid-line, and surface project-level skills in the homogeneous agent runtime. (#15095, #15061, #15110) - **New Models** β DeepSeek V4 Flash/Pro and Gemini 3.5 Flash across providers, with thinking params for structured output and chat cost estimates. (#15031, #15001, #15051, #14876) - **Agent Runtime Observability** β OpenTelemetry GenAI semantic conventions plus per-call generation tracing. (#15123, #15124) --- ## π€ Agents & Heterogeneous Runtime - **Platform agent creation** β OpenClaw/Hermes creation UI, device guard, and remote dispatch backend. (#15065) - **Execution-target switcher** β Pick local vs remote execution directly in the composer; device-selection UX with actionable guidance. (#15179, #15111) - **CLI hetero dispatch** β OpenClaw/Hermes dispatch with persistent sessions and a notify protocol. (#15022) - **Gateway snapshot as source of truth** β Consume the gateway `uiMessages` snapshot at step boundaries to keep chat state consistent. (#15153, #15152) - **Client sub-agent as a normal tool call** β Simplifies the sub-agent execution path. (#15281) - **Hermes agent chain** β Implements the Hermes agent chain logic. (#15189) - **Device registry** β TRPC endpoints to register, list, update, and remove devices. (#15299) - **Desktop device routing** β Route gateway agent runs through `lh hetero exec`; restore `userId` in gateway dispatch and gate local-system by execution target. (#15132, #15232) - **Agent signals** β Anchor agent-signal receipts to messages and isolate memory-agent messages into a child thread. (#14969, #14921) --- ## π Onboarding - **Simplified first screen** β Defer topic creation to first send. (#15090) - **Market Agent Picker** β Added as a classic onboarding step, with template prefetch. (#14980, #15041) - **Welcome guidance** β Show agent welcome guidance on first run. (#15098) - **Mobile** β Adapt agent onboarding UI and restore Classic-step padding on mobile. (#15019, #15032) - **Discovery** β Streamline discovery to a single profession question. (#14987) - **Analytics** β Track onboarding step events and create-agent modal source. (#15133, #15028) --- ## π Documents, Pages & Knowledge - **Thread chat in preview** β Embed thread chat in the document preview portal. (#15216) - **Non-markdown rendering** β Render non-markdown docs as a read-only highlight. (#15272) - **Multi-select** β Multi-select delete in the document tree. (#15125) - **Page-agent streaming** β Preview `initPage` streaming arguments. (#15039) - **Per-agent topics** β Per-agent topic management page. (#15207) - **Server-side category** β Derive document category server-side and drop frontend predicates. (#15076) --- ## π§© Skills & Tools - **Drag skill chips** β Drag skills into chat input and register agent-document skills. (#15095) - **Slash menu** β Installed skills appear in the slash menu with a mid-line trigger. (#15061) - **Project skills** β Recognize project-level skills in the homogeneous agent runtime and surface them regardless of active device. (#15110, #15177) - **VFS archiving** β Archive oversized tool results to VFS instead of truncating. (#15074) - **@localfile mentions** β Drag folders into chat input as `@localFile` mentions on desktop. (#15071) --- ## π§ Model Runtime & Providers - **Error spec registry** β Unify error codes into a spec + pattern registry, split `ProviderBizError` into finer codes, classify Cloud-only codes via a tier digit, and add `DatabasePersistError`. (#15262, #15286, #15278, #15279) - **New models** β DeepSeek V4 Flash/Pro (opencode-go) and Gemini 3.5 Flash; DeepSeek V4 Pro on SiliconCloud. (#15031, #15001, #15017, #15267) - **Structured output** β Thinking params for structured output, Bedrock structured generation, and DeepSeek `generateObject` tool choice. (#15051, #15174, #15054) - **Cost** β Chat cost estimate support; preserve usage cost in custom streams. (#14876, #15218) --- ## π¬ Chat & User Experience - **Follow-up chips** β Extend follow-up chip suggestions to general chat with scene-specific model config. (#15101, #14797) - **Input drafts** β Persist unsent input drafts across tab switches and prevent repeated draft restore. (#14992, #15024) - **Command menu** β Order topic/message search by recency and promote inline type filters. (#15094, #14986) - **Zoom HUD** β Show a zoom-level HUD on Cmd +/β and Cmd 0. (#15294) - **Copy** β Unescape markdown escapes when copying user messages. (#15253) --- ## π₯οΈ Desktop - **App Nap fix** β Prevent App Nap from dropping the gateway WebSocket during display sleep. (#14994) - **File preview** β Preview `.cjs`/`.mjs`/no-extension files instead of binary fallback and expand `~` when opening local files. (#15168, #15284) - **Cross-platform settings** β Open settings via main-window navigation on Windows/Linux and restore the route after an update restart. (#15036, #14922) - **Token refresh** β Prevent frequent logout from token-refresh retries. (#14928) --- ## π Observability - **OTel GenAI** β Instrument Agent Runtime with OpenTelemetry GenAI semantic conventions. (#15123) - **Generation tracing** β Per-call `llm_generation_tracing` with a pre-allocated tracingId and recordFeedback router. (#15124, #15146) - **Error classification** β Persist `ERROR_CODE_SPECS` classification on operation errors. (#15273) --- ## ποΈ Database Migrations - **Batch migrations** β Topic usage stats, push tokens, `tasks.editor_data`, and document shares. (#15280) - **Tracing & eval tables** β Add `llm_generation_tracing` and agent eval experiment tables. (#15126) > Self-hosted operators should run the database migration (`pnpm db:migrate`, or restart with auto-migrate enabled) after upgrading. The changes are additive and backwards-compatible. --- ## π Security & Reliability - **Security:** Remove the `getPlaintextCred` tool to prevent plaintext credential exposure. (#14998) - **Security:** Prompt account selection for Google OAuth and add `prompt=consent` to the OIDC authorization URL to fix missing refresh tokens. (#15234, #15010) - **Reliability:** Preserve streamed content across a mid-stream cancel. (#15173) - **Reliability:** Bound the Redis command timeout and configure the Anthropic client timeout. (#15091, #15042) - **Reliability:** Prevent infinite recursion in the assistant chain. (#15288) --- ## π₯ Contributors Huge thanks to **15 contributors** who shipped **220 merged PRs** this cycle. @AnotiaWang Β· @sxjeru Β· @algojogacor Β· @hardy-one Β· @arvinxx Β· @Innei Β· @tjx666 Β· @lijian Β· @AmAzing129 Β· @rdmclin2 Β· @neko Β· @cy948 Β· @CanisMinor Β· @sudongyuer Β· @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.2.0...release/weekly-20260528
Summary
Two related pieces of work on the skill drag-and-slash flow:
1. Drag skill chips from working sidebar into chat input (
30b3d7a524)/slash menu.getComputedStyleagainst the dragged row so the chip stays themed ondocument.body.application/x-lobe-skillMIME so it never interferes with the file-upload drop zone (which keys offFiles).SKILL_DRAG_MIMElives in@lobechat/constso both sides share one source of truth.2. Register agent-document skill bundles in the skill registry (
331eed1e9c)Agent-document skill bundles (the ζΊθ½δ½ Skills panel group, stored as
isSkillBundledocuments inagent_document) become first-class runtime skills end-to-end β so the slash menu, drag chip, and model activation all share one source of truth.Identifier convention:
agent-document:<filename>(the bundle's slug,validateSkillName-validated server-side). Prefix prevents collisions with builtin / DB skill names; mirrors theproject:<name>convention.Server:
aiAgent/index.tsSkillEngine assembly merges agent-doc bundles alongside builtin + DB skills, so the model sees them in<available_skills>.serverRuntimes/skills.tsfactory pre-loads the bundles'SKILL.mdcontent asBuiltinSkill-shaped entries and feeds them toSkillsExecutionRuntime'sbuiltinSkillschannel. The runtime's existingactivateSkillresolves builtins bynamewith no DB lookup β soactivateSkill('agent-document:<filename>')returns the SKILL.md content for free, noSkillRuntimeServiceextension needed.Client:
agentDocumentSkills(per-agent scoped, cleared on agent switch).useFetchAgentDocumentSkills(agentId)is SWR-backed and shares the SWR key with the panel β at most one network request.useInstalledSkillsAndToolsreads the new slice + triggers the SWR hook with the active agent's id, so/menu / @ mention see agent-doc skills alongside builtin / lobehub / market / user skills.AgentDocumentsGroupwiresonSkillDragStart: payload uses the runtime identifier (agent-document:<filename>); chip label keeps the title.Also picks up the user's i18n localization commit (
d48cfb0455) on the way.Test plan
/<skill-name>into the input β send β CLI agent resolves and runs the skill.<skill name="agent-document:<filename>">chip β send β model sees it in<available_skills>βactivateSkillreturns the SKILL.md content (no longer "skill not found")./) shows agent-doc skills alongside installed skills.Files).π€ Generated with Claude Code