diff --git a/web/src/pages/memory/memory-message/hook.ts b/web/src/pages/memory/memory-message/hook.ts
index 7cf05a5d2..0273b581a 100644
--- a/web/src/pages/memory/memory-message/hook.ts
+++ b/web/src/pages/memory/memory-message/hook.ts
@@ -1,9 +1,12 @@
+import { FilterCollection } from '@/components/list-filter-bar/interface';
+import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-filter-submit';
import message from '@/components/ui/message';
import { useHandleSearchChange } from '@/hooks/logic-hooks';
import memoryService, { getMemoryDetailById } from '@/services/memory-service';
+import { groupListByType } from '@/utils/list-filter-util';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { t } from 'i18next';
-import { useCallback, useState } from 'react';
+import { useCallback, useMemo, useState } from 'react';
import { useParams, useSearchParams } from 'react-router';
import { MemoryApiAction } from '../constant';
import {
@@ -18,13 +21,15 @@ export const useFetchMemoryMessageList = () => {
const memoryBaseId = searchParams.get('id') || id;
const { handleInputChange, searchString, pagination, setPagination } =
useHandleSearchChange();
-
+ const { filterValue, handleFilterSubmit } = useHandleFilterSubmit();
let queryKey: (MemoryApiAction | number)[] = [
MemoryApiAction.FetchMemoryMessage,
];
-
+ const agentIds = Array.isArray(filterValue.agentId)
+ ? filterValue.agentId
+ : [];
const { data, isFetching: loading } = useQuery
({
- queryKey: [...queryKey, searchString, pagination],
+ queryKey: [...queryKey, searchString, pagination, filterValue],
initialData: {} as IMessageTableProps,
gcTime: 0,
queryFn: async () => {
@@ -33,6 +38,7 @@ export const useFetchMemoryMessageList = () => {
keywords: searchString,
page: pagination.current,
page_size: pagination.pageSize,
+ agentId: agentIds.length > 0 ? agentIds.join(',') : undefined,
});
return data?.data ?? {};
} else {
@@ -48,6 +54,8 @@ export const useFetchMemoryMessageList = () => {
searchString,
pagination,
setPagination,
+ filterValue,
+ handleFilterSubmit,
};
};
@@ -164,3 +172,24 @@ export const useMessageAction = () => {
handleClickUpdateMessageState,
};
};
+
+export function useSelectFilters() {
+ const { data } = useFetchMemoryMessageList();
+ const agentId = useMemo(() => {
+ return groupListByType(
+ data?.messages?.message_list ?? [],
+ 'agent_id',
+ 'agent_name',
+ );
+ }, [data?.messages?.message_list]);
+
+ const filters: FilterCollection[] = [
+ {
+ field: 'agentId',
+ list: agentId,
+ label: 'Agent',
+ },
+ ];
+
+ return { filters };
+}
diff --git a/web/src/pages/memory/memory-message/index.tsx b/web/src/pages/memory/memory-message/index.tsx
index 943fad706..62e27678d 100644
--- a/web/src/pages/memory/memory-message/index.tsx
+++ b/web/src/pages/memory/memory-message/index.tsx
@@ -1,6 +1,6 @@
import ListFilterBar from '@/components/list-filter-bar';
import { t } from 'i18next';
-import { useFetchMemoryMessageList } from './hook';
+import { useFetchMemoryMessageList, useSelectFilters } from './hook';
import { MemoryTable } from './message-table';
export default function MemoryMessage() {
@@ -11,25 +11,29 @@ export default function MemoryMessage() {
pagination,
handleInputChange,
setPagination,
- // filterValue,
- // handleFilterSubmit,
+ filterValue,
+ handleFilterSubmit,
loading,
} = useFetchMemoryMessageList();
+ const { filters } = useSelectFilters();
return (
{t('memory.sideBar.messages')}
-
+
{t('memory.messages.messageDescription')}
diff --git a/web/src/pages/memory/memory-message/message-table.tsx b/web/src/pages/memory/memory-message/message-table.tsx
index 9557c0190..1a8d6c946 100644
--- a/web/src/pages/memory/memory-message/message-table.tsx
+++ b/web/src/pages/memory/memory-message/message-table.tsx
@@ -210,7 +210,7 @@ export function MemoryTable({
return (
-
+
{table.getHeaderGroups().map((headerGroup) => (
@@ -257,7 +257,7 @@ export function MemoryTable({
title={t('memory.messages.forgetMessage')}
open={showDeleteDialog}
onOpenChange={setShowDeleteDialog}
- okButtonText={t('common.confirm')}
+ okButtonText={t('memory.messages.forget')}
content={{
title: t('memory.messages.forgetMessageTip'),
node: (
diff --git a/web/src/pages/memory/memory-setting/advanced-settings-form.tsx b/web/src/pages/memory/memory-setting/advanced-settings-form.tsx
index 8ff2918ea..2776e29f8 100644
--- a/web/src/pages/memory/memory-setting/advanced-settings-form.tsx
+++ b/web/src/pages/memory/memory-setting/advanced-settings-form.tsx
@@ -30,7 +30,9 @@ export const AdvancedSettingsForm = () => {
return (
<>
setShowAdvancedSettings(!showAdvancedSettings)}
>
{showAdvancedSettings ? (
@@ -134,6 +136,7 @@ export const AdvancedSettingsForm = () => {
/>
{
/>
{
label={t('memory.config.description')}
required={false}
horizontal={true}
+ className="!items-start"
// tooltip={field.tooltip}
// labelClassName={labelClassName || field.labelClassName}
>
diff --git a/web/src/pages/next-chats/index.tsx b/web/src/pages/next-chats/index.tsx
index 2f45ff942..00077b678 100644
--- a/web/src/pages/next-chats/index.tsx
+++ b/web/src/pages/next-chats/index.tsx
@@ -72,7 +72,7 @@ export default function ChatList() {
searchString={searchString}
>
diff --git a/web/src/pages/next-searches/index.tsx b/web/src/pages/next-searches/index.tsx
index 39482c0fe..7656c50af 100644
--- a/web/src/pages/next-searches/index.tsx
+++ b/web/src/pages/next-searches/index.tsx
@@ -96,7 +96,7 @@ export default function SearchList() {
openCreateModalFun();
}}
>
-
+
{t('createSearch')}
diff --git a/web/src/pages/user-setting/data-source/constant/index.tsx b/web/src/pages/user-setting/data-source/constant/index.tsx
index 8b9193c18..199443178 100644
--- a/web/src/pages/user-setting/data-source/constant/index.tsx
+++ b/web/src/pages/user-setting/data-source/constant/index.tsx
@@ -1,6 +1,8 @@
import { FormFieldType } from '@/components/dynamic-form';
+import { IconFontFill } from '@/components/icon-font';
import SvgIcon from '@/components/svg-icon';
import { t, TFunction } from 'i18next';
+import { Mail } from 'lucide-react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import BoxTokenField from '../component/box-token-field';
@@ -130,12 +132,18 @@ export const generateDataSourceInfo = (t: TFunction) => {
[DataSourceKey.GITHUB]: {
name: 'GitHub',
description: t(`setting.${DataSourceKey.GITHUB}Description`),
- icon: ,
+ icon: (
+
+ ),
},
[DataSourceKey.IMAP]: {
name: 'IMAP',
description: t(`setting.${DataSourceKey.IMAP}Description`),
- icon: ,
+ icon: ,
},
[DataSourceKey.BITBUCKET]: {
name: 'Bitbucket',
diff --git a/web/src/utils/list-filter-util.ts b/web/src/utils/list-filter-util.ts
index 727f55e9b..06fcbc733 100644
--- a/web/src/utils/list-filter-util.ts
+++ b/web/src/utils/list-filter-util.ts
@@ -22,8 +22,32 @@ export function groupListByType>(
return fileTypeList;
}
-export function buildOwnersFilter>(list: T[]) {
- const owners = groupListByType(list, 'tenant_id', 'nickname');
+export function groupListByArray>(
+ list: T[],
+ idField: string,
+) {
+ const fileTypeList: FilterType[] = [];
+ list.forEach((x) => {
+ if (Array.isArray(x[idField])) {
+ x[idField].forEach((j) => {
+ const item = fileTypeList.find((i) => i.id === j);
+ if (!item) {
+ fileTypeList.push({ id: j, label: j, count: 1 });
+ } else {
+ item.count += 1;
+ }
+ });
+ }
+ });
+
+ return fileTypeList;
+}
+
+export function buildOwnersFilter>(
+ list: T[],
+ nickName?: string,
+) {
+ const owners = groupListByType(list, 'tenant_id', nickName || 'nickname');
return { field: 'owner', list: owners, label: 'Owner' };
}
diff --git a/web/vite.config.ts b/web/vite.config.ts
index 25f1c5b01..7ef0e5c71 100644
--- a/web/vite.config.ts
+++ b/web/vite.config.ts
@@ -61,6 +61,9 @@ export default defineConfig(({ mode, command }) => {
server: {
port: 9222,
strictPort: false,
+ hmr: {
+ overlay: false,
+ },
proxy: {
'/api/v1/admin': {
target: 'http://127.0.0.1:9381/',
@@ -77,18 +80,63 @@ export default defineConfig(({ mode, command }) => {
assetsInclude: ['**/*.md'],
base: env.VITE_BASE_URL,
publicDir: 'public',
+ cacheDir: './node_modules/.vite-cache',
+ optimizeDeps: {
+ include: [
+ 'react',
+ 'react-dom',
+ 'react-router',
+ 'antd',
+ 'axios',
+ 'lodash',
+ 'dayjs',
+ ],
+ exclude: [],
+ force: false,
+ },
build: {
outDir: 'dist',
assetsDir: 'assets',
assetsInlineLimit: 4096,
experimentalMinChunkSize: 30 * 1024,
+ chunkSizeWarningLimit: 1000,
rollupOptions: {
output: {
+ manualChunks(id) {
+ // if (id.includes('src/components')) {
+ // return 'components';
+ // }
+
+ if (id.includes('node_modules')) {
+ if (id.includes('node_modules/d3')) {
+ return 'd3';
+ }
+ if (id.includes('node_modules/ajv')) {
+ return 'ajv';
+ }
+ if (id.includes('node_modules/@antv')) {
+ return 'antv';
+ }
+ const name = id
+ .toString()
+ .split('node_modules/')[1]
+ .split('/')[0]
+ .toString();
+ if (['lodash', 'dayjs', 'date-fns', 'axios'].includes(name)) {
+ return 'utils';
+ }
+ if (['@xmldom', 'xmlbuilder '].includes(name)) {
+ return 'xml-js';
+ }
+ return name;
+ }
+ },
chunkFileNames: 'chunk/js/[name]-[hash].js',
entryFileNames: 'entry/js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
},
plugins: [],
+ treeshake: true,
},
minify: 'terser',
terserOptions: {
@@ -108,6 +156,8 @@ export default defineConfig(({ mode, command }) => {
},
},
sourcemap: true,
+ cssCodeSplit: true,
+ target: 'es2015',
},
esbuild: {
tsconfigRaw: {
@@ -118,5 +168,6 @@ export default defineConfig(({ mode, command }) => {
},
},
},
+ entries: ['./src/main.tsx'],
};
});