Skip to content

✨ feat: support agent group unpublish agents#11687

Merged
ONLY-yours merged 1 commit intonextfrom
fix/CronJobFixed
Jan 22, 2026
Merged

✨ feat: support agent group unpublish agents#11687
ONLY-yours merged 1 commit intonextfrom
fix/CronJobFixed

Conversation

@ONLY-yours
Copy link
Copy Markdown
Member

@ONLY-yours ONLY-yours commented Jan 21, 2026

💻 Change Type

  • ✨ feat
  • 🐛 fix
  • ♻️ refactor
  • 💄 style
  • 👷 build
  • ⚡️ perf
  • ✅ test
  • 📝 docs
  • 🔨 chore

🔗 Related Issue

🔀 Description of Change

🧪 How to Test

  • Tested locally
  • Added/updated tests
  • No tests needed

📸 Screenshots / Videos

Before After
... ...

📝 Additional Information

Summary by Sourcery

Add server and client support for managing agent group publication status in the marketplace, including publish, unpublish, and deprecate actions.

New Features:

  • Expose new lambda router endpoints to publish, unpublish, and deprecate agent groups via the marketplace API.
  • Add market API client methods and user detail hooks to change status for both individual agents and agent groups.
  • Enhance the user group card UI with owner-only actions menu and status badges for group publication state.

Enhancements:

  • Update trusted-client / access-token handling for status changes to support environments with or without market trusted client configuration.
  • Align the agent card actions dropdown behavior with the new group card dropdown interaction.

@vercel
Copy link
Copy Markdown

vercel bot commented Jan 21, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
lobehub Ready Ready Preview, Comment Jan 21, 2026 2:36pm

Request Review

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 21, 2026
@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai bot commented Jan 21, 2026

Reviewer's Guide

Adds full status-management support (publish, unpublish, deprecate) for agent groups across backend lambda router, market API client, discover service responses, and the user detail/group card UI, aligning group behavior with existing single-agent controls and status display.

Sequence diagram for agent group status change flow

sequenceDiagram
  actor User
  participant UserGroupCard
  participant DetailProvider
  participant UseUserDetail
  participant MarketApiService
  participant LambdaAgentGroupRouter
  participant MarketBackendApi

  User->>UserGroupCard: Click more menu
  UserGroupCard->>UserGroupCard: handleStatusAction(action, group)
  UserGroupCard->>DetailProvider: onStatusChange(identifier, action, group)
  DetailProvider->>UseUserDetail: handleStatusChange(identifier, action, group)

  UseUserDetail->>UseUserDetail: validateAuth(enableMarketTrustedClient, session)
  alt action is deprecate
    UseUserDetail->>UseUserDetail: show confirm dialog
    User-->>UseUserDetail: Confirm deprecate
  end

  UseUserDetail->>MarketApiService: executeStatusChange(identifier, action, group)

  alt group publish
    MarketApiService->>LambdaAgentGroupRouter: publishAgentGroup(identifier)
    LambdaAgentGroupRouter->>MarketBackendApi: POST /agent-groups/{id}/publish
    MarketBackendApi-->>LambdaAgentGroupRouter: 200 OK
  else group unpublish
    MarketApiService->>LambdaAgentGroupRouter: unpublishAgentGroup(identifier)
    LambdaAgentGroupRouter->>MarketBackendApi: POST /agent-groups/{id}/unpublish
    MarketBackendApi-->>LambdaAgentGroupRouter: 200 OK
  else group deprecate
    MarketApiService->>LambdaAgentGroupRouter: deprecateAgentGroup(identifier)
    LambdaAgentGroupRouter->>MarketBackendApi: POST /agent-groups/{id}/deprecate
    MarketBackendApi-->>LambdaAgentGroupRouter: 200 OK
  end

  LambdaAgentGroupRouter-->>MarketApiService: success
  MarketApiService-->>UseUserDetail: success
  UseUserDetail->>DetailProvider: onMutate()
  DetailProvider-->>UserGroupCard: refreshed data with updated status
  UserGroupCard-->>User: Updated status tag
Loading

Class diagram for updated agent and group status management

