diff --git a/web/app/components/plugins/types.ts b/web/app/components/plugins/types.ts index da651caa089..35528abaeac 100644 --- a/web/app/components/plugins/types.ts +++ b/web/app/components/plugins/types.ts @@ -379,12 +379,6 @@ export type uploadGitHubResponse = { manifest: PluginDeclaration } -export type DebugInfo = { - key: string - host: string - port: number -} - export const TaskStatus = { pending: 'pending', running: 'running', diff --git a/web/service/__tests__/use-plugins.spec.tsx b/web/service/__tests__/use-plugins.spec.tsx index 043ec0b8e86..aae9e4ea433 100644 --- a/web/service/__tests__/use-plugins.spec.tsx +++ b/web/service/__tests__/use-plugins.spec.tsx @@ -49,12 +49,20 @@ vi.mock('@/service/base', () => ({ request: mockRequest, })) -mockRequest.mockImplementation(async (url: string) => { - const data = await mockGet(url) - return new Response(JSON.stringify(data), { - headers: { 'Content-Type': 'application/json' }, - }) -}) +mockRequest.mockImplementation( + async (url: string, _init: RequestInit, options: { request?: Request }) => { + const method = options.request?.method ?? 'GET' + const data = + method === 'GET' + ? await mockGet(url) + : await mockPost(new URL(url).pathname.replace('/console/api', ''), { + body: await options.request?.json(), + }) + return new Response(JSON.stringify(data ?? {}), { + headers: { 'Content-Type': 'application/json' }, + }) + }, +) vi.mock('@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list', () => ({ default: () => ({ @@ -1346,7 +1354,7 @@ describe('usePluginAutoUpgradeSettings', () => { vi.clearAllMocks() }) - it('does not expose frontend default settings before backend data resolves', () => { + it('does not expose frontend default settings before backend data resolves', async () => { const queryClient = createQueryClient() mockGet.mockReturnValue(new Promise(() => {})) @@ -1355,10 +1363,10 @@ describe('usePluginAutoUpgradeSettings', () => { }) expect(result.current.data).toBeUndefined() - expect(mockGet).toHaveBeenCalledWith('/workspaces/current/plugin/auto-upgrade/fetch', { - params: { - category: PluginCategoryEnum.model, - }, + await waitFor(() => { + expect(mockGet).toHaveBeenCalledWith( + `http://localhost:5001/console/api/workspaces/current/plugin/auto-upgrade/fetch?category=${PluginCategoryEnum.model}`, + ) }) }) diff --git a/web/service/console/narrow-response.ts b/web/service/console/narrow-response.ts new file mode 100644 index 00000000000..d76098014a5 --- /dev/null +++ b/web/service/console/narrow-response.ts @@ -0,0 +1,8 @@ +/** + * Some UI types narrow fields that backend response models declare as plain strings or + * loose records (enum-like statuses, `doc_form`, plugin `source`, locale label maps, ...). + * Until those response models declare literal types, contract responses are narrowed to the + * UI types at the service boundary with this helper instead of re-typing every consumer. + * Prefer aliasing the generated type whenever the UI type can follow it. + */ +export const narrowResponse = (response: Promise) => response as Promise diff --git a/web/service/datasets.ts b/web/service/datasets.ts index 4f7c131611c..5f53c27d9b6 100644 --- a/web/service/datasets.ts +++ b/web/service/datasets.ts @@ -23,14 +23,7 @@ import { DataSourceProvider } from '@/models/common' // oxlint-disable-next-line no-restricted-imports -- the zip download needs the raw Blob response import { post } from './base' import { consoleClient } from './console' - -/** - * The knowledge UI types in `@/models/datasets` narrow fields that backend response models - * declare as plain strings (indexing_technique, doc_form, permission, indexing statuses, ...). - * Until those response models declare literal types, contract responses are narrowed to the UI - * types at this boundary instead of re-typing every consumer. - */ -export const narrowKnowledgeResponse = (response: Promise) => response as Promise +import { narrowResponse } from './console/narrow-response' // apis for documents in a dataset @@ -64,17 +57,17 @@ export const updateDatasetSetting = ({ datasetId: string body: DatasetUpdatePayload }): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.patch({ params: { dataset_id: datasetId }, body }), ) } export const fetchDatasets = ({ params }: FetchDatasetsParams): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.get({ query: params })) + return narrowResponse(consoleClient.datasets.get({ query: params })) } export const createEmptyDataset = ({ name }: { name: string }): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.post({ body: { name } })) + return narrowResponse(consoleClient.datasets.post({ body: { name } })) } export const checkIsUsedInApp = (id: string): Promise<{ is_using: boolean }> => { @@ -93,7 +86,7 @@ export const fetchExternalAPI = ({ }: { apiTemplateId: string }): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.externalKnowledgeApi.byExternalKnowledgeApiId.get({ params: { external_knowledge_api_id: apiTemplateId }, }), @@ -107,7 +100,7 @@ export const updateExternalAPI = ({ apiTemplateId: string body: ExternalAPIItem }): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.externalKnowledgeApi.byExternalKnowledgeApiId.patch({ params: { external_knowledge_api_id: apiTemplateId }, body, @@ -136,7 +129,7 @@ export const createExternalAPI = ({ }: { body: CreateExternalAPIReq }): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.externalKnowledgeApi.post({ body })) + return narrowResponse(consoleClient.datasets.externalKnowledgeApi.post({ body })) } export const createExternalKnowledgeBase = ({ @@ -144,11 +137,11 @@ export const createExternalKnowledgeBase = ({ }: { body: CreateKnowledgeBaseReq }): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.external.post({ body })) + return narrowResponse(consoleClient.datasets.external.post({ body })) } export const fetchDefaultProcessRule = (): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.processRule.get({})) + return narrowResponse(consoleClient.datasets.processRule.get({})) } export const createFirstDocument = ({ @@ -156,7 +149,7 @@ export const createFirstDocument = ({ }: { body: KnowledgeConfig }): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.init.post({ body })) + return narrowResponse(consoleClient.datasets.init.post({ body })) } export const createDocument = ({ @@ -166,7 +159,7 @@ export const createDocument = ({ datasetId: string body: KnowledgeConfig }): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.post({ params: { dataset_id: datasetId }, body }), ) } @@ -175,7 +168,7 @@ export const fetchIndexingStatus = ({ datasetId, documentId, }: CommonDocReq): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.indexingStatus.get({ params: { dataset_id: datasetId, document_id: documentId }, }), @@ -186,7 +179,7 @@ export const fetchIndexingStatusBatch = ({ datasetId, batchId, }: BatchReq): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.batch.byBatch.indexingStatus.get({ params: { dataset_id: datasetId, batch: batchId }, }), @@ -198,7 +191,7 @@ export const renameDocumentName = ({ documentId, name, }: CommonDocReq & { name: string }): Promise => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.rename.post({ params: { dataset_id: datasetId, document_id: documentId }, body: { name }, @@ -244,7 +237,7 @@ export const downloadDocumentsZip = ({ export const fetchFileIndexingEstimate = ( body: IndexingEstimatePayload, ): Promise => { - return narrowKnowledgeResponse(consoleClient.datasets.indexingEstimate.post({ body })) + return narrowResponse(consoleClient.datasets.indexingEstimate.post({ body })) } export const fetchNotionPagePreview = ({ diff --git a/web/service/knowledge/use-dataset.ts b/web/service/knowledge/use-dataset.ts index bfef6fff14b..50924ae9061 100644 --- a/web/service/knowledge/use-dataset.ts +++ b/web/service/knowledge/use-dataset.ts @@ -14,7 +14,8 @@ import type { import { ORPCError } from '@orpc/client' import { keepPreviousData, useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query' import { consoleClient } from '../console' -import { fetchIndexingStatusBatch, narrowKnowledgeResponse } from '../datasets' +import { narrowResponse } from '../console/narrow-response' +import { fetchIndexingStatusBatch } from '../datasets' import { useInvalid } from '../use-base' const NAME_SPACE = 'dataset' @@ -51,7 +52,7 @@ export const useInfiniteDatasets = ( return useInfiniteQuery({ queryKey: [...datasetListQueryKey, 'infinite', normalizedParams], queryFn: ({ pageParam = normalizedParams.page }) => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.get({ query: { ...normalizedParams, page: pageParam as number | undefined }, }), @@ -69,7 +70,7 @@ export const useDatasetList = (params: DatasetListRequest) => { return useInfiniteQuery({ queryKey: [...datasetListQueryKey, initialPage, tag_ids, limit, include_all, keyword], queryFn: ({ pageParam = 1 }) => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.get({ query: { tag_ids, limit, include_all, keyword, page: pageParam }, }), @@ -90,7 +91,7 @@ export const useDatasetDetail = (datasetId: string) => { return useQuery({ queryKey: [...datasetDetailQueryKeyPrefix, datasetId], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.get({ params: { dataset_id: datasetId } }), ), enabled: !!datasetId, @@ -106,7 +107,7 @@ export const useDatasetRelatedApps = (datasetId: string, options?: { enabled?: b return useQuery({ queryKey: [NAME_SPACE, 'related-apps', datasetId], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.relatedApps.get({ params: { dataset_id: datasetId } }), ), enabled: options?.enabled ?? !!datasetId, @@ -129,7 +130,7 @@ export const useProcessRule = (documentId?: string) => { return useQuery({ queryKey: [NAME_SPACE, 'process-rule', documentId], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.processRule.get({ query: { document_id: documentId } }), ), enabled: !!documentId, @@ -172,7 +173,7 @@ export const useDatasetTestingRecords = ( return useQuery({ queryKey: [NAME_SPACE, 'testing-records', datasetId, params], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.queries.get({ params: { dataset_id: datasetId! }, query: params, @@ -187,7 +188,7 @@ export const useDatasetErrorDocs = (datasetId?: string) => { return useQuery({ queryKey: [NAME_SPACE, 'error-docs', datasetId], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.errorDocs.get({ params: { dataset_id: datasetId! } }), ), enabled: !!datasetId, diff --git a/web/service/knowledge/use-document.ts b/web/service/knowledge/use-document.ts index bf7699cccb2..70771999f1e 100644 --- a/web/service/knowledge/use-document.ts +++ b/web/service/knowledge/use-document.ts @@ -9,10 +9,10 @@ import { keepPreviousData, useMutation, useQuery } from '@tanstack/react-query' import { normalizeStatusForQuery } from '@/app/components/datasets/documents/status-filter' import { DocumentActionType } from '@/models/datasets' import { consoleClient } from '../console' +import { narrowResponse } from '../console/narrow-response' import { downloadDocumentsZip, fetchDocumentDownloadUrl, - narrowKnowledgeResponse, pauseDocIndexing, resumeDocIndexing, retryErrorDocs, @@ -48,7 +48,7 @@ export const useDocumentList = (payload: { return useQuery({ queryKey: [...useDocumentListKey, datasetId, params], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.documents.get({ params: { dataset_id: datasetId }, query: params, @@ -165,7 +165,7 @@ export const useDocumentDetail = (payload: { return useQuery({ queryKey: [...useDocumentDetailKey, 'withoutMetaData', datasetId, documentId, params], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.get({ params: { dataset_id: datasetId, document_id: documentId }, query: params, @@ -184,7 +184,7 @@ export const useDocumentMetadata = (payload: { return useQuery({ queryKey: [...useDocumentDetailKey, 'onlyMetaData', datasetId, documentId, params], queryFn: () => - narrowKnowledgeResponse( + narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.get({ params: { dataset_id: datasetId, document_id: documentId }, query: params, diff --git a/web/service/knowledge/use-metadata.ts b/web/service/knowledge/use-metadata.ts index 572024615f3..0f60aa0c2df 100644 --- a/web/service/knowledge/use-metadata.ts +++ b/web/service/knowledge/use-metadata.ts @@ -6,7 +6,7 @@ import type { import type { DocumentDetailResponse } from '@/models/datasets' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { consoleClient } from '../console' -import { narrowKnowledgeResponse } from '../datasets' +import { narrowResponse } from '../console/narrow-response' import { useInvalid } from '../use-base' import { useDocumentListKey, useInvalidDocumentList } from './use-document' @@ -17,7 +17,7 @@ export const useDatasetMetaData = (datasetId: string) => { { queryKey: [NAME_SPACE, 'dataset', datasetId], queryFn: () => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.metadata.get({ params: { dataset_id: datasetId } }), ) }, @@ -99,7 +99,7 @@ export const useBuiltInMetaDataFields = () => { return useQuery<{ fields: BuiltInMetadataItem[] }>({ queryKey: [NAME_SPACE, 'built-in'], queryFn: () => { - return narrowKnowledgeResponse(consoleClient.datasets.metadata.builtIn.get()) + return narrowResponse(consoleClient.datasets.metadata.builtIn.get()) }, }) } @@ -114,7 +114,7 @@ export const useDocumentMetaData = ({ return useQuery({ queryKey: [NAME_SPACE, 'document', datasetId, documentId], queryFn: () => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.get({ params: { dataset_id: datasetId, document_id: documentId }, query: { metadata: 'only' }, diff --git a/web/service/knowledge/use-segment.ts b/web/service/knowledge/use-segment.ts index e6a85697b59..ad371f24d30 100644 --- a/web/service/knowledge/use-segment.ts +++ b/web/service/knowledge/use-segment.ts @@ -9,7 +9,7 @@ import type { } from '@/models/datasets' import { useMutation, useQuery } from '@tanstack/react-query' import { consoleClient } from '../console' -import { narrowKnowledgeResponse } from '../datasets' +import { narrowResponse } from '../console/narrow-response' const NAME_SPACE = 'segment' @@ -36,7 +36,7 @@ export const useSegmentList = ( return useQuery({ queryKey: [...useSegmentListKey, datasetId, documentId, params], queryFn: () => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.get({ params: { dataset_id: datasetId, document_id: documentId }, query: { ...params, enabled: String(params.enabled) }, @@ -57,7 +57,7 @@ export const useUpdateSegment = () => { body: SegmentUpdater }) => { const { datasetId, documentId, segmentId, body } = payload - return narrowKnowledgeResponse<{ data: SegmentDetailModel; doc_form: ChunkingMode }>( + return narrowResponse<{ data: SegmentDetailModel; doc_form: ChunkingMode }>( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.bySegmentId.patch({ params: { dataset_id: datasetId, document_id: documentId, segment_id: segmentId }, body, @@ -72,7 +72,7 @@ export const useAddSegment = () => { mutationKey: [NAME_SPACE, 'add'], mutationFn: (payload: { datasetId: string; documentId: string; body: SegmentUpdater }) => { const { datasetId, documentId, body } = payload - return narrowKnowledgeResponse<{ data: SegmentDetailModel; doc_form: ChunkingMode }>( + return narrowResponse<{ data: SegmentDetailModel; doc_form: ChunkingMode }>( consoleClient.datasets.byDatasetId.documents.byDocumentId.segment.post({ params: { dataset_id: datasetId, document_id: documentId }, body, @@ -141,7 +141,7 @@ export const useChildSegmentList = ( return useQuery({ queryKey: [...useChildSegmentListKey, datasetId, documentId, segmentId, params], queryFn: () => { - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.bySegmentId.childChunks.get( { params: { dataset_id: datasetId, document_id: documentId, segment_id: segmentId }, @@ -188,7 +188,7 @@ export const useAddChildSegment = () => { body: { content: string } }) => { const { datasetId, documentId, segmentId, body } = payload - return narrowKnowledgeResponse<{ data: ChildChunkDetail }>( + return narrowResponse<{ data: ChildChunkDetail }>( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.bySegmentId.childChunks.post( { params: { dataset_id: datasetId, document_id: documentId, segment_id: segmentId }, @@ -211,7 +211,7 @@ export const useUpdateChildSegment = () => { body: { content: string } }) => { const { datasetId, documentId, segmentId, childChunkId, body } = payload - return narrowKnowledgeResponse<{ data: ChildChunkDetail }>( + return narrowResponse<{ data: ChildChunkDetail }>( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.bySegmentId.childChunks.byChildChunkId.patch( { params: { @@ -237,7 +237,7 @@ export const useSegmentBatchImport = () => { body: { upload_file_id: string } }) => { const { datasetId, documentId, body } = payload - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.byDatasetId.documents.byDocumentId.segments.batchImport.post({ params: { dataset_id: datasetId, document_id: documentId }, body, @@ -252,7 +252,7 @@ export const useCheckSegmentBatchImportProgress = () => { mutationKey: [NAME_SPACE, 'batchImport', 'checkProgress'], mutationFn: (payload: { jobID: string }) => { const { jobID } = payload - return narrowKnowledgeResponse( + return narrowResponse( consoleClient.datasets.batchImportStatus.byJobId.get({ params: { job_id: jobID } }), ) }, diff --git a/web/service/use-plugins.ts b/web/service/use-plugins.ts index 2847fbbcea9..bca83fda64b 100644 --- a/web/service/use-plugins.ts +++ b/web/service/use-plugins.ts @@ -1,5 +1,6 @@ import type { GetWorkspacesCurrentPluginByCategoryListData, + ParserMarketplaceUpgrade, PluginCategoryInstalledPluginResponse, PluginCategoryListResponse, PluginEntity, @@ -15,7 +16,6 @@ import type { InfiniteData, MutateOptions, QueryClient, QueryOptions } from '@ta import type { FormOption } from '@/app/components/header/account-setting/model-provider-page/declarations' import type { AutoUpdateConfig } from '@/app/components/plugins/reference-setting-modal/auto-update-setting/types' import type { - DebugInfo as DebugInfoTypes, Dependency, GitHubItemAndMarketPlaceDependency, InstallPackageResponse, @@ -48,11 +48,12 @@ import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/ import { getFormattedPlugin } from '@/app/components/plugins/marketplace/utils' import { PluginCategoryEnum, PluginSource, TaskStatus } from '@/app/components/plugins/types' import { workspacePermissionKeysAtom } from '@/context/permission-state' -import { consoleQuery } from '@/service/console' +import { consoleClient, consoleQuery } from '@/service/console' +import { narrowResponse } from '@/service/console/narrow-response' import { uninstallPlugin } from '@/service/plugins' import { hasPermission } from '@/utils/permission' // oxlint-disable-next-line no-restricted-imports -import { get, getMarketplace, post, postMarketplace } from './base' +import { getMarketplace, postMarketplace } from './base' import { useInvalidateAllBuiltInTools } from './use-tools' const NAME_SPACE = 'plugins' @@ -809,9 +810,11 @@ export const useInstallPackageFromMarketPlace = ( return useMutation({ ...options, mutationFn: (uniqueIdentifier: string) => { - return post('/workspaces/current/plugin/install/marketplace', { - body: { plugin_unique_identifiers: [uniqueIdentifier] }, - }) + return narrowResponse( + consoleClient.workspaces.current.plugin.install.marketplace.post({ + body: { plugin_unique_identifiers: [uniqueIdentifier] }, + }), + ) }, onSuccess: (data, variables, context, mutation) => { upsertStartedPluginTask(queryClient, data) @@ -821,15 +824,17 @@ export const useInstallPackageFromMarketPlace = ( } export const useUpdatePackageFromMarketPlace = ( - options?: MutateOptions, + options?: MutateOptions, ) => { const queryClient = useQueryClient() return useMutation({ ...options, - mutationFn: (body: object) => { - return post('/workspaces/current/plugin/upgrade/marketplace', { - body, - }) + mutationFn: (body: ParserMarketplaceUpgrade) => { + return narrowResponse( + consoleClient.workspaces.current.plugin.upgrade.marketplace.post({ + body, + }), + ) }, onSuccess: (data, variables, context, mutation) => { upsertStartedPluginTask(queryClient, data) @@ -842,9 +847,11 @@ export const usePluginDeclarationFromMarketPlace = (pluginUniqueIdentifier: stri return useQuery({ queryKey: [NAME_SPACE, 'pluginDeclaration', pluginUniqueIdentifier], queryFn: () => - get<{ manifest: PluginDeclaration }>('/workspaces/current/plugin/marketplace/pkg', { - params: { plugin_unique_identifier: pluginUniqueIdentifier }, - }), + narrowResponse<{ manifest: PluginDeclaration }>( + consoleClient.workspaces.current.plugin.marketplace.pkg.get({ + query: { plugin_unique_identifier: pluginUniqueIdentifier }, + }), + ), enabled: !!pluginUniqueIdentifier, }) } @@ -864,9 +871,11 @@ export const useInstallPackageFromLocal = () => { const queryClient = useQueryClient() return useMutation({ mutationFn: (uniqueIdentifier: string) => { - return post('/workspaces/current/plugin/install/pkg', { - body: { plugin_unique_identifiers: [uniqueIdentifier] }, - }) + return narrowResponse( + consoleClient.workspaces.current.plugin.install.pkg.post({ + body: { plugin_unique_identifiers: [uniqueIdentifier] }, + }), + ) }, onSuccess: (data) => { upsertStartedPluginTask(queryClient, data) @@ -888,14 +897,16 @@ export const useInstallPackageFromGitHub = () => { selectedPackage: string uniqueIdentifier: string }) => { - return post('/workspaces/current/plugin/install/github', { - body: { - repo: repoUrl, - version: selectedVersion, - package: selectedPackage, - plugin_unique_identifier: uniqueIdentifier, - }, - }) + return narrowResponse( + consoleClient.workspaces.current.plugin.install.github.post({ + body: { + repo: repoUrl, + version: selectedVersion, + package: selectedPackage, + plugin_unique_identifier: uniqueIdentifier, + }, + }), + ) }, onSuccess: (data) => { upsertStartedPluginTask(queryClient, data) @@ -907,9 +918,11 @@ export const useUploadGitHub = (payload: { repo: string; version: string; packag return useQuery({ queryKey: [NAME_SPACE, 'uploadGitHub', payload], queryFn: () => - post('/workspaces/current/plugin/upload/github', { - body: payload, - }), + narrowResponse( + consoleClient.workspaces.current.plugin.upload.github.post({ + body: payload, + }), + ), retry: 0, }) } @@ -945,15 +958,14 @@ export const useInstallOrUpdate = ({ // From local bundle don't have data.value.github_plugin_unique_identifier uniqueIdentifier = data.value.github_plugin_unique_identifier! if (!uniqueIdentifier) { - const { unique_identifier } = await post( - '/workspaces/current/plugin/upload/github', - { + const { unique_identifier } = await narrowResponse( + consoleClient.workspaces.current.plugin.upload.github.post({ body: { repo: data.value.repo!, version: data.value.release! || data.value.version!, package: data.value.packages! || data.value.package!, }, - }, + }), ) uniqueIdentifier = data.value.github_plugin_unique_identifier! || unique_identifier // has the same version, but not installed @@ -966,16 +978,15 @@ export const useInstallOrUpdate = ({ } } if (!isInstalled) { - const response = await post( - '/workspaces/current/plugin/install/github', - { + const response = await narrowResponse( + consoleClient.workspaces.current.plugin.install.github.post({ body: { repo: data.value.repo!, version: data.value.release! || data.value.version!, package: data.value.packages! || data.value.package!, plugin_unique_identifier: uniqueIdentifier, }, - }, + }), ) upsertStartedPluginTask(queryClient, response) const { task_id, all_installed } = response @@ -997,13 +1008,12 @@ export const useInstallOrUpdate = ({ } } if (!isInstalled) { - const response = await post( - '/workspaces/current/plugin/install/marketplace', - { + const response = await narrowResponse( + consoleClient.workspaces.current.plugin.install.marketplace.post({ body: { plugin_unique_identifiers: [uniqueIdentifier], }, - }, + }), ) upsertStartedPluginTask(queryClient, response) const { task_id, all_installed } = response @@ -1022,13 +1032,12 @@ export const useInstallOrUpdate = ({ } } if (!isInstalled) { - const response = await post( - '/workspaces/current/plugin/install/pkg', - { + const response = await narrowResponse( + consoleClient.workspaces.current.plugin.install.pkg.post({ body: { plugin_unique_identifiers: [uniqueIdentifier], }, - }, + }), ) upsertStartedPluginTask(queryClient, response) const { task_id, all_installed } = response @@ -1039,13 +1048,12 @@ export const useInstallOrUpdate = ({ if (isInstalled) { if (item.type === 'package') { await uninstallPlugin(installedPayload.installedId, { preserveCredentials: true }) - const response = await post( - '/workspaces/current/plugin/install/pkg', - { + const response = await narrowResponse( + consoleClient.workspaces.current.plugin.install.pkg.post({ body: { plugin_unique_identifiers: [uniqueIdentifier], }, - }, + }), ) upsertStartedPluginTask(queryClient, response) const { task_id, all_installed } = response @@ -1087,7 +1095,7 @@ export const useInstallOrUpdate = ({ export const useDebugKey = () => { return useQuery({ queryKey: [NAME_SPACE, 'debugKey'], - queryFn: () => get('/workspaces/current/plugin/debugging-key'), + queryFn: () => consoleClient.workspaces.current.plugin.debuggingKey.get(), }) } @@ -1151,7 +1159,7 @@ const areAutoUpgradeSettingsEqual = ( export const usePluginPermissionSettings = () => { return useQuery({ queryKey: usePluginPermissionSettingsKey, - queryFn: () => get('/workspaces/current/plugin/permission/fetch'), + queryFn: () => consoleClient.workspaces.current.plugin.permission.fetch.get(), }) } @@ -1159,9 +1167,7 @@ export const usePluginAutoUpgradeSettings = (category: PluginCategoryEnum) => { return useQuery({ queryKey: pluginAutoUpgradeSettingsQueryKey(category), queryFn: () => - get('/workspaces/current/plugin/auto-upgrade/fetch', { - params: { category }, - }), + consoleClient.workspaces.current.plugin.autoUpgrade.fetch.get({ query: { category } }), staleTime: 60 * 1000, }) } @@ -1184,7 +1190,7 @@ export const useMutationPluginPermissionSettings = ({ return useMutation({ mutationFn: (payload: Permissions) => { - return post('/workspaces/current/plugin/permission/change', { body: payload }) + return consoleClient.workspaces.current.plugin.permission.change.post({ body: payload }) }, onMutate: async (payload) => { await queryClient.cancelQueries({ queryKey: usePluginPermissionSettingsKey }) @@ -1219,7 +1225,7 @@ export const useMutationPluginAutoUpgradeSettings = ({ return useMutation({ mutationFn: (payload: AutoUpdateConfig) => { - return post('/workspaces/current/plugin/auto-upgrade/change', { + return consoleClient.workspaces.current.plugin.autoUpgrade.change.post({ body: { category, auto_upgrade: payload, @@ -1270,14 +1276,16 @@ export const useMutationReferenceSettings = ({ if (!arePermissionsEqual(payload.permission, currentReferenceSetting?.permission)) mutations.push( - post('/workspaces/current/plugin/permission/change', { body: payload.permission }), + consoleClient.workspaces.current.plugin.permission.change.post({ + body: payload.permission, + }), ) if ( !areAutoUpgradeSettingsEqual(payload.auto_upgrade, currentReferenceSetting?.auto_upgrade) ) { mutations.push( - post('/workspaces/current/plugin/auto-upgrade/change', { + consoleClient.workspaces.current.plugin.autoUpgrade.change.post({ body: { category, auto_upgrade: payload.auto_upgrade, @@ -1358,7 +1366,7 @@ export const useRemoveAutoUpgrade = () => { return useMutation({ mutationFn: (payload: { plugin_id: string; category: PluginCategoryEnum }) => { - return post('/workspaces/current/plugin/auto-upgrade/exclude', { body: payload }) + return consoleClient.workspaces.current.plugin.autoUpgrade.exclude.post({ body: payload }) }, onSuccess: (_data, payload) => { queryClient.invalidateQueries({ @@ -1414,7 +1422,9 @@ export const usePluginTaskList = (category?: PluginCategoryEnum | string) => { enabled: canManagement, queryKey: usePluginTaskListKey, queryFn: () => - get<{ tasks: PluginTask[] }>('/workspaces/current/plugin/tasks?page=1&page_size=100'), + narrowResponse<{ tasks: PluginTask[] }>( + consoleClient.workspaces.current.plugin.tasks.get({ query: { page: 1, page_size: 100 } }), + ), structuralSharing: (previousData, nextData) => preserveLocalUnfinishedPluginTasks( previousData as PluginTaskListResponse | undefined, @@ -1478,10 +1488,9 @@ export const usePluginTaskList = (category?: PluginCategoryEnum | string) => { export const useMutationClearTaskPlugin = () => { return useMutation({ mutationFn: ({ taskId, pluginId }: { taskId: string; pluginId: string }) => { - const encodedPluginId = encodeURIComponent(pluginId) - return post<{ success: boolean }>( - `/workspaces/current/plugin/tasks/${taskId}/delete/${encodedPluginId}`, - ) + return consoleClient.workspaces.current.plugin.tasks.byTaskId.delete.byIdentifier.post({ + params: { task_id: taskId, identifier: pluginId }, + }) }, }) } @@ -1503,20 +1512,23 @@ export const useFetchDynamicOptions = ( provider: string, action: string, parameter: string, - provider_type?: 'tool' | 'trigger', + // The backend requires a provider type; callers without one render tool options. + provider_type: 'tool' | 'trigger' = 'tool', extra?: Record, ) => { return useMutation({ mutationFn: () => - get<{ options: FormOption[] }>('/workspaces/current/plugin/parameters/dynamic-options', { - params: { - plugin_id, - provider, - action, - parameter, - provider_type, - ...extra, - }, - }), + narrowResponse<{ options: FormOption[] }>( + consoleClient.workspaces.current.plugin.parameters.dynamicOptions.get({ + query: { + plugin_id, + provider, + action, + parameter, + provider_type, + ...extra, + }, + }), + ), }) }