From d3d77bb2c8bc7c40853f539dc7f9534d4a78ace3 Mon Sep 17 00:00:00 2001 From: Jyong Date: Mon, 7 Sep 2026 04:30:12 -0400 Subject: [PATCH] fix(agent): expose KnowledgeFS configuration entry points --- .../use-agent-configure-sync.spec.tsx | 6 +- .../__tests__/agent-prompt-editor.spec.tsx | 9 +- .../__tests__/knowledge-entrypoints.spec.tsx | 194 ++++++++++++++++++ .../components/orchestrate/index.tsx | 3 +- .../orchestrate/prompt-editor/index.tsx | 9 +- .../orchestrate/prompt-editor/slash.tsx | 6 +- .../agent-detail/configure/feature-flags.ts | 1 - 7 files changed, 214 insertions(+), 14 deletions(-) create mode 100644 web/features/agent-v2/agent-detail/configure/components/orchestrate/__tests__/knowledge-entrypoints.spec.tsx diff --git a/web/features/agent-v2/agent-detail/configure/__tests__/use-agent-configure-sync.spec.tsx b/web/features/agent-v2/agent-detail/configure/__tests__/use-agent-configure-sync.spec.tsx index a3c1ddee992..83c9647f9e5 100644 --- a/web/features/agent-v2/agent-detail/configure/__tests__/use-agent-configure-sync.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/__tests__/use-agent-configure-sync.spec.tsx @@ -1391,7 +1391,7 @@ describe('useAgentConfigureSync', () => { ) }) - it('should toast metadata filtering model error when publishing with automatic metadata filtering and no model', async () => { + it('requires legacy knowledge migration before validating its old retrieval settings', async () => { const { result, store } = renderUseAgentConfigureSync({ currentModel: configuredModel, }) @@ -1416,9 +1416,7 @@ describe('useAgentConfigureSync', () => { expect(composerPutMutationFn).not.toHaveBeenCalled() expect(publishAgentMutationFn).not.toHaveBeenCalled() - expect(toastMock.error).toHaveBeenCalledWith( - 'agentV2.agentDetail.configure.knowledgeRetrieval.validation.metadataModelRequired', - ) + expect(toastMock.error).toHaveBeenCalledWith('agentV2.agentDetail.configure.knowledgeFs.legacy') }) it('should expose publishing status from the publish mutation while publish is pending', async () => { diff --git a/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx index 48fde00309c..c1eb5c6273d 100644 --- a/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx +++ b/web/features/agent-v2/agent-detail/configure/components/__tests__/agent-prompt-editor.spec.tsx @@ -4,13 +4,17 @@ import type { AgentTool } from '@/features/agent-v2/agent-composer/form-state' import { act, fireEvent, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { createStore, Provider as JotaiProvider } from 'jotai' +import { queryClientAtom } from 'jotai-tanstack-query' import { API_PREFIX } from '@/config' import { defaultAgentSoulConfigFormState } from '@/features/agent-v2/agent-composer/form-state' import { agentComposerDraftAtom } from '@/features/agent-v2/agent-composer/store' import { agentComposerKnowledgeRetrievalsAtom } from '@/features/agent-v2/agent-composer/store-modules/knowledge' import { agentComposerPromptAtom } from '@/features/agent-v2/agent-composer/store-modules/prompt' import { agentComposerToolsAtom } from '@/features/agent-v2/agent-composer/store-modules/tools' -import { render } from '@/test/console/render' +import { + createConsoleQueryClient, + renderWithConsoleQuery as render, +} from '@/test/console/query-data' import { seedRegisteredConsoleStateFixture } from '@/test/console/state-fixture' import { AgentPromptEditor } from '../orchestrate/prompt-editor' import { AgentPromptSlashMenu } from '../orchestrate/prompt-editor/slash' @@ -261,6 +265,8 @@ const renderAgentPromptEditor = ( draftOverrides: Partial = {}, ) => { const store = createStore() + const queryClient = createConsoleQueryClient() + store.set(queryClientAtom, queryClient) seedRegisteredConsoleStateFixture(store) store.set(agentComposerDraftAtom, { ...promptEditorDraft, @@ -272,6 +278,7 @@ const renderAgentPromptEditor = ( , + { queryClient, systemFeatures: { agent_knowledge_fs_enabled: false } }, ) return { diff --git a/web/features/agent-v2/agent-detail/configure/components/orchestrate/__tests__/knowledge-entrypoints.spec.tsx b/web/features/agent-v2/agent-detail/configure/components/orchestrate/__tests__/knowledge-entrypoints.spec.tsx new file mode 100644 index 00000000000..9b614e6958b --- /dev/null +++ b/web/features/agent-v2/agent-detail/configure/components/orchestrate/__tests__/knowledge-entrypoints.spec.tsx @@ -0,0 +1,194 @@ +import type { PromptEditorProps } from '@/app/components/base/prompt-editor' +import { zKnowledgeFsSpaceListResponse } from '@dify/contracts/api/console/knowledge-fs/zod.gen' +import { act, screen, waitFor, within } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { defaultAgentSoulConfigFormState } from '@/features/agent-v2/agent-composer/form-state' +import { AgentComposerProvider } from '@/features/agent-v2/agent-composer/provider' +import { consoleQuery } from '@/service/client' +import { + createConsoleQueryClient, + renderWithConsoleQuery as render, + seedSystemFeatures, +} from '@/test/console/query-data' +import { AgentOrchestratePanel } from '../index' + +// Keep the panel, KnowledgeFS dialog, prompt commands and action registration real. +// Independent sections and Lexical selection are outside this entry-point contract. +vi.mock('../model-config/field', () => ({ AgentModelField: () => null })) +vi.mock('../skills', () => ({ AgentSkills: () => null })) +vi.mock('../files', () => ({ AgentFiles: () => null })) +vi.mock('../tools', () => ({ AgentTools: () => null })) +vi.mock('../advanced', () => ({ AgentAdvancedSettings: () => null })) +vi.mock('@/app/components/base/prompt-editor', () => ({ + default: (props: PromptEditorProps) => ( +