classDiagram

  class MarketApiService {
    +setAccessToken(token string) void
    +publishAgent(identifier string) void
    +unpublishAgent(identifier string) void
    +deprecateAgent(identifier string) void
    +publishAgentGroup(identifier string) void
    +unpublishAgentGroup(identifier string) void
    +deprecateAgentGroup(identifier string) void
  }

  class UseUserDetail {
    +handleStatusChange(identifier string, action AgentStatusAction, type EntityType) Promise~void~
  }

  class UserDetailContextConfig {
    +isOwner boolean
    +mobile boolean
    +totalInstalls number
    +user DiscoverUserInfo
    +onEditProfile(onSuccess function) void
    +onStatusChange(identifier string, action AgentStatusAction, type EntityType) void
  }

  class UserGroupCard {
    +avatar string
    +title string
    +description string
    +createdAt string
    +category string
    +installCount number
    +identifier string
    +memberCount number
    +status GroupAgentStatus
    +handleStatusAction(action AgentStatusAction, type EntityType) void
  }

  class UserAgentCard {
    +status AgentStatus
    +handleStatusAction(action AgentStatusAction, type EntityType) void
  }

  class DiscoverService {
    +mapAgentToDiscoverItem(agent MarketAgent) DiscoverAgentItem
    +mapGroupToDiscoverItem(group MarketAgentGroup) DiscoverGroupAgentItem
  }

  class DiscoverGroupAgentItem {
    +identifier string
    +title string
    +status GroupAgentStatus
    +memberCount number
    +schemaVersion number
  }

  class DiscoverAgentItem {
    +identifier string
    +title string
    +status AgentStatus
    +schemaVersion number
  }

  class AgentStatusAction {
    <<enumeration>>
    publish
    unpublish
    deprecate
  }

  class EntityType {
    <<enumeration>>
    agent
    group
  }

  class GroupAgentStatus {
    <<enumeration>>
    published
    unpublished
    deprecated
    archived
  }

  class AgentStatus {
    <<enumeration>>
    published
    unpublished
    deprecated
    archived
  }

  %% Relationships
  UseUserDetail ..> MarketApiService : uses
  UserGroupCard ..> UserDetailContextConfig : reads context
  UserAgentCard ..> UserDetailContextConfig : reads context

  UserDetailContextConfig o--> UseUserDetail : provides onStatusChange

  UseUserDetail ..> AgentStatusAction
  UseUserDetail ..> EntityType

  UserGroupCard ..> GroupAgentStatus
  UserAgentCard ..> AgentStatus

  DiscoverService ..> DiscoverGroupAgentItem : returns
  DiscoverService ..> DiscoverAgentItem : returns
  DiscoverGroupAgentItem ..> GroupAgentStatus
  DiscoverAgentItem ..> AgentStatus
Loading

File-Level Changes

Change Details Files
Add backend lambda mutations to publish, unpublish, and deprecate agent groups with trusted-client / access-token auth and TRPC error handling.
  • Introduce deprecateAgentGroup, publishAgentGroup, and unpublishAgentGroup mutations on agentGroupRouter using identifier input.
  • Implement shared header construction using trusted-client token when available, falling back to Bearer access token.
  • Perform POST requests to corresponding /api/v1/agent-groups/:identifier/(deprecate
publish
Expose agent-group status management in the market API client for use by the UI.
  • Add publishAgentGroup, unpublishAgentGroup, and deprecateAgentGroup methods that delegate to lambdaClient.market.agentGroup.* mutations.
src/services/marketApi.ts
Extend discover service responses to include agent and group status for list and detail payloads.
  • Propagate status field from raw agent data into DiscoverService agent mapping in multiple listing methods.
  • Propagate status field from raw group data into DiscoverService group mapping in multiple listing methods.
src/server/services/discover/index.ts
Enable owner-side status management (publish/unpublish/deprecate) and status display for agent groups in the user detail UI, mirroring existing agent behavior.
  • Extend UserGroupCard to accept status, compute a status tag color, and render a localized status tag for owners.
  • Add a hover-only owner actions menu on UserGroupCard (edit, publish/unpublish toggle, deprecate) wired to onStatusChange with type='group'.
  • Adjust UserAgentCard dropdown wrapper to stop event propagation at a parent div for consistency with UserGroupCard.
src/app/[variants]/(main)/community/(detail)/user/features/UserGroupCard.tsx
src/app/[variants]/(main)/community/(detail)/user/features/UserAgentCard.tsx
src/app/[variants]/(main)/community/(detail)/user/features/DetailProvider.tsx
Generalize the user detail status-change hook to support both agents and agent groups and to work with or without a trusted client token.
  • Introduce EntityType parameter ('agent'
'group') in useUserDetail handleStatusChange and route actions to appropriate MarketApiService methods.
  • Prefix toast/message keys with the entity type to allow separate localization entries for agents vs groups.
  • Guard status changes on either a trusted-client config flag or presence of a session access token and update error logging to include entity type.

  • Tips and commands

    Interacting with Sourcery

    • Trigger a new review: Comment @sourcery-ai review on the pull request.
    • Continue discussions: Reply directly to Sourcery's review comments.
    • Generate a GitHub issue from a review comment: Ask Sourcery to create an
      issue from a review comment by replying to it. You can also reply to a
      review comment with @sourcery-ai issue to create an issue from it.
    • Generate a pull request title: Write @sourcery-ai anywhere in the pull
      request title to generate a title at any time. You can also comment
      @sourcery-ai title on the pull request to (re-)generate the title at any time.
    • Generate a pull request summary: Write @sourcery-ai summary anywhere in
      the pull request body to generate a PR summary at any time exactly where you
      want it. You can also comment @sourcery-ai summary on the pull request to
      (re-)generate the summary at any time.
    • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
      request to (re-)generate the reviewer's guide at any time.
    • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
      pull request to resolve all Sourcery comments. Useful if you've already
      addressed all the comments and don't want to see them anymore.
    • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
      request to dismiss all existing Sourcery reviews. Especially useful if you
      want to start fresh with a new review - don't forget to comment
      @sourcery-ai review to trigger a new review!

    Customizing Your Experience

    Access your dashboard to:

    • Enable or disable review features such as the Sourcery-generated pull request
      summary, the reviewer's guide, and others.
    • Change the review language.
    • Add, remove or edit custom review instructions.
    • Adjust other review settings.

    Getting Help

    @gru-agent
    Copy link
    Copy Markdown
    Contributor

    gru-agent bot commented Jan 21, 2026

    TestGru Assignment

    Summary

    Link CommitId Status Reason
    Detail 226ae3d ✅ Finished

    History Assignment

    Files

    File Pull Request
    src/server/services/discover/index.ts ❌ Failed (I failed to setup the environment.)
    src/server/routers/lambda/market/agentGroup.ts ❌ Failed (I failed to setup the environment.)

    Tip

    You can @gru-agent and leave your feedback. TestGru will make adjustments based on your input

    Copy link
    Copy Markdown
    Contributor

    @sourcery-ai sourcery-ai bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Hey - I've found 3 issues, and left some high level feedback:

    • The three new agentGroup mutations (publish/unpublish/deprecate) duplicate the same URL-building, header, and error-handling logic; consider extracting a shared helper to reduce repetition and keep behavior consistent if this flow changes.
    • In useUserDetail, when enableMarketTrustedClient is true you can hit the path where session is undefined but marketApiService.setAccessToken(session!.accessToken) is still called; guard this or skip setting the access token in the trusted-client-only scenario to avoid a runtime error.
    • The DropdownMenu usages in UserGroupCard and UserAgentCard are cast to any for items; it would be more robust to align the menuItems shape with the DropdownMenu type (or add a small wrapper type) so you don't need the unsafe casts.
    Prompt for AI Agents
    Please address the comments from this code review:
    
    ## Overall Comments
    - The three new agentGroup mutations (publish/unpublish/deprecate) duplicate the same URL-building, header, and error-handling logic; consider extracting a shared helper to reduce repetition and keep behavior consistent if this flow changes.
    - In `useUserDetail`, when `enableMarketTrustedClient` is true you can hit the path where `session` is undefined but `marketApiService.setAccessToken(session!.accessToken)` is still called; guard this or skip setting the access token in the trusted-client-only scenario to avoid a runtime error.
    - The `DropdownMenu` usages in `UserGroupCard` and `UserAgentCard` are cast to `any` for `items`; it would be more robust to align the `menuItems` shape with the `DropdownMenu` type (or add a small wrapper type) so you don't need the unsafe casts.
    
    ## Individual Comments
    
    ### Comment 1
    <location> `src/app/[variants]/(main)/community/(detail)/user/features/useUserDetail.ts:22-31` </location>
    <code_context>
    +  const enableMarketTrustedClient = useServerConfigStore(
    </code_context>
    
    <issue_to_address>
    **issue (bug_risk):** Possible undefined access token when trusted-client mode is enabled
    
    When `enableMarketTrustedClient` is true, the guard `if (!enableMarketTrustedClient && !session?.accessToken)` no longer protects against a missing `session`/`accessToken`, so `marketApiService.setAccessToken(session!.accessToken)` may receive `undefined` or throw. Please either:
    
    1) Call `setAccessToken` only when an access token is present, or
    2) Add a separate guard that requires `session?.accessToken` in the paths where the downstream API needs it.
    
    This avoids relying on the non-null assertion when trusted-client auth runs without a user session.
    </issue_to_address>
    
    ### Comment 2
    <location> `src/app/[variants]/(main)/community/(detail)/user/features/UserGroupCard.tsx:198` </location>
    <code_context>
    -            </div>
    -          </DropdownMenu>
    +          <div onClick={(e) => e.stopPropagation()}>
    +            <DropdownMenu items={menuItems as any}>
    +              <div className={cx('more-button', styles.moreButton)}>
    +                <Icon icon={MoreVerticalIcon} size={16} style={{ cursor: 'pointer' }} />
    </code_context>
    
    <issue_to_address>
    **suggestion:** Avoid `any` cast on menuItems by aligning its type with DropdownMenu
    
    Casting `menuItems` to `any` masks type mismatches between what `DropdownMenu` expects and what is provided. Since `menuItems` is already a structured array (`icon`, `key`, `label`, `onClick`, `type`, `danger`), you can define its type explicitly or derive it from the `DropdownMenu` API instead of using `any`, preserving compile-time checks if the contract changes.
    
    Suggested implementation:
    
    ```typescript
            {isOwner && (
              <div onClick={(e) => e.stopPropagation()}>
                <DropdownMenu items={menuItems}>
    
    ```
    
    To fully remove the `any` cast while keeping type safety, also adjust the `menuItems` declaration earlier in the file:
    
    1. Import `DropdownMenu`’s type if needed (or rely on the value import if it’s already imported):
       - If `DropdownMenu` is already imported as a component, you can derive the type directly from it:
       ```ts
       import DropdownMenu from '...'; // existing import
       ```
    
    2. Change the `menuItems` declaration to use the inferred `items` type from `DropdownMenu`:
       ```ts
       const menuItems: React.ComponentProps<typeof DropdownMenu>['items'] = [
         // existing items with icon, key, label, onClick, type, danger, ...
       ];
       ```
    
    This aligns `menuItems`’s type with `DropdownMenu`’s `items` prop and will preserve compile-time checks if the `DropdownMenu` API changes.
    </issue_to_address>
    
    ### Comment 3
    <location> `src/app/[variants]/(main)/community/(detail)/user/features/UserAgentCard.tsx:264` </location>
    <code_context>
    -            </div>
    -          </DropdownMenu>
    +          <div onClick={(e) => e.stopPropagation()}>
    +            <DropdownMenu items={menuItems as any}>
    +              <div className={cx('more-button', styles.moreButton)}>
    +                <Icon icon={MoreVerticalIcon} size={16} style={{ cursor: 'pointer' }} />
    </code_context>
    
    <issue_to_address>
    **suggestion:** Type `menuItems` instead of casting to `any` for the agent card menu as well
    
    As with `UserGroupCard`, avoid casting `menuItems` to `any`. Instead, give it the same type as `DropdownMenu`'s `items` prop (either by importing that type or defining a local interface) so TypeScript enforces the menu shape.
    
    Suggested implementation:
    
    ```typescript
            {isOwner && (
              <div onClick={(e) => e.stopPropagation()}>
                <DropdownMenu items={menuItems}>
                  <div className={cx('more-button', styles.moreButton)}>
                    <Icon icon={MoreVerticalIcon} size={16} style={{ cursor: 'pointer' }} />
                  </div>
                </DropdownMenu>
              </div>
            )}
    
    ```
    
    To fully implement your comment and get type safety instead of the `any` cast, also:
    1. Locate the `menuItems` declaration in this file and give it the same type used by `DropdownMenu`'s `items` prop (for example, something like `DropdownMenuItem[]`).
    2. If `DropdownMenu` already exports that item type (check the implementation or how `UserGroupCard` types its `menuItems`), import it at the top of this file and annotate: `const menuItems: DropdownMenuItem[] = [...]`.
    3. If no shared type exists, define a local interface (mirroring the `DropdownMenu` item shape) and use it as the type for `menuItems`, again following the pattern used in `UserGroupCard`.
    </issue_to_address>

    Sourcery is free for open source - if you like our reviews please consider sharing them ✨
    Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

    >
    {isOwner && (
    <div onClick={(e) => e.stopPropagation()}>
    <DropdownMenu items={menuItems as any}>
    Copy link
    Copy Markdown
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    suggestion: Avoid any cast on menuItems by aligning its type with DropdownMenu

    Casting menuItems to any masks type mismatches between what DropdownMenu expects and what is provided. Since menuItems is already a structured array (icon, key, label, onClick, type, danger), you can define its type explicitly or derive it from the DropdownMenu API instead of using any, preserving compile-time checks if the contract changes.

    Suggested implementation:

            {isOwner && (
              <div onClick={(e) => e.stopPropagation()}>
                <DropdownMenu items={menuItems}>

    To fully remove the any cast while keeping type safety, also adjust the menuItems declaration earlier in the file:

    1. Import DropdownMenu’s type if needed (or rely on the value import if it’s already imported):

      • If DropdownMenu is already imported as a component, you can derive the type directly from it:
      import DropdownMenu from '...'; // existing import
    2. Change the menuItems declaration to use the inferred items type from DropdownMenu:

      const menuItems: React.ComponentProps<typeof DropdownMenu>['items'] = [
        // existing items with icon, key, label, onClick, type, danger, ...
      ];

    This aligns menuItems’s type with DropdownMenu’s items prop and will preserve compile-time checks if the DropdownMenu API changes.

    </div>
    </DropdownMenu>
    <div onClick={(e) => e.stopPropagation()}>
    <DropdownMenu items={menuItems as any}>
    Copy link
    Copy Markdown
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    suggestion: Type menuItems instead of casting to any for the agent card menu as well

    As with UserGroupCard, avoid casting menuItems to any. Instead, give it the same type as DropdownMenu's items prop (either by importing that type or defining a local interface) so TypeScript enforces the menu shape.

    Suggested implementation:

            {isOwner && (
              <div onClick={(e) => e.stopPropagation()}>
                <DropdownMenu items={menuItems}>
                  <div className={cx('more-button', styles.moreButton)}>
                    <Icon icon={MoreVerticalIcon} size={16} style={{ cursor: 'pointer' }} />
                  </div>
                </DropdownMenu>
              </div>
            )}

    To fully implement your comment and get type safety instead of the any cast, also:

    1. Locate the menuItems declaration in this file and give it the same type used by DropdownMenu's items prop (for example, something like DropdownMenuItem[]).
    2. If DropdownMenu already exports that item type (check the implementation or how UserGroupCard types its menuItems), import it at the top of this file and annotate: const menuItems: DropdownMenuItem[] = [...].
    3. If no shared type exists, define a local interface (mirroring the DropdownMenu item shape) and use it as the type for menuItems, again following the pattern used in UserGroupCard.

    Copy link
    Copy Markdown

    @chatgpt-codex-connector chatgpt-codex-connector bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    💡 Codex Review

    Here are some automated review suggestions for this pull request.

    Reviewed commit: 226ae3d145

    ℹ️ 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".

    Comment on lines 44 to 46
    message.loading({ content: loadingText, key: messageKey });
    marketApiService.setAccessToken(session!.accessToken);

    Copy link
    Copy Markdown

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    P2 Badge Guard access token when trusted client skips session

    When enableMarketTrustedClient is true and the user isn’t logged in, handleStatusChange allows the action to proceed but executeStatusChange still executes session!.accessToken, which will throw because session is undefined. This means group/agent publish/unpublish flows crash for trusted-client users without a session. Consider only calling setAccessToken when a session exists, or derive the token from trusted client state instead.

    Useful? React with 👍 / 👎.

    @codecov
    Copy link
    Copy Markdown

    codecov bot commented Jan 21, 2026

    Codecov Report

    ❌ Patch coverage is 0% with 4 lines in your changes missing coverage. Please review.
    ✅ Project coverage is 74.05%. Comparing base (e1666a5) to head (226ae3d).
    ⚠️ Report is 19 commits behind head on next.

    Additional details and impacted files
    @@            Coverage Diff             @@
    ##             next   #11687      +/-   ##
    ==========================================
    - Coverage   74.06%   74.05%   -0.01%     
    ==========================================
      Files        1187     1187              
      Lines       94521    94525       +4     
      Branches    10825    12426    +1601     
    ==========================================
      Hits        70004    70004              
    - Misses      24427    24431       +4     
      Partials       90       90              
    Flag Coverage Δ
    app 66.89% <0.00%> (-0.01%) ⬇️
    database 93.29% <ø> (ø)
    packages/agent-runtime 90.20% <ø> (ø)
    packages/context-engine 85.29% <ø> (ø)
    packages/conversation-flow 92.37% <ø> (ø)
    packages/file-loaders 88.66% <ø> (ø)
    packages/memory-user-memory 69.75% <ø> (ø)
    packages/model-bank 100.00% <ø> (ø)
    packages/model-runtime 86.70% <ø> (ø)
    packages/prompts 79.33% <ø> (ø)
    packages/python-interpreter 92.90% <ø> (ø)
    packages/ssrf-safe-fetch 0.00% <ø> (ø)
    packages/utils 93.25% <ø> (ø)
    packages/web-crawler 95.62% <ø> (ø)

    Flags with carried forward coverage won't be shown. Click here to find out more.

    Components Coverage Δ
    Store 66.81% <ø> (ø)
    Services 50.80% <ø> (ø)
    Server 67.81% <0.00%> (-0.02%) ⬇️
    Libs 41.13% <ø> (ø)
    Utils 93.82% <ø> (ø)
    🚀 New features to boost your workflow:
    • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
    • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

    @ONLY-yours ONLY-yours merged commit 4e060be into next Jan 22, 2026
    47 of 48 checks passed
    @ONLY-yours ONLY-yours deleted the fix/CronJobFixed branch January 22, 2026 02:58
    @lobehubbot
    Copy link
    Copy Markdown
    Member

    lobehubbot commented Jan 22, 2026

    ❤️ Great PR @ONLY-yours ❤️

    The growth of the project is inseparable from user feedback and contributions. Thanks for your contribution! If you are interested in the lobehub developer community, please join our discord and then DM @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about lobe-chat development and sharing AI newsletters from around the world.


    This comment was translated by Claude.

    Original Content

    ❤️ Great PR @ONLY-yours ❤️

    The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world.

    lobehubbot pushed a commit that referenced this pull request Jan 22, 2026
    ## [Version&nbsp;2.0.0-next.336](v2.0.0-next.335...v2.0.0-next.336)
    <sup>Released on **2026-01-22**</sup>
    
    #### ✨ Features
    
    - **misc**: Support agent group unpublish agents.
    
    #### 🐛 Bug Fixes
    
    - **misc**: Fix tool argument scape and improve multi task run.
    
    <br/>
    
    <details>
    <summary><kbd>Improvements and Fixes</kbd></summary>
    
    #### What's improved
    
    * **misc**: Support agent group unpublish agents, closes [#11687](#11687) ([4e060be](4e060be))
    
    #### What's fixed
    
    * **misc**: Fix tool argument scape and improve multi task run, closes [#11691](#11691) ([b13bb8a](b13bb8a))
    
    </details>
    
    <div align="right">
    
    [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
    
    </div>
    @lobehubbot
    Copy link
    Copy Markdown
    Member

    🎉 This PR is included in version 2.0.0-next.336 🎉

    The release is available on:

    Your semantic-release bot 📦🚀

    JamieStivala pushed a commit to jaworldwideorg/OneJA-Bot that referenced this pull request Jan 23, 2026
    ## [Version&nbsp;1.153.0](v1.152.0...v1.153.0)
    <sup>Released on **2026-01-23**</sup>
    
    #### ♻ Code Refactoring
    
    - **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable.
    - **model-select**: Migrate FunctionCallingModelSelect to LobeSelect.
    - **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling.
    - **userMemories**: Removed un-used code.
    - **misc**: Improve memory data with experience and identity, move vercel-react-best-practices skills to .agents directory.
    
    #### ✨ Features
    
    - **database**: Added user memory activity.
    - **desktop**: Add legacy local database detection and migration guidance.
    - **misc**: Add platform-aware download client menu option, add server version check for desktop app, remove Clerk authentication code, skill setting page and skill store, support agent group unpublish agents, support client tasks mode, update the sandbox preinstall libs in sys role.
    
    #### 🐛 Bug Fixes
    
    - **copilot**: Pass correct scope when creating new session in PageEditor.
    - **desktop**: Gracefully handle missing update manifest 404 errors.
    - **model-runtime**: Filter unsupported image types (SVG) before sending to vision models.
    - **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x.
    - **sidebar-drawer**: Fix drawer positioning and title style.
    - **misc**: Fix group broadcast trigger tool use, fix local system tools, fix memory schema, fix multi agent tasks issue, fix multi tasks no summary issue, fix scope issue, fix tool argument scape and improve multi task run, fixed the sandbox tools call when error should use right callback, improve e2e server and complete i18n resources, slove the agent group editor not focus in editdata area, slove the agents header switch agents the lobeAI not show problem, sloved the old removeSessionTopics not work, TypewriterEffect not refreshing on language change, updata cron job ui & fixed commnuity pagenation goto error, update the agentbuilder tools not always use humanIntervention.
    
    #### 💄 Styles
    
    - **misc**: Improve auto scroll and group profile, update og, update share style.
    
    <br/>
    
    <details>
    <summary><kbd>Improvements and Fixes</kbd></summary>
    
    #### Code refactoring
    
    * **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable, closes [lobehub#11658](https://github.com/jaworldwideorg/OneJA-Bot/issues/11658) ([c0f9875](c0f9875))
    * **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [lobehub#11664](https://github.com/jaworldwideorg/OneJA-Bot/issues/11664) ([ad51305](ad51305))
    * **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [lobehub#11663](https://github.com/jaworldwideorg/OneJA-Bot/issues/11663) ([c9d9dff](c9d9dff))
    * **userMemories**: Removed un-used code, closes [lobehub#11713](https://github.com/jaworldwideorg/OneJA-Bot/issues/11713) ([89750fc](89750fc))
    * **misc**: Improve memory data with experience and identity, closes [lobehub#11717](https://github.com/jaworldwideorg/OneJA-Bot/issues/11717) ([bdb3eb4](bdb3eb4))
    * **misc**: Move vercel-react-best-practices skills to .agents directory, closes [lobehub#11703](https://github.com/jaworldwideorg/OneJA-Bot/issues/11703) ([6df7731](6df7731))
    
    #### What's improved
    
    * **database**: Added user memory activity, closes [lobehub#11680](https://github.com/jaworldwideorg/OneJA-Bot/issues/11680) ([0160fbd](0160fbd))
    * **desktop**: Add legacy local database detection and migration guidance, closes [lobehub#11682](https://github.com/jaworldwideorg/OneJA-Bot/issues/11682) ([5664b84](5664b84))
    * **misc**: Add platform-aware download client menu option, closes [lobehub#11676](https://github.com/jaworldwideorg/OneJA-Bot/issues/11676) ([55abddc](55abddc))
    * **misc**: Add server version check for desktop app, closes [lobehub#11710](https://github.com/jaworldwideorg/OneJA-Bot/issues/11710) ([0cf2723](0cf2723))
    * **misc**: Remove Clerk authentication code, closes [lobehub#11711](https://github.com/jaworldwideorg/OneJA-Bot/issues/11711) ([395595a](395595a))
    * **misc**: Skill setting page and skill store, closes [lobehub#11665](https://github.com/jaworldwideorg/OneJA-Bot/issues/11665) ([d8c0c26](d8c0c26))
    * **misc**: Support agent group unpublish agents, closes [lobehub#11687](https://github.com/jaworldwideorg/OneJA-Bot/issues/11687) ([4e060be](4e060be))
    * **misc**: Support client tasks mode, closes [lobehub#11666](https://github.com/jaworldwideorg/OneJA-Bot/issues/11666) ([98cf57b](98cf57b))
    * **misc**: Update the sandbox preinstall libs in sys role, closes [lobehub#11688](https://github.com/jaworldwideorg/OneJA-Bot/issues/11688) ([404c577](404c577))
    
    #### What's fixed
    
    * **copilot**: Pass correct scope when creating new session in PageEditor, closes [lobehub#11714](https://github.com/jaworldwideorg/OneJA-Bot/issues/11714) ([0259270](0259270))
    * **desktop**: Gracefully handle missing update manifest 404 errors, closes [lobehub#11625](https://github.com/jaworldwideorg/OneJA-Bot/issues/11625) ([13e95b9](13e95b9))
    * **model-runtime**: Filter unsupported image types (SVG) before sending to vision models, closes [lobehub#11698](https://github.com/jaworldwideorg/OneJA-Bot/issues/11698) ([c0c99a7](c0c99a7))
    * **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x, closes [lobehub#11686](https://github.com/jaworldwideorg/OneJA-Bot/issues/11686) ([2b620df](2b620df))
    * **sidebar-drawer**: Fix drawer positioning and title style, closes [lobehub#11655](https://github.com/jaworldwideorg/OneJA-Bot/issues/11655) ([cf5320e](cf5320e))
    * **misc**: Fix group broadcast trigger tool use, closes [lobehub#11646](https://github.com/jaworldwideorg/OneJA-Bot/issues/11646) ([831a9b3](831a9b3))
    * **misc**: Fix local system tools, closes [lobehub#11702](https://github.com/jaworldwideorg/OneJA-Bot/issues/11702) ([6548fc7](6548fc7))
    * **misc**: Fix memory schema, closes [lobehub#11645](https://github.com/jaworldwideorg/OneJA-Bot/issues/11645) ([3baf780](3baf780))
    * **misc**: Fix multi agent tasks issue, closes [lobehub#11672](https://github.com/jaworldwideorg/OneJA-Bot/issues/11672) ([9de773b](9de773b))
    * **misc**: Fix multi tasks no summary issue, closes [lobehub#11685](https://github.com/jaworldwideorg/OneJA-Bot/issues/11685) ([26ce317](26ce317))
    * **misc**: Fix scope issue, closes [lobehub#11719](https://github.com/jaworldwideorg/OneJA-Bot/issues/11719) ([17adde8](17adde8))
    * **misc**: Fix tool argument scape and improve multi task run, closes [lobehub#11691](https://github.com/jaworldwideorg/OneJA-Bot/issues/11691) ([b13bb8a](b13bb8a))
    * **misc**: Fixed the sandbox tools call when error should use right callback, closes [lobehub#11721](https://github.com/jaworldwideorg/OneJA-Bot/issues/11721) ([e8fce68](e8fce68))
    * **misc**: Improve e2e server and complete i18n resources, closes [lobehub#11678](https://github.com/jaworldwideorg/OneJA-Bot/issues/11678) ([d450dd9](d450dd9))
    * **misc**: Slove the agent group editor not focus in editdata area, closes [lobehub#11677](https://github.com/jaworldwideorg/OneJA-Bot/issues/11677) ([9ac84e6](9ac84e6))
    * **misc**: Slove the agents header switch agents the lobeAI not show problem, closes [lobehub#11726](https://github.com/jaworldwideorg/OneJA-Bot/issues/11726) ([f45f508](f45f508))
    * **misc**: Sloved the old removeSessionTopics not work, closes [lobehub#11671](https://github.com/jaworldwideorg/OneJA-Bot/issues/11671) ([06d41e5](06d41e5))
    * **misc**: TypewriterEffect not refreshing on language change, closes [lobehub#11657](https://github.com/jaworldwideorg/OneJA-Bot/issues/11657) ([ba30f46](ba30f46))
    * **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [lobehub#11700](https://github.com/jaworldwideorg/OneJA-Bot/issues/11700) ([42ad2a0](42ad2a0))
    * **misc**: Update the agentbuilder tools not always use humanIntervention, closes [lobehub#11696](https://github.com/jaworldwideorg/OneJA-Bot/issues/11696) ([0d3017b](0d3017b))
    
    #### Styles
    
    * **misc**: Improve auto scroll and group profile, closes [lobehub#11725](https://github.com/jaworldwideorg/OneJA-Bot/issues/11725) ([550acc2](550acc2))
    * **misc**: Update og, closes [lobehub#11709](https://github.com/jaworldwideorg/OneJA-Bot/issues/11709) ([01cf4e4](01cf4e4))
    * **misc**: Update share style, closes [lobehub#11716](https://github.com/jaworldwideorg/OneJA-Bot/issues/11716) ([3c70dfa](3c70dfa))
    
    </details>
    
    <div align="right">
    
    [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
    
    </div>
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    released on @next size:L This PR changes 100-499 lines, ignoring generated files.

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    2 participants