Feat: Memory-message supports categorized display (#12482)

### What problem does this PR solve?

Feat: Memory-message supports categorized display

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
chanx
2026-01-07 13:48:40 +08:00
committed by GitHub
parent 07845be5bd
commit 671e719d75
2 changed files with 65 additions and 7 deletions

View File

@ -2,7 +2,6 @@ export interface IMessageInfo {
message_id: number; message_id: number;
message_type: 'semantic' | 'raw' | 'procedural'; message_type: 'semantic' | 'raw' | 'procedural';
source_id: string | '-'; source_id: string | '-';
id: string;
user_id: string; user_id: string;
agent_id: string; agent_id: string;
agent_name: string; agent_name: string;
@ -11,6 +10,7 @@ export interface IMessageInfo {
invalid_at: string; invalid_at: string;
forget_at: string; forget_at: string;
status: boolean; status: boolean;
extract?: IMessageInfo[];
} }
export interface IMessageTableProps { export interface IMessageTableProps {

View File

@ -17,15 +17,19 @@ import {
TableRow, TableRow,
} from '@/components/ui/table'; } from '@/components/ui/table';
import { Pagination } from '@/interfaces/common'; import { Pagination } from '@/interfaces/common';
import { cn } from '@/lib/utils';
import { replaceText } from '@/pages/dataset/process-log-modal'; import { replaceText } from '@/pages/dataset/process-log-modal';
import { MemoryOptions } from '@/pages/memories/constants'; import { MemoryOptions } from '@/pages/memories/constants';
import { import {
ColumnDef, ColumnDef,
ColumnFiltersState, ColumnFiltersState,
ExpandedState,
Row,
SortingState, SortingState,
VisibilityState, VisibilityState,
flexRender, flexRender,
getCoreRowModel, getCoreRowModel,
getExpandedRowModel,
getFilteredRowModel, getFilteredRowModel,
getPaginationRowModel, getPaginationRowModel,
getSortedRowModel, getSortedRowModel,
@ -33,7 +37,13 @@ import {
} from '@tanstack/react-table'; } from '@tanstack/react-table';
import { t } from 'i18next'; import { t } from 'i18next';
import { pick } from 'lodash'; import { pick } from 'lodash';
import { Copy, Eraser, TextSelect } from 'lucide-react'; import {
Copy,
Eraser,
ListChevronsDownUp,
ListChevronsUpDown,
TextSelect,
} from 'lucide-react';
import * as React from 'react'; import * as React from 'react';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { CopyToClipboard } from 'react-copy-to-clipboard'; import { CopyToClipboard } from 'react-copy-to-clipboard';
@ -74,15 +84,55 @@ export function MemoryTable({
handleClickMessageContentDialog, handleClickMessageContentDialog,
} = useMessageAction(); } = useMessageAction();
const disabledRowFunc = (row: Row<IMessageInfo>) => {
return row.original.forget_at !== 'None' && !!row.original.forget_at;
};
// Define columns for the memory table // Define columns for the memory table
const columns: ColumnDef<IMessageInfo>[] = useMemo( const columns: ColumnDef<IMessageInfo>[] = useMemo(
() => [ () => [
{ {
accessorKey: 'session_id', accessorKey: 'session_id',
header: () => <span>{t('memory.messages.sessionId')}</span>, header: ({ table }) => (
<div className="flex items-center gap-1">
<button
{...{
onClick: table.getToggleAllRowsExpandedHandler(),
}}
>
{table.getIsAllRowsExpanded() ? (
<ListChevronsDownUp size={16} />
) : (
<ListChevronsUpDown size={16} />
)}
</button>{' '}
<span>{t('memory.messages.sessionId')}</span>
</div>
),
cell: ({ row }) => ( cell: ({ row }) => (
<div className="text-sm font-medium "> <div className="flex items-center gap-1">
{row.getValue('session_id')} {row.getCanExpand() ? (
<button
{...{
onClick: row.getToggleExpandedHandler(),
style: { cursor: 'pointer' },
}}
>
{row.getIsExpanded() ? (
<ListChevronsDownUp size={16} />
) : (
<ListChevronsUpDown size={16} />
)}
</button>
) : (
''
)}
<div
className={cn('text-sm font-medium', {
'pl-5': !row.getCanExpand(),
})}
>
{row.getValue('session_id')}
</div>
</div> </div>
), ),
}, },
@ -138,6 +188,7 @@ export function MemoryTable({
return ( return (
<div className="flex items-center"> <div className="flex items-center">
<Switch <Switch
disabled={disabledRowFunc(row)}
defaultChecked={isEnabled} defaultChecked={isEnabled}
onCheckedChange={(val) => { onCheckedChange={(val) => {
handleClickUpdateMessageState(row.original, val); handleClickUpdateMessageState(row.original, val);
@ -166,6 +217,7 @@ export function MemoryTable({
</Button> </Button>
<Button <Button
variant={'delete'} variant={'delete'}
disabled={disabledRowFunc(row)}
className="bg-transparent" className="bg-transparent"
aria-label="Edit" aria-label="Edit"
onClick={() => { onClick={() => {
@ -187,15 +239,18 @@ export function MemoryTable({
pageSize: pagination.pageSize || 10, pageSize: pagination.pageSize || 10,
}; };
}, [pagination]); }, [pagination]);
const [expanded, setExpanded] = React.useState<ExpandedState>({});
const table = useReactTable({ const table = useReactTable({
data: messages, data: messages,
columns, columns,
onExpandedChange: setExpanded,
getSubRows: (row) => row.extract || undefined,
onSortingChange: setSorting, onSortingChange: setSorting,
onColumnFiltersChange: setColumnFilters, onColumnFiltersChange: setColumnFilters,
getCoreRowModel: getCoreRowModel(), getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(), getPaginationRowModel: getPaginationRowModel(),
getSortedRowModel: getSortedRowModel(), getSortedRowModel: getSortedRowModel(),
getExpandedRowModel: getExpandedRowModel(),
getFilteredRowModel: getFilteredRowModel(), getFilteredRowModel: getFilteredRowModel(),
onColumnVisibilityChange: setColumnVisibility, onColumnVisibilityChange: setColumnVisibility,
manualPagination: true, manualPagination: true,
@ -204,6 +259,7 @@ export function MemoryTable({
columnFilters, columnFilters,
columnVisibility, columnVisibility,
pagination: currentPagination, pagination: currentPagination,
expanded,
}, },
rowCount: total, rowCount: total,
}); });
@ -233,7 +289,9 @@ export function MemoryTable({
<TableRow <TableRow
key={row.id} key={row.id}
data-state={row.getIsSelected() && 'selected'} data-state={row.getIsSelected() && 'selected'}
className="group" className={cn('group', {
'bg-bg-list/5': !row.getCanExpand(),
})}
> >
{row.getVisibleCells().map((cell) => ( {row.getVisibleCells().map((cell) => (
<TableCell key={cell.id}> <TableCell key={cell.id}>