@lobehub/lobehub 2.0.0-next.307 → 2.0.0-next.309

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 (221) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/changelog/v1.json +21 -0
  3. package/locales/ar/agentGroup.json +5 -0
  4. package/locales/ar/chat.json +26 -0
  5. package/locales/ar/models.json +43 -5
  6. package/locales/ar/plugin.json +4 -5
  7. package/locales/ar/setting.json +11 -0
  8. package/locales/ar/subscription.json +2 -0
  9. package/locales/ar/tool.json +2 -0
  10. package/locales/bg-BG/agentGroup.json +5 -0
  11. package/locales/bg-BG/chat.json +26 -0
  12. package/locales/bg-BG/models.json +49 -3
  13. package/locales/bg-BG/plugin.json +4 -5
  14. package/locales/bg-BG/setting.json +11 -0
  15. package/locales/bg-BG/subscription.json +2 -0
  16. package/locales/bg-BG/tool.json +2 -0
  17. package/locales/de-DE/agentGroup.json +5 -0
  18. package/locales/de-DE/chat.json +26 -0
  19. package/locales/de-DE/models.json +48 -5
  20. package/locales/de-DE/plugin.json +4 -5
  21. package/locales/de-DE/setting.json +11 -0
  22. package/locales/de-DE/subscription.json +2 -0
  23. package/locales/de-DE/tool.json +2 -0
  24. package/locales/en-US/models.json +8 -6
  25. package/locales/en-US/plugin.json +3 -4
  26. package/locales/en-US/setting.json +10 -11
  27. package/locales/en-US/tool.json +2 -0
  28. package/locales/es-ES/agentGroup.json +5 -0
  29. package/locales/es-ES/chat.json +26 -0
  30. package/locales/es-ES/models.json +43 -5
  31. package/locales/es-ES/plugin.json +4 -5
  32. package/locales/es-ES/setting.json +11 -0
  33. package/locales/es-ES/subscription.json +2 -0
  34. package/locales/es-ES/tool.json +2 -0
  35. package/locales/fa-IR/agentGroup.json +5 -0
  36. package/locales/fa-IR/chat.json +26 -0
  37. package/locales/fa-IR/models.json +42 -5
  38. package/locales/fa-IR/plugin.json +4 -5
  39. package/locales/fa-IR/setting.json +11 -0
  40. package/locales/fa-IR/subscription.json +2 -0
  41. package/locales/fa-IR/tool.json +2 -0
  42. package/locales/fr-FR/agentGroup.json +5 -0
  43. package/locales/fr-FR/chat.json +26 -0
  44. package/locales/fr-FR/models.json +5 -5
  45. package/locales/fr-FR/plugin.json +4 -5
  46. package/locales/fr-FR/setting.json +11 -0
  47. package/locales/fr-FR/subscription.json +2 -0
  48. package/locales/fr-FR/tool.json +2 -0
  49. package/locales/it-IT/agentGroup.json +5 -0
  50. package/locales/it-IT/chat.json +26 -0
  51. package/locales/it-IT/models.json +1 -3
  52. package/locales/it-IT/plugin.json +4 -5
  53. package/locales/it-IT/setting.json +11 -0
  54. package/locales/it-IT/subscription.json +2 -0
  55. package/locales/it-IT/tool.json +2 -0
  56. package/locales/ja-JP/agentGroup.json +5 -0
  57. package/locales/ja-JP/chat.json +26 -0
  58. package/locales/ja-JP/models.json +1 -5
  59. package/locales/ja-JP/plugin.json +4 -5
  60. package/locales/ja-JP/setting.json +11 -0
  61. package/locales/ja-JP/subscription.json +2 -0
  62. package/locales/ja-JP/tool.json +2 -0
  63. package/locales/ko-KR/agentGroup.json +5 -0
  64. package/locales/ko-KR/chat.json +26 -0
  65. package/locales/ko-KR/models.json +1 -3
  66. package/locales/ko-KR/plugin.json +4 -5
  67. package/locales/ko-KR/setting.json +11 -0
  68. package/locales/ko-KR/subscription.json +2 -0
  69. package/locales/ko-KR/tool.json +2 -0
  70. package/locales/nl-NL/agentGroup.json +5 -0
  71. package/locales/nl-NL/chat.json +26 -0
  72. package/locales/nl-NL/models.json +35 -3
  73. package/locales/nl-NL/plugin.json +4 -5
  74. package/locales/nl-NL/setting.json +11 -0
  75. package/locales/nl-NL/subscription.json +2 -0
  76. package/locales/nl-NL/tool.json +2 -0
  77. package/locales/pl-PL/agentGroup.json +5 -0
  78. package/locales/pl-PL/chat.json +26 -0
  79. package/locales/pl-PL/models.json +1 -3
  80. package/locales/pl-PL/plugin.json +4 -5
  81. package/locales/pl-PL/setting.json +11 -0
  82. package/locales/pl-PL/subscription.json +2 -0
  83. package/locales/pl-PL/tool.json +2 -0
  84. package/locales/pt-BR/agentGroup.json +5 -0
  85. package/locales/pt-BR/chat.json +26 -0
  86. package/locales/pt-BR/models.json +50 -5
  87. package/locales/pt-BR/plugin.json +4 -5
  88. package/locales/pt-BR/setting.json +11 -0
  89. package/locales/pt-BR/subscription.json +2 -0
  90. package/locales/pt-BR/tool.json +2 -0
  91. package/locales/ru-RU/agentGroup.json +5 -0
  92. package/locales/ru-RU/chat.json +26 -0
  93. package/locales/ru-RU/models.json +22 -3
  94. package/locales/ru-RU/plugin.json +4 -5
  95. package/locales/ru-RU/setting.json +11 -0
  96. package/locales/ru-RU/subscription.json +2 -0
  97. package/locales/ru-RU/tool.json +2 -0
  98. package/locales/tr-TR/agentGroup.json +5 -0
  99. package/locales/tr-TR/chat.json +26 -0
  100. package/locales/tr-TR/models.json +36 -3
  101. package/locales/tr-TR/plugin.json +4 -5
  102. package/locales/tr-TR/setting.json +11 -0
  103. package/locales/tr-TR/subscription.json +2 -0
  104. package/locales/tr-TR/tool.json +2 -0
  105. package/locales/vi-VN/agentGroup.json +5 -0
  106. package/locales/vi-VN/chat.json +26 -0
  107. package/locales/vi-VN/models.json +1 -1
  108. package/locales/vi-VN/plugin.json +4 -5
  109. package/locales/vi-VN/setting.json +11 -0
  110. package/locales/vi-VN/subscription.json +2 -0
  111. package/locales/vi-VN/tool.json +2 -0
  112. package/locales/zh-CN/models.json +52 -5
  113. package/locales/zh-CN/plugin.json +6 -7
  114. package/locales/zh-CN/setting.json +10 -11
  115. package/locales/zh-CN/tool.json +2 -2
  116. package/locales/zh-TW/agentGroup.json +5 -0
  117. package/locales/zh-TW/chat.json +26 -0
  118. package/locales/zh-TW/models.json +54 -5
  119. package/locales/zh-TW/plugin.json +4 -5
  120. package/locales/zh-TW/setting.json +11 -0
  121. package/locales/zh-TW/subscription.json +2 -0
  122. package/locales/zh-TW/tool.json +2 -0
  123. package/package.json +1 -1
  124. package/packages/agent-runtime/src/types/state.ts +2 -0
  125. package/packages/builtin-tool-group-agent-builder/src/client/Inspector/GetAgentInfo/index.tsx +68 -0
  126. package/packages/builtin-tool-group-agent-builder/src/client/Inspector/index.ts +3 -0
  127. package/packages/builtin-tool-group-management/src/client/Inspector/ExecuteAgentTask/index.tsx +52 -8
  128. package/packages/builtin-tool-group-management/src/client/Render/ExecuteTask/index.tsx +2 -21
  129. package/packages/builtin-tool-group-management/src/executor.test.ts +6 -4
  130. package/packages/builtin-tool-group-management/src/manifest.ts +5 -1
  131. package/packages/builtin-tool-group-management/src/types.ts +2 -0
  132. package/packages/builtin-tool-local-system/src/client/Render/WriteFile/index.tsx +48 -5
  133. package/packages/builtin-tool-local-system/src/client/Streaming/WriteFile/index.tsx +39 -0
  134. package/packages/builtin-tool-local-system/src/client/Streaming/index.ts +2 -0
  135. package/packages/builtin-tool-memory/src/manifest.ts +581 -19
  136. package/packages/model-bank/src/aiModels/qiniu.ts +24 -0
  137. package/packages/types/src/topic/thread.ts +2 -2
  138. package/packages/types/src/userMemory/layers.ts +19 -8
  139. package/packages/types/src/userMemory/shared.ts +7 -1
  140. package/src/app/[variants]/(auth)/_layout/index.tsx +0 -2
  141. package/src/app/[variants]/(auth)/layout.tsx +0 -2
  142. package/src/app/[variants]/(auth)/login/[[...login]]/page.tsx +1 -3
  143. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -3
  144. package/src/app/[variants]/(desktop)/desktop-onboarding/_layout/index.tsx +0 -2
  145. package/src/app/[variants]/(main)/_layout/index.tsx +0 -2
  146. package/src/app/[variants]/(main)/agent/_layout/index.tsx +0 -2
  147. package/src/app/[variants]/(main)/agent/features/Portal/index.tsx +0 -2
  148. package/src/app/[variants]/(main)/community/(list)/_layout/index.tsx +0 -2
  149. package/src/app/[variants]/(main)/community/(list)/assistant/_layout/index.tsx +0 -2
  150. package/src/app/[variants]/(main)/community/(list)/mcp/_layout/index.tsx +0 -2
  151. package/src/app/[variants]/(main)/community/(list)/model/_layout/index.tsx +0 -2
  152. package/src/app/[variants]/(main)/community/_layout/index.tsx +0 -2
  153. package/src/app/[variants]/(main)/group/_layout/index.tsx +0 -2
  154. package/src/app/[variants]/(main)/group/features/Conversation/Header/index.tsx +4 -2
  155. package/src/app/[variants]/(main)/group/features/Portal/index.tsx +0 -2
  156. package/src/app/[variants]/(main)/home/_layout/index.tsx +0 -2
  157. package/src/app/[variants]/(main)/home/index.tsx +0 -2
  158. package/src/app/[variants]/(main)/image/_layout/Topics/TopicUrlSync.tsx +0 -2
  159. package/src/app/[variants]/(main)/image/_layout/index.tsx +0 -2
  160. package/src/app/[variants]/(main)/memory/_layout/index.tsx +0 -2
  161. package/src/app/[variants]/(main)/page/_layout/index.tsx +0 -2
  162. package/src/app/[variants]/(main)/resource/(home)/_layout/index.tsx +0 -2
  163. package/src/app/[variants]/(main)/resource/_layout/index.tsx +0 -2
  164. package/src/app/[variants]/(main)/resource/library/_layout/index.tsx +0 -2
  165. package/src/app/[variants]/(main)/resource/library/features/Container.tsx +0 -2
  166. package/src/app/[variants]/(main)/settings/_layout/index.tsx +0 -2
  167. package/src/app/[variants]/(main)/settings/about/index.tsx +0 -2
  168. package/src/app/[variants]/(main)/settings/agent/index.tsx +0 -2
  169. package/src/app/[variants]/(main)/settings/apikey/index.tsx +0 -2
  170. package/src/app/[variants]/(main)/settings/chat-appearance/index.tsx +0 -2
  171. package/src/app/[variants]/(main)/settings/common/index.tsx +0 -2
  172. package/src/app/[variants]/(main)/settings/hotkey/index.tsx +0 -2
  173. package/src/app/[variants]/(main)/settings/image/index.tsx +0 -2
  174. package/src/app/[variants]/(main)/settings/memory/index.tsx +0 -2
  175. package/src/app/[variants]/(main)/settings/provider/(list)/index.tsx +0 -2
  176. package/src/app/[variants]/(main)/settings/proxy/index.tsx +0 -2
  177. package/src/app/[variants]/(main)/settings/security/index.tsx +1 -3
  178. package/src/app/[variants]/(main)/settings/storage/index.tsx +0 -2
  179. package/src/app/[variants]/(main)/settings/tts/index.tsx +0 -2
  180. package/src/app/[variants]/(mobile)/(home)/_layout/index.tsx +0 -2
  181. package/src/app/[variants]/(mobile)/_layout/index.tsx +1 -3
  182. package/src/app/[variants]/(mobile)/chat/_layout/index.tsx +0 -2
  183. package/src/app/[variants]/(mobile)/chat/settings/_layout/index.tsx +0 -2
  184. package/src/app/[variants]/(mobile)/community/(detail)/_layout/index.tsx +0 -2
  185. package/src/app/[variants]/(mobile)/community/(list)/_layout/index.tsx +0 -2
  186. package/src/app/[variants]/(mobile)/community/_layout/index.tsx +0 -2
  187. package/src/app/[variants]/(mobile)/router/MobileClientRouter.tsx +0 -2
  188. package/src/app/[variants]/(mobile)/settings/index.tsx +0 -2
  189. package/src/app/[variants]/onboarding/_layout/index.tsx +0 -2
  190. package/src/app/[variants]/router/DesktopClientRouter.tsx +0 -2
  191. package/src/components/ModelSelect/index.tsx +6 -56
  192. package/src/components/server/MobileNavLayout.tsx +0 -2
  193. package/src/components/server/ServerLayout.tsx +0 -2
  194. package/src/features/ModelSwitchPanel/components/Footer.tsx +0 -2
  195. package/src/features/ModelSwitchPanel/components/List/MultipleProvidersModelItem.tsx +0 -1
  196. package/src/features/ModelSwitchPanel/components/List/SingleProviderModelItem.tsx +0 -1
  197. package/src/features/ModelSwitchPanel/components/List/VirtualItemRenderer.tsx +0 -1
  198. package/src/features/ModelSwitchPanel/components/List/index.tsx +15 -13
  199. package/src/features/ModelSwitchPanel/components/PanelContent.tsx +0 -2
  200. package/src/features/ModelSwitchPanel/index.tsx +21 -23
  201. package/src/features/ResourceManager/components/Explorer/MasonryView/index.tsx +0 -2
  202. package/src/features/User/UserAvatar.tsx +0 -2
  203. package/src/locales/default/plugin.ts +3 -1
  204. package/src/server/modules/AgentRuntime/RuntimeExecutors.ts +11 -3
  205. package/src/server/modules/Mecha/AgentToolsEngine/index.ts +14 -6
  206. package/src/server/modules/Mecha/AgentToolsEngine/types.ts +4 -3
  207. package/src/server/routers/lambda/aiAgent.ts +10 -0
  208. package/src/server/services/agent/index.test.ts +155 -0
  209. package/src/server/services/agent/index.ts +25 -0
  210. package/src/server/services/agentRuntime/AgentRuntimeService.ts +2 -0
  211. package/src/server/services/agentRuntime/types.ts +1 -0
  212. package/src/server/services/aiAgent/__tests__/execAgent.threadId.test.ts +29 -9
  213. package/src/server/services/aiAgent/index.ts +175 -6
  214. package/src/server/services/lobehubSkill/index.ts +109 -0
  215. package/src/server/services/toolExecution/builtin.ts +28 -2
  216. package/src/server/services/toolExecution/types.ts +3 -0
  217. package/src/store/chat/agents/GroupOrchestration/__tests__/call-supervisor.test.ts +305 -0
  218. package/src/store/chat/agents/GroupOrchestration/createGroupOrchestrationExecutors.ts +2 -1
  219. package/src/store/chat/agents/createAgentExecutors.ts +4 -2
  220. package/src/store/chat/slices/plugin/actions/exector.ts +92 -0
  221. package/src/store/chat/slices/plugin/actions/pluginTypes.ts +82 -177
