From 73365651c1dbb841b045ddfad3284a32aeab34b6 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 11 Nov 2025 03:48:04 +0000 Subject: [PATCH 01/11] Create useSWRINFxRecentThreads --- .../features/mastra/client/stores/thread.tsx | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/app/src/features/mastra/client/stores/thread.tsx diff --git a/apps/app/src/features/mastra/client/stores/thread.tsx b/apps/app/src/features/mastra/client/stores/thread.tsx new file mode 100644 index 00000000000..071d3fcbe1a --- /dev/null +++ b/apps/app/src/features/mastra/client/stores/thread.tsx @@ -0,0 +1,40 @@ +import type { PaginationInfo, StorageThreadType } from '@mastra/core'; +import type { SWRConfiguration } from 'swr'; +import type { SWRInfiniteResponse } from 'swr/infinite'; +import useSWRInfinite from 'swr/infinite'; + +import { apiv3Get } from '~/client/util/apiv3-client'; + +type PaginatedThread = PaginationInfo & { threads: StorageThreadType[] }; + +const getRecentThreadsKey = ( + pageIndex: number, + previousPageData: PaginatedThread | null, +): [string, number, number] | null => { + if (previousPageData && !previousPageData.hasMore) { + return null; + } + + const PER_PAGE = 20; + const page = pageIndex + 1; + + return ['/mastra/threads', page, PER_PAGE]; +}; + +export const useSWRINFxRecentThreads = ( + config?: SWRConfiguration, +): SWRInfiniteResponse => { + return useSWRInfinite( + (pageIndex, previousPageData) => + getRecentThreadsKey(pageIndex, previousPageData), + ([endpoint, page, perPage]) => + apiv3Get(endpoint, { page, perPage }).then( + (response) => response.data.threads, + ), + { + ...config, + revalidateFirstPage: false, + revalidateAll: true, + }, + ); +}; From 8f9a663808ce2a3d4188f1061101f8aea27a7197 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 11 Nov 2025 03:53:08 +0000 Subject: [PATCH 02/11] Fix pagination validation and adjust page index for thread retrieval --- apps/app/src/features/mastra/server/routes/get-threads.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/features/mastra/server/routes/get-threads.ts b/apps/app/src/features/mastra/server/routes/get-threads.ts index ef2f41fb22b..aae5a83f6ec 100644 --- a/apps/app/src/features/mastra/server/routes/get-threads.ts +++ b/apps/app/src/features/mastra/server/routes/get-threads.ts @@ -34,7 +34,7 @@ export const getThreadsFactory: GetThreadsFactory = (crowi) => { const validator: ValidationChain[] = [ query('page') - .isInt({ min: 0 }) + .isInt({ min: 1 }) .toInt() .withMessage('"page" must be a number'), @@ -75,7 +75,7 @@ export const getThreadsFactory: GetThreadsFactory = (crowi) => { const threads = await memory.getThreadsByResourceIdPaginated({ resourceId: req.user._id.toString(), - page: req.query.page, + page: req.query.page - 1, perPage: req.query.perPage, orderBy: req.query.orderBy, sortDirection: req.query.sortDirection, From 3c75bf2d0a0d6616aa758e8ba67b9eb3a7b8292c Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 11 Nov 2025 03:55:35 +0000 Subject: [PATCH 03/11] rm obsoleted swr hook --- .../features/openai/client/stores/thread.tsx | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/apps/app/src/features/openai/client/stores/thread.tsx b/apps/app/src/features/openai/client/stores/thread.tsx index a94828ffdf5..37db5f9ab07 100644 --- a/apps/app/src/features/openai/client/stores/thread.tsx +++ b/apps/app/src/features/openai/client/stores/thread.tsx @@ -1,13 +1,10 @@ -import type { SWRConfiguration, SWRResponse } from 'swr'; +import type { SWRResponse } from 'swr'; import useSWRImmutable from 'swr/immutable'; -import type { SWRInfiniteResponse } from 'swr/infinite'; -import useSWRInfinite from 'swr/infinite'; import useSWRMutation, { type SWRMutationResponse } from 'swr/mutation'; import { apiv3Get } from '~/client/util/apiv3-client'; import type { IThreadRelationHasId, - IThreadRelationPaginate, } from '~/features/openai/interfaces/thread-relation'; const getKey = (aiAssistantId?: string) => @@ -33,35 +30,3 @@ export const useSWRMUTxThreads = ( { revalidate: true }, ); }; - -const getRecentThreadsKey = ( - pageIndex: number, - previousPageData: IThreadRelationPaginate | null, -): [string, number, number] | null => { - if (previousPageData && !previousPageData.paginateResult.hasNextPage) { - return null; - } - - const PER_PAGE = 20; - const page = pageIndex + 1; - - return ['/openai/threads/recent', page, PER_PAGE]; -}; - -export const useSWRINFxRecentThreads = ( - config?: SWRConfiguration, -): SWRInfiniteResponse => { - return useSWRInfinite( - (pageIndex, previousPageData) => - getRecentThreadsKey(pageIndex, previousPageData), - ([endpoint, page, limit]) => - apiv3Get(endpoint, { page, limit }).then( - (response) => response.data, - ), - { - ...config, - revalidateFirstPage: false, - revalidateAll: true, - }, - ); -}; From b17878cffd307b7bde2ca3b036298cb8efef513c Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 11 Nov 2025 03:57:34 +0000 Subject: [PATCH 04/11] fix import --- .../mastra/client/components/Sidebar/AiAssistantSubstance.tsx | 2 +- .../features/openai/client/services/knowledge-assistant.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/app/src/features/mastra/client/components/Sidebar/AiAssistantSubstance.tsx b/apps/app/src/features/mastra/client/components/Sidebar/AiAssistantSubstance.tsx index f91d1f8a711..dd07a861b91 100644 --- a/apps/app/src/features/mastra/client/components/Sidebar/AiAssistantSubstance.tsx +++ b/apps/app/src/features/mastra/client/components/Sidebar/AiAssistantSubstance.tsx @@ -6,7 +6,7 @@ import { useAiAssistantSidebar, useSWRxAiAssistants, } from '../../../../openai/client/stores/ai-assistant'; -import { useSWRINFxRecentThreads } from '../../../../openai/client/stores/thread'; +import { useSWRINFxRecentThreads } from '../../stores/thread'; import { AiAssistantList } from './AiAssistantList'; import { ThreadList } from './ThreadList'; diff --git a/apps/app/src/features/openai/client/services/knowledge-assistant.tsx b/apps/app/src/features/openai/client/services/knowledge-assistant.tsx index a24d2cc768c..7f299778c5e 100644 --- a/apps/app/src/features/openai/client/services/knowledge-assistant.tsx +++ b/apps/app/src/features/openai/client/services/knowledge-assistant.tsx @@ -11,6 +11,7 @@ import { } from 'reactstrap'; import { apiv3Post } from '~/client/util/apiv3-client'; +import { useSWRINFxRecentThreads } from '~/features/mastra/client/stores/thread'; import { type SseMessage, SseMessageSchema, @@ -28,7 +29,7 @@ import { ThreadType } from '../../interfaces/thread-relation'; // import { AiAssistantChatInitialView } from '../components/AiAssistant/AiAssistantSidebar/AiAssistantChatInitialView'; import { useAiAssistantSidebar } from '../stores/ai-assistant'; import { useSWRMUTxMessages } from '../stores/message'; -import { useSWRINFxRecentThreads, useSWRMUTxThreads } from '../stores/thread'; +import { useSWRMUTxThreads } from '../stores/thread'; type CreateThread = ( aiAssistantId: string, From 46955a24098148f2ab11d23a724694329e89a6b3 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 11 Nov 2025 05:46:19 +0000 Subject: [PATCH 05/11] Use useSWRINFxRecentThreads (features/mastra) --- .../client/components/Sidebar/ThreadList.tsx | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/apps/app/src/features/mastra/client/components/Sidebar/ThreadList.tsx b/apps/app/src/features/mastra/client/components/Sidebar/ThreadList.tsx index 3e4f16ed4be..fda8410ae94 100644 --- a/apps/app/src/features/mastra/client/components/Sidebar/ThreadList.tsx +++ b/apps/app/src/features/mastra/client/components/Sidebar/ThreadList.tsx @@ -6,13 +6,13 @@ import { useTranslation } from 'react-i18next'; import InfiniteScroll from '~/client/components/InfiniteScroll'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { - useSWRINFxRecentThreads, useSWRMUTxThreads, } from '~/features/openai/client/stores/thread'; import loggerFactory from '~/utils/logger'; import { deleteThread } from '../../../../openai/client/services/thread'; import { useAiAssistantSidebar } from '../../../../openai/client/stores/ai-assistant'; +import { useSWRINFxRecentThreads } from '../../stores/thread'; const logger = loggerFactory('growi:openai:client:components:ThreadList'); @@ -20,6 +20,7 @@ export const ThreadList: React.FC = () => { const swrInifiniteThreads = useSWRINFxRecentThreads(); const { t } = useTranslation(); const { data, mutate: mutateRecentThreads } = swrInifiniteThreads; + console.log('data', data); const { openChat, data: aiAssistantSidebarData, @@ -29,11 +30,11 @@ export const ThreadList: React.FC = () => { aiAssistantSidebarData?.aiAssistantData?._id, ); - const isEmpty = data?.[0]?.paginateResult.totalDocs === 0; + const isEmpty = data?.[0]?.total === 0; const isReachingEnd = isEmpty || (data != null && - data[data.length - 1].paginateResult.hasNextPage === false); + data[data.length - 1].hasMore === false); const deleteThreadHandler = useCallback( async (aiAssistantId: string, threadRelationId: string) => { @@ -74,16 +75,16 @@ export const ThreadList: React.FC = () => { isReachingEnd={isReachingEnd} > {data - ?.flatMap((thread) => thread.paginateResult.docs) + ?.flatMap((thread) => thread.threads) .map((thread) => ( -
  • +