'use client' import type { AgentAppPartial } from '@dify/contracts/api/console/agent/types.gen' import type { RosterFilterValue } from './components/roster-filter' import { ScrollAreaContent, ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport, } from '@langgenius/dify-ui/scroll-area' import { keepPreviousData, useInfiniteQuery } from '@tanstack/react-query' import { useDebounce } from 'ahooks' import { useQueryState } from 'nuqs' import { useTranslation } from 'react-i18next' import { useDocLink } from '@/context/i18n' import useDocumentTitle from '@/hooks/use-document-title' import { consoleQuery } from '@/service/client' import { AgentRosterList } from './components/agent-roster-list' import { RosterToolbar } from './components/roster-toolbar' import { rosterCreatedByMeQueryParser, rosterFilterQueryParser, rosterKeywordQueryParser, rosterQueryParamNames, rosterSortByQueryParser, } from './query-params' const ROSTER_PAGE_SIZE = 30 const isAgentPublished = (agent: AgentAppPartial) => agent.active_config_is_published === true const getFilteredRosterItems = (agents: AgentAppPartial[], filter: RosterFilterValue) => { if (filter === 'published') return agents.filter(isAgentPublished) if (filter === 'drafts') return agents.filter((agent) => !isAgentPublished(agent)) return agents } export default function RosterPage() { const { t } = useTranslation('agentV2') const docLink = useDocLink() const [keyword] = useQueryState(rosterQueryParamNames.keyword, rosterKeywordQueryParser) const [rosterFilter] = useQueryState(rosterQueryParamNames.filter, rosterFilterQueryParser) const [createdByMe] = useQueryState( rosterQueryParamNames.createdByMe, rosterCreatedByMeQueryParser, ) const [sortBy] = useQueryState(rosterQueryParamNames.sortBy, rosterSortByQueryParser) const debouncedKeyword = useDebounce(keyword.trim(), { wait: 300 }) const rosterQueryInput = { limit: ROSTER_PAGE_SIZE, sort_by: sortBy, ...(debouncedKeyword ? { name: debouncedKeyword } : {}), ...(createdByMe ? { is_created_by_me: true } : {}), } const { data: rosterPages, isPending, isFetching, isFetchingNextPage, fetchNextPage, hasNextPage, error, } = useInfiniteQuery({ ...consoleQuery.agent.get.infiniteOptions({ input: (pageParam) => ({ query: { ...rosterQueryInput, page: Number(pageParam), }, }), getNextPageParam: (lastPage) => (lastPage.has_more ? lastPage.page + 1 : undefined), initialPageParam: 1, placeholderData: keepPreviousData, }), }) const rosterItems: AgentAppPartial[] = rosterPages?.pages.flatMap((page) => page.data) ?? [] const publishedAgents = rosterItems.filter(isAgentPublished).length const draftAgents = Math.max(rosterItems.length - publishedAgents, 0) const filteredRosterItems = getFilteredRosterItems(rosterItems, rosterFilter) useDocumentTitle('Agents') return (