@lobehub/lobehub 2.0.0-next.295 → 2.0.0-next.297

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 (132) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/locales/en-US/plugin.json +4 -0
  4. package/locales/zh-CN/plugin.json +4 -0
  5. package/package.json +2 -2
  6. package/packages/agent-runtime/src/core/__tests__/runtime.test.ts +5 -5
  7. package/packages/agent-runtime/src/utils/stepContextComputer.test.ts +5 -5
  8. package/packages/builtin-tool-gtd/src/client/Inspector/index.ts +0 -4
  9. package/packages/builtin-tool-gtd/src/client/Intervention/AddTodo.tsx +1 -1
  10. package/packages/builtin-tool-gtd/src/client/Render/TodoList/index.tsx +39 -10
  11. package/packages/builtin-tool-gtd/src/client/Render/index.ts +0 -2
  12. package/packages/builtin-tool-gtd/src/client/components/SortableTodoList/TodoItemRow.tsx +26 -12
  13. package/packages/builtin-tool-gtd/src/client/components/SortableTodoList/store/actions.ts +5 -5
  14. package/packages/builtin-tool-gtd/src/client/components/SortableTodoList/store/store.test.ts +14 -8
  15. package/packages/builtin-tool-gtd/src/executor/index.test.ts +48 -227
  16. package/packages/builtin-tool-gtd/src/executor/index.ts +15 -158
  17. package/packages/builtin-tool-gtd/src/manifest.ts +12 -42
  18. package/packages/builtin-tool-gtd/src/systemRole.ts +14 -8
  19. package/packages/builtin-tool-gtd/src/types.ts +47 -41
  20. package/packages/builtin-tool-memory/package.json +8 -0
  21. package/packages/builtin-tool-memory/src/client/Inspector/AddContextMemory/index.tsx +60 -0
  22. package/packages/builtin-tool-memory/src/client/Inspector/AddExperienceMemory/index.tsx +60 -0
  23. package/packages/builtin-tool-memory/src/client/Inspector/AddIdentityMemory/index.tsx +60 -0
  24. package/packages/builtin-tool-memory/src/client/Inspector/AddPreferenceMemory/index.tsx +60 -0
  25. package/packages/builtin-tool-memory/src/client/Inspector/RemoveIdentityMemory/index.tsx +60 -0
  26. package/packages/builtin-tool-memory/src/client/Inspector/SearchUserMemory/index.tsx +67 -0
  27. package/packages/builtin-tool-memory/src/client/Inspector/UpdateIdentityMemory/index.tsx +60 -0
  28. package/packages/builtin-tool-memory/src/client/Inspector/index.ts +35 -0
  29. package/packages/builtin-tool-memory/src/client/Intervention/AddExperienceMemory/index.tsx +17 -0
  30. package/packages/builtin-tool-memory/src/client/Intervention/index.ts +13 -0
  31. package/packages/builtin-tool-memory/src/client/Render/AddExperienceMemory/index.tsx +17 -0
  32. package/packages/builtin-tool-memory/src/client/Render/SearchUserMemory/index.tsx +217 -0
  33. package/packages/builtin-tool-memory/src/client/Render/index.ts +15 -0
  34. package/packages/builtin-tool-memory/src/client/Streaming/AddExperienceMemory/index.tsx +17 -0
  35. package/packages/builtin-tool-memory/src/client/Streaming/index.ts +18 -0
  36. package/packages/builtin-tool-memory/src/client/components/ExperienceMemoryCard.tsx +231 -0
  37. package/packages/builtin-tool-memory/src/client/components/index.ts +1 -0
  38. package/packages/builtin-tool-memory/src/client/index.ts +27 -0
  39. package/packages/builtin-tool-memory/src/executor/index.ts +9 -1
  40. package/packages/builtin-tool-memory/src/types.ts +61 -0
  41. package/packages/context-engine/src/providers/GTDTodoInjector.ts +15 -7
  42. package/packages/conversation-flow/src/__tests__/fixtures/outputs/assistantGroup/tools-with-branches.json +4 -0
  43. package/packages/conversation-flow/src/transformation/FlatListBuilder.ts +1 -0
  44. package/packages/prompts/src/prompts/gtd/index.test.ts +32 -16
  45. package/packages/prompts/src/prompts/gtd/index.ts +9 -5
  46. package/packages/types/package.json +1 -1
  47. package/packages/types/src/discover/assistants.ts +4 -0
  48. package/packages/types/src/discover/groupAgents.ts +196 -0
  49. package/packages/types/src/discover/index.ts +5 -1
  50. package/packages/types/src/stepContext.ts +4 -1
  51. package/src/app/[variants]/(main)/community/(detail)/assistant/features/Details/Versions/index.tsx +2 -2
  52. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/DetailProvider.tsx +19 -0
  53. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Members/index.tsx +137 -0
  54. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Nav.tsx +88 -0
  55. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Overview/index.tsx +213 -0
  56. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Related/index.tsx +85 -0
  57. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/SystemRole/TagList.tsx +20 -0
  58. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/SystemRole/index.tsx +71 -0
  59. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Versions/index.tsx +119 -0
  60. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/index.tsx +51 -0
  61. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Header.tsx +253 -0
  62. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/AddGroupAgent.tsx +222 -0
  63. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/index.tsx +34 -0
  64. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/Summary/index.tsx +42 -0
  65. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/index.tsx +41 -0
  66. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/StatusPage/index.tsx +104 -0
  67. package/src/app/[variants]/(main)/community/(detail)/group_agent/index.tsx +103 -0
  68. package/src/app/[variants]/(main)/community/(detail)/group_agent/loading.tsx +1 -0
  69. package/src/app/[variants]/(main)/community/(detail)/user/features/DetailProvider.tsx +7 -1
  70. package/src/app/[variants]/(main)/community/(detail)/user/features/UserContent.tsx +2 -0
  71. package/src/app/[variants]/(main)/community/(detail)/user/features/UserGroupCard.tsx +186 -0
  72. package/src/app/[variants]/(main)/community/(detail)/user/features/UserGroupList.tsx +59 -0
  73. package/src/app/[variants]/(main)/community/(detail)/user/index.tsx +3 -1
  74. package/src/app/[variants]/(main)/community/(list)/assistant/features/List/Item.tsx +26 -8
  75. package/src/app/[variants]/(main)/community/(list)/assistant/index.tsx +1 -0
  76. package/src/app/[variants]/(main)/community/features/Search.tsx +1 -1
  77. package/src/app/[variants]/(main)/group/profile/features/GroupProfile/index.tsx +2 -0
  78. package/src/app/[variants]/(main)/group/profile/features/Header/AgentPublishButton/PublishResultModal.tsx +2 -1
  79. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/GroupForkConfirmModal.tsx +60 -0
  80. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/GroupPublishResultModal.tsx +62 -0
  81. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/PublishButton.tsx +122 -0
  82. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/index.tsx +46 -0
  83. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/types.ts +12 -0
  84. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/useMarketGroupPublish.ts +211 -0
  85. package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/utils.ts +22 -0
  86. package/src/app/[variants]/(main)/resource/features/DndContextWrapper.tsx +4 -2
  87. package/src/app/[variants]/(main)/resource/library/_layout/Header/LibraryHead.tsx +30 -35
  88. package/src/app/[variants]/(main)/resource/library/_layout/Header/index.tsx +9 -11
  89. package/src/app/[variants]/router/desktopRouter.config.tsx +7 -0
  90. package/src/features/Conversation/Messages/AssistantGroup/Tool/Actions/index.tsx +11 -17
  91. package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/LoadingPlaceholder/index.tsx +13 -3
  92. package/src/features/Conversation/Messages/AssistantGroup/Tool/Detail/Render/CustomRender.tsx +43 -0
  93. package/src/features/Conversation/Messages/AssistantGroup/Tool/Detail/Render/FallbacktArgumentRender.tsx +59 -0
  94. package/src/features/Conversation/Messages/AssistantGroup/Tool/Detail/Render/index.tsx +46 -0
  95. package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/index.tsx +13 -19
  96. package/src/features/Conversation/Messages/AssistantGroup/Tool/index.tsx +17 -17
  97. package/src/features/Conversation/Messages/Tool/Tool/index.tsx +10 -9
  98. package/src/features/Conversation/TodoProgress/index.tsx +56 -23
  99. package/src/features/PluginsUI/Render/MCPType/index.tsx +1 -1
  100. package/src/features/ResourceManager/components/Explorer/Header/index.tsx +57 -4
  101. package/src/features/ResourceManager/components/Explorer/ListView/ListItem/index.tsx +6 -4
  102. package/src/features/ResourceManager/components/Explorer/ListView/index.tsx +16 -5
  103. package/src/features/ResourceManager/components/LibraryHierarchy/styles.ts +5 -4
  104. package/src/hooks/useActiveTabKey.ts +1 -2
  105. package/src/locales/default/plugin.ts +1 -0
  106. package/src/locales/default/setting.ts +12 -0
  107. package/src/server/routers/lambda/market/agentGroup.ts +296 -0
  108. package/src/server/routers/lambda/market/index.ts +134 -4
  109. package/src/server/services/discover/index.ts +123 -7
  110. package/src/services/discover.ts +55 -0
  111. package/src/store/chat/slices/message/selectors/dbMessage.test.ts +11 -11
  112. package/src/store/discover/slices/groupAgent/action.ts +80 -0
  113. package/src/store/discover/store.ts +3 -0
  114. package/src/store/file/slices/resource/action.ts +4 -2
  115. package/src/tools/inspectors.ts +2 -0
  116. package/src/tools/interventions.ts +2 -0
  117. package/src/tools/renders.ts +3 -1
  118. package/src/tools/streamings.ts +2 -0
  119. package/packages/builtin-tool-gtd/src/client/Inspector/CompleteTodos/index.tsx +0 -52
  120. package/packages/builtin-tool-gtd/src/client/Inspector/RemoveTodos/index.tsx +0 -52
  121. package/src/features/Conversation/Messages/AssistantGroup/Tool/Render/CustomRender.tsx +0 -113
  122. package/src/features/Conversation/Messages/Tool/Tool/Render.tsx +0 -47
  123. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/AbortResponse.tsx +0 -0
  124. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Arguments/index.tsx +0 -0
  125. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/ErrorResponse.tsx +0 -0
  126. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Intervention/ApprovalActions.tsx +0 -0
  127. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Intervention/Fallback.tsx +0 -0
  128. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Intervention/KeyValueEditor.tsx +0 -0
  129. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Intervention/ModeSelector.tsx +0 -0
  130. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/Intervention/index.tsx +0 -0
  131. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/PluginSettings.tsx +0 -0
  132. /package/src/features/Conversation/Messages/AssistantGroup/Tool/{Render → Detail}/RejectedResponse.tsx +0 -0