@@ -14,7 +14,7 @@ import {
14
14
  } from 'lucide-react';
15
15
  import { type ModelAbilities } from 'model-bank';
16
16
  import numeral from 'numeral';
17
- import { CSSProperties, type ComponentProps, type FC, memo, useState } from 'react';
17
+ import { CSSProperties, type ComponentProps, type FC, memo } from 'react';
18
18
  import { useTranslation } from 'react-i18next';
19
19
 
20
20
  import { type AiProviderSourceType } from '@/types/aiProvider';
@@ -65,13 +65,6 @@ interface ModelInfoTagsProps extends ModelAbilities {
65
65
  isCustom?: boolean;
66
66
  placement?: 'top' | 'right';
67
67
  style?: CSSProperties;
68
- /**
69
- * Whether to render tooltip overlays for each tag.
70
- * Disable this when rendering a large list (e.g. dropdown menus) to avoid mounting hundreds of Tooltip instances.
71
- *
72
- * When `false`, tags are rendered without any tooltip/title fallback by design.
73
- */
74
- withTooltip?: boolean;
75
68
  }
76
69
 
77
70
  interface FeatureTagsProps extends Pick<
@@ -80,7 +73,6 @@ interface FeatureTagsProps extends Pick<
80
73
  > {
81
74
  placement: 'top' | 'right';
82
75
  tagClassName: string;
83
- withTooltip: boolean;
84
76
  }
