@djangocfg/ext-knowbase 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -0
- package/dist/chunk-GNRC54ON.js +4308 -0
- package/dist/hooks.cjs +6003 -0
- package/dist/hooks.d.cts +610 -0
- package/dist/hooks.d.ts +610 -0
- package/dist/hooks.js +1486 -0
- package/dist/index.cjs +4450 -0
- package/dist/index.d.cts +4398 -0
- package/dist/index.d.ts +4398 -0
- package/dist/index.js +1 -0
- package/package.json +81 -0
- package/src/api/generated/ext_knowbase/_utils/fetchers/ext_knowbase__knowbase.ts +2983 -0
- package/src/api/generated/ext_knowbase/_utils/fetchers/index.ts +28 -0
- package/src/api/generated/ext_knowbase/_utils/hooks/ext_knowbase__knowbase.ts +999 -0
- package/src/api/generated/ext_knowbase/_utils/hooks/index.ts +28 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItem.schema.ts +33 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItemChunk.schema.ts +29 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItemChunkDetail.schema.ts +30 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItemChunkRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItemDetail.schema.ts +35 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveItemRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveProcessingResult.schema.ts +26 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveSearchRequestRequest.schema.ts +25 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveSearchResult.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ArchiveStatistics.schema.ts +28 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatHistory.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatMessage.schema.ts +27 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatQueryRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatResponse.schema.ts +26 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatResponseRequest.schema.ts +26 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatSession.schema.ts +29 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatSessionCreateRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatSessionRequest.schema.ts +25 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatSource.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChatSourceRequest.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/ChunkRevectorizationRequestRequest.schema.ts +20 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/Document.schema.ts +32 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentArchive.schema.ts +44 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentArchiveDetail.schema.ts +48 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentArchiveList.schema.ts +35 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentArchiveRequest.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentCategory.schema.ts +23 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentCategoryRequest.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentCreateRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentProcessingStatus.schema.ts +23 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/DocumentStats.schema.ts +25 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedArchiveItemChunkList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedArchiveItemList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedArchiveSearchResultList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedChatResponseList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedChatSessionList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedDocumentArchiveListList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedDocumentList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedPublicCategoryList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PaginatedPublicDocumentListList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedArchiveItemChunkRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedArchiveItemRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedChatResponseRequest.schema.ts +26 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedChatSessionRequest.schema.ts +25 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedDocumentArchiveRequest.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PatchedDocumentRequest.schema.ts +22 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PublicCategory.schema.ts +21 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PublicDocument.schema.ts +25 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/PublicDocumentList.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/VectorizationResult.schema.ts +24 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/VectorizationStatistics.schema.ts +26 -0
- package/src/api/generated/ext_knowbase/_utils/schemas/index.ts +70 -0
- package/src/api/generated/ext_knowbase/api-instance.ts +131 -0
- package/src/api/generated/ext_knowbase/client.ts +301 -0
- package/src/api/generated/ext_knowbase/enums.ts +241 -0
- package/src/api/generated/ext_knowbase/errors.ts +116 -0
- package/src/api/generated/ext_knowbase/ext_knowbase__knowbase/client.ts +666 -0
- package/src/api/generated/ext_knowbase/ext_knowbase__knowbase/index.ts +2 -0
- package/src/api/generated/ext_knowbase/ext_knowbase__knowbase/models.ts +1120 -0
- package/src/api/generated/ext_knowbase/http.ts +103 -0
- package/src/api/generated/ext_knowbase/index.ts +273 -0
- package/src/api/generated/ext_knowbase/logger.ts +259 -0
- package/src/api/generated/ext_knowbase/retry.ts +175 -0
- package/src/api/generated/ext_knowbase/schema.json +5865 -0
- package/src/api/generated/ext_knowbase/storage.ts +161 -0
- package/src/api/generated/ext_knowbase/validation-events.ts +133 -0
- package/src/api/index.ts +9 -0
- package/src/components/Chat/ChatUIContext.tsx +110 -0
- package/src/components/Chat/ChatWidget.tsx +476 -0
- package/src/components/Chat/README.md +122 -0
- package/src/components/Chat/components/MessageInput.tsx +124 -0
- package/src/components/Chat/components/MessageList.tsx +169 -0
- package/src/components/Chat/components/SessionList.tsx +192 -0
- package/src/components/Chat/components/index.ts +9 -0
- package/src/components/Chat/hooks/index.ts +6 -0
- package/src/components/Chat/hooks/useInfiniteSessions.ts +81 -0
- package/src/components/Chat/index.tsx +45 -0
- package/src/components/Chat/types.ts +81 -0
- package/src/config.ts +20 -0
- package/src/contexts/knowbase/ChatContext.tsx +173 -0
- package/src/contexts/knowbase/DocumentsContext.tsx +306 -0
- package/src/contexts/knowbase/KnowbaseProvider.tsx +47 -0
- package/src/contexts/knowbase/SessionsContext.tsx +175 -0
- package/src/contexts/knowbase/index.ts +63 -0
- package/src/contexts/knowbase/types.ts +69 -0
- package/src/hooks/index.ts +28 -0
- package/src/index.ts +22 -0
- package/src/utils/logger.ts +10 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Types
|
|
3
|
+
* Type definitions for RAG-powered chat widget
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Import types from local generated API
|
|
7
|
+
import { ExtKnowbaseKnowbaseTypes, Enums as GeneratedEnums } from '../../api/generated/ext_knowbase';
|
|
8
|
+
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Extract types from generated API
|
|
11
|
+
export const Enums = GeneratedEnums;
|
|
12
|
+
export type ChatMessage = ExtKnowbaseKnowbaseTypes.ChatMessage;
|
|
13
|
+
export type ChatSource = ExtKnowbaseKnowbaseTypes.ChatSource;
|
|
14
|
+
|
|
15
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
16
|
+
// Extended Message Type (for UI with sources)
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export interface ChatMessageWithSources extends ChatMessage {
|
|
20
|
+
sources?: ChatSource[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
24
|
+
// Widget Props
|
|
25
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
export interface ChatWidgetProps {
|
|
28
|
+
/** Whether to auto-open on mount */
|
|
29
|
+
autoOpen?: boolean;
|
|
30
|
+
/** Render even when closed (for animations) */
|
|
31
|
+
persistent?: boolean;
|
|
32
|
+
/** Additional CSS classes */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Callback when toggle state changes */
|
|
35
|
+
onToggle?: (isOpen: boolean) => void;
|
|
36
|
+
/** Callback when message is sent */
|
|
37
|
+
onMessage?: (message: ChatMessageWithSources) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
41
|
+
// UI State
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
export interface ChatUIState {
|
|
45
|
+
isOpen: boolean;
|
|
46
|
+
isExpanded: boolean;
|
|
47
|
+
isMinimized: boolean;
|
|
48
|
+
showSources: boolean;
|
|
49
|
+
showTimestamps: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Component Props
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
export interface MessageListProps {
|
|
57
|
+
messages: ChatMessageWithSources[];
|
|
58
|
+
isLoading?: boolean;
|
|
59
|
+
showSources?: boolean;
|
|
60
|
+
showTimestamps?: boolean;
|
|
61
|
+
autoScroll?: boolean;
|
|
62
|
+
className?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface MessageInputProps {
|
|
66
|
+
onSend: (message: string) => Promise<void>;
|
|
67
|
+
isLoading?: boolean;
|
|
68
|
+
disabled?: boolean;
|
|
69
|
+
placeholder?: string;
|
|
70
|
+
className?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface SessionListProps {
|
|
74
|
+
isOpen: boolean;
|
|
75
|
+
onClose: () => void;
|
|
76
|
+
onSelectSession: (sessionId: string) => void;
|
|
77
|
+
className?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Base extension configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ExtensionMetadata } from '@djangocfg/ext-base';
|
|
6
|
+
|
|
7
|
+
export const extensionConfig: ExtensionMetadata = {
|
|
8
|
+
name: 'knowbase',
|
|
9
|
+
version: '1.0.0',
|
|
10
|
+
author: 'DjangoCFG',
|
|
11
|
+
displayName: 'Knowledge Base',
|
|
12
|
+
description: 'Knowledge base and documentation management system',
|
|
13
|
+
icon: '📚',
|
|
14
|
+
license: 'MIT',
|
|
15
|
+
githubUrl: 'https://github.com/markolofsen/django-cfg',
|
|
16
|
+
homepage: 'https://djangocfg.com',
|
|
17
|
+
keywords: ['knowledge-base', 'documentation', 'articles', 'help', 'faq'],
|
|
18
|
+
dependencies: [],
|
|
19
|
+
minVersion: '2.0.0',
|
|
20
|
+
} as const;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowbase Chat Context
|
|
3
|
+
* Context for RAG-powered chat functionality
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use client';
|
|
7
|
+
|
|
8
|
+
import React, { createContext, useContext, type ReactNode } from 'react';
|
|
9
|
+
|
|
10
|
+
import { apiKnowbase } from '../../api';
|
|
11
|
+
import {
|
|
12
|
+
useKnowbaseAdminChatList,
|
|
13
|
+
useKnowbaseAdminChatRetrieve,
|
|
14
|
+
useCreateKnowbaseAdminChatCreate,
|
|
15
|
+
useUpdateKnowbaseAdminChatUpdate,
|
|
16
|
+
usePartialUpdateKnowbaseAdminChatPartialUpdate,
|
|
17
|
+
useDeleteKnowbaseAdminChatDestroy,
|
|
18
|
+
useKnowbaseAdminChatHistoryRetrieve,
|
|
19
|
+
useCreateKnowbaseAdminChatQueryCreate,
|
|
20
|
+
} from '../../api/generated/ext_knowbase/_utils/hooks';
|
|
21
|
+
import type {
|
|
22
|
+
PaginatedChatResponseList,
|
|
23
|
+
ChatResponse,
|
|
24
|
+
ChatResponseRequest,
|
|
25
|
+
PatchedChatResponseRequest,
|
|
26
|
+
ChatHistory,
|
|
27
|
+
ChatQueryRequest,
|
|
28
|
+
} from './types';
|
|
29
|
+
|
|
30
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
31
|
+
// Context Type
|
|
32
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export interface KnowbaseChatContextValue {
|
|
35
|
+
// Chat list
|
|
36
|
+
chats: PaginatedChatResponseList | undefined;
|
|
37
|
+
isLoadingChats: boolean;
|
|
38
|
+
chatsError: Error | undefined;
|
|
39
|
+
refreshChats: () => Promise<void>;
|
|
40
|
+
|
|
41
|
+
// Chat operations
|
|
42
|
+
getChat: (id: string) => Promise<ChatResponse | undefined>;
|
|
43
|
+
getChatHistory: (id: string) => Promise<ChatHistory | undefined>;
|
|
44
|
+
createChat: (data: ChatResponseRequest) => Promise<ChatResponse>;
|
|
45
|
+
updateChat: (id: string, data: ChatResponseRequest) => Promise<ChatResponse>;
|
|
46
|
+
partialUpdateChat: (id: string, data: PatchedChatResponseRequest) => Promise<ChatResponse>;
|
|
47
|
+
deleteChat: (id: string) => Promise<void>;
|
|
48
|
+
|
|
49
|
+
// RAG Query
|
|
50
|
+
sendQuery: (data: ChatQueryRequest) => Promise<ChatResponse>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
54
|
+
// Context
|
|
55
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
const KnowbaseChatContext = createContext<KnowbaseChatContextValue | undefined>(undefined);
|
|
58
|
+
|
|
59
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
60
|
+
// Provider
|
|
61
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
export function KnowbaseChatProvider({ children }: { children: ReactNode }) {
|
|
64
|
+
// List chats
|
|
65
|
+
const {
|
|
66
|
+
data: chats,
|
|
67
|
+
error: chatsError,
|
|
68
|
+
isLoading: isLoadingChats,
|
|
69
|
+
mutate: mutateChats,
|
|
70
|
+
} = useKnowbaseAdminChatList({}, apiKnowbase);
|
|
71
|
+
|
|
72
|
+
const refreshChats = async () => {
|
|
73
|
+
await mutateChats();
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Mutations
|
|
77
|
+
const createChatMutation = useCreateKnowbaseAdminChatCreate();
|
|
78
|
+
const updateChatMutation = useUpdateKnowbaseAdminChatUpdate();
|
|
79
|
+
const partialUpdateChatMutation = usePartialUpdateKnowbaseAdminChatPartialUpdate();
|
|
80
|
+
const deleteChatMutation = useDeleteKnowbaseAdminChatDestroy();
|
|
81
|
+
const sendQueryMutation = useCreateKnowbaseAdminChatQueryCreate();
|
|
82
|
+
|
|
83
|
+
// Get single chat
|
|
84
|
+
const getChat = async (id: string): Promise<ChatResponse | undefined> => {
|
|
85
|
+
const { data } = useKnowbaseAdminChatRetrieve(id, apiKnowbase);
|
|
86
|
+
return data;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Get chat history
|
|
90
|
+
const getChatHistory = async (id: string): Promise<ChatHistory | undefined> => {
|
|
91
|
+
const { data } = useKnowbaseAdminChatHistoryRetrieve(id, apiKnowbase);
|
|
92
|
+
return data;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Create chat
|
|
96
|
+
const createChat = async (data: ChatResponseRequest): Promise<ChatResponse> => {
|
|
97
|
+
const result = await createChatMutation(data, apiKnowbase);
|
|
98
|
+
await refreshChats();
|
|
99
|
+
return result as ChatResponse;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Update chat
|
|
103
|
+
const updateChat = async (id: string, data: ChatResponseRequest): Promise<ChatResponse> => {
|
|
104
|
+
const result = await updateChatMutation(id, data, apiKnowbase);
|
|
105
|
+
await refreshChats();
|
|
106
|
+
return result as ChatResponse;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Partial update chat
|
|
110
|
+
const partialUpdateChat = async (
|
|
111
|
+
id: string,
|
|
112
|
+
data: PatchedChatResponseRequest
|
|
113
|
+
): Promise<ChatResponse> => {
|
|
114
|
+
const result = await partialUpdateChatMutation(id, data, apiKnowbase);
|
|
115
|
+
await refreshChats();
|
|
116
|
+
return result as ChatResponse;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Delete chat
|
|
120
|
+
const deleteChat = async (id: string): Promise<void> => {
|
|
121
|
+
await deleteChatMutation(id, apiKnowbase);
|
|
122
|
+
await refreshChats();
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// Send RAG query
|
|
126
|
+
const sendQuery = async (data: ChatQueryRequest): Promise<ChatResponse> => {
|
|
127
|
+
const result = await sendQueryMutation(data, apiKnowbase);
|
|
128
|
+
await refreshChats();
|
|
129
|
+
return result as ChatResponse;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const value: KnowbaseChatContextValue = {
|
|
133
|
+
chats,
|
|
134
|
+
isLoadingChats,
|
|
135
|
+
chatsError,
|
|
136
|
+
refreshChats,
|
|
137
|
+
getChat,
|
|
138
|
+
getChatHistory,
|
|
139
|
+
createChat,
|
|
140
|
+
updateChat,
|
|
141
|
+
partialUpdateChat,
|
|
142
|
+
deleteChat,
|
|
143
|
+
sendQuery,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
return <KnowbaseChatContext.Provider value={value}>{children}</KnowbaseChatContext.Provider>;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
150
|
+
// Hook
|
|
151
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
152
|
+
|
|
153
|
+
export function useKnowbaseChatContext(): KnowbaseChatContextValue {
|
|
154
|
+
const context = useContext(KnowbaseChatContext);
|
|
155
|
+
if (!context) {
|
|
156
|
+
throw new Error('useKnowbaseChatContext must be used within KnowbaseChatProvider');
|
|
157
|
+
}
|
|
158
|
+
return context;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
162
|
+
// Re-export types for external use
|
|
163
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
export type {
|
|
166
|
+
PaginatedChatResponseList,
|
|
167
|
+
ChatResponse,
|
|
168
|
+
ChatResponseRequest,
|
|
169
|
+
PatchedChatResponseRequest,
|
|
170
|
+
ChatHistory,
|
|
171
|
+
ChatQueryRequest,
|
|
172
|
+
} from './types';
|
|
173
|
+
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowbase Documents Context
|
|
3
|
+
* Context for managing documents and archives
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use client';
|
|
7
|
+
|
|
8
|
+
import React, { createContext, useContext, type ReactNode } from 'react';
|
|
9
|
+
|
|
10
|
+
import { apiKnowbase } from '../../api';
|
|
11
|
+
import {
|
|
12
|
+
useKnowbaseAdminDocumentsList,
|
|
13
|
+
useKnowbaseAdminDocumentsRetrieve,
|
|
14
|
+
useCreateKnowbaseAdminDocumentsCreate,
|
|
15
|
+
useUpdateKnowbaseAdminDocumentsUpdate,
|
|
16
|
+
usePartialUpdateKnowbaseAdminDocumentsPartialUpdate,
|
|
17
|
+
useDeleteKnowbaseAdminDocumentsDestroy,
|
|
18
|
+
useCreateKnowbaseAdminDocumentsReprocessCreate,
|
|
19
|
+
useKnowbaseAdminDocumentsStatusRetrieve,
|
|
20
|
+
useKnowbaseAdminDocumentsStatsRetrieve,
|
|
21
|
+
useKnowbaseSystemArchivesList,
|
|
22
|
+
useKnowbaseSystemArchivesRetrieve,
|
|
23
|
+
useCreateKnowbaseSystemArchivesCreate,
|
|
24
|
+
useUpdateKnowbaseSystemArchivesUpdate,
|
|
25
|
+
usePartialUpdateKnowbaseSystemArchivesPartialUpdate,
|
|
26
|
+
useDeleteKnowbaseSystemArchivesDestroy,
|
|
27
|
+
useKnowbaseSystemArchivesStatisticsRetrieve,
|
|
28
|
+
} from '../../api/generated/ext_knowbase/_utils/hooks';
|
|
29
|
+
import type {
|
|
30
|
+
PaginatedDocumentList,
|
|
31
|
+
Document,
|
|
32
|
+
DocumentCreateRequest,
|
|
33
|
+
DocumentRequest,
|
|
34
|
+
PatchedDocumentRequest,
|
|
35
|
+
DocumentProcessingStatus,
|
|
36
|
+
DocumentStats,
|
|
37
|
+
PaginatedDocumentArchiveListList,
|
|
38
|
+
DocumentArchive,
|
|
39
|
+
DocumentArchiveDetail,
|
|
40
|
+
PatchedDocumentArchiveRequest,
|
|
41
|
+
ArchiveProcessingResult,
|
|
42
|
+
ArchiveStatistics,
|
|
43
|
+
} from './types';
|
|
44
|
+
|
|
45
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
46
|
+
// Context Type
|
|
47
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
export interface KnowbaseDocumentsContextValue {
|
|
50
|
+
// Documents list
|
|
51
|
+
documents: PaginatedDocumentList | undefined;
|
|
52
|
+
isLoadingDocuments: boolean;
|
|
53
|
+
documentsError: Error | undefined;
|
|
54
|
+
refreshDocuments: () => Promise<void>;
|
|
55
|
+
|
|
56
|
+
// Document operations
|
|
57
|
+
getDocument: (id: string) => Promise<Document | undefined>;
|
|
58
|
+
getDocumentStatus: (id: string) => Promise<DocumentProcessingStatus | undefined>;
|
|
59
|
+
getDocumentStats: () => Promise<DocumentStats | undefined>;
|
|
60
|
+
createDocument: (data: DocumentCreateRequest) => Promise<Document>;
|
|
61
|
+
updateDocument: (id: string, data: DocumentRequest) => Promise<Document>;
|
|
62
|
+
partialUpdateDocument: (id: string, data: PatchedDocumentRequest) => Promise<Document>;
|
|
63
|
+
deleteDocument: (id: string) => Promise<void>;
|
|
64
|
+
reprocessDocument: (id: string, data: DocumentRequest) => Promise<Document>;
|
|
65
|
+
|
|
66
|
+
// Archives list
|
|
67
|
+
archives: PaginatedDocumentArchiveListList | undefined;
|
|
68
|
+
isLoadingArchives: boolean;
|
|
69
|
+
archivesError: Error | undefined;
|
|
70
|
+
refreshArchives: () => Promise<void>;
|
|
71
|
+
|
|
72
|
+
// Archive operations
|
|
73
|
+
getArchive: (id: string) => Promise<DocumentArchiveDetail | undefined>;
|
|
74
|
+
getArchiveStatistics: () => Promise<ArchiveStatistics | undefined>;
|
|
75
|
+
createArchive: (data: FormData) => Promise<ArchiveProcessingResult>;
|
|
76
|
+
updateArchive: (
|
|
77
|
+
id: string,
|
|
78
|
+
title: string,
|
|
79
|
+
archive_file: File | Blob,
|
|
80
|
+
description?: string,
|
|
81
|
+
is_public?: boolean
|
|
82
|
+
) => Promise<DocumentArchive>;
|
|
83
|
+
partialUpdateArchive: (id: string, data: PatchedDocumentArchiveRequest) => Promise<DocumentArchive>;
|
|
84
|
+
deleteArchive: (id: string) => Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
88
|
+
// Context
|
|
89
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
const KnowbaseDocumentsContext = createContext<KnowbaseDocumentsContextValue | undefined>(
|
|
92
|
+
undefined
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
96
|
+
// Provider
|
|
97
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
export function KnowbaseDocumentsProvider({ children }: { children: ReactNode }) {
|
|
100
|
+
// Documents list (first page only for count)
|
|
101
|
+
const {
|
|
102
|
+
data: documents,
|
|
103
|
+
error: documentsError,
|
|
104
|
+
isLoading: isLoadingDocuments,
|
|
105
|
+
mutate: mutateDocuments,
|
|
106
|
+
} = useKnowbaseAdminDocumentsList({ page: 1, page_size: 1 }, apiKnowbase);
|
|
107
|
+
|
|
108
|
+
const refreshDocuments = async () => {
|
|
109
|
+
await mutateDocuments();
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Archives list (first page only for count)
|
|
113
|
+
const {
|
|
114
|
+
data: archives,
|
|
115
|
+
error: archivesError,
|
|
116
|
+
isLoading: isLoadingArchives,
|
|
117
|
+
mutate: mutateArchives,
|
|
118
|
+
} = useKnowbaseSystemArchivesList({ page: 1, page_size: 1 }, apiKnowbase);
|
|
119
|
+
|
|
120
|
+
const refreshArchives = async () => {
|
|
121
|
+
await mutateArchives();
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// Document mutations
|
|
125
|
+
const createDocumentMutation = useCreateKnowbaseAdminDocumentsCreate();
|
|
126
|
+
const updateDocumentMutation = useUpdateKnowbaseAdminDocumentsUpdate();
|
|
127
|
+
const partialUpdateDocumentMutation = usePartialUpdateKnowbaseAdminDocumentsPartialUpdate();
|
|
128
|
+
const deleteDocumentMutation = useDeleteKnowbaseAdminDocumentsDestroy();
|
|
129
|
+
const reprocessDocumentMutation = useCreateKnowbaseAdminDocumentsReprocessCreate();
|
|
130
|
+
|
|
131
|
+
// Archive mutations
|
|
132
|
+
const createArchiveMutation = useCreateKnowbaseSystemArchivesCreate();
|
|
133
|
+
const updateArchiveMutation = useUpdateKnowbaseSystemArchivesUpdate();
|
|
134
|
+
const partialUpdateArchiveMutation = usePartialUpdateKnowbaseSystemArchivesPartialUpdate();
|
|
135
|
+
const deleteArchiveMutation = useDeleteKnowbaseSystemArchivesDestroy();
|
|
136
|
+
|
|
137
|
+
// Get single document
|
|
138
|
+
const getDocument = async (id: string): Promise<Document | undefined> => {
|
|
139
|
+
const { data } = useKnowbaseAdminDocumentsRetrieve(id, apiKnowbase);
|
|
140
|
+
return data;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// Get document status
|
|
144
|
+
const getDocumentStatus = async (id: string): Promise<DocumentProcessingStatus | undefined> => {
|
|
145
|
+
const { data } = useKnowbaseAdminDocumentsStatusRetrieve(id, apiKnowbase);
|
|
146
|
+
return data;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Get document stats
|
|
150
|
+
const getDocumentStats = async (): Promise<DocumentStats | undefined> => {
|
|
151
|
+
const { data } = useKnowbaseAdminDocumentsStatsRetrieve(apiKnowbase);
|
|
152
|
+
return data;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Create document
|
|
156
|
+
const createDocument = async (data: DocumentCreateRequest): Promise<Document> => {
|
|
157
|
+
const result = await createDocumentMutation(data, apiKnowbase);
|
|
158
|
+
await refreshDocuments();
|
|
159
|
+
return result as Document;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// Update document
|
|
163
|
+
const updateDocument = async (id: string, data: DocumentRequest): Promise<Document> => {
|
|
164
|
+
const result = await updateDocumentMutation(id, data, apiKnowbase);
|
|
165
|
+
await refreshDocuments();
|
|
166
|
+
return result as Document;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// Partial update document
|
|
170
|
+
const partialUpdateDocument = async (
|
|
171
|
+
id: string,
|
|
172
|
+
data: PatchedDocumentRequest
|
|
173
|
+
): Promise<Document> => {
|
|
174
|
+
const result = await partialUpdateDocumentMutation(id, data, apiKnowbase);
|
|
175
|
+
await refreshDocuments();
|
|
176
|
+
return result as Document;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// Delete document
|
|
180
|
+
const deleteDocument = async (id: string): Promise<void> => {
|
|
181
|
+
await deleteDocumentMutation(id, apiKnowbase);
|
|
182
|
+
await refreshDocuments();
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// Reprocess document
|
|
186
|
+
const reprocessDocument = async (id: string, data: DocumentRequest): Promise<Document> => {
|
|
187
|
+
const result = await reprocessDocumentMutation(id, data, apiKnowbase);
|
|
188
|
+
await refreshDocuments();
|
|
189
|
+
return result as Document;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// Get single archive
|
|
193
|
+
const getArchive = async (id: string): Promise<DocumentArchiveDetail | undefined> => {
|
|
194
|
+
const { data } = useKnowbaseSystemArchivesRetrieve(id, apiKnowbase);
|
|
195
|
+
return data as DocumentArchiveDetail | undefined;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Get archive statistics
|
|
199
|
+
const getArchiveStatistics = async (): Promise<ArchiveStatistics | undefined> => {
|
|
200
|
+
const { data } = useKnowbaseSystemArchivesStatisticsRetrieve(apiKnowbase);
|
|
201
|
+
return data;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// Create archive
|
|
205
|
+
const createArchive = async (data: FormData): Promise<ArchiveProcessingResult> => {
|
|
206
|
+
const result = await createArchiveMutation(data, apiKnowbase);
|
|
207
|
+
await refreshArchives();
|
|
208
|
+
return result as unknown as ArchiveProcessingResult;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// Update archive
|
|
212
|
+
const updateArchive = async (
|
|
213
|
+
id: string,
|
|
214
|
+
title: string,
|
|
215
|
+
archive_file: File | Blob,
|
|
216
|
+
description?: string,
|
|
217
|
+
is_public?: boolean
|
|
218
|
+
): Promise<DocumentArchive> => {
|
|
219
|
+
// Note: The hook expects DocumentArchiveRequest, but the client method has different signature
|
|
220
|
+
// This is a type mismatch in the generated code
|
|
221
|
+
const data = { title, archive_file, description, is_public } as any;
|
|
222
|
+
const result = await updateArchiveMutation(id, data, apiKnowbase);
|
|
223
|
+
await refreshArchives();
|
|
224
|
+
return result as unknown as DocumentArchive;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// Partial update archive
|
|
228
|
+
const partialUpdateArchive = async (
|
|
229
|
+
id: string,
|
|
230
|
+
data: PatchedDocumentArchiveRequest
|
|
231
|
+
): Promise<DocumentArchive> => {
|
|
232
|
+
const result = await partialUpdateArchiveMutation(id, data, apiKnowbase);
|
|
233
|
+
await refreshArchives();
|
|
234
|
+
return result as unknown as DocumentArchive;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Delete archive
|
|
238
|
+
const deleteArchive = async (id: string): Promise<void> => {
|
|
239
|
+
await deleteArchiveMutation(id, apiKnowbase);
|
|
240
|
+
await refreshArchives();
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const value: KnowbaseDocumentsContextValue = {
|
|
244
|
+
documents,
|
|
245
|
+
isLoadingDocuments,
|
|
246
|
+
documentsError,
|
|
247
|
+
refreshDocuments,
|
|
248
|
+
getDocument,
|
|
249
|
+
getDocumentStatus,
|
|
250
|
+
getDocumentStats,
|
|
251
|
+
createDocument,
|
|
252
|
+
updateDocument,
|
|
253
|
+
partialUpdateDocument,
|
|
254
|
+
deleteDocument,
|
|
255
|
+
reprocessDocument,
|
|
256
|
+
archives: archives as PaginatedDocumentArchiveListList | undefined,
|
|
257
|
+
isLoadingArchives,
|
|
258
|
+
archivesError,
|
|
259
|
+
refreshArchives,
|
|
260
|
+
getArchive,
|
|
261
|
+
getArchiveStatistics,
|
|
262
|
+
createArchive,
|
|
263
|
+
updateArchive,
|
|
264
|
+
partialUpdateArchive,
|
|
265
|
+
deleteArchive,
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
return (
|
|
269
|
+
<KnowbaseDocumentsContext.Provider value={value}>
|
|
270
|
+
{children}
|
|
271
|
+
</KnowbaseDocumentsContext.Provider>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
276
|
+
// Hook
|
|
277
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
export function useKnowbaseDocumentsContext(): KnowbaseDocumentsContextValue {
|
|
280
|
+
const context = useContext(KnowbaseDocumentsContext);
|
|
281
|
+
if (!context) {
|
|
282
|
+
throw new Error('useKnowbaseDocumentsContext must be used within KnowbaseDocumentsProvider');
|
|
283
|
+
}
|
|
284
|
+
return context;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
288
|
+
// Re-export types for external use
|
|
289
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
290
|
+
|
|
291
|
+
export type {
|
|
292
|
+
PaginatedDocumentList,
|
|
293
|
+
Document,
|
|
294
|
+
DocumentCreateRequest,
|
|
295
|
+
DocumentRequest,
|
|
296
|
+
PatchedDocumentRequest,
|
|
297
|
+
DocumentProcessingStatus,
|
|
298
|
+
DocumentStats,
|
|
299
|
+
PaginatedDocumentArchiveListList,
|
|
300
|
+
DocumentArchive,
|
|
301
|
+
DocumentArchiveDetail,
|
|
302
|
+
PatchedDocumentArchiveRequest,
|
|
303
|
+
ArchiveProcessingResult,
|
|
304
|
+
ArchiveStatistics,
|
|
305
|
+
} from './types';
|
|
306
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Knowbase Provider
|
|
3
|
+
*
|
|
4
|
+
* Wraps all knowbase contexts with ExtensionProvider for proper registration
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use client';
|
|
8
|
+
|
|
9
|
+
import type { ReactNode } from 'react';
|
|
10
|
+
import { ExtensionProvider } from '@djangocfg/ext-base/hooks';
|
|
11
|
+
import { extensionConfig } from '../../config';
|
|
12
|
+
import { KnowbaseChatProvider } from './ChatContext';
|
|
13
|
+
import { KnowbaseDocumentsProvider } from './DocumentsContext';
|
|
14
|
+
import { KnowbaseSessionsProvider } from './SessionsContext';
|
|
15
|
+
|
|
16
|
+
interface KnowbaseProviderProps {
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Main provider for Knowledge Base extension
|
|
22
|
+
*
|
|
23
|
+
* Provides all knowbase contexts:
|
|
24
|
+
* - Chat context (RAG-powered chat)
|
|
25
|
+
* - Documents context (document management)
|
|
26
|
+
* - Sessions context (chat sessions)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <KnowbaseProvider>
|
|
31
|
+
* <YourApp />
|
|
32
|
+
* </KnowbaseProvider>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function KnowbaseProvider({ children }: KnowbaseProviderProps) {
|
|
36
|
+
return (
|
|
37
|
+
<ExtensionProvider metadata={extensionConfig}>
|
|
38
|
+
<KnowbaseDocumentsProvider>
|
|
39
|
+
<KnowbaseSessionsProvider>
|
|
40
|
+
<KnowbaseChatProvider>
|
|
41
|
+
{children}
|
|
42
|
+
</KnowbaseChatProvider>
|
|
43
|
+
</KnowbaseSessionsProvider>
|
|
44
|
+
</KnowbaseDocumentsProvider>
|
|
45
|
+
</ExtensionProvider>
|
|
46
|
+
);
|
|
47
|
+
}
|