@@ -0,0 +1,137 @@
1
+ import { Avatar, Flexbox, Tag } from '@lobehub/ui';
2
+ import { Card, Typography } from 'antd';
3
+ import { Crown, User } from 'lucide-react';
4
+ import { memo } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+
7
+ import { useDetailContext } from '../../DetailProvider';
8
+
9
+ const { Title, Text, Paragraph } = Typography;
10
+
11
+ const MemberCard = memo(
12
+ ({
13
+ agent,
14
+ currentVersion,
15
+ }: {
16
+ agent: any;
17
+ currentVersion: any;
18
+ }) => {
19
+ const { t } = useTranslation('discover');
20
+ const isSupervisor = agent.role === 'supervisor';
21
+
22
+ return (
23
+ <Card hoverable>
24
+ <Flexbox gap={12}>
25
+ {/* Avatar and Basic Info */}
26
+ <Flexbox align="center" gap={12} horizontal>
27
+ <Avatar avatar={currentVersion.avatar || agent.name[0]} size={48} />
28
+ <Flexbox flex={1} gap={4}>
29
+ <Flexbox align="center" gap={8} horizontal>
30
+ <Title level={5} style={{ margin: 0 }}>
31
+ {currentVersion.name || agent.name}
32
+ </Title>
33
+ {isSupervisor ? (
34
+ <Tag color="gold" icon={<Crown size={12} />}>
35
+ {t('members.supervisor', { defaultValue: 'Supervisor' })}
36
+ </Tag>
37
+ ) : (
38
+ <Tag color="blue" icon={<User size={12} />}>
39
+ {t('members.participant', { defaultValue: 'Participant' })}
40
+ </Tag>
41
+ )}
42
+ </Flexbox>
43
+ <Text type="secondary">{agent.identifier}</Text>
44
+ </Flexbox>
45
+ </Flexbox>
46
+
47
+ {/* Description */}
48
+ {currentVersion.description && (
49
+ <Paragraph ellipsis={{ rows: 2 }} style={{ margin: 0 }} type="secondary">
50
+ {currentVersion.description}
51
+ </Paragraph>
52
+ )}
53
+
54
+ {/* System Role (if available) */}
55
+ {currentVersion.config?.systemRole && (
56
+ <Flexbox gap={4}>
57
+ <Text strong>{t('members.systemRole', { defaultValue: 'System Role' })}:</Text>
58
+ <Paragraph ellipsis={{ rows: 3 }} style={{ margin: 0 }} type="secondary">
59
+ {currentVersion.config.systemRole}
60
+ </Paragraph>
61
+ </Flexbox>
62
+ )}
63
+
64
+ {/* Metadata */}
65
+ <Flexbox gap={8} horizontal wrap="wrap">
66
+ {currentVersion.version && (
67
+ <Text type="secondary">
68
+ {t('members.version', { defaultValue: 'Version' })}: {currentVersion.version}
69
+ </Text>
70
+ )}
71
+ {currentVersion.tokenUsage !== undefined && (
72
+ <Text type="secondary">
73
+ {t('members.tokenUsage', { defaultValue: 'Token Usage' })}:{' '}
74
+ {currentVersion.tokenUsage}
75
+ </Text>
76
+ )}
77
+ </Flexbox>
78
+
79
+ {/* URL */}
80
+ {currentVersion.url && (
81
+ <Text
82
+ copyable={{ text: currentVersion.url }}
83
+ ellipsis
84
+ style={{ fontSize: 12 }}
85
+ type="secondary"
86
+ >
87
+ {currentVersion.url}
88
+ </Text>
89
+ )}
90
+ </Flexbox>
91
+ </Card>
92
+ );
93
+ },
94
+ );
95
+
96
+ MemberCard.displayName = 'MemberCard';
97
+
98
+ const Members = memo(() => {
99
+ const { t } = useTranslation('discover');
100
+ const { memberAgents = [] } = useDetailContext();
101
+
102
+ // Sort: supervisors first, then by displayOrder
103
+ const sortedMembers = [...(memberAgents || [])].sort((a: any, b: any) => {
104
+ const aRole = a.role || a.agent?.role;
105
+ const bRole = b.role || b.agent?.role;
106
+ if (aRole === 'supervisor' && bRole !== 'supervisor') return -1;
107
+ if (aRole !== 'supervisor' && bRole === 'supervisor') return 1;
108
+ const aOrder = a.displayOrder || a.agent?.displayOrder || 0;
109
+ const bOrder = b.displayOrder || b.agent?.displayOrder || 0;
110
+ return aOrder - bOrder;
111
+ });
112
+
113
+ return (
114
+ <Flexbox gap={16}>
115
+ <Title level={4}>
116
+ {t('members.title', { defaultValue: 'Member Agents' })} ({memberAgents?.length || 0})
117
+ </Title>
118
+
119
+ <Flexbox gap={12}>
120
+ {sortedMembers.map((member: any, index) => {
121
+ // Support both flat structure and nested structure
122
+ const agent = member.agent || member;
123
+ const currentVersion = member.currentVersion || member;
124
+ return (
125
+ <MemberCard
126
+ agent={agent}
127
+ currentVersion={currentVersion}
128
+ key={agent.identifier || index}
129
+ />
130
+ );
131
+ })}
132
+ </Flexbox>
133
+ </Flexbox>
134
+ );
135
+ });
136
+
137
+ export default Members;
@@ -0,0 +1,88 @@
1
+ 'use client';
2
+
3
+ import { SOCIAL_URL } from '@lobechat/business-const';
4
+ import { Flexbox, Icon, Tabs } from '@lobehub/ui';
5
+ import { createStaticStyles } from 'antd-style';
6
+ import { BookOpenIcon, HistoryIcon, SquareUserIcon } from 'lucide-react';
7
+ import { memo } from 'react';
8
+ import { useTranslation } from 'react-i18next';
9
+
10
+
11
+ const styles = createStaticStyles(({ css, cssVar }) => {
12
+ return {
13
+ link: css`
14
+ color: ${cssVar.colorTextDescription};
15
+
16
+ &:hover {
17
+ color: ${cssVar.colorInfo};
18
+ }
19
+ `,
20
+ nav: css`
21
+ border-block-end: 1px solid ${cssVar.colorBorder};
22
+ `,
23
+ };
24
+ });
25
+
26
+ export enum GroupAgentNavKey {
27
+ Overview = 'overview',
28
+ SystemRole = 'systemRole',
29
+ Versions = 'versions',
30
+ }
31
+
32
+ interface NavProps {
33
+ activeTab?: GroupAgentNavKey;
34
+ mobile?: boolean;
35
+ setActiveTab?: (tab: GroupAgentNavKey) => void;
36
+ }
37
+
38
+ const Nav = memo<NavProps>(({ mobile, setActiveTab, activeTab = GroupAgentNavKey.Overview }) => {
39
+ const { t } = useTranslation('discover');
40
+
41
+ const nav = (
42
+ <Tabs
43
+ activeKey={activeTab}
44
+ compact={mobile}
45
+ items={[
46
+ {
47
+ icon: <Icon icon={BookOpenIcon} size={16} />,
48
+ key: GroupAgentNavKey.Overview,
49
+ label: t('groupAgents.details.overview.title', { defaultValue: 'Overview' }),
50
+ },
51
+ {
52
+ icon: <Icon icon={SquareUserIcon} size={16} />,
53
+ key: GroupAgentNavKey.SystemRole,
54
+ label: t('groupAgents.details.systemRole.title', { defaultValue: 'System Role' }),
55
+ },
56
+ {
57
+ icon: <Icon icon={HistoryIcon} size={16} />,
58
+ key: GroupAgentNavKey.Versions,
59
+ label: t('groupAgents.details.versions.title', { defaultValue: 'Versions' }),
60
+ },
61
+ ]}
62
+ onChange={(key) => setActiveTab?.(key as GroupAgentNavKey)}
63
+ />
64
+ );
65
+
66
+ return mobile ? (
67
+ nav
68
+ ) : (
69
+ <Flexbox align={'center'} className={styles.nav} horizontal justify={'space-between'}>
70
+ {nav}
71
+ <Flexbox gap={12} horizontal>
72
+ <a className={styles.link} href={SOCIAL_URL.discord} rel="noreferrer" target="_blank">
73
+ {t('groupAgents.details.nav.needHelp', { defaultValue: 'Need help?' })}
74
+ </a>
75
+ <a
76
+ className={styles.link}
77
+ href="https://github.com/lobehub/lobe-chat/issues/new/choose"
78
+ rel="noreferrer"
79
+ target="_blank"
80
+ >
81
+ {t('groupAgents.details.nav.reportIssue', { defaultValue: 'Report issue' })}
82
+ </a>
83
+ </Flexbox>
84
+ </Flexbox>
85
+ );
86
+ });
87
+
88
+ export default Nav;
@@ -0,0 +1,213 @@
1
+ import { BRANDING_NAME } from '@lobechat/business-const';
2
+ import { Avatar, Block, Collapse, Flexbox, Grid, Text } from '@lobehub/ui';
3
+ import { ChatList } from '@lobehub/ui/chat';
4
+ import { createStaticStyles, useTheme } from 'antd-style';
5
+ import { memo } from 'react';
6
+ import { useTranslation } from 'react-i18next';
7
+
8
+ import { DEFAULT_USER_AVATAR_URL } from '@/const/meta';
9
+ import { useUserStore } from '@/store/user';
10
+ import { authSelectors, userProfileSelectors } from '@/store/user/selectors';
11
+
12
+ import Title from '../../../../../features/Title';
13
+ import { useDetailContext } from '../../DetailProvider';
14
+
15
+ const styles = createStaticStyles(({ css, cssVar }) => {
16
+ return {
17
+ desc: css`
18
+ flex: 1;
19
+ margin: 0 !important;
20
+ color: ${cssVar.colorTextSecondary};
21
+ `,
22
+ title: css`
23
+ margin: 0 !important;
24
+ font-size: 14px !important;
25
+ font-weight: 500 !important;
26
+ `,
27
+ };
28
+ });
29
+
30
+ const MemberCard = memo(
31
+ ({
32
+ agent,
33
+ currentVersion,
34
+ }: {
35
+ agent: any;
36
+ currentVersion: any;
37
+ }) => {
38
+ return (
39
+ <Block
40
+ height={'100%'}
41
+ style={{
42
+ cursor: 'default',
43
+ overflow: 'hidden',
44
+ }}
45
+ variant={'outlined'}
46
+ width={'100%'}
47
+ >
48
+ <Flexbox gap={12} padding={16}>
49
+ {/* Avatar and Basic Info */}
50
+ <Flexbox align={'flex-start'} gap={12} horizontal>
51
+ <Avatar
52
+ avatar={currentVersion.avatar || agent.name?.[0]}
53
+ shape={'square'}
54
+ size={40}
55
+ style={{ flex: 'none' }}
56
+ />
57
+ <Flexbox
58
+ flex={1}
59
+ gap={4}
60
+ style={{
61
+ overflow: 'hidden',
62
+ }}
63
+ >
64
+ <Text as={'h3'} className={styles.title} ellipsis>
65
+ {currentVersion.name || agent.name}
66
+ </Text>
67
+ </Flexbox>
68
+ </Flexbox>
69
+
70
+ {/* Description */}
71
+ {currentVersion.description && currentVersion.description !== 'No description provided' && (
72
+ <Text
73
+ as={'p'}
74
+ className={styles.desc}
75
+ ellipsis={{
76
+ rows: 2,
77
+ }}
78
+ >
79
+ {currentVersion.description}
80
+ </Text>
81
+ )}
82
+ </Flexbox>
83
+ </Block>
84
+ );
85
+ },
86
+ );
87
+
88
+ MemberCard.displayName = 'MemberCard';
89
+
90
+ const Overview = memo(() => {
91
+ const [userAvatar, username] = useUserStore((s) => [
92
+ userProfileSelectors.userAvatar(s),
93
+ userProfileSelectors.username(s),
94
+ ]);
95
+
96
+ const isSignedIn = useUserStore(authSelectors.isLogin);
97
+ const { t } = useTranslation('discover');
98
+ const theme = useTheme();
99
+ const {
100
+ examples = [],
101
+ description,
102
+ summary,
103
+ avatar,
104
+ title,
105
+ backgroundColor,
106
+ config,
107
+ memberAgents = [],
108
+ } = useDetailContext();
109
+
110
+ const data: any = [
111
+ {
112
+ content: config?.openingMessage,
113
+ role: 'assistant',
114
+ },
115
+ ...examples,
116
+ ].map((item, index) => {
117
+ let meta = {
118
+ avatar,
119
+ backgroundColor: backgroundColor || 'transparent',
120
+ title,
121
+ };
122
+ if (item.role === 'user') {
123
+ meta = {
124
+ avatar: isSignedIn && !!userAvatar ? userAvatar : DEFAULT_USER_AVATAR_URL,
125
+ backgroundColor: 'transparent',
126
+ title: isSignedIn && !!username ? username : BRANDING_NAME,
127
+ };
128
+ }
129
+
130
+ return {
131
+ extra: {},
132
+ id: index,
133
+ ...item,
134
+ meta,
135
+ };
136
+ });
137
+
138
+ // Sort: supervisors first, then by displayOrder
139
+ const sortedMembers = [...(memberAgents || [])].sort((a: any, b: any) => {
140
+ const aRole = a.role || a.agent?.role;
141
+ const bRole = b.role || b.agent?.role;
142
+ if (aRole === 'supervisor' && bRole !== 'supervisor') return -1;
143
+ if (aRole !== 'supervisor' && bRole === 'supervisor') return 1;
144
+ const aOrder = a.displayOrder || a.agent?.displayOrder || 0;
145
+ const bOrder = b.displayOrder || b.agent?.displayOrder || 0;
146
+ return aOrder - bOrder;
147
+ });
148
+
149
+ return (
150
+ <Flexbox gap={16}>
151
+ <Collapse
152
+ defaultActiveKey={['summary']}
153
+ expandIconPlacement={'end'}
154
+ items={[
155
+ {
156
+ children: summary || description,
157
+ key: 'summary',
158
+ label: t('groupAgents.details.summary.title', { defaultValue: 'Summary' }),
159
+ },
160
+ ]}
161
+ variant={'outlined'}
162
+ />
163
+
164
+ {/* Members Section */}
165
+ {memberAgents.length > 0 && (
166
+ <>
167
+ <Title>
168
+ {t('groupAgents.details.members.title', { defaultValue: 'Member Agents' })} (
169
+ {memberAgents.length})
170
+ </Title>
171
+ <Grid rows={4} width={'100%'}>
172
+ {sortedMembers.map((member: any, index) => {
173
+ // Support both flat structure and nested structure
174
+ const agent = member.agent || member;
175
+ const currentVersion = member.currentVersion || member;
176
+ return (
177
+ <MemberCard
178
+ agent={agent}
179
+ currentVersion={currentVersion}
180
+ key={agent.identifier || index}
181
+ />
182
+ );
183
+ })}
184
+ </Grid>
185
+ </>
186
+ )}
187
+
188
+ {data.length > 0 && config?.openingMessage && (
189
+ <>
190
+ <Title>
191
+ {t('groupAgents.details.overview.example', { defaultValue: 'Conversation Example' })}
192
+ </Title>
193
+ <Block
194
+ style={{
195
+ background: theme.colorBgContainerSecondary,
196
+ }}
197
+ variant={'outlined'}
198
+ >
199
+ <ChatList
200
+ data={data}
201
+ renderMessages={{
202
+ default: ({ id, editableContent }) => <div id={id}>{editableContent}</div>,
203
+ }}
204
+ style={{ width: '100%' }}
205
+ />
206
+ </Block>
207
+ </>
208
+ )}
209
+ </Flexbox>
210
+ );
211
+ });
212
+
213
+ export default Overview;
@@ -0,0 +1,85 @@
1
+ import { Avatar, Flexbox, Text , Grid } from '@lobehub/ui';
2
+ import qs from 'query-string';
3
+ import { memo } from 'react';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { useNavigate } from 'react-router-dom';
6
+ import urlJoin from 'url-join';
7
+
8
+ import { type DiscoverGroupAgentItem } from '@/types/discover';
9
+
10
+ import Title from '../../../../../features/Title';
11
+ import { useDetailContext } from '../../DetailProvider';
12
+
13
+ const GroupAgentCard = memo<DiscoverGroupAgentItem>((item) => {
14
+ const navigate = useNavigate();
15
+
16
+ const handleClick = () => {
17
+ if (!item.identifier) return;
18
+ navigate(qs.stringifyUrl({
19
+ url: urlJoin('/community/group_agent', item.identifier),
20
+ }));
21
+ };
22
+
23
+ return (
24
+ <Flexbox
25
+ gap={12}
26
+ onClick={handleClick}
27
+ padding={16}
28
+ style={{
29
+ border: '1px solid var(--lobe-border-color)',
30
+ borderRadius: 8,
31
+ cursor: 'pointer',
32
+ transition: 'all 0.2s',
33
+ }}
34
+ >
35
+ <Flexbox align="center" gap={12} horizontal>
36
+ <Avatar avatar={item.avatar || item.title[0]} shape="square" size={48} />
37
+ <Flexbox flex={1} gap={4}>
38
+ <Text ellipsis style={{ fontWeight: 500 }}>
39
+ {item.title}
40
+ </Text>
41
+ <Text ellipsis style={{ fontSize: 12, opacity: 0.65 }} type="secondary">
42
+ {item.description}
43
+ </Text>
44
+ </Flexbox>
45
+ </Flexbox>
46
+ </Flexbox>
47
+ );
48
+ });
49
+
50
+ const Related = memo(() => {
51
+ const { t } = useTranslation('discover');
52
+ const { related = [], category } = useDetailContext();
53
+
54
+ return (
55
+ <Flexbox gap={16}>
56
+ <Title
57
+ more={t('groupAgents.details.related.more', { defaultValue: 'View More' })}
58
+ moreLink={qs.stringifyUrl(
59
+ {
60
+ query: {
61
+ category,
62
+ },
63
+ url: '/community/group_agent',
64
+ },
65
+ { skipNull: true },
66
+ )}
67
+ >
68
+ {t('groupAgents.details.related.listTitle', { defaultValue: 'Related Group Agents' })}
69
+ </Title>
70
+ {related.length > 0 ? (
71
+ <Grid rows={4}>
72
+ {related.map((item) => (
73
+ <GroupAgentCard key={item.identifier} {...item} />
74
+ ))}
75
+ </Grid>
76
+ ) : (
77
+ <Flexbox align="center" padding={32} style={{ color: '#999' }}>
78
+ {t('groupAgents.details.related.empty', { defaultValue: 'No related group agents found' })}
79
+ </Flexbox>
80
+ )}
81
+ </Flexbox>
82
+ );
83
+ });
84
+
85
+ export default Related;
@@ -0,0 +1,20 @@
1
+ import { Tag as AntdTag, Flexbox } from '@lobehub/ui';
2
+ import { memo } from 'react';
3
+
4
+ interface TagListProps {
5
+ tags?: string[];
6
+ }
7
+
8
+ const TagList = memo<TagListProps>(({ tags = [] }) => {
9
+ if (!tags || tags.length === 0) return null;
10
+
11
+ return (
12
+ <Flexbox gap={8} horizontal wrap={'wrap'}>
13
+ {tags.map((tag, index) => (
14
+ <AntdTag key={index}>{tag}</AntdTag>
15
+ ))}
16
+ </Flexbox>
17
+ );
18
+ });
19
+
20
+ export default TagList;
@@ -0,0 +1,71 @@
1
+ import { Block, Flexbox, Icon, Tag } from '@lobehub/ui';
2
+ import { cssVar } from 'antd-style';
3
+ import { MessageCircleHeartIcon, MessageCircleQuestionIcon } from 'lucide-react';
4
+ import { memo } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+
7
+ import Title from '../../../../../features/Title';
8
+ import MarkdownRender from '../../../../features/MakedownRender';
9
+ import { useDetailContext } from '../../DetailProvider';
10
+ import TagList from './TagList';
11
+
12
+ const SystemRole = memo(() => {
13
+ const { t } = useTranslation('discover');
14
+ const { tokenUsage, tags = [], config } = useDetailContext();
15
+
16
+ const { systemRole, openingMessage, openingQuestions } = config || {};
17
+ return (
18
+ <Flexbox gap={16}>
19
+ {systemRole && (
20
+ <>
21
+ <Title tag={tokenUsage && <Tag>{t('groupAgents.details.tokenUsage', { defaultValue: `${tokenUsage} tokens` })}</Tag>}>
22
+ {t('groupAgents.details.systemRole.title', { defaultValue: 'System Role' })}
23
+ </Title>
24
+ <Block gap={16} padding={16} variant={'outlined'}>
25
+ {<MarkdownRender>{systemRole.trimEnd()}</MarkdownRender>}
26
+ <TagList tags={tags} />
27
+ </Block>
28
+ </>
29
+ )}
30
+ {openingMessage && (
31
+ <>
32
+ <Title>
33
+ {t('groupAgents.details.systemRole.openingMessage', {
34
+ defaultValue: 'Opening Message',
35
+ })}
36
+ </Title>
37
+ <Block align={'flex-start'} gap={12} horizontal padding={16} variant={'outlined'}>
38
+ <Icon
39
+ color={cssVar.colorError}
40
+ icon={MessageCircleHeartIcon}
41
+ size={20}
42
+ style={{
43
+ marginTop: 4,
44
+ }}
45
+ />
46
+ <MarkdownRender>{openingMessage?.trimEnd()}</MarkdownRender>
47
+ </Block>
48
+ </>
49
+ )}
50
+ {openingQuestions && openingQuestions.length > 0 && (
51
+ <>
52
+ <Title tag={<Tag>{openingQuestions?.length}</Tag>}>
53
+ {t('groupAgents.details.systemRole.openingQuestions', {
54
+ defaultValue: 'Opening Questions',
55
+ })}
56
+ </Title>
57
+ <Flexbox gap={8}>
58
+ {openingQuestions?.map((item, key) => (
59
+ <Block gap={12} horizontal key={key} padding={16} variant={'outlined'}>
60
+ <Icon color={cssVar.colorWarning} icon={MessageCircleQuestionIcon} size={20} />
61
+ <MarkdownRender>{item}</MarkdownRender>
62
+ </Block>
63
+ ))}
64
+ </Flexbox>
65
+ </>
66
+ )}
67
+ </Flexbox>
68
+ );
69
+ });
70
+
71
+ export default SystemRole;