85
77
 
86
78
  interface FeatureTagItemProps {
@@ -91,11 +83,10 @@ interface FeatureTagItemProps {
91
83
  placement: 'top' | 'right';
92
84
  title: string;
93
85
  tooltipStyles?: ComponentProps<typeof Tooltip>['styles'];
94
- withTooltip: boolean;
95
86
  }
96
87
 
97
88
  const FeatureTagItem = memo<FeatureTagItemProps>(
98
- ({ className, color, enabled, icon, placement, title, tooltipStyles, withTooltip }) => {
89
+ ({ className, color, enabled, icon, placement, title, tooltipStyles }) => {
99
90
  if (!enabled) return null;
100
91
 
101
92
  const tag = (
@@ -104,8 +95,6 @@ const FeatureTagItem = memo<FeatureTagItemProps>(
104
95
  </Tag>
105
96
  );
106
97
 
107
- if (!withTooltip) return tag;
108
-
109
98
  return (
110
99
  <Tooltip placement={placement} styles={tooltipStyles ?? DEFAULT_TOOLTIP_STYLES} title={title}>
111
100
  {tag}
@@ -125,7 +114,6 @@ const FeatureTags = memo<FeatureTagsProps>(
125
114
  tagClassName,
126
115
  video,
127
116
  vision,
128
- withTooltip,
129
117
  }) => {
130
118
  const { t } = useTranslation('components');
131
119
 
@@ -138,7 +126,6 @@ const FeatureTags = memo<FeatureTagsProps>(
138
126
  icon={LucidePaperclip}
139
127
  placement={placement}
140
128
  title={t('ModelSelect.featureTag.file')}
141
- withTooltip={withTooltip}
142
129
  />
143
130
  <FeatureTagItem
144
131
  className={tagClassName}
@@ -147,7 +134,6 @@ const FeatureTags = memo<FeatureTagsProps>(
147
134
  icon={LucideImage}
148
135
  placement={placement}
149
136
  title={t('ModelSelect.featureTag.imageOutput')}
150
- withTooltip={withTooltip}
151
137
  />
152
138
  <FeatureTagItem
153
139
  className={tagClassName}
@@ -156,7 +142,6 @@ const FeatureTags = memo<FeatureTagsProps>(
156
142
  icon={LucideEye}
157
143
  placement={placement}
158
144
  title={t('ModelSelect.featureTag.vision')}
159
- withTooltip={withTooltip}
160
145
  />
161
146
  <FeatureTagItem
162
147
  className={tagClassName}
@@ -165,7 +150,6 @@ const FeatureTags = memo<FeatureTagsProps>(
165
150
  icon={Video}
166
151
  placement={placement}
167
152
  title={t('ModelSelect.featureTag.video')}
168
- withTooltip={withTooltip}
169
153
  />
170
154
  <FeatureTagItem
171
155
  className={tagClassName}
@@ -175,7 +159,6 @@ const FeatureTags = memo<FeatureTagsProps>(
175
159
  placement={placement}
176
160
  title={t('ModelSelect.featureTag.functionCall')}
177
161
  tooltipStyles={FUNCTION_CALL_TOOLTIP_STYLES}
178
- withTooltip={withTooltip}
179
162
  />
180
163
  <FeatureTagItem
181
164
  className={tagClassName}
@@ -184,7 +167,6 @@ const FeatureTags = memo<FeatureTagsProps>(
184
167
  icon={AtomIcon}
185
168
  placement={placement}
186
169
  title={t('ModelSelect.featureTag.reasoning')}
187
- withTooltip={withTooltip}
188
170
  />
189
171
  <FeatureTagItem
190
172
  className={tagClassName}
@@ -193,7 +175,6 @@ const FeatureTags = memo<FeatureTagsProps>(
193
175
  icon={LucideGlobe}
194
176
  placement={placement}
195
177
  title={t('ModelSelect.featureTag.search')}
196
- withTooltip={withTooltip}
197
178
  />
198
179
  </>
199
180
  );
@@ -203,14 +184,12 @@ const FeatureTags = memo<FeatureTagsProps>(
203
184
  const Context = memo(
204
185
  ({
205
186
  contextWindowTokens,
206
- withTooltip,
207
187
  placement,
208
188
  styles,
209
189
  }: {
210
190
  contextWindowTokens: number;
211
191
  placement: 'top' | 'right';
212
192
  styles: TooltipStyles;
213
- withTooltip: boolean;
214
193
  }) => {
215
194
  const { t } = useTranslation('components');
216
195
  const tokensText = contextWindowTokens === 0 ? '∞' : formatTokenNumber(contextWindowTokens);
@@ -221,8 +200,6 @@ const Context = memo(
221
200
  </Tag>
222
201
  );
223
202
 
224
- if (!withTooltip) return tag;
225
-
226
203
  return (
227
204
  <Tooltip
228
205
  placement={placement}
@@ -238,7 +215,7 @@ const Context = memo(
238
215
  );
239
216
 
240
217
  export const ModelInfoTags = memo<ModelInfoTagsProps>(
241
- ({ directionReverse, placement = 'top', withTooltip = true, style, ...model }) => {
218
+ ({ directionReverse, placement = 'top', style, ...model }) => {
242
219
  return (
243
220
  <Flexbox
244
221
  className={TAG_CLASSNAME}
@@ -257,14 +234,12 @@ export const ModelInfoTags = memo<ModelInfoTagsProps>(
257
234
  tagClassName={styles.tag}
258
235
  video={model.video}
259
236
  vision={model.vision}
260
- withTooltip={withTooltip}
261
237
  />
262
238
  {typeof model.contextWindowTokens === 'number' && (
263
239
  <Context
264
240
  contextWindowTokens={model.contextWindowTokens}
265
241
  placement={placement}
266
242
  styles={styles}
267
- withTooltip={withTooltip}
268
243
  />
269
244
  )}
270
245
  </Flexbox>
@@ -274,15 +249,6 @@ export const ModelInfoTags = memo<ModelInfoTagsProps>(
274
249
 
275
250
  interface ModelItemRenderProps extends ChatModelCard, Partial<Omit<FlexboxProps, 'id' | 'title'>> {
276
251
  abilities?: ModelAbilities;
277
- infoTagTooltip?: boolean;
278
- /**
279
- * Only mounts Tooltip components while hovering the item, to reduce initial render cost in large dropdown lists.
280
- *
281
- * Note: hover is not available on mobile, so this will be ignored on mobile.
282
- * Also note: since tooltips are mounted lazily, the very first hover may require a tiny pointer movement
283
- * before the tooltip system detects the hover target (depends on the underlying tooltip implementation).
284
- */
285
- infoTagTooltipOnHover?: boolean;
286
252
  newBadgeLabel?: string;
287
253
  showInfoTag?: boolean;
288
254
  }
@@ -291,8 +257,6 @@ export const ModelItemRender = memo<ModelItemRenderProps>(
291
257
  ({
292
258
  showInfoTag = true,
293
259
  abilities,
294
- infoTagTooltip = true,
295
- infoTagTooltipOnHover = false,
296
260
  contextWindowTokens,
297
261
  files,
298
262
  functionCall,
@@ -308,14 +272,6 @@ export const ModelItemRender = memo<ModelItemRenderProps>(
308
272
  ...rest
309
273
  }) => {
310
274
  const { mobile } = useResponsive();
311
- const [hovered, setHovered] = useState(false);
312
-
313
- const shouldLazyMountTooltip = infoTagTooltipOnHover && !mobile;
314
- /**
315
- * When `infoTagTooltipOnHover` is enabled, we don't mount Tooltip components until the row is hovered.
316
- * This avoids creating many overlays on dropdown open, while keeping the tooltip UX on demand.
317
- */
318
- const withTooltip = infoTagTooltip && (!shouldLazyMountTooltip || hovered);
319
275
  const displayNameOrId = displayName || id;
320
276
 
321
277
  return (
@@ -324,7 +280,6 @@ export const ModelItemRender = memo<ModelItemRenderProps>(
324
280
  gap={32}
325
281
  horizontal
326
282
  justify={'space-between'}
327
- onMouseEnter={shouldLazyMountTooltip && !hovered ? () => setHovered(true) : undefined}
328
283
  {...rest}
329
284
  style={{
330
285
  overflow: 'hidden',
@@ -341,13 +296,9 @@ export const ModelItemRender = memo<ModelItemRenderProps>(
341
296
  >
342
297
  <ModelIcon model={id} size={20} />
343
298
  <Text
344
- ellipsis={
345
- withTooltip
346
- ? {
347
- tooltip: displayNameOrId,
348
- }
349
- : true
350
- }
299
+ ellipsis={{
300
+ tooltip: displayNameOrId,
301
+ }}
351
302
  style={mobile ? { maxWidth: '60vw' } : { minWidth: 0, overflow: 'hidden' }}
352
303
  >
353
304
  {displayNameOrId}
@@ -369,7 +320,6 @@ export const ModelItemRender = memo<ModelItemRenderProps>(
369
320
  style={{ zoom: 0.9 }}
370
321
  video={video ?? abilities?.video}
371
322
  vision={vision ?? abilities?.vision}
372
- withTooltip={withTooltip}
373
323
  />
374
324
  )}
375
325
  </Flexbox>
@@ -58,6 +58,4 @@ const MobileContentLayout = ({
58
58
  );
59
59
  };
60
60
 
61
- MobileContentLayout.displayName = 'MobileContentLayout';
62
-
63
61
  export default MobileContentLayout;
@@ -28,6 +28,4 @@ const ServerLayout =
28
28
  return isMobile ? <Mobile {...(res as T)} /> : <Desktop {...(res as T)} />;
29
29
  };
30
30
 
31
- ServerLayout.displayName = 'ServerLayout';
32
-
33
31
  export default ServerLayout;
@@ -38,5 +38,3 @@ export const Footer: FC<FooterProps> = ({ onClose }) => {
38
38
  </Flexbox>
39
39
  );
40
40
  };
41
-
42
- Footer.displayName = 'Footer';
@@ -89,7 +89,6 @@ export const MultipleProvidersModelItem = memo<MultipleProvidersModelItemProps>(
89
89
  <ModelItemRender
90
90
  {...data.model}
91
91
  {...data.model.abilities}
92
- infoTagTooltip={false}
93
92
  newBadgeLabel={newLabel}
94
93
  showInfoTag={true}
95
94
  />
@@ -14,7 +14,6 @@ export const SingleProviderModelItem = memo<SingleProviderModelItemProps>(({ dat
14
14
  <ModelItemRender
15
15
  {...data.model}
16
16
  {...data.model.abilities}
17
- infoTagTooltip={false}
18
17
  newBadgeLabel={newLabel}
19
18
  showInfoTag={true}
20
19
  />
@@ -116,7 +116,6 @@ export const VirtualItemRenderer = memo<VirtualItemRendererProps>(
116
116
  <ModelItemRender
117
117
  {...item.model}
118
118
  {...item.model.abilities}
119
- infoTagTooltip={false}
120
119
  newBadgeLabel={newLabel}
121
120
  showInfoTag
122
121
  />
@@ -1,4 +1,4 @@
1
- import { Flexbox } from '@lobehub/ui';
1
+ import { Flexbox, TooltipGroup } from '@lobehub/ui';
2
2
  import type { FC } from 'react';
3
3
  import { useMemo } from 'react';
4
4
  import { useTranslation } from 'react-i18next';
@@ -82,18 +82,20 @@ export const List: FC<ListProps> = ({
82
82
  paddingBlock: groupMode === 'byModel' ? 8 : 0,
83
83
  }}
84
84
  >
85
- {virtualItems.slice(0, renderAll ? virtualItems.length : INITIAL_RENDER_COUNT).map((item) => (
86
- <VirtualItemRenderer
87
- activeKey={activeKey}
88
- item={item}
89
- key={getVirtualItemKey(item)}
90
- newLabel={newLabel}
91
- onClose={handleClose}
92
- onModelChange={handleModelChange}
93
- />
94
- ))}
85
+ <TooltipGroup>
86
+ {virtualItems
87
+ .slice(0, renderAll ? virtualItems.length : INITIAL_RENDER_COUNT)
88
+ .map((item) => (
89
+ <VirtualItemRenderer
90
+ activeKey={activeKey}
91
+ item={item}
92
+ key={getVirtualItemKey(item)}
93
+ newLabel={newLabel}
94
+ onClose={handleClose}
95
+ onModelChange={handleModelChange}
96
+ />
97
+ ))}
98
+ </TooltipGroup>
95
99
  </Flexbox>
96
100
  );
97
101
  };
98
-
99
- List.displayName = 'List';
@@ -73,5 +73,3 @@ export const PanelContent: FC<PanelContentProps> = ({
73
73
  </Rnd>
74
74
  );
75
75
  };
76
-
77
- PanelContent.displayName = 'PanelContent';
@@ -1,4 +1,4 @@
1
- import { Popover, TooltipGroup } from '@lobehub/ui';
1
+ import { Popover } from '@lobehub/ui';
2
2
  import { memo, useCallback, useState } from 'react';
3
3
 
4
4
  import { PanelContent } from './components/PanelContent';
@@ -29,28 +29,26 @@ const ModelSwitchPanel = memo<ModelSwitchPanelProps>(
29
29
  );
30
30
 
31
31
  return (
32
- <TooltipGroup>
33
- <Popover
34
- classNames={{
35
- content: styles.container,
36
- }}
37
- content={
38
- <PanelContent
39
- isOpen={isOpen}
40
- model={modelProp}
41
- onModelChange={onModelChange}
42
- onOpenChange={handleOpenChange}
43
- provider={providerProp}
44
- />
45
- }
46
- nativeButton={false}
47
- onOpenChange={handleOpenChange}
48
- open={isOpen}
49
- placement={placement}
50
- >
51
- {children}
52
- </Popover>
53
- </TooltipGroup>
32
+ <Popover
33
+ classNames={{
34
+ content: styles.container,
35
+ }}
36
+ content={
37
+ <PanelContent
38
+ isOpen={isOpen}
39
+ model={modelProp}
40
+ onModelChange={onModelChange}
41
+ onOpenChange={handleOpenChange}
42
+ provider={providerProp}
43
+ />
44
+ }
45
+ nativeButton={false}
46
+ onOpenChange={handleOpenChange}
47
+ open={isOpen}
48
+ placement={placement}
49
+ >
50
+ {children}
51
+ </Popover>
54
52
  );
55
53
  },
56
54
  );
@@ -197,6 +197,4 @@ const MasonryView = memo(function MasonryView() {
197
197
  );
198
198
  });
199
199
 
200
- MasonryView.displayName = 'MasonryView';
201
-
202
200
  export default MasonryView;
@@ -88,6 +88,4 @@ const UserAvatar = forwardRef<HTMLDivElement, UserAvatarProps>(
88
88
  },
89
89
  );
90
90
 
91
- UserAvatar.displayName = 'UserAvatar';
92
-
93
91
  export default UserAvatar;
@@ -40,6 +40,7 @@ export default {
40
40
  'builtins.lobe-cloud-sandbox.title': 'Cloud Sandbox',
41
41
  'builtins.lobe-group-agent-builder.apiName.batchCreateAgents': 'Batch create agents',
42
42
  'builtins.lobe-group-agent-builder.apiName.createAgent': 'Create agent',
43
+ 'builtins.lobe-group-agent-builder.apiName.getAgentInfo': 'Get member info',
43
44
  'builtins.lobe-group-agent-builder.apiName.getAvailableModels': 'Get available models',
44
45
  'builtins.lobe-group-agent-builder.apiName.installPlugin': 'Install Skill',
45
46
  'builtins.lobe-group-agent-builder.apiName.inviteAgent': 'Invite member',
@@ -70,7 +71,8 @@ export default {
70
71
  'builtins.lobe-group-management.apiName.summarize': 'Summarize conversation',
71
72
  'builtins.lobe-group-management.apiName.vote': 'Start vote',
72
73
  'builtins.lobe-group-management.inspector.broadcast.title': 'Following Agents speak:',
73
- 'builtins.lobe-group-management.inspector.executeAgentTask.title': 'Assigning task to:',
74
+ 'builtins.lobe-group-management.inspector.executeAgentTask.assignTo': 'Assign',
75
+ 'builtins.lobe-group-management.inspector.executeAgentTask.task': 'task:',
74
76
  'builtins.lobe-group-management.inspector.executeAgentTasks.title': 'Assigning tasks to:',
75
77
  'builtins.lobe-group-management.inspector.speak.title': 'Designated Agent speaks:',
76
78
  'builtins.lobe-group-management.title': 'Group Coordinator',
@@ -55,6 +55,8 @@ export const createRuntimeExecutors = (
55
55
  // Fallback to state's modelRuntimeConfig if not in payload
56
56
  const model = llmPayload.model || state.modelRuntimeConfig?.model;
57
57
  const provider = llmPayload.provider || state.modelRuntimeConfig?.provider;
58
+ // Fallback to state's tools if not in payload
59
+ const tools = llmPayload.tools || state.tools;
58
60
 
59
61
  if (!model || !provider) {
60
62
  throw new Error('Model and provider are required for call_llm instruction');
@@ -128,14 +130,14 @@ export const createRuntimeExecutors = (
128
130
  const chatPayload = {
129
131
  messages: llmPayload.messages,
130
132
  model,
131
- tools: llmPayload.tools,
133
+ tools,
132
134
  };
133
135
 
134
136
  log(
135
137
  `${stagePrefix} calling model-runtime chat (model: %s, messages: %d, tools: %d)`,
136
138
  model,
137
139
  llmPayload.messages.length,
138
- llmPayload.tools?.length ?? 0,
140
+ tools?.length ?? 0,
139
141
  );
140
142
 
141
143
  // Buffer: accumulate text and reasoning, send every 50ms
@@ -261,7 +263,12 @@ export const createRuntimeExecutors = (
261
263
  }
262
264
  },
263
265
  onToolsCalling: async ({ toolsCalling: raw }) => {
264
- const payload = new ToolNameResolver().resolve(raw, state.toolManifestMap);
266
+ const resolved = new ToolNameResolver().resolve(raw, state.toolManifestMap);
267
+ // Add source field from toolSourceMap for routing tool execution
268
+ const payload = resolved.map((p) => ({
269
+ ...p,
270
+ source: state.toolSourceMap?.[p.identifier],
271
+ }));
265
272
  // log(`[${operationLogId}][toolsCalling]`, payload);
266
273
  toolsCalling = payload;
267
274
  tool_calls = raw;
@@ -466,6 +473,7 @@ export const createRuntimeExecutors = (
466
473
  // Execute tool using ToolExecutionService
467
474
  log(`[${operationLogId}] Executing tool ${toolName} ...`);
468
475
  const executionResult = await toolExecutionService.executeTool(chatToolPayload, {
476
+ serverDB: ctx.serverDB,
469
477
  toolManifestMap: state.toolManifestMap,
470
478
  userId: ctx.userId,
471
479
  });
@@ -12,8 +12,7 @@
12
12
  import { KnowledgeBaseManifest } from '@lobechat/builtin-tool-knowledge-base';
13
13
  import { LocalSystemManifest } from '@lobechat/builtin-tool-local-system';
14
14
  import { WebBrowsingManifest } from '@lobechat/builtin-tool-web-browsing';
15
- import { ToolsEngine } from '@lobechat/context-engine';
16
- import type { LobeChatPluginManifest } from '@lobehub/chat-plugin-sdk';
15
+ import { type LobeToolManifest, ToolsEngine } from '@lobechat/context-engine';
17
16
  import debug from 'debug';
18
17
 
19
18
  import { builtinTools } from '@/tools';
@@ -50,11 +49,11 @@ export const createServerToolsEngine = (
50
49
 
51
50
  // Get plugin manifests from installed plugins (from database)
52
51
  const pluginManifests = context.installedPlugins
53
- .map((plugin) => plugin.manifest as LobeChatPluginManifest)
52
+ .map((plugin) => plugin.manifest as LobeToolManifest)
54
53
  .filter(Boolean);
55
54
 
56
55
  // Get all builtin tool manifests
57
- const builtinManifests = builtinTools.map((tool) => tool.manifest as LobeChatPluginManifest);
56
+ const builtinManifests = builtinTools.map((tool) => tool.manifest as LobeToolManifest);
58
57
 
59
58
  // Combine all manifests
60
59
  const allManifests = [...pluginManifests, ...builtinManifests, ...additionalManifests];
@@ -87,18 +86,27 @@ export const createServerAgentToolsEngine = (
87
86
  context: ServerAgentToolsContext,
88
87
  params: ServerCreateAgentToolsEngineParams,
89
88
  ): ToolsEngine => {
90
- const { agentConfig, model, provider, hasEnabledKnowledgeBases = false } = params;
89
+ const {
90
+ additionalManifests,
91
+ agentConfig,
92
+ hasEnabledKnowledgeBases = false,
93
+ model,
94
+ provider,
95
+ } = params;
91
96
  const searchMode = agentConfig.chatConfig?.searchMode ?? 'off';
92
97
  const isSearchEnabled = searchMode !== 'off';
93
98
 
94
99
  log(
95
- 'Creating agent tools engine for model=%s, provider=%s, searchMode=%s',
100
+ 'Creating agent tools engine for model=%s, provider=%s, searchMode=%s, additionalManifests=%d',
96
101
  model,
97
102
  provider,
98
103
  searchMode,
104
+ additionalManifests?.length ?? 0,
99
105
  );
100
106
 
101
107
  return createServerToolsEngine(context, {
108
+ // Pass additional manifests (e.g., LobeHub Skills)
109
+ additionalManifests,
102
110
  // Add default tools based on configuration
103
111
  defaultToolIds: [WebBrowsingManifest.identifier, KnowledgeBaseManifest.identifier],
104
112
  // Create search-aware enableChecker for this request
@@ -1,6 +1,5 @@
1
- import type { PluginEnableChecker } from '@lobechat/context-engine';
1
+ import type { LobeToolManifest, PluginEnableChecker } from '@lobechat/context-engine';
2
2
  import type { LobeTool } from '@lobechat/types';
3
- import type { LobeChatPluginManifest } from '@lobehub/chat-plugin-sdk';
4
3
 
5
4
  /**
6
5
  * Installed plugin with manifest
@@ -22,7 +21,7 @@ export interface ServerAgentToolsContext {
22
21
  */
23
22
  export interface ServerAgentToolsEngineConfig {
24
23
  /** Additional manifests to include (e.g., Klavis tools) */
25
- additionalManifests?: LobeChatPluginManifest[];
24
+ additionalManifests?: LobeToolManifest[];
26
25
  /** Default tool IDs that will always be added */
27
26
  defaultToolIds?: string[];
28
27
  /** Custom enable checker for plugins */
@@ -33,6 +32,8 @@ export interface ServerAgentToolsEngineConfig {
33
32
  * Parameters for createServerAgentToolsEngine
34
33
  */
35
34
  export interface ServerCreateAgentToolsEngineParams {
35
+ /** Additional manifests to include (e.g., LobeHub Skills) */
36
+ additionalManifests?: LobeToolManifest[];
36
37
  /** Agent configuration containing plugins array */
37
38
  agentConfig: {
38
39
  /** Optional agent chat config with searchMode */
@@ -642,6 +642,16 @@ export const aiAgentRouter = router({
642
642
  const updatedStatus = updatedThread?.status ?? thread.status;
643
643
  const updatedTaskStatus = threadStatusToTaskStatus[updatedStatus] || 'processing';
644
644
 
645
+ // DEBUG: Log metadata for failed tasks
646
+ if (updatedTaskStatus === 'failed') {
647
+ console.log('[DEBUG] getSubAgentTaskStatus - failed task metadata:', {
648
+ threadId,
649
+ updatedMetadata,
650
+ 'updatedMetadata?.error': updatedMetadata?.error,
651
+ updatedStatus,
652
+ });
653
+ }
654
+
645
655
  // 6. Query thread messages for result content or current activity
646
656
  const threadMessages = await ctx.messageModel.query({ threadId });
647
657
  const sortedMessages = threadMessages.sort(