zhangwei-way b6503e9a35
feat(knowledge): add per-message RAGFlow retrieval scope (#5238)
* feat(knowledge): integrate RAGFlow retrieval and management

* test(knowledge): cover merged listing tool

* feat(knowledge): add per-message retrieval scope

* chore(docs): remove unrelated document

* docs(knowledge): add interaction screenshots

* feat(knowledge): simplify scope selector trigger

* docs(knowledge): refresh selector screenshot

* feat(knowledge): defer standalone management

* docs(knowledge): show chat-only scope UI

* fix(knowledge): honor scope on clarification replies

* fix(knowledge): harden scoped replay validation

* docs(knowledge): clarify replay scope precedence

* fix(knowledge): keep provider settings on tools

* fix(config): preserve tools-only knowledge settings

* fix(knowledge): submit custom assistant identity

* refactor(knowledge): trim PR scope changes

* fix(knowledge): sanitize document scope display

* feat(knowledge): enable scope selection in main chat

* fix(knowledge): emphasize active scope icon without button frame

* fix(knowledge): close context scrubbing and refresh e2e checks

* fix(knowledge): preserve idempotent canonical retries

* fix(knowledge): accept promptless conversation runs

* style(knowledge): format backend regression tests

* chore(knowledge): trim PR scope and fix frontend format

* fix(knowledge): remove shared-scope notice

* fix(knowledge): remove scope persistence notice

* docs(knowledge): include main chat in catalog scope

* fix(knowledge): preserve scope recovery and upgrades

* fix(config): preserve LightRAG knowledge upgrades

---------

Co-authored-by: foreleven <for-eleven@hotmail.com>
2026-09-18 16:59:31 +08:00

87 lines
2.5 KiB
TypeScript

import { fetch } from "@/core/api/fetcher";
import { getBackendBaseURL } from "@/core/config";
export interface FeaturesResponse {
agents_api: { enabled: boolean };
browser_control?: { enabled: boolean };
mcp_tasks?: { enabled: boolean };
subagent_batches?: {
enabled?: boolean;
repository_available?: boolean;
worker_running?: boolean;
max_running?: number;
};
conversation_references?: {
enabled?: boolean;
max_references?: number;
};
knowledge_base?: {
scope_selection_enabled?: boolean;
};
}
export interface ConversationReferencesCapability {
enabled: boolean;
maxReferences: number;
}
export interface SubagentBatchesCapability {
repositoryAvailable: boolean;
workerRunning: boolean;
maxRunning: number;
}
export async function fetchFeatures(): Promise<FeaturesResponse> {
const res = await fetch(`${getBackendBaseURL()}/api/features`);
if (!res.ok) {
throw new Error(`Failed to load features: ${res.statusText}`);
}
return (await res.json()) as FeaturesResponse;
}
export async function fetchAgentsApiEnabled(): Promise<boolean> {
return (await fetchFeatures()).agents_api.enabled;
}
export async function fetchBrowserControlEnabled(): Promise<boolean> {
return (await fetchFeatures()).browser_control?.enabled ?? false;
}
export async function fetchMcpTasksEnabled(): Promise<boolean> {
return (await fetchFeatures()).mcp_tasks?.enabled ?? false;
}
export async function fetchSubagentBatchesCapability(): Promise<SubagentBatchesCapability> {
const feature = (await fetchFeatures()).subagent_batches;
const legacyEnabled = feature?.enabled ?? false;
return {
repositoryAvailable: feature?.repository_available ?? legacyEnabled,
workerRunning: feature?.worker_running ?? legacyEnabled,
maxRunning: feature?.max_running ?? 0,
};
}
export async function fetchConversationReferencesCapability(): Promise<ConversationReferencesCapability> {
const features = await fetchFeatures();
const capability = features.conversation_references;
const maxReferences = capability?.max_references;
return {
enabled: capability?.enabled === true,
maxReferences:
typeof maxReferences === "number" &&
Number.isInteger(maxReferences) &&
maxReferences > 0
? maxReferences
: 0,
};
}
export async function fetchKnowledgeBaseFeature(): Promise<{
scopeSelectionEnabled: boolean;
}> {
const feature = (await fetchFeatures()).knowledge_base;
return {
scopeSelectionEnabled: feature?.scope_selection_enabled ?? false,
};
}