@@ -550,7 +520,7 @@ function CreateKnowledgeSession() {
type="submit"
variant="primary"
loading={submissionPending}
- disabled={uploadSubmissionBlocked || sourceSubmissionBlocked}
+ disabled={uploadSubmissionBlocked || sourceSubmissionBlocked || membersInvalid}
>
{t(($) => $.createTitle)}
diff --git a/web/features/new-rag/create/permissions.tsx b/web/features/new-rag/create/permissions.tsx
new file mode 100644
index 00000000000..133c7d9933d
--- /dev/null
+++ b/web/features/new-rag/create/permissions.tsx
@@ -0,0 +1,91 @@
+import type { KnowledgeVisibility } from './workflow'
+import { Button } from '@langgenius/dify-ui/button'
+import { Fieldset, FieldsetLegend } from '@langgenius/dify-ui/fieldset'
+import { useQuery, useSuspenseQuery } from '@tanstack/react-query'
+import { useId } from 'react'
+import { useTranslation } from 'react-i18next'
+import { SkeletonRectangle } from '@/app/components/base/skeleton'
+import PermissionSelector from '@/app/components/datasets/settings/permission-selector'
+import { userProfileQueryOptions } from '@/features/account-profile/client'
+import { consoleQuery } from '@/service/console'
+
+type KnowledgeCreationPermissionsProps = {
+ canConfigureAccess: boolean
+ disabled: boolean
+ selectedMemberIds: string[]
+ visibility: KnowledgeVisibility
+ onSelectedMemberIdsChange: (memberIds: string[]) => void
+ onVisibilityChange: (visibility: KnowledgeVisibility) => void
+}
+
+export function KnowledgeCreationPermissions({
+ canConfigureAccess,
+ disabled,
+ selectedMemberIds,
+ visibility,
+ onSelectedMemberIdsChange,
+ onVisibilityChange,
+}: KnowledgeCreationPermissionsProps) {
+ const { t } = useTranslation('knowledgeSpace')
+ const { t: tCommon } = useTranslation('common')
+ const labelId = useId()
+ const descriptionId = useId()
+ const membersErrorId = useId()
+ const { data: ownerAccountId } = useSuspenseQuery({
+ ...userProfileQueryOptions(),
+ select: (data) => data.profile.id,
+ })
+ const membersQuery = useQuery(
+ consoleQuery.workspaces.current.members.get.queryOptions({ enabled: canConfigureAccess }),
+ )
+ const membersInvalid = visibility === 'partial_members' && selectedMemberIds.length === 0
+
+ return (
+
+ )
+}
diff --git a/web/features/new-rag/create/workflow.ts b/web/features/new-rag/create/workflow.ts
index 6423523b432..76084d933ac 100644
--- a/web/features/new-rag/create/workflow.ts
+++ b/web/features/new-rag/create/workflow.ts
@@ -11,16 +11,14 @@ import { KNOWLEDGE_DESCRIPTION_MAX_LENGTH, KNOWLEDGE_NAME_MAX_LENGTH } from '../
export const NAME_MAX_LENGTH = KNOWLEDGE_NAME_MAX_LENGTH
export const DESCRIPTION_MAX_LENGTH = KNOWLEDGE_DESCRIPTION_MAX_LENGTH
-export type KnowledgeVisibility = Extract<
- KnowledgeFsControlSpaceVisibility,
- 'all_team_members' | 'only_me'
->
+export type KnowledgeVisibility = KnowledgeFsControlSpaceVisibility
type CreateKnowledgeValues = {
existingKnowledge?: KnowledgeFsSpaceCreateResponse
description: string
idempotencyKey: string
initialSource?: NonNullable
+ members?: KnowledgeFsSpaceCreatePayload['members']
name: string
onCreated: (knowledgeSpace: KnowledgeFsSpaceCreateResponse) => void
visibility: KnowledgeVisibility
@@ -200,6 +198,7 @@ export async function createKnowledge(
description: values.description || undefined,
idempotency_key: values.idempotencyKey,
initial_source: values.initialSource,
+ ...(values.visibility === 'partial_members' ? { members: values.members } : {}),
...modelConfiguration,
name: values.name,
slug: knowledgeSlug(values.name, values.idempotencyKey),
diff --git a/web/features/new-rag/knowledge-fs-task-error.ts b/web/features/new-rag/knowledge-fs-task-error.ts
index 1d3d56a47e4..5897ce5898e 100644
--- a/web/features/new-rag/knowledge-fs-task-error.ts
+++ b/web/features/new-rag/knowledge-fs-task-error.ts
@@ -75,6 +75,7 @@ const failureMessageKeyByCode = {
DOCUMENT_PARSER_UNAVAILABLE: 'taskFailure.parserUnavailable',
DOCUMENT_PARSER_UNSUPPORTED_TYPE: 'taskFailure.parserUnsupportedType',
DOCUMENT_PDF_RENDER_FAILED: 'taskFailure.pdfRender',
+ DURABLE_DELETION_IDEMPOTENCY_CONFLICT: 'taskFailure.conflict',
EMBEDDING_DIMENSION_INVALID: 'taskFailure.embeddingDimension',
EMBEDDING_DIMENSION_UNSUPPORTED: 'taskFailure.embeddingDimension',
EXECUTION_ATTEMPTS_EXHAUSTED: 'taskFailure.attemptsExhausted',
@@ -91,6 +92,7 @@ const failureMessageKeyByCode = {
KNOWLEDGE_SPACE_SETTINGS_COMPILATION_IN_PROGRESS: 'settings.compilationInProgress',
KNOWLEDGE_SPACE_SETTINGS_REVISION_CONFLICT: 'settings.revisionConflict',
KNOWLEDGE_SPACE_SETTINGS_MIGRATION_REQUIRED: 'settings.migrationRequired',
+ LOGICAL_DOCUMENT_CAS_CONFLICT: 'taskFailure.conflict',
MODEL_CAPABILITY_MISMATCH: 'taskFailure.modelConfiguration',
MODEL_CONFIGURATION_STALE: 'taskFailure.conflict',
MODEL_CREDENTIAL_INVALID: 'taskFailure.modelConfiguration',
@@ -148,6 +150,7 @@ const failureMessageKeyByCode = {
SOURCE_SECRET_REF_CONFLICT: 'taskFailure.conflict',
SOURCE_SYNC_FAILED: 'taskFailure.source',
SOURCE_SYNC_SELECTION_MISMATCH: 'taskFailure.conflict',
+ SOURCE_VERSION_CONFLICT: 'taskFailure.conflict',
SOURCE_WEBSITE_CRAWL_CONFIG_INVALID: 'taskFailure.sourceConfigInvalid',
SOURCE_WEBSITE_CRAWL_FAILED: 'taskFailure.source',
SOURCE_WORKFLOW_CONTENT_MISSING: 'taskFailure.sourceContentMissing',
diff --git a/web/features/new-rag/retrieval/services/__tests__/knowledge-query-events.spec.ts b/web/features/new-rag/retrieval/services/__tests__/knowledge-query-events.spec.ts
index 8b45c7492cc..e998f974f6a 100644
--- a/web/features/new-rag/retrieval/services/__tests__/knowledge-query-events.spec.ts
+++ b/web/features/new-rag/retrieval/services/__tests__/knowledge-query-events.spec.ts
@@ -27,6 +27,7 @@ describe('streamKnowledgeQuery', () => {
query: 'What is the policy?',
},
token: `header.${btoa(JSON.stringify({ trace_id: 'capability-trace-1' }))}.signature`,
+ trace_id: 'capability-trace-1',
url: 'https://query.example.test/stream',
}
diff --git a/web/features/new-rag/settings/__tests__/form.spec.tsx b/web/features/new-rag/settings/__tests__/form.spec.tsx
index b62bc4837fb..795aa96791e 100644
--- a/web/features/new-rag/settings/__tests__/form.spec.tsx
+++ b/web/features/new-rag/settings/__tests__/form.spec.tsx
@@ -2039,7 +2039,7 @@ describe('KnowledgeSettingsPage workflows', () => {
within(picker).getByRole('radio', {
name: /datasetSettings\.form\.permissionsOnlyMe/,
}),
- ).toHaveAttribute('aria-disabled', 'true')
+ ).toBeDisabled()
await user.click(within(picker).getByRole('button', { name: /Team Member/ }))
await user.click(screen.getByRole('button', { name: 'knowledgeSpace.settings.saveChanges' }))