- Add reversible write tools to the per-user agent toolset (page create/update/ move/soft-delete; comment reply + resolve), exposed under the user's JWT and enforced by Docmost CASL; no permanent/force delete (D3). - Non-spoofable agent provenance: sign actor/aiChatId into the access and collab tokens (TokenService), propagate via jwt.strategy onto the request, and set pages.last_updated_source/last_updated_ai_chat_id on REST create/update/move and comments.created_source/resolved_source/ai_chat_id. - packages/mcp: add an optional getCollabToken provider (content-edit provenance) and guard against empty tokens; service-account /mcp path unchanged. Frontend: - Admin 'AI / Models' settings section: provider/model/embedding/base URL, a write-only API key field, system prompt, and Test connection. - AI chat panel (useChat + DefaultChatTransport): conversation list, streamed messages, tool-call action log and page citations; header entry point gated on settings.ai.chat. Compile-verified (server nest build + client tsc/vite); not yet live-tested. Known gaps: history 'AI agent' badge (C3), vector RAG (D), external MCP (E); chat tool-card citation links pending a fix. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import {
|
|
useMutation,
|
|
useQuery,
|
|
useQueryClient,
|
|
UseQueryResult,
|
|
} from "@tanstack/react-query";
|
|
import {
|
|
getAiSettings,
|
|
updateAiSettings,
|
|
testAiConnection,
|
|
IAiSettings,
|
|
IAiSettingsUpdate,
|
|
IAiTestResult,
|
|
} from "@/features/workspace/services/ai-settings-service.ts";
|
|
import { notifications } from "@mantine/notifications";
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
const aiSettingsKey = ["ai-settings"];
|
|
|
|
export function useAiSettingsQuery(
|
|
enabled: boolean = true,
|
|
): UseQueryResult<IAiSettings, Error> {
|
|
return useQuery({
|
|
queryKey: aiSettingsKey,
|
|
queryFn: () => getAiSettings(),
|
|
enabled,
|
|
});
|
|
}
|
|
|
|
export function useUpdateAiSettingsMutation() {
|
|
const { t } = useTranslation();
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation<IAiSettings, Error, IAiSettingsUpdate>({
|
|
mutationFn: (data) => updateAiSettings(data),
|
|
onSuccess: () => {
|
|
notifications.show({ message: t("Updated successfully") });
|
|
queryClient.invalidateQueries({ queryKey: aiSettingsKey });
|
|
},
|
|
onError: (error) => {
|
|
const errorMessage = error["response"]?.data?.message;
|
|
notifications.show({
|
|
message: errorMessage ?? t("Failed to update data"),
|
|
color: "red",
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useTestAiConnectionMutation() {
|
|
return useMutation<IAiTestResult, Error, void>({
|
|
mutationFn: () => testAiConnection(),
|
|
});
|
|
}
|