@lobehub/lobehub 2.0.0-next.322 → 2.0.0-next.324

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/apps/desktop/src/main/core/infrastructure/UpdaterManager.ts +9 -76
  3. package/apps/desktop/src/main/core/infrastructure/__tests__/UpdaterManager.test.ts +0 -1
  4. package/apps/desktop/src/main/modules/updater/configs.ts +0 -4
  5. package/changelog/v1.json +24 -0
  6. package/e2e/src/mocks/llm/index.ts +3 -3
  7. package/locales/ar/common.json +5 -0
  8. package/locales/ar/error.json +10 -1
  9. package/locales/bg-BG/common.json +5 -0
  10. package/locales/bg-BG/error.json +10 -1
  11. package/locales/de-DE/common.json +5 -0
  12. package/locales/de-DE/error.json +10 -1
  13. package/locales/en-US/common.json +5 -0
  14. package/locales/es-ES/common.json +5 -0
  15. package/locales/es-ES/error.json +10 -1
  16. package/locales/fa-IR/common.json +5 -0
  17. package/locales/fa-IR/error.json +10 -1
  18. package/locales/fr-FR/common.json +5 -0
  19. package/locales/fr-FR/error.json +10 -1
  20. package/locales/it-IT/common.json +5 -0
  21. package/locales/it-IT/error.json +10 -1
  22. package/locales/ja-JP/common.json +5 -0
  23. package/locales/ja-JP/error.json +10 -1
  24. package/locales/ko-KR/common.json +5 -0
  25. package/locales/ko-KR/error.json +10 -1
  26. package/locales/nl-NL/common.json +5 -0
  27. package/locales/nl-NL/error.json +10 -1
  28. package/locales/pl-PL/common.json +5 -0
  29. package/locales/pl-PL/error.json +10 -1
  30. package/locales/pt-BR/common.json +5 -0
  31. package/locales/pt-BR/error.json +10 -1
  32. package/locales/ru-RU/common.json +5 -0
  33. package/locales/ru-RU/error.json +10 -1
  34. package/locales/tr-TR/common.json +5 -0
  35. package/locales/tr-TR/error.json +10 -1
  36. package/locales/vi-VN/common.json +5 -0
  37. package/locales/vi-VN/error.json +10 -1
  38. package/locales/zh-CN/common.json +5 -0
  39. package/locales/zh-TW/common.json +5 -0
  40. package/locales/zh-TW/error.json +10 -1
  41. package/package.json +2 -2
  42. package/packages/business/const/src/branding.ts +1 -0
  43. package/packages/business/const/src/llm.ts +2 -1
  44. package/packages/const/src/settings/llm.ts +2 -1
  45. package/packages/const/src/settings/systemAgent.ts +12 -7
  46. package/packages/database/src/models/agent.ts +18 -1
  47. package/packages/database/src/models/chatGroup.ts +18 -1
  48. package/packages/database/src/types/chatGroup.ts +1 -0
  49. package/packages/model-bank/package.json +1 -1
  50. package/packages/model-bank/src/aiModels/index.ts +2 -2
  51. package/packages/model-bank/src/aiModels/lobehub/chat/anthropic.ts +256 -0
  52. package/packages/model-bank/src/aiModels/lobehub/chat/deepseek.ts +45 -0
  53. package/packages/model-bank/src/aiModels/lobehub/chat/google.ts +267 -0
  54. package/packages/model-bank/src/aiModels/lobehub/chat/index.ts +26 -0
  55. package/packages/model-bank/src/aiModels/lobehub/chat/minimax.ts +75 -0
  56. package/packages/model-bank/src/aiModels/lobehub/chat/moonshot.ts +28 -0
  57. package/packages/model-bank/src/aiModels/lobehub/chat/openai.ts +345 -0
  58. package/packages/model-bank/src/aiModels/lobehub/chat/xai.ts +32 -0
  59. package/packages/model-bank/src/aiModels/lobehub/image.ts +240 -0
  60. package/packages/model-bank/src/aiModels/lobehub/index.ts +10 -0
  61. package/packages/model-bank/src/aiModels/lobehub/utils.ts +58 -0
  62. package/packages/model-bank/src/modelProviders/index.ts +10 -10
  63. package/packages/model-runtime/src/core/streams/qwen.test.ts +320 -0
  64. package/packages/model-runtime/src/core/streams/qwen.ts +19 -10
  65. package/packages/types/package.json +1 -1
  66. package/packages/types/src/agentGroup/index.ts +2 -0
  67. package/packages/types/src/discover/assistants.ts +9 -0
  68. package/packages/types/src/discover/fork.ts +163 -0
  69. package/packages/types/src/discover/groupAgents.ts +13 -4
  70. package/packages/types/src/discover/index.ts +9 -0
  71. package/src/app/[variants]/(auth)/_layout/index.tsx +2 -1
  72. package/src/app/[variants]/(auth)/auth-error/page.tsx +5 -5
  73. package/src/app/[variants]/(desktop)/desktop-onboarding/components/LobeMessage.tsx +5 -0
  74. package/src/app/[variants]/(desktop)/desktop-onboarding/features/WelcomeStep.tsx +3 -1
  75. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/Item/index.tsx +1 -2
  76. package/src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx +37 -0
  77. package/src/app/[variants]/(main)/community/(detail)/agent/features/Sidebar/ActionButton/ForkAndChat.tsx +133 -0
  78. package/src/app/[variants]/(main)/community/(detail)/agent/features/Sidebar/ActionButton/index.tsx +2 -2
  79. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/index.tsx +7 -10
  80. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/ForkGroupAndChat.tsx +208 -0
  81. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/index.tsx +2 -2
  82. package/src/app/[variants]/(main)/community/(detail)/user/features/DetailProvider.tsx +2 -0
  83. package/src/app/[variants]/(main)/community/(detail)/user/features/UserContent.tsx +7 -0
  84. package/src/app/[variants]/(main)/community/(detail)/user/features/UserForkedAgentGroups.tsx +63 -0
  85. package/src/app/[variants]/(main)/community/(detail)/user/features/UserForkedAgents.tsx +61 -0
  86. package/src/app/[variants]/(main)/community/(detail)/user/index.tsx +3 -1
  87. package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/List/Item/index.tsx +1 -2
  88. package/src/app/[variants]/(main)/home/features/WelcomeText/index.tsx +3 -1
  89. package/src/app/[variants]/(main)/settings/profile/index.tsx +92 -68
  90. package/src/app/[variants]/(mobile)/chat/features/Topic/index.tsx +2 -1
  91. package/src/app/[variants]/onboarding/components/LobeMessage.tsx +5 -0
  92. package/src/app/[variants]/onboarding/features/TelemetryStep.tsx +3 -1
  93. package/src/features/CommandMenu/AskAgentCommands.tsx +105 -0
  94. package/src/features/CommandMenu/CommandMenuContext.tsx +57 -38
  95. package/src/features/CommandMenu/components/CommandInput.tsx +43 -9
  96. package/src/features/CommandMenu/index.tsx +89 -27
  97. package/src/features/CommandMenu/types.ts +6 -0
  98. package/src/features/CommandMenu/useCommandMenu.ts +62 -39
  99. package/src/locales/default/common.ts +5 -0
  100. package/src/locales/default/discover.ts +371 -0
  101. package/src/server/globalConfig/parseMemoryExtractionConfig.ts +7 -8
  102. package/src/server/routers/lambda/agent.ts +14 -0
  103. package/src/server/routers/lambda/agentGroup.ts +19 -3
  104. package/src/server/routers/lambda/market/agent.ts +234 -26
  105. package/src/server/routers/lambda/market/agentGroup.ts +204 -1
  106. package/src/server/services/discover/index.ts +52 -2
  107. package/src/services/agent.ts +8 -0
  108. package/src/services/chatGroup/index.ts +8 -0
  109. package/src/services/marketApi.ts +78 -0
  110. package/src/store/user/slices/settings/selectors/__snapshots__/settings.test.ts.snap +12 -12
  111. package/packages/model-bank/src/aiModels/lobehub.ts +0 -1315
@@ -1736,6 +1736,8 @@ export class DiscoverService {
1736
1736
  locale,
1737
1737
  })) as UserInfoResponse & {
1738
1738
  agentGroups?: any[];
1739
+ forkedAgentGroups?: any[];
1740
+ forkedAgents?: any[];
1739
1741
  };
1740
1742
 
1741
1743
  if (!response?.user) {
@@ -1743,7 +1745,7 @@ export class DiscoverService {
1743
1745
  return undefined;
1744
1746
  }
1745
1747
 
1746
- const { user, agents, agentGroups } = response;
1748
+ const { user, agents, agentGroups, forkedAgents, forkedAgentGroups } = response;
1747
1749
 
1748
1750
  // Transform agents to DiscoverAssistantItem format
1749
1751
  const transformedAgents: DiscoverAssistantItem[] = (agents || []).map((agent: any) => ({
@@ -1783,9 +1785,55 @@ export class DiscoverService {
1783
1785
  updatedAt: group.updatedAt,
1784
1786
  }));
1785
1787
 
1788
+ // Transform forkedAgents to DiscoverAssistantItem format
1789
+ const transformedForkedAgents: DiscoverAssistantItem[] = (forkedAgents || []).map(
1790
+ (agent: any) => ({
1791
+ author: user.displayName || user.userName || user.namespace || '',
1792
+ avatar: agent.avatar || '',
1793
+ category: agent.category as any,
1794
+ config: {} as any,
1795
+ createdAt: agent.createdAt,
1796
+ description: agent.description || '',
1797
+ forkCount: agent.forkCount || 0,
1798
+ forkedFromAgentId: agent.forkedFromAgentId || null,
1799
+ homepage: `https://lobehub.com/discover/assistant/${agent.identifier}`,
1800
+ identifier: agent.identifier,
1801
+ installCount: agent.installCount,
1802
+ knowledgeCount: agent.knowledgeCount || 0,
1803
+ pluginCount: agent.pluginCount || 0,
1804
+ schemaVersion: 1,
1805
+ tags: agent.tags || [],
1806
+ title: agent.name || agent.identifier,
1807
+ tokenUsage: agent.tokenUsage || 0,
1808
+ }),
1809
+ );
1810
+
1811
+ // Transform forkedAgentGroups to DiscoverGroupAgentItem format
1812
+ const transformedForkedAgentGroups = (forkedAgentGroups || []).map((group: any) => ({
1813
+ author: user.displayName || user.userName || user.namespace || '',
1814
+ avatar: group.avatar || '👥',
1815
+ category: group.category as any,
1816
+ createdAt: group.createdAt,
1817
+ description: group.description || '',
1818
+ forkCount: group.forkCount || 0,
1819
+ forkedFromGroupId: group.forkedFromGroupId || null,
1820
+ homepage: `https://lobehub.com/discover/group_agent/${group.identifier}`,
1821
+ identifier: group.identifier,
1822
+ installCount: group.installCount || 0,
1823
+ isFeatured: group.isFeatured || false,
1824
+ isOfficial: group.isOfficial || false,
1825
+ memberCount: 0, // Will be populated from memberAgents in detail view
1826
+ schemaVersion: 1,
1827
+ tags: group.tags || [],
1828
+ title: group.name || group.identifier,
1829
+ updatedAt: group.updatedAt,
1830
+ }));
1831
+
1786
1832
  const result: DiscoverUserProfile = {
1787
1833
  agentGroups: transformedAgentGroups,
1788
1834
  agents: transformedAgents,
1835
+ forkedAgentGroups: transformedForkedAgentGroups,
1836
+ forkedAgents: transformedForkedAgents,
1789
1837
  user: {
1790
1838
  avatarUrl: user.avatarUrl || null,
1791
1839
  bannerUrl: user.meta?.bannerUrl || null,
@@ -1803,9 +1851,11 @@ export class DiscoverService {
1803
1851
  };
1804
1852
 
1805
1853
  log(
1806
- 'getUserInfo: returning user profile with %d agents and %d groups',
1854
+ 'getUserInfo: returning user profile with %d agents, %d groups, %d forked agents, %d forked groups',
1807
1855
  result.agents.length,
1808
1856
  result.agentGroups?.length || 0,
1857
+ result.forkedAgents?.length || 0,
1858
+ result.forkedAgentGroups?.length || 0,
1809
1859
  );
1810
1860
  return result;
1811
1861
  } catch (error) {
@@ -76,6 +76,14 @@ class AgentService {
76
76
  return lambdaClient.agent.getAgentByMarketIdentifier.query({ marketIdentifier });
77
77
  };
78
78
 
79
+ /**
80
+ * Get an agent by forkedFromIdentifier stored in params
81
+ * @returns agent id if exists, null otherwise
82
+ */
83
+ getAgentByForkedFromIdentifier = async (forkedFromIdentifier: string): Promise<string | null> => {
84
+ return lambdaClient.agent.getAgentByForkedFromIdentifier.query({ forkedFromIdentifier });
85
+ };
86
+
79
87
  /**
80
88
  * Create a new agent with session.
81
89
  * Automatically normalizes market agent config (handles model as object).
@@ -33,6 +33,14 @@ export interface SupervisorConfig {
33
33
  }
34
34
 
35
35
  class ChatGroupService {
36
+ /**
37
+ * Get a group by forkedFromIdentifier stored in config
38
+ * @returns group id if exists, null otherwise
39
+ */
40
+ getGroupByForkedFromIdentifier = async (forkedFromIdentifier: string): Promise<string | null> => {
41
+ return lambdaClient.group.getGroupByForkedFromIdentifier.query({ forkedFromIdentifier });
42
+ };
43
+
36
44
  /**
37
45
  * Create a group with a supervisor agent.
38
46
  * The supervisor agent is automatically created as a virtual agent.
@@ -5,6 +5,16 @@ import {
5
5
  } from '@lobehub/market-sdk';
6
6
 
7
7
  import { lambdaClient } from '@/libs/trpc/client';
8
+ import type {
9
+ AgentForkRequest,
10
+ AgentForkResponse,
11
+ AgentForkSourceResponse,
12
+ AgentForksResponse,
13
+ AgentGroupForkRequest,
14
+ AgentGroupForkResponse,
15
+ AgentGroupForkSourceResponse,
16
+ AgentGroupForksResponse,
17
+ } from '@/types/discover';
8
18
 
9
19
  interface GetOwnAgentsParams {
10
20
  page?: number;
@@ -101,6 +111,74 @@ export class MarketApiService {
101
111
  async getOwnAgents(params?: GetOwnAgentsParams): Promise<AgentListResponse> {
102
112
  return lambdaClient.market.agent.getOwnAgents.query(params) as Promise<AgentListResponse>;
103
113
  }
114
+
115
+ // ==================== Fork Agent API ====================
116
+
117
+ /**
118
+ * Fork an agent
119
+ * @param sourceIdentifier - Source agent identifier
120
+ * @param forkData - Fork request parameters
121
+ */
122
+ async forkAgent(
123
+ sourceIdentifier: string,
124
+ forkData: AgentForkRequest,
125
+ ): Promise<AgentForkResponse> {
126
+ return lambdaClient.market.agent.forkAgent.mutate({
127
+ sourceIdentifier,
128
+ ...forkData,
129
+ });
130
+ }
131
+
132
+ /**
133
+ * Get all forks of an agent
134
+ * @param identifier - Agent identifier
135
+ */
136
+ async getAgentForks(identifier: string): Promise<AgentForksResponse> {
137
+ return lambdaClient.market.agent.getAgentForks.query({ identifier });
138
+ }
139
+
140
+ /**
141
+ * Get the fork source of an agent
142
+ * @param identifier - Agent identifier
143
+ * @returns Fork source information (null if not a fork)
144
+ */
145
+ async getAgentForkSource(identifier: string): Promise<AgentForkSourceResponse> {
146
+ return lambdaClient.market.agent.getAgentForkSource.query({ identifier });
147
+ }
148
+
149
+ // ==================== Fork Agent Group API ====================
150
+
151
+ /**
152
+ * Fork an agent group
153
+ * @param sourceIdentifier - Source agent group identifier
154
+ * @param forkData - Fork request parameters
155
+ */
156
+ async forkAgentGroup(
157
+ sourceIdentifier: string,
158
+ forkData: AgentGroupForkRequest,
159
+ ): Promise<AgentGroupForkResponse> {
160
+ return lambdaClient.market.agentGroup.forkAgentGroup.mutate({
161
+ sourceIdentifier,
162
+ ...forkData,
163
+ });
164
+ }
165
+
166
+ /**
167
+ * Get all forks of an agent group
168
+ * @param identifier - Agent group identifier
169
+ */
170
+ async getAgentGroupForks(identifier: string): Promise<AgentGroupForksResponse> {
171
+ return lambdaClient.market.agentGroup.getAgentGroupForks.query({ identifier });
172
+ }
173
+
174
+ /**
175
+ * Get the fork source of an agent group
176
+ * @param identifier - Agent group identifier
177
+ * @returns Fork source information (null if not a fork)
178
+ */
179
+ async getAgentGroupForkSource(identifier: string): Promise<AgentGroupForkSourceResponse> {
180
+ return lambdaClient.market.agentGroup.getAgentGroupForkSource.query({ identifier });
181
+ }
104
182
  }
105
183
 
106
184
  export const marketApiService = new MarketApiService();
@@ -51,8 +51,8 @@ exports[`settingsSelectors > currentSettings > should merge DEFAULT_SETTINGS and
51
51
  exports[`settingsSelectors > currentSystemAgent > should merge DEFAULT_SYSTEM_AGENT_CONFIG and s.settings.systemAgent correctly 1`] = `
52
52
  {
53
53
  "agentMeta": {
54
- "model": "gpt-5-mini",
55
- "provider": "openai",
54
+ "model": "claude-sonnet-4-5-20250929",
55
+ "provider": "anthropic",
56
56
  },
57
57
  "enableAutoReply": true,
58
58
  "generationTopic": {
@@ -60,8 +60,8 @@ exports[`settingsSelectors > currentSystemAgent > should merge DEFAULT_SYSTEM_AG
60
60
  "provider": "openai",
61
61
  },
62
62
  "historyCompress": {
63
- "model": "gpt-5-mini",
64
- "provider": "openai",
63
+ "model": "claude-sonnet-4-5-20250929",
64
+ "provider": "anthropic",
65
65
  },
66
66
  "queryRewrite": {
67
67
  "enabled": true,
@@ -70,8 +70,8 @@ exports[`settingsSelectors > currentSystemAgent > should merge DEFAULT_SYSTEM_AG
70
70
  },
71
71
  "replyMessage": "Custom auto reply",
72
72
  "thread": {
73
- "model": "gpt-5-mini",
74
- "provider": "openai",
73
+ "model": "claude-sonnet-4-5-20250929",
74
+ "provider": "anthropic",
75
75
  },
76
76
  "topic": {
77
77
  "model": "gpt-5-mini",
@@ -108,8 +108,8 @@ exports[`settingsSelectors > defaultAgent > should merge DEFAULT_AGENT and s.set
108
108
  "historyCount": 20,
109
109
  "reasoningBudgetToken": 1024,
110
110
  "searchFCModel": {
111
- "model": "gpt-5-mini",
112
- "provider": "openai",
111
+ "model": "claude-sonnet-4-5-20250929",
112
+ "provider": "anthropic",
113
113
  },
114
114
  "searchMode": "off",
115
115
  },
@@ -122,7 +122,7 @@ exports[`settingsSelectors > defaultAgent > should merge DEFAULT_AGENT and s.set
122
122
  "top_p": 1,
123
123
  },
124
124
  "plugins": [],
125
- "provider": "openai",
125
+ "provider": "anthropic",
126
126
  "systemRole": "user",
127
127
  "tts": {
128
128
  "showAllLocaleVoice": false,
@@ -152,8 +152,8 @@ exports[`settingsSelectors > defaultAgentConfig > should merge DEFAULT_AGENT_CON
152
152
  "historyCount": 20,
153
153
  "reasoningBudgetToken": 1024,
154
154
  "searchFCModel": {
155
- "model": "gpt-5-mini",
156
- "provider": "openai",
155
+ "model": "claude-sonnet-4-5-20250929",
156
+ "provider": "anthropic",
157
157
  },
158
158
  "searchMode": "off",
159
159
  },
@@ -166,7 +166,7 @@ exports[`settingsSelectors > defaultAgentConfig > should merge DEFAULT_AGENT_CON
166
166
  "top_p": 1,
167
167
  },
168
168
  "plugins": [],
169
- "provider": "openai",
169
+ "provider": "anthropic",
170
170
  "systemRole": "custom role",
171
171
  "tts": {
172
172
  "showAllLocaleVoice": false,