diff --git a/app/api/dify-dataset/api/documentApi.ts b/app/api/dify-dataset/api/documentApi.ts index d147edf..9f69f0f 100644 --- a/app/api/dify-dataset/api/documentApi.ts +++ b/app/api/dify-dataset/api/documentApi.ts @@ -121,7 +121,7 @@ export async function toggleDocumentStatus( } /** - * 上传文件到知识库 + * 上传文件到知识库(使用默认配置) * * @param datasetId - 知识库 ID * @param file - 文件对象 @@ -132,19 +132,44 @@ export async function uploadDocument( datasetId: string, file: File, onProgress?: (percent: number) => void -): Promise { +): Promise { + return uploadDocumentWithConfig( + datasetId, + file, + { + indexing_technique: 'high_quality', + process_rule: { mode: 'automatic' }, + }, + onProgress + ); +} + +/** + * 上传文件到知识库(使用自定义配置) + * + * @param datasetId - 知识库 ID + * @param file - 文件对象 + * @param config - 上传配置(索引模式、分段规则等) + * @param onProgress - 上传进度回调 + * @returns 创建的文档信息,包含 batch 用于查询索引进度 + */ +export async function uploadDocumentWithConfig( + datasetId: string, + file: File, + config: UploadDocumentConfig, + onProgress?: (percent: number) => void +): Promise { const formData = new FormData(); formData.append('file', file); - formData.append('data', JSON.stringify({ - indexing_technique: 'high_quality', - process_rule: { - mode: 'automatic', - }, - })); + formData.append('data', JSON.stringify(config)); - console.log('[Dataset Client] 上传文档:', { datasetId, fileName: file.name }); + console.log('[Dataset Client] 上传文档:', { + datasetId, + fileName: file.name, + config, + }); - const response = await axios.post( + const response = await axios.post( `${API_URL}/datasets/${datasetId}/documents`, formData, { @@ -200,21 +225,41 @@ export async function fetchUploadFileInfo( return response.data; } +/** + * 预处理规则 ID + */ +export type PreProcessingRuleId = 'remove_extra_spaces' | 'remove_urls_emails'; + +/** + * 预处理规则配置 + */ +export interface PreProcessingRule { + id: PreProcessingRuleId; + enabled: boolean; +} + +/** + * 分段配置 + */ +export interface SegmentationConfig { + separator: string; + max_tokens: number; +} + +/** + * 自定义处理规则 + */ +export interface CustomRules { + pre_processing_rules?: PreProcessingRule[]; + segmentation?: SegmentationConfig; +} + /** * 文档处理规则配置 */ export interface ProcessRule { mode: 'automatic' | 'custom'; - rules?: { - pre_processing_rules?: Array<{ - id: 'remove_extra_spaces' | 'remove_urls_emails'; - enabled: boolean; - }>; - segmentation?: { - separator: string; - max_tokens: number; - }; - }; + rules?: CustomRules; } /** @@ -225,6 +270,45 @@ export interface UpdateDocumentSettings { process_rule?: ProcessRule; } +/** + * 上传文档配置参数 + */ +export interface UploadDocumentConfig { + indexing_technique: 'high_quality' | 'economy'; + process_rule: ProcessRule; +} + +/** + * 上传文档响应 + */ +export interface UploadDocumentResponse { + document: { + id: string; + position: number; + data_source_type: string; + data_source_info: { + upload_file_id: string; + }; + dataset_process_rule_id: string; + name: string; + created_from: string; + created_by: string; + created_at: number; + tokens: number; + indexing_status: string; + error: string | null; + enabled: boolean; + disabled_at: number | null; + disabled_by: string | null; + archived: boolean; + display_status: string; + word_count: number; + hit_count: number; + doc_form: string; + }; + batch: string; +} + /** * 更新文档设置并重新处理 * 注意:Dify API 不直接支持修改已有文档的分段设置 @@ -252,3 +336,50 @@ export async function updateDocumentWithSettings( ); return response.data; } + +/** + * 通过文件更新文档 + * Dify API: POST /datasets/{dataset_id}/documents/{document_id}/update-by-file + * + * 用于在用户修改分段参数后,使用同一文件重新处理文档 + * + * @param datasetId - 知识库 ID + * @param documentId - 文档 ID + * @param file - 文件对象(使用原上传的文件) + * @param config - 新的分段配置 + * @param onProgress - 上传进度回调 + * @returns 更新后的文档信息,包含新的 batch 用于查询索引进度 + */ +export async function updateDocumentByFile( + datasetId: string, + documentId: string, + file: File, + config: UploadDocumentConfig, + onProgress?: (percent: number) => void +): Promise { + const formData = new FormData(); + formData.append('file', file); + formData.append('data', JSON.stringify(config)); + + console.log('[Dataset Client] 通过文件更新文档:', { + datasetId, + documentId, + fileName: file.name, + config, + }); + + const response = await axios.post( + `${API_URL}/datasets/${datasetId}/documents/${documentId}/update-by-file`, + formData, + { + withCredentials: true, + onUploadProgress: (progressEvent) => { + if (progressEvent.total && onProgress) { + const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total); + onProgress(percent); + } + }, + } + ); + return response.data; +} diff --git a/app/api/dify-dataset/api/index.ts b/app/api/dify-dataset/api/index.ts index 3e69d9e..1ed6ee0 100644 --- a/app/api/dify-dataset/api/index.ts +++ b/app/api/dify-dataset/api/index.ts @@ -18,10 +18,19 @@ export { deleteDocument, toggleDocumentStatus, uploadDocument, + uploadDocumentWithConfig, + updateDocumentByFile, fetchIndexingStatus, fetchUploadFileInfo, } from './documentApi'; +// 文档 API 类型 +export type { + ProcessRule, + UploadDocumentConfig, + UploadDocumentResponse, +} from './documentApi'; + // 分段、子分段、检索 API export { fetchSegments, diff --git a/app/api/dify-dataset/api/segmentApi.ts b/app/api/dify-dataset/api/segmentApi.ts index 0761e06..b71e268 100644 --- a/app/api/dify-dataset/api/segmentApi.ts +++ b/app/api/dify-dataset/api/segmentApi.ts @@ -332,7 +332,7 @@ export async function deleteChildChunk( * * @param datasetId - 知识库 ID * @param query - 检索关键词 - * @param retrievalModel - 检索模型配置 + * @param retrievalModel - 检索模型配置(完整的 Dify API 格式) * @returns 检索结果 */ export async function retrieveDataset( @@ -340,7 +340,7 @@ export async function retrieveDataset( query: string, retrievalModel?: RetrieveRequest['retrieval_model'] ): Promise { - console.log('[Dataset Client] 检索知识库:', { datasetId, query }); + console.log('[Dataset Client] 检索知识库:', { datasetId, query, retrievalModel }); const requestBody: RetrieveRequest = { query, diff --git a/app/api/dify-dataset/type/index.ts b/app/api/dify-dataset/type/index.ts index 78d558e..1d9f649 100644 --- a/app/api/dify-dataset/type/index.ts +++ b/app/api/dify-dataset/type/index.ts @@ -42,6 +42,7 @@ export type { MetadataFilterCondition, MetadataFilteringConditions, RetrieveRequest, + RetrieveSegment, RetrieveRecord, RetrieveResponse, } from './segmentTypes'; diff --git a/app/api/dify-dataset/type/segmentTypes.ts b/app/api/dify-dataset/type/segmentTypes.ts index a976acd..3b83581 100644 --- a/app/api/dify-dataset/type/segmentTypes.ts +++ b/app/api/dify-dataset/type/segmentTypes.ts @@ -4,6 +4,11 @@ * @module api/dify-dataset/type/segmentTypes */ +import type { RetrievalModel } from './datasetTypes'; + +// 重新导出以便其他模块使用 +export type { RetrievalModel }; + // ============================================================================ // 分段类型 // ============================================================================ @@ -154,25 +159,27 @@ export interface MetadataFilteringConditions { */ export interface RetrieveRequest { query: string; - retrieval_model?: { - search_method: 'keyword_search' | 'semantic_search' | 'full_text_search' | 'hybrid_search'; - reranking_enable?: boolean; - reranking_model?: { - reranking_provider_name: string; - reranking_model_name: string; - }; - top_k?: number; - score_threshold_enabled?: boolean; - score_threshold?: number; - }; + retrieval_model?: RetrievalModel; metadata_filtering_conditions?: MetadataFilteringConditions; } +/** + * 检索结果中的分段信息(包含关联文档) + */ +export interface RetrieveSegment extends Segment { + document?: { + id: string; + data_source_type: string; + name: string; + doc_type: string | null; + }; +} + /** * 检索结果记录 */ export interface RetrieveRecord { - segment: Segment; + segment: RetrieveSegment; score: number; tsne_position?: { x: number; diff --git a/app/components/dify-dataset-manager/dataset-settings.tsx b/app/components/dify-dataset-manager/dataset-settings.tsx index 333dfde..05f1a90 100644 --- a/app/components/dify-dataset-manager/dataset-settings.tsx +++ b/app/components/dify-dataset-manager/dataset-settings.tsx @@ -1,16 +1,10 @@ -import { useState, useEffect } from 'react'; -import { Form, Input, Button, Card, message, Spin } from 'antd'; +import { Form, Input, Button, Card, Spin } from 'antd'; import { SaveOutlined } from '@ant-design/icons'; -import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; -import { updateDatasetName } from '~/api/dify-dataset/api/datasetApi'; +import { useDatasetSettings } from '~/hooks/dify-dataset-manager/dataset-settings'; +import type { DatasetSettingsProps } from '~/types/dify-dataset-manager/dataset-settings'; const { TextArea } = Input; -interface DatasetSettingsProps { - dataset: Dataset | null; - onDatasetUpdated: (dataset: Dataset) => void; -} - /** * 知识库设置组件 * 用于修改知识库名称和描述 @@ -20,70 +14,14 @@ export default function DatasetSettings({ onDatasetUpdated, }: DatasetSettingsProps) { const [form] = Form.useForm(); - const [saving, setSaving] = useState(false); - const [hasChanges, setHasChanges] = useState(false); - - // 初始化表单数据 - useEffect(() => { - if (dataset) { - form.setFieldsValue({ - name: dataset.name, - description: dataset.description || '', - }); - setHasChanges(false); - } - }, [dataset, form]); - - /** - * 处理表单值变化 - */ - const handleValuesChange = () => { - const values = form.getFieldsValue(); - const changed = - values.name !== dataset?.name || - values.description !== (dataset?.description || ''); - setHasChanges(changed); - }; - - /** - * 保存设置 - */ - const handleSave = async () => { - if (!dataset) { - message.error('知识库不存在'); - return; - } - - try { - const values = await form.validateFields(); - setSaving(true); - - // 目前只支持修改名称 - const updatedDataset = await updateDatasetName(dataset.id, values.name); - - message.success('保存成功'); - onDatasetUpdated(updatedDataset); - setHasChanges(false); - } catch (err: any) { - console.error('保存设置失败:', err); - message.error(err.message || '保存失败'); - } finally { - setSaving(false); - } - }; - - /** - * 重置表单 - */ - const handleReset = () => { - if (dataset) { - form.setFieldsValue({ - name: dataset.name, - description: dataset.description || '', - }); - setHasChanges(false); - } - }; + + const { + saving, + hasChanges, + handleValuesChange, + handleSave, + handleReset, + } = useDatasetSettings(dataset, form, onDatasetUpdated); if (!dataset) { return ( diff --git a/app/components/dify-dataset-manager/document-detail.tsx b/app/components/dify-dataset-manager/document-detail.tsx index 1a38377..a59fc8b 100644 --- a/app/components/dify-dataset-manager/document-detail.tsx +++ b/app/components/dify-dataset-manager/document-detail.tsx @@ -1,4 +1,3 @@ -import { useState, useEffect } from 'react'; import { Input, Button, @@ -8,7 +7,6 @@ import { Card, Empty, Spin, - message, Divider, Tooltip, } from 'antd'; @@ -17,45 +15,8 @@ import { ReloadOutlined, EyeOutlined, } from '@ant-design/icons'; -import type { Document } from '~/api/dify-dataset/type/documentTypes'; -import type { Segment } from '~/api/dify-dataset/type'; -import { fetchSegments } from '~/api/dify-dataset/api/segmentApi'; -import { updateDocumentWithSettings } from '~/api/dify-dataset/api/documentApi'; - -interface DocumentDetailProps { - datasetId: string; - document: Document | null; -} - -/** - * 分段设置配置 - * 注意:Dify API 支持的参数有限 - * - separator: ✅ 支持 - * - maxTokens: ✅ 支持 - * - removeExtraSpaces: ✅ 支持 - * - removeUrlsEmails: ✅ 支持 - * - useQASegment: ⚠️ 需要 doc_form: "qa_model" - */ -interface SegmentationSettings { - separator: string; - maxTokens: number; - removeExtraSpaces: boolean; - removeUrlsEmails: boolean; - useQASegment: boolean; - qaLanguage: string; -} - -/** - * 默认分段设置 - */ -const DEFAULT_SETTINGS: SegmentationSettings = { - separator: '\\n\\n', - maxTokens: 500, - removeExtraSpaces: true, - removeUrlsEmails: false, - useQASegment: false, - qaLanguage: 'Chinese', -}; +import { useDocumentDetail } from '~/hooks/dify-dataset-manager/document-detail'; +import type { DocumentDetailProps } from '~/types/dify-dataset-manager/document-detail'; /** * 文档详情组件 @@ -65,98 +26,17 @@ export default function DocumentDetail({ datasetId, document, }: DocumentDetailProps) { - // 分段设置状态 - const [settings, setSettings] = useState(DEFAULT_SETTINGS); - - // 预览状态 - const [previewSegments, setPreviewSegments] = useState([]); - const [previewLoading, setPreviewLoading] = useState(false); - const [showPreview, setShowPreview] = useState(false); - - // 保存状态 - const [saving, setSaving] = useState(false); - - // 当文档变化时重置设置 - useEffect(() => { - if (document) { - // 可以从文档中读取已有的设置,这里使用默认值 - setSettings(DEFAULT_SETTINGS); - setPreviewSegments([]); - setShowPreview(false); - } - }, [document?.id]); - - /** - * 更新设置 - */ - const updateSettings = (key: keyof SegmentationSettings, value: any) => { - setSettings(prev => ({ ...prev, [key]: value })); - }; - - /** - * 重置设置 - */ - const handleReset = () => { - setSettings(DEFAULT_SETTINGS); - setPreviewSegments([]); - setShowPreview(false); - }; - - /** - * 预览分段 - */ - const handlePreview = async () => { - if (!document) return; - - setPreviewLoading(true); - setShowPreview(true); - try { - // 获取当前文档的分段作为预览 - const response = await fetchSegments(datasetId, document.id, 1, 50); - setPreviewSegments(response.data || []); - if (response.data?.length === 0) { - message.info('该文档暂无分段数据'); - } - } catch (err: any) { - console.error('预览分段失败:', err); - message.error(err.message || '预览失败'); - } finally { - setPreviewLoading(false); - } - }; - - /** - * 保存并处理 - */ - const handleSaveAndProcess = async () => { - if (!document) return; - - setSaving(true); - try { - await updateDocumentWithSettings(datasetId, document.id, { - indexing_technique: 'high_quality', - process_rule: { - mode: 'custom', - rules: { - pre_processing_rules: [ - { id: 'remove_extra_spaces', enabled: settings.removeExtraSpaces }, - { id: 'remove_urls_emails', enabled: settings.removeUrlsEmails }, - ], - segmentation: { - separator: settings.separator.replace(/\\n/g, '\n'), - max_tokens: settings.maxTokens, - }, - }, - }, - }); - message.success('设置已保存,文档正在重新处理...'); - } catch (err: any) { - console.error('保存设置失败:', err); - message.error(err.message || '保存失败'); - } finally { - setSaving(false); - } - }; + const { + settings, + previewSegments, + previewLoading, + showPreview, + saving, + updateSettings, + handleReset, + handlePreview, + handleSaveAndProcess, + } = useDocumentDetail(datasetId, document); if (!document) { return ( diff --git a/app/components/dify-dataset-manager/document-list.tsx b/app/components/dify-dataset-manager/document-list.tsx index 90945fc..4da0c78 100644 --- a/app/components/dify-dataset-manager/document-list.tsx +++ b/app/components/dify-dataset-manager/document-list.tsx @@ -1,4 +1,3 @@ -import { useState } from 'react'; import { Button, Input, @@ -8,10 +7,8 @@ import { Tooltip, Popconfirm, Switch, - message, Empty, Spin, - Upload, } from 'antd'; import { SearchOutlined, @@ -20,32 +17,14 @@ import { FileTextOutlined, CloudUploadOutlined, EyeOutlined, - ClockCircleOutlined, - CheckCircleOutlined, - SyncOutlined, - ExclamationCircleOutlined, - PauseCircleOutlined, } from '@ant-design/icons'; import type { ColumnsType } from 'antd/es/table'; import type { Document, IndexingStatus } from '~/api/dify-dataset/type/documentTypes'; -import { deleteDocument, toggleDocumentStatus, uploadDocument } from '~/api/dify-dataset/api/documentApi'; +import { useDocumentList } from '~/hooks/dify-dataset-manager/document-list'; +import type { DocumentListProps } from '~/types/dify-dataset-manager/document-list'; +import DocumentUpload from './document-upload'; import '../../styles/components/dify-dataset-manager/index.css'; -interface DocumentListProps { - datasetId: string; - datasetName: string; - documents: Document[]; - loading: boolean; - total: number; - page: number; - pageSize: number; - onPageChange: (page: number) => void; - onDocumentDeleted: (documentId: string) => void; - onDocumentStatusChanged: (documentId: string, enabled: boolean) => void; - onRefresh: () => void; - onViewDocument?: (document: Document) => void; -} - /** * 文档列表组件 */ @@ -62,114 +41,24 @@ export default function DocumentList({ onRefresh, onViewDocument, }: DocumentListProps) { - const [searchValue, setSearchValue] = useState(''); - const [uploading, setUploading] = useState(false); - const [deletingId, setDeletingId] = useState(null); - - /** - * 获取状态标签配置 - */ - const getStatusConfig = (status: IndexingStatus) => { - const configs: Record = { - completed: { color: 'success', icon: , text: '已完成' }, - indexing: { color: 'processing', icon: , text: '索引中' }, - waiting: { color: 'warning', icon: , text: '等待中' }, - parsing: { color: 'processing', icon: , text: '解析中' }, - cleaning: { color: 'processing', icon: , text: '清洗中' }, - splitting: { color: 'processing', icon: , text: '分段中' }, - paused: { color: 'default', icon: , text: '已暂停' }, - error: { color: 'error', icon: , text: '错误' }, - }; - return configs[status] || { color: 'default', icon: null, text: status }; - }; - - /** - * 格式化日期 - */ - const formatDate = (timestamp: number) => { - return new Date(timestamp * 1000).toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - }); - }; - - /** - * 格式化数字 - */ - const formatNumber = (num: number) => { - if (num >= 10000) { - return (num / 10000).toFixed(1) + 'w'; - } - if (num >= 1000) { - return (num / 1000).toFixed(1) + 'k'; - } - return num.toString(); - }; - - /** - * 处理删除文档 - */ - const handleDelete = async (documentId: string) => { - setDeletingId(documentId); - try { - await deleteDocument(datasetId, documentId); - message.success('删除成功'); - onDocumentDeleted(documentId); - } catch (err: any) { - console.error('删除文档失败:', err); - message.error(err.message || '删除失败'); - } finally { - setDeletingId(null); - } - }; - - /** - * 处理启用/禁用文档 - */ - const handleToggleStatus = async (documentId: string, enabled: boolean) => { - try { - await toggleDocumentStatus(datasetId, documentId, enabled); - message.success(enabled ? '已启用' : '已禁用'); - onDocumentStatusChanged(documentId, enabled); - } catch (err: any) { - console.error('切换文档状态失败:', err); - message.error(err.message || '操作失败'); - } - }; - - /** - * 处理文件上传 - */ - const handleUpload = async (file: File) => { - if (!datasetId) { - message.error('请先选择知识库'); - return false; - } - - setUploading(true); - try { - await uploadDocument(datasetId, file, (percent) => { - console.log('上传进度:', percent); - }); - message.success('上传成功,正在处理...'); - onRefresh(); - } catch (err: any) { - console.error('上传文件失败:', err); - message.error(err.message || '上传失败'); - } finally { - setUploading(false); - } - - return false; - }; + const { + searchValue, + setSearchValue, + deletingId, + showUploadPage, + getStatusConfig, + formatDate, + formatNumber, + handleDelete, + handleToggleStatus, + handleUploadClick, + handleUploadClose, + handleUploadSuccess, + filterDocuments, + } = useDocumentList(datasetId, onDocumentDeleted, onDocumentStatusChanged, onRefresh); // 过滤文档 - const filteredDocuments = documents.filter((doc) => - doc.name.toLowerCase().includes(searchValue.toLowerCase()) - ); + const filteredDocuments = filterDocuments(documents); // 表格列定义 const columns: ColumnsType = [ @@ -271,115 +160,114 @@ export default function DocumentList({ ]; return ( -
- {/* 页面头部 */} -
-
-

文档

- {/*

- 知识库的所有文件都在这里显示,整个知识库都可以被接到 Dify 引用或通过 Chat 插件进行索引。 -

*/} -
-
- - - -
-
- - {/* 搜索栏 */} -
- } - value={searchValue} - onChange={(e) => setSearchValue(e.target.value)} - allowClear - style={{ width: 280 }} + <> + {/* 上传页面 */} + {showUploadPage ? ( + -
- - {/* 文档表格 */} -
- {loading && documents.length === 0 ? ( -
- -
加载中...
+ ) : ( +
+ {/* 页面头部 */} +
+
+

文档

+
+
+ + +
- ) : filteredDocuments.length === 0 ? ( -
- - {!searchValue && ( - + } + value={searchValue} + onChange={(e) => setSearchValue(e.target.value)} + allowClear + style={{ width: 280 }} + /> +
+ + {/* 文档表格 */} +
+ {loading && documents.length === 0 ? ( +
+ +
加载中...
+
+ ) : filteredDocuments.length === 0 ? ( +
+ + {!searchValue && ( + + )} + +
+ ) : ( + + )} + + + {/* 底部分页器 */} + {filteredDocuments.length > 0 && ( +
+ 共 {total} 条 +
+ - - )} - -
- ) : ( -
- )} - - - {/* 底部分页器 */} - {filteredDocuments.length > 0 && ( -
- 共 {total} 条 -
- - - 第 {page} 页 / 共 {Math.ceil(total / pageSize)} 页 - - -
+ 上一页 + + + 第 {page} 页 / 共 {Math.ceil(total / pageSize)} 页 + + +
+ + )} )} - + ); } diff --git a/app/components/dify-dataset-manager/document-upload.tsx b/app/components/dify-dataset-manager/document-upload.tsx new file mode 100644 index 0000000..a461be0 --- /dev/null +++ b/app/components/dify-dataset-manager/document-upload.tsx @@ -0,0 +1,446 @@ +import { + ArrowLeftOutlined, + CheckCircleOutlined, + DeleteOutlined, + ExclamationCircleOutlined, + FileTextOutlined, + InboxOutlined, + LoadingOutlined, + QuestionCircleOutlined, +} from '@ant-design/icons'; +import type { UploadFile } from 'antd'; +import { + Button, + Card, + Checkbox, + Divider, + Empty, + Input, + InputNumber, + Progress, + Select, + Spin, + Tooltip, + Upload, +} from 'antd'; +import { useEffect, useState } from 'react'; +import type { Segment } from '~/api/dify-dataset/type'; +import { useDocumentUpload } from '~/hooks/dify-dataset-manager/document-upload'; +import type { DocumentUploadProps, UploadedDocument } from '~/types/dify-dataset-manager/document-upload'; +import { SUPPORTED_FORMATS } from '~/types/dify-dataset-manager/document-upload'; + +const { Dragger } = Upload; + +/** + * 文档上传组件 + * 支持多文件上传,两步流程:选择文件 → 上传并配置分段 + */ +export default function DocumentUpload({ + datasetId, + onClose, + onSuccess, +}: DocumentUploadProps) { + const { + // 状态 + step, + fileList, + uploadedDocuments, + currentSettings, + previewLoading, + + // 方法 + handleFileChange, + handleRemoveFile, + handleNextStep, + handleDocumentChange, + handleReprocess, + handlePrevStep, + handleGoToDocuments, + updateCurrentSettings, + + // 计算属性方法 + getCurrentDocument, + getCurrentProgress, + getStatusText, + isCurrentDocProcessing, + getCompletionStats, + } = useDocumentUpload(datasetId, onClose, onSuccess); + + const selectedFiles = fileList.filter((f: UploadFile) => f.originFileObj).map((f: UploadFile) => f.originFileObj as File); + + // 平滑进度条逻辑 + const [displayPercent, setDisplayPercent] = useState(0); + const targetPercent = getCurrentProgress(); + + useEffect(() => { + if (targetPercent > displayPercent) { + // 如果目标进度大于当前显示进度,启动动画 + const diff = targetPercent - displayPercent; + // 动态步长:差距越大跑得越快,但最小步长为1 + const step = Math.max(1, Math.ceil(diff / 10)); + + const timer = requestAnimationFrame(() => { + setDisplayPercent(prev => Math.min(targetPercent, prev + step)); + }); + + return () => cancelAnimationFrame(timer); + } else if (targetPercent < displayPercent && targetPercent === 0) { + // 如果目标重置为0(例如重新开始),立即重置 + setDisplayPercent(0); + } + }, [targetPercent, displayPercent]); + + /** + * 渲染步骤指示器(两步流程) + */ + const renderSteps = () => ( +
+
1 ? 'completed' : ''}`}> + 1 + 选择数据源 +
+
1 ? 'completed' : ''}`}>
+
+ 2 + 文本分段与清洗 +
+
+ ); + + /** + * 渲染第一步:选择文件(支持多文件) + */ + const renderStep1 = () => ( +
+

上传文本文件

+

+ 文档需上传至知识智能理解法治知识库,广东烟草智能理解将按照于知识库,你可以在聊后指数文档所据案中检索它 +

+ +
+ false} + multiple={true} + accept=".txt,.md,.mdx,.pdf,.html,.htm,.xlsx,.xls,.docx,.csv,.vtt,.properties" + showUploadList={false} + > +

+ +

+

拖拽文件或至此,或者 选择文件

+

+ 已支持 {SUPPORTED_FORMATS},每个文件不超过 15MB。支持批量上传多个文件。 +

+
+
+ + {/* 已选文件列表 */} + {selectedFiles.length > 0 && ( +
+

嵌入已就绪 ({selectedFiles.length} 个文件)

+
+ {fileList.map((file: UploadFile) => ( +
+ +
+ {file.name} + + {file.originFileObj + ? `${file.originFileObj.type?.split('/')[1]?.toUpperCase() || 'FILE'},${(file.originFileObj.size / 1024 / 1024).toFixed(2)}MB` + : ''} + +
+
+ ))} +
+
+ )} + +
+ +
+
+ ); + + /** + * 渲染第二步:分段配置与预览 + * 左侧始终显示配置面板,右侧预览框内显示进度或分段内容 + */ + const renderStep2 = () => { + const currentDoc = getCurrentDocument(); + const isProcessing = isCurrentDocProcessing(); + const stats = getCompletionStats(); + + return ( +
+ {/* 分段配置与预览 */} +
+ {/* 左侧设置区域 */} +
+
+

分段设置

+ + {/* 分段标识符 */} +
+ + updateCurrentSettings('separator', e.target.value)} + placeholder="\n\n" + className="setting-input" + disabled={isProcessing} + /> +
+ + {/* 分段最大长度 */} +
+ +
+ updateCurrentSettings('maxTokens', value || 1024)} + min={100} + max={4000} + className="setting-input-number" + disabled={isProcessing} + /> + characters +
+
+ + {/* 分段重叠长度 */} +
+ +
+ updateCurrentSettings('chunkOverlap', value || 50)} + min={0} + max={500} + className="setting-input-number" + disabled={isProcessing} + /> + characters +
+
+
+ + + + {/* 文本预处理规则 */} +
+

文本预处理规则

+
+ updateCurrentSettings('removeExtraSpaces', e.target.checked)} + disabled={isProcessing} + > + 替换掉连续的空格、换行符和制表符 + + updateCurrentSettings('removeUrlsEmails', e.target.checked)} + disabled={isProcessing} + > + 删除所有 URL 和电子邮件地址 + +
+
+ + + + {/* 索引方式 */} +
+

索引方式

+
+
!isProcessing && updateCurrentSettings('indexingTechnique', 'high_quality')} + > + + 高质量 + 推荐 +
+
!isProcessing && updateCurrentSettings('indexingTechnique', 'economy')} + > + + 经济 +
+
+
+ + {/* 操作按钮 */} +
+ + +
+
+ + {/* 右侧预览区域 */} +
+ + 预览 + {uploadedDocuments.length > 0 && ( + <> + } - value={searchQuery} - onChange={(e) => setSearchQuery(e.target.value)} - onPressEnter={handleRetrieve} - className="search-input" - /> - -
- -
-
- 检索方式: + {/* 查询输入区 */} + + + + 源文本 +
record.segment.id} - pagination={false} - size="small" - /> + + + 检索结果 + + + 共找到 {retrieveResults.length} 条结果 + + + + {retrieveResults.map((record, index) => ( + + ))} + )} - - + + ); } diff --git a/app/config/api-config.ts b/app/config/api-config.ts index fb23685..28c04c3 100644 --- a/app/config/api-config.ts +++ b/app/config/api-config.ts @@ -28,6 +28,13 @@ interface ApiConfig { // 应用ID(用于登出) appId?: string; }; + // Dify 知识库检索配置 + dify: { + // Reranking 模型提供商 + rerankingProviderName: string; + // Reranking 模型名称 + rerankingModelName: string; + }; } // 端口特定配置映射 @@ -37,17 +44,12 @@ const portConfigs: Record> = { // 主要 // 梅州 '51703': { - // baseUrl: 'http://172.16.0.55:8073', - // documentUrl: 'http://172.16.0.55:8073/docauditai/', - // uploadUrl: 'http://172.16.0.55:8073/admin/documents', - // collaboraUrl: 'http://172.16.0.81:9980', - // appUrl: 'http://172.16.0.34:51703', + baseUrl: 'http://172.16.0.78:8073', + documentUrl: 'http://172.16.0.78:8073/docauditai/', + uploadUrl: 'http://172.16.0.78:8073/admin/documents', - baseUrl: 'http://10.79.97.17:8000', - documentUrl: 'http://10.79.97.17:8000/docauditai/', - uploadUrl: 'http://10.79.97.17:8000/admin/documents', - collaboraUrl: 'http://10.79.97.17:9980', - appUrl: 'http://10.79.97.17:51703', + collaboraUrl: 'http://172.16.0.81:9980', + appUrl: 'http://172.16.0.34:51703', oauth: { redirectUri: 'http://10.79.97.17:51703/callback' @@ -127,15 +129,18 @@ const configs: Record = { // uploadUrl: 'http://172.16.0.55:8073/admin/documents', collaboraUrl: 'http://172.16.0.81:9980', - // appUrl: 'http://172.16.0.34:51709', - appUrl: 'http://172.16.0.34:5173', - + appUrl: 'http://172.16.0.78:51703', + oauth: { serverUrl: 'http://10.79.112.85', // IDaaS服务器地址 clientId: 'none', clientSecret: 'none', // 需要替换为实际的Client Secret redirectUri: 'http://10.79.97.17/', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 + }, + dify: { + rerankingProviderName: 'langgenius/tongyi/tongyi', + rerankingModelName: 'gte-rerank' } }, @@ -152,6 +157,10 @@ const configs: Record = { clientSecret: 'placeholder', // 需要替换为实际的Client Secret redirectUri: 'http://10.79.97.17/', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 + }, + dify: { + rerankingProviderName: 'langgenius/tongyi/tongyi', + rerankingModelName: 'gte-rerank' } }, @@ -173,6 +182,10 @@ const configs: Record = { clientSecret: 'placeholder', // 占位符,实际值从环境变量获取 redirectUri: 'http://10.79.97.17/', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 + }, + dify: { + rerankingProviderName: 'langgenius/tongyi/tongyi', + rerankingModelName: 'gte-rerank' } }, @@ -189,6 +202,10 @@ const configs: Record = { clientSecret: 'your_client_secret', // 需要替换为实际的Client Secret redirectUri: 'http://172.16.0.119:3000/callback', // 回调地址 appId: 'idaasoauth2' // 应用ID,用于登出 + }, + dify: { + rerankingProviderName: 'langgenius/tongyi/tongyi', + rerankingModelName: 'gte-rerank' } } }; @@ -238,7 +255,8 @@ const getConfigFromEnv = (defaultConfig: ApiConfig): ApiConfig => { clientSecret: process.env.OAUTH_CLIENT_SECRET || defaultConfig.oauth.clientSecret, redirectUri: process.env.NEXT_PUBLIC_OAUTH_REDIRECT_URI || defaultConfig.oauth.redirectUri, appId: process.env.NEXT_PUBLIC_OAUTH_APP_ID || defaultConfig.oauth.appId - } + }, + dify: defaultConfig.dify }; }; @@ -366,7 +384,8 @@ export const { uploadUrl: UPLOAD_URL, collaboraUrl: COLLABORA_URL, appUrl: APP_URL, - oauth: OAUTH_CONFIG + oauth: OAUTH_CONFIG, + dify: DIFY_CONFIG } = apiConfig; /** diff --git a/app/hooks/dify-dataset-manager/dataset-settings.ts b/app/hooks/dify-dataset-manager/dataset-settings.ts new file mode 100644 index 0000000..dcaba5a --- /dev/null +++ b/app/hooks/dify-dataset-manager/dataset-settings.ts @@ -0,0 +1,92 @@ +import { useState, useEffect, useCallback } from 'react'; +import { message } from 'antd'; +import type { FormInstance } from 'antd'; +import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; +import { updateDatasetName } from '~/api/dify-dataset/api/datasetApi'; + +/** + * 知识库设置状态管理 Hook + */ +export function useDatasetSettings( + dataset: Dataset | null, + form: FormInstance, + onDatasetUpdated: (dataset: Dataset) => void +) { + const [saving, setSaving] = useState(false); + const [hasChanges, setHasChanges] = useState(false); + + // 初始化表单数据 + useEffect(() => { + if (dataset) { + form.setFieldsValue({ + name: dataset.name, + description: dataset.description || '', + }); + setHasChanges(false); + } + }, [dataset, form]); + + /** + * 处理表单值变化 + */ + const handleValuesChange = useCallback(() => { + const values = form.getFieldsValue(); + const changed = + values.name !== dataset?.name || + values.description !== (dataset?.description || ''); + setHasChanges(changed); + }, [form, dataset]); + + /** + * 保存设置 + */ + const handleSave = useCallback(async () => { + if (!dataset) { + message.error('知识库不存在'); + return; + } + + try { + const values = await form.validateFields(); + setSaving(true); + + // 目前只支持修改名称 + const updatedDataset = await updateDatasetName(dataset.id, values.name); + + message.success('保存成功'); + onDatasetUpdated(updatedDataset); + setHasChanges(false); + } catch (err: any) { + console.error('保存设置失败:', err); + message.error(err.message || '保存失败'); + } finally { + setSaving(false); + } + }, [dataset, form, onDatasetUpdated]); + + /** + * 重置表单 + */ + const handleReset = useCallback(() => { + if (dataset) { + form.setFieldsValue({ + name: dataset.name, + description: dataset.description || '', + }); + setHasChanges(false); + } + }, [dataset, form]); + + return { + // 状态 + saving, + hasChanges, + + // 方法 + handleValuesChange, + handleSave, + handleReset, + }; +} + +export type UseDatasetSettingsReturn = ReturnType; diff --git a/app/hooks/dify-dataset-manager/document-detail.ts b/app/hooks/dify-dataset-manager/document-detail.ts new file mode 100644 index 0000000..36fb602 --- /dev/null +++ b/app/hooks/dify-dataset-manager/document-detail.ts @@ -0,0 +1,123 @@ +import { message } from 'antd'; +import { useCallback, useEffect, useState } from 'react'; +import { updateDocumentWithSettings } from '~/api/dify-dataset/api/documentApi'; +import { fetchSegments } from '~/api/dify-dataset/api/segmentApi'; +import type { Segment } from '~/api/dify-dataset/type'; +import type { Document } from '~/api/dify-dataset/type/documentTypes'; +import type { DocumentDetailSegmentationSettings } from '~/types/dify-dataset-manager/document-detail'; +import { DEFAULT_DOCUMENT_DETAIL_SETTINGS } from '~/types/dify-dataset-manager/document-detail'; + +/** + * 文档详情状态管理 Hook + */ +export function useDocumentDetail(datasetId: string, document: Document | null) { + // 分段设置状态 + const [settings, setSettings] = useState(DEFAULT_DOCUMENT_DETAIL_SETTINGS); + + // 预览状态 + const [previewSegments, setPreviewSegments] = useState([]); + const [previewLoading, setPreviewLoading] = useState(false); + const [showPreview, setShowPreview] = useState(false); + + // 保存状态 + const [saving, setSaving] = useState(false); + + // 当文档变化时重置设置 + useEffect(() => { + if (document) { + // 可以从文档中读取已有的设置,这里使用默认值 + setSettings(DEFAULT_DOCUMENT_DETAIL_SETTINGS); + setPreviewSegments([]); + setShowPreview(false); + } + }, [document?.id]); + + /** + * 更新设置 + */ + const updateSettings = useCallback((key: keyof DocumentDetailSegmentationSettings, value: any) => { + setSettings(prev => ({ ...prev, [key]: value })); + }, []); + + /** + * 重置设置 + */ + const handleReset = useCallback(() => { + setSettings(DEFAULT_DOCUMENT_DETAIL_SETTINGS); + setPreviewSegments([]); + setShowPreview(false); + }, []); + + /** + * 预览分段 + */ + const handlePreview = useCallback(async () => { + if (!document) return; + + setPreviewLoading(true); + setShowPreview(true); + try { + // 获取当前文档的分段作为预览 + const response = await fetchSegments(datasetId, document.id, 1, 50); + setPreviewSegments(response.data || []); + if (response.data?.length === 0) { + message.info('该文档暂无分段数据'); + } + } catch (err: any) { + console.error('预览分段失败:', err); + message.error(err.message || '预览失败'); + } finally { + setPreviewLoading(false); + } + }, [datasetId, document]); + + /** + * 保存并处理 + */ + const handleSaveAndProcess = useCallback(async () => { + if (!document) return; + + setSaving(true); + try { + await updateDocumentWithSettings(datasetId, document.id, { + indexing_technique: 'high_quality', + process_rule: { + mode: 'custom', + rules: { + pre_processing_rules: [ + { id: 'remove_extra_spaces', enabled: settings.removeExtraSpaces }, + { id: 'remove_urls_emails', enabled: settings.removeUrlsEmails }, + ], + segmentation: { + separator: settings.separator.replace(/\\n/g, '\n'), + max_tokens: settings.maxTokens, + }, + }, + }, + }); + message.success('设置已保存,文档正在重新处理...'); + } catch (err: any) { + console.error('保存设置失败:', err); + message.error(err.message || '保存失败'); + } finally { + setSaving(false); + } + }, [datasetId, document, settings]); + + return { + // 状态 + settings, + previewSegments, + previewLoading, + showPreview, + saving, + + // 方法 + updateSettings, + handleReset, + handlePreview, + handleSaveAndProcess, + }; +} + +export type UseDocumentDetailReturn = ReturnType; diff --git a/app/hooks/dify-dataset-manager/document-list.tsx b/app/hooks/dify-dataset-manager/document-list.tsx new file mode 100644 index 0000000..6a487a8 --- /dev/null +++ b/app/hooks/dify-dataset-manager/document-list.tsx @@ -0,0 +1,156 @@ +import { useState, useCallback } from 'react'; +import { message } from 'antd'; +import type { Document, IndexingStatus } from '~/api/dify-dataset/type/documentTypes'; +import { deleteDocument, toggleDocumentStatus } from '~/api/dify-dataset/api/documentApi'; +import { + CheckCircleOutlined, + SyncOutlined, + ClockCircleOutlined, + PauseCircleOutlined, + ExclamationCircleOutlined, +} from '@ant-design/icons'; +import type { StatusConfig } from '~/types/dify-dataset-manager/document-list'; + +/** + * 文档列表状态管理 Hook + */ +export function useDocumentList( + datasetId: string, + onDocumentDeleted: (documentId: string) => void, + onDocumentStatusChanged: (documentId: string, enabled: boolean) => void, + onRefresh: () => void +) { + const [searchValue, setSearchValue] = useState(''); + const [deletingId, setDeletingId] = useState(null); + const [showUploadPage, setShowUploadPage] = useState(false); + + /** + * 获取状态标签配置 + */ + const getStatusConfig = useCallback((status: IndexingStatus): StatusConfig => { + const configs: Record = { + completed: { color: 'success', icon: , text: '已完成' }, + indexing: { color: 'processing', icon: , text: '索引中' }, + waiting: { color: 'warning', icon: , text: '等待中' }, + parsing: { color: 'processing', icon: , text: '解析中' }, + cleaning: { color: 'processing', icon: , text: '清洗中' }, + splitting: { color: 'processing', icon: , text: '分段中' }, + paused: { color: 'default', icon: , text: '已暂停' }, + error: { color: 'error', icon: , text: '错误' }, + }; + return configs[status] || { color: 'default', icon: null, text: status }; + }, []); + + /** + * 格式化日期 + */ + const formatDate = useCallback((timestamp: number) => { + return new Date(timestamp * 1000).toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + }); + }, []); + + /** + * 格式化数字 + */ + const formatNumber = useCallback((num: number) => { + if (num >= 10000) { + return (num / 10000).toFixed(1) + 'w'; + } + if (num >= 1000) { + return (num / 1000).toFixed(1) + 'k'; + } + return num.toString(); + }, []); + + /** + * 处理删除文档 + */ + const handleDelete = useCallback(async (documentId: string) => { + setDeletingId(documentId); + try { + await deleteDocument(datasetId, documentId); + message.success('删除成功'); + onDocumentDeleted(documentId); + } catch (err: any) { + console.error('删除文档失败:', err); + message.error(err.message || '删除失败'); + } finally { + setDeletingId(null); + } + }, [datasetId, onDocumentDeleted]); + + /** + * 处理启用/禁用文档 + */ + const handleToggleStatus = useCallback(async (documentId: string, enabled: boolean) => { + try { + await toggleDocumentStatus(datasetId, documentId, enabled); + message.success(enabled ? '已启用' : '已禁用'); + onDocumentStatusChanged(documentId, enabled); + } catch (err: any) { + console.error('切换文档状态失败:', err); + message.error(err.message || '操作失败'); + } + }, [datasetId, onDocumentStatusChanged]); + + /** + * 点击上传按钮,显示上传页面 + */ + const handleUploadClick = useCallback(() => { + if (!datasetId) { + message.error('请先选择知识库'); + return; + } + setShowUploadPage(true); + }, [datasetId]); + + /** + * 关闭上传页面 + */ + const handleUploadClose = useCallback(() => { + setShowUploadPage(false); + }, []); + + /** + * 上传成功回调 + */ + const handleUploadSuccess = useCallback(() => { + setShowUploadPage(false); + onRefresh(); + }, [onRefresh]); + + /** + * 过滤文档 + */ + const filterDocuments = useCallback((documents: Document[]) => { + return documents.filter((doc) => + doc.name.toLowerCase().includes(searchValue.toLowerCase()) + ); + }, [searchValue]); + + return { + // 状态 + searchValue, + setSearchValue, + deletingId, + showUploadPage, + + // 方法 + getStatusConfig, + formatDate, + formatNumber, + handleDelete, + handleToggleStatus, + handleUploadClick, + handleUploadClose, + handleUploadSuccess, + filterDocuments, + }; +} + +export type UseDocumentListReturn = ReturnType; diff --git a/app/hooks/dify-dataset-manager/document-upload.ts b/app/hooks/dify-dataset-manager/document-upload.ts new file mode 100644 index 0000000..1cb4b94 --- /dev/null +++ b/app/hooks/dify-dataset-manager/document-upload.ts @@ -0,0 +1,533 @@ +import type { UploadFile, UploadProps } from 'antd'; +import { message } from 'antd'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { + fetchIndexingStatus, + updateDocumentByFile, + uploadDocumentWithConfig, +} from '~/api/dify-dataset/api/documentApi'; +import { fetchSegments } from '~/api/dify-dataset/api/segmentApi'; +import type { IndexingStatus } from '~/api/dify-dataset/type/documentTypes'; +import type { + DocumentStage, + SegmentationSettings, + UploadedDocument, +} from '~/types/dify-dataset-manager/document-upload'; +import { + DEFAULT_SEGMENTATION_SETTINGS, + INDEXING_STATUS_CONFIG, +} from '~/types/dify-dataset-manager/document-upload'; + +/** + * 文档上传状态管理 Hook + */ +export function useDocumentUpload(datasetId: string, onClose: () => void, onSuccess: () => void) { + // 步骤控制 + const [step, setStep] = useState<1 | 2>(1); + + // 文件相关 + const [selectedFiles, setSelectedFiles] = useState([]); + const [fileList, setFileList] = useState([]); + + // 多文档状态管理 + const [uploadedDocuments, setUploadedDocuments] = useState([]); + // 当前选中查看的文档索引 + const [currentDocIndex, setCurrentDocIndex] = useState(0); + + // 当前显示的分段设置(来自当前选中的文档) + const [currentSettings, setCurrentSettings] = useState(DEFAULT_SEGMENTATION_SETTINGS); + + // 预览相关 + const [previewLoading, setPreviewLoading] = useState(false); + + // 轮询定时器(支持多个文档) + const pollingTimersRef = useRef>(new Map()); + // 状态追赶定时器 + const statusCatchUpTimersRef = useRef>(new Map()); + + // 状态顺序 + const STATUS_ORDER: IndexingStatus[] = ['waiting', 'parsing', 'cleaning', 'splitting', 'indexing', 'completed']; + + /** + * 停止指定文档的轮询 + */ + const stopPolling = useCallback((documentId: string) => { + const timer = pollingTimersRef.current.get(documentId); + if (timer) { + clearInterval(timer); + pollingTimersRef.current.delete(documentId); + } + }, []); + + /** + * 停止所有轮询 + */ + const stopAllPolling = useCallback(() => { + pollingTimersRef.current.forEach(timer => clearInterval(timer)); + pollingTimersRef.current.clear(); + }, []); + + /** + * 加载分段预览 + */ + const loadSegmentsPreview = useCallback(async (documentId: string, docIndex: number) => { + setPreviewLoading(true); + try { + const response = await fetchSegments(datasetId, documentId, 1, 50); + const segments = response.data || []; + // 更新对应文档的分段 + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === docIndex ? { ...doc, segments } : doc + )); + } catch (err: any) { + console.error('加载分段预览失败:', err); + message.error('加载分段预览失败'); + } finally { + setPreviewLoading(false); + } + }, [datasetId]); + + // 清理所有轮询定时器 + useEffect(() => { + return () => { + pollingTimersRef.current.forEach(timer => clearInterval(timer)); + pollingTimersRef.current.clear(); + statusCatchUpTimersRef.current.forEach(timer => clearTimeout(timer)); + statusCatchUpTimersRef.current.clear(); + }; + }, []); + + /** + * 状态追赶逻辑 + */ + useEffect(() => { + uploadedDocuments.forEach((doc, index) => { + // 如果没有真实状态,或者已经完成/错误,或者正在追赶中(有定时器),则跳过 + if (!doc.realIndexingStatus || doc.stage === 'error' || statusCatchUpTimersRef.current.has(doc.documentId)) { + return; + } + + const currentIndex = STATUS_ORDER.indexOf(doc.indexingStatus); + const targetIndex = STATUS_ORDER.indexOf(doc.realIndexingStatus); + + // 如果当前显示状态落后于真实状态 + if (currentIndex < targetIndex) { + // 设置定时器,1秒后更新到下一个状态 + const timer = setTimeout(() => { + setUploadedDocuments(prev => prev.map((d, idx) => { + if (idx !== index) return d; + + const nextStatus = STATUS_ORDER[currentIndex + 1]; + const isCompleted = nextStatus === 'completed'; + + // 如果到达完成状态,且真实状态也是完成,则触发完成逻辑 + if (isCompleted && d.realIndexingStatus === 'completed') { + stopPolling(d.documentId); + // 自动加载分段预览 + loadSegmentsPreview(d.documentId, index); + return { ...d, indexingStatus: nextStatus, stage: 'completed' }; + } + + return { ...d, indexingStatus: nextStatus }; + })); + + // 清除定时器引用 + statusCatchUpTimersRef.current.delete(doc.documentId); + }, 1000); // 至少停留1秒 + + statusCatchUpTimersRef.current.set(doc.documentId, timer); + } + }); + }, [uploadedDocuments, stopPolling, loadSegmentsPreview]); + + /** + * 轮询索引状态 + */ + const pollIndexingStatus = useCallback(async (batch: string, documentId: string, docIndex: number) => { + try { + const response = await fetchIndexingStatus(datasetId, batch); + const documentStatus = response.data?.[0]; + + if (documentStatus) { + const realStatus = documentStatus.indexing_status as IndexingStatus; + + // 更新文档状态(只更新真实状态和统计信息,显示状态由 useEffect 控制) + setUploadedDocuments(prev => prev.map((doc, idx) => { + if (idx !== docIndex) return doc; + + // 如果已经是 error 状态,直接更新 + if (realStatus === 'error') { + stopPolling(documentId); + return { + ...doc, + stage: 'error', + error: documentStatus.error || '处理失败', + realIndexingStatus: realStatus + }; + } + + return { + ...doc, + realIndexingStatus: realStatus, + completedSegments: documentStatus.completed_segments, + totalSegments: documentStatus.total_segments + }; + })); + } + } catch (err) { + console.error('获取索引状态失败:', err); + } + }, [datasetId, stopPolling]); + + /** + * 开始轮询 + */ + const startPolling = useCallback((batch: string, documentId: string, docIndex: number) => { + // 先停止之前的轮询 + stopPolling(documentId); + + // 开始新的轮询 + const timer = setInterval(() => { + pollIndexingStatus(batch, documentId, docIndex); + }, 2000); + pollingTimersRef.current.set(documentId, timer); + + // 立即执行一次 + pollIndexingStatus(batch, documentId, docIndex); + }, [stopPolling, pollIndexingStatus]); + + /** + * 构建上传配置 + */ + const buildConfig = useCallback((s: SegmentationSettings) => ({ + indexing_technique: s.indexingTechnique, + process_rule: { + mode: 'custom' as const, + rules: { + pre_processing_rules: [ + { id: 'remove_extra_spaces' as const, enabled: s.removeExtraSpaces }, + { id: 'remove_urls_emails' as const, enabled: s.removeUrlsEmails }, + ], + segmentation: { + separator: s.separator.replace(/\\n/g, '\n'), + max_tokens: s.maxTokens, + }, + }, + }, + }), []); + + /** + * 更新当前文档的设置 + */ + const updateCurrentSettings = useCallback((key: keyof SegmentationSettings, value: any) => { + setCurrentSettings(prev => { + const newSettings = { ...prev, [key]: value }; + // 同步更新到文档列表 + setUploadedDocuments(prevDocs => prevDocs.map((doc, idx) => + idx === currentDocIndex ? { ...doc, settings: newSettings } : doc + )); + return newSettings; + }); + }, [currentDocIndex]); + + /** + * 处理文件选择变化 + */ + const handleFileChange: UploadProps['onChange'] = useCallback(({ fileList: newFileList }: { fileList: UploadFile[] }) => { + setFileList(newFileList); + // 提取实际文件对象 + const files = newFileList + .filter((f: UploadFile) => f.originFileObj) + .map((f: UploadFile) => f.originFileObj as File); + setSelectedFiles(files); + }, []); + + /** + * 移除文件 + */ + const handleRemoveFile = useCallback((file: UploadFile) => { + setFileList(prev => { + const newFileList = prev.filter(f => f.uid !== file.uid); + const files = newFileList + .filter(f => f.originFileObj) + .map(f => f.originFileObj as File); + setSelectedFiles(files); + return newFileList; + }); + }, []); + + /** + * 上传单个文件 + */ + const uploadSingleFile = useCallback(async (file: File, index: number): Promise => { + try { + // 更新状态为上传中 + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === index ? { ...doc, stage: 'uploading' as DocumentStage } : doc + )); + + const config = buildConfig(DEFAULT_SEGMENTATION_SETTINGS); + const result = await uploadDocumentWithConfig( + datasetId, + file, + config, + (percent) => { + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === index ? { ...doc, uploadProgress: percent } : doc + )); + } + ); + + // 更新文档信息 + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === index ? { + ...doc, + documentId: result.document.id, + batch: result.batch, + stage: 'indexing' as DocumentStage, + indexingStatus: 'waiting' as IndexingStatus, + realIndexingStatus: 'waiting' as IndexingStatus, // 初始化真实状态 + } : doc + )); + + // 开始轮询索引状态 + startPolling(result.batch, result.document.id, index); + } catch (err: any) { + console.error(`上传文档 ${file.name} 失败:`, err); + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === index ? { + ...doc, + stage: 'error' as DocumentStage, + error: err.message || '上传失败', + } : doc + )); + } + }, [datasetId, buildConfig, startPolling]); + + /** + * 点击"下一步":立即上传所有文件 + */ + const handleNextStep = useCallback(async () => { + if (selectedFiles.length === 0) { + message.warning('请先选择文件'); + return; + } + + // 初始化所有文档状态 + const docs: UploadedDocument[] = selectedFiles.map(file => ({ + file, + documentId: '', + batch: '', + stage: 'pending' as DocumentStage, + indexingStatus: 'waiting' as IndexingStatus, + realIndexingStatus: 'waiting' as IndexingStatus, // 初始化真实状态 + uploadProgress: 0, + settings: { ...DEFAULT_SEGMENTATION_SETTINGS }, + segments: [], + })); + setUploadedDocuments(docs); + setCurrentDocIndex(0); + setCurrentSettings({ ...DEFAULT_SEGMENTATION_SETTINGS }); + setStep(2); + + // 依次上传所有文件 + for (let i = 0; i < selectedFiles.length; i++) { + await uploadSingleFile(selectedFiles[i], i); + } + }, [selectedFiles, uploadSingleFile]); + + /** + * 切换查看的文档 + */ + const handleDocumentChange = useCallback((docId: string) => { + const index = uploadedDocuments.findIndex(doc => doc.documentId === docId || doc.file.name === docId); + if (index !== -1) { + setCurrentDocIndex(index); + const doc = uploadedDocuments[index]; + setCurrentSettings(doc.settings); + } + }, [uploadedDocuments]); + + /** + * 修改参数后重新处理当前文档 + */ + const handleReprocess = useCallback(async () => { + const currentDoc = uploadedDocuments[currentDocIndex]; + if (!currentDoc || !currentDoc.documentId) return; + + // 更新状态 + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === currentDocIndex ? { + ...doc, + stage: 'uploading' as DocumentStage, + uploadProgress: 0, + segments: [], + } : doc + )); + + try { + const config = buildConfig(currentSettings); + const result = await updateDocumentByFile( + datasetId, + currentDoc.documentId, + currentDoc.file, + config, + (percent) => { + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === currentDocIndex ? { ...doc, uploadProgress: percent } : doc + )); + } + ); + + // 更新 batch + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === currentDocIndex ? { + ...doc, + batch: result.batch, + stage: 'indexing' as DocumentStage, + indexingStatus: 'waiting' as IndexingStatus, + realIndexingStatus: 'waiting' as IndexingStatus, // 初始化真实状态 + } : doc + )); + + startPolling(result.batch, currentDoc.documentId, currentDocIndex); + } catch (err: any) { + console.error('重新处理失败:', err); + setUploadedDocuments(prev => prev.map((doc, idx) => + idx === currentDocIndex ? { + ...doc, + stage: 'error' as DocumentStage, + error: err.message || '重新处理失败', + } : doc + )); + message.error(err.message || '重新处理失败'); + } + }, [uploadedDocuments, currentDocIndex, currentSettings, datasetId, buildConfig, startPolling]); + + /** + * 返回上一步 + */ + const handlePrevStep = useCallback(() => { + // 检查是否有文档正在处理 + const hasProcessing = uploadedDocuments.some(doc => + doc.stage === 'uploading' || doc.stage === 'indexing' + ); + if (hasProcessing) { + message.warning('还有文档正在处理中,请等待完成'); + return; + } + stopAllPolling(); + setStep(1); + setUploadedDocuments([]); + setCurrentDocIndex(0); + setCurrentSettings(DEFAULT_SEGMENTATION_SETTINGS); + }, [uploadedDocuments, stopAllPolling]); + + /** + * 返回文档列表 + */ + const handleGoToDocuments = useCallback(() => { + stopAllPolling(); + const hasCompleted = uploadedDocuments.some(doc => doc.stage === 'completed'); + if (hasCompleted) { + onSuccess(); + } + onClose(); + }, [uploadedDocuments, stopAllPolling, onSuccess, onClose]); + + /** + * 获取当前文档 + */ + const getCurrentDocument = useCallback((): UploadedDocument | null => { + return uploadedDocuments[currentDocIndex] || null; + }, [uploadedDocuments, currentDocIndex]); + + /** + * 获取当前文档的进度 + */ + const getCurrentProgress = useCallback(() => { + const doc = getCurrentDocument(); + if (!doc) return 0; + if (doc.stage === 'uploading') { + return doc.uploadProgress; + } + if (doc.stage === 'indexing' || doc.stage === 'completed') { + return INDEXING_STATUS_CONFIG[doc.indexingStatus]?.percent || 0; + } + return 0; + }, [getCurrentDocument]); + + /** + * 获取当前文档的状态文本 + */ + const getStatusText = useCallback(() => { + const doc = getCurrentDocument(); + if (!doc) return ''; + if (doc.stage === 'uploading') { + return `正在上传... ${doc.uploadProgress}%`; + } + if (doc.stage === 'indexing') { + const baseText = INDEXING_STATUS_CONFIG[doc.indexingStatus]?.text || '处理中...'; + // 如果有分段信息,且处于分段或索引阶段,显示进度 + if ((doc.indexingStatus === 'splitting' || doc.indexingStatus === 'indexing') && + doc.totalSegments && doc.totalSegments > 0) { + return `${baseText} (${doc.completedSegments || 0}/${doc.totalSegments})`; + } + return baseText; + } + if (doc.stage === 'completed') { + return `处理完成 (${doc.totalSegments || doc.segments?.length || 0} 段)`; + } + if (doc.stage === 'error') { + return doc.error || '处理失败'; + } + return ''; + }, [getCurrentDocument]); + + /** + * 判断当前文档是否正在处理 + */ + const isCurrentDocProcessing = useCallback(() => { + const doc = getCurrentDocument(); + return doc?.stage === 'uploading' || doc?.stage === 'indexing'; + }, [getCurrentDocument]); + + /** + * 获取所有文档的完成状态统计 + */ + const getCompletionStats = useCallback(() => { + const completed = uploadedDocuments.filter(doc => doc.stage === 'completed').length; + const total = uploadedDocuments.length; + return { completed, total }; + }, [uploadedDocuments]); + + return { + // 状态 + step, + selectedFiles, + fileList, + uploadedDocuments, + currentDocIndex, + currentSettings, + previewLoading, + + // 方法 + handleFileChange, + handleRemoveFile, + handleNextStep, + handleDocumentChange, + handleReprocess, + handlePrevStep, + handleGoToDocuments, + updateCurrentSettings, + + // 计算属性方法 + getCurrentDocument, + getCurrentProgress, + getStatusText, + isCurrentDocProcessing, + getCompletionStats, + }; +} + +export type UseDocumentUploadReturn = ReturnType; diff --git a/app/hooks/dify-dataset-manager/index.ts b/app/hooks/dify-dataset-manager/index.ts new file mode 100644 index 0000000..853291b --- /dev/null +++ b/app/hooks/dify-dataset-manager/index.ts @@ -0,0 +1,202 @@ +import { useState, useEffect, useCallback } from 'react'; +import { message } from 'antd'; +import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; +import type { Document } from '~/api/dify-dataset/type/documentTypes'; +import { fetchDatasets } from '~/api/dify-dataset/api/datasetApi'; +import { fetchDocuments } from '~/api/dify-dataset/api/documentApi'; +import type { MenuTab } from '~/types/dify-dataset-manager/layout'; +import { DEFAULT_DOCUMENT_PAGE_SIZE } from '~/types/dify-dataset-manager/index'; + +/** + * 知识库管理器状态管理 Hook + */ +export function useDatasetManager() { + // 知识库状态 + const [dataset, setDataset] = useState(null); + const [loadingDataset, setLoadingDataset] = useState(true); + + // 文档状态 + const [documents, setDocuments] = useState([]); + const [loadingDocuments, setLoadingDocuments] = useState(false); + const [documentTotal, setDocumentTotal] = useState(0); + const [documentPage, setDocumentPage] = useState(1); + const [documentPageSize] = useState(DEFAULT_DOCUMENT_PAGE_SIZE); + + // 初始化状态 + const [inited, setInited] = useState(false); + const [error, setError] = useState(null); + + // 菜单状态 + const [activeTab, setActiveTab] = useState('documents'); + + // 选中的文档(用于查看文档详情) + const [selectedDocument, setSelectedDocument] = useState(null); + + /** + * 加载文档列表 + */ + const loadDocuments = useCallback(async (datasetId: string, page: number = 1) => { + if (!datasetId) return; + + setLoadingDocuments(true); + try { + console.log('[DatasetManager] 加载文档列表:', { datasetId, page }); + const response = await fetchDocuments(datasetId, page, documentPageSize); + console.log('[DatasetManager] 文档列表响应:', response); + + if (response && response.data) { + setDocuments(response.data); + setDocumentTotal(response.total); + setDocumentPage(page); + } + } catch (err: any) { + console.error('[DatasetManager] 加载文档列表失败:', err); + message.error('加载文档列表失败'); + } finally { + setLoadingDocuments(false); + } + }, [documentPageSize]); + + /** + * 加载知识库(获取第一个知识库) + */ + const loadDataset = useCallback(async () => { + setLoadingDataset(true); + try { + console.log('[DatasetManager] 加载知识库...'); + const response = await fetchDatasets(1, 1); + console.log('[DatasetManager] 知识库响应:', response); + + if (response && response.data && response.data.length > 0) { + const firstDataset = response.data[0]; + setDataset(firstDataset); + // 立即加载文档 + await loadDocuments(firstDataset.id, 1); + } else { + setError('未找到知识库,请先在Dify中创建知识库'); + } + } catch (err: any) { + console.error('[DatasetManager] 加载知识库失败:', err); + setError(err.message || '加载知识库失败'); + message.error('加载知识库失败'); + } finally { + setLoadingDataset(false); + setInited(true); + } + }, [loadDocuments]); + + /** + * 处理文档页码变化 + */ + const handlePageChange = useCallback((page: number) => { + if (dataset) { + loadDocuments(dataset.id, page); + } + }, [dataset, loadDocuments]); + + /** + * 处理文档删除 + */ + const handleDocumentDeleted = useCallback((documentId: string) => { + setDocuments((prev) => prev.filter((doc) => doc.id !== documentId)); + setDocumentTotal((prev) => prev - 1); + + // 更新知识库的文档数量 + setDataset((prev) => { + if (prev) { + return { + ...prev, + document_count: prev.document_count - 1 + }; + } + return prev; + }); + }, []); + + /** + * 处理文档状态变化 + */ + const handleDocumentStatusChanged = useCallback((documentId: string, enabled: boolean) => { + setDocuments((prev) => + prev.map((doc) => + doc.id === documentId ? { ...doc, enabled } : doc + ) + ); + }, []); + + /** + * 刷新文档列表 + */ + const handleRefresh = useCallback(() => { + if (dataset) { + loadDocuments(dataset.id, documentPage); + } + }, [dataset, documentPage, loadDocuments]); + + /** + * 查看文档详情(分段管理) + */ + const handleViewDocument = useCallback((doc: Document) => { + console.log('[DatasetManager] 查看文档详情:', doc); + setSelectedDocument(doc); + }, []); + + /** + * 返回文档列表 + */ + const handleBackToDocuments = useCallback(() => { + setSelectedDocument(null); + }, []); + + /** + * 处理菜单切换 + */ + const handleTabChange = useCallback((tab: MenuTab) => { + setActiveTab(tab); + // 切换菜单时清除选中的文档 + if (tab !== 'documents') { + setSelectedDocument(null); + } + }, []); + + /** + * 处理知识库更新 + */ + const handleDatasetUpdated = useCallback((updatedDataset: Dataset) => { + setDataset(updatedDataset); + }, []); + + // 初始化 + useEffect(() => { + loadDataset(); + }, [loadDataset]); + + return { + // 状态 + dataset, + loadingDataset, + documents, + loadingDocuments, + documentTotal, + documentPage, + documentPageSize, + inited, + error, + activeTab, + selectedDocument, + + // 方法 + loadDataset, + loadDocuments, + handlePageChange, + handleDocumentDeleted, + handleDocumentStatusChanged, + handleRefresh, + handleViewDocument, + handleBackToDocuments, + handleTabChange, + handleDatasetUpdated, + }; +} + +export type UseDatasetManagerReturn = ReturnType; diff --git a/app/hooks/dify-dataset-manager/retrieve-test.ts b/app/hooks/dify-dataset-manager/retrieve-test.ts new file mode 100644 index 0000000..cf24d62 --- /dev/null +++ b/app/hooks/dify-dataset-manager/retrieve-test.ts @@ -0,0 +1,90 @@ +import { useState, useCallback } from 'react'; +import { message } from 'antd'; +import type { RetrieveRecord, RetrievalModel } from '~/api/dify-dataset/type'; +import { retrieveDataset } from '~/api/dify-dataset/api/segmentApi'; +import { DIFY_CONFIG } from '~/config/api-config'; +import type { SearchMethod } from '~/types/dify-dataset-manager/retrieve-test'; + +/** + * 构建完整的 retrieval_model 参数(匹配 Dify API 规范) + * 根据检索方式启用 Reranking(语义搜索和混合搜索需要启用) + */ +function buildRetrievalModel(searchMethod: SearchMethod, topK: number): RetrievalModel { + // 语义搜索和混合搜索需要启用 Reranking + const needReranking = searchMethod === 'semantic_search' || searchMethod === 'hybrid_search'; + + return { + search_method: searchMethod, + reranking_enable: needReranking, + reranking_mode: needReranking ? null : null, + reranking_model: { + reranking_provider_name: DIFY_CONFIG.rerankingProviderName, + reranking_model_name: DIFY_CONFIG.rerankingModelName, + }, + weights: null, + top_k: topK, + score_threshold_enabled: false, + score_threshold: null, + }; +} + +/** + * 召回测试状态管理 Hook + */ +export function useRetrieveTest(datasetId: string) { + const [searchQuery, setSearchQuery] = useState(''); + const [retrieveResults, setRetrieveResults] = useState([]); + const [retrieving, setRetrieving] = useState(false); + // 默认使用语义搜索 + const [searchMethod, setSearchMethod] = useState('semantic_search'); + const [topK, setTopK] = useState(5); + + /** + * 执行检索 + */ + const handleRetrieve = useCallback(async () => { + if (!searchQuery.trim()) { + message.warning('请输入检索关键词'); + return; + } + + if (!datasetId) { + message.warning('知识库ID不存在'); + return; + } + + setRetrieving(true); + try { + const retrievalModel = buildRetrievalModel(searchMethod, topK); + console.log('[Hook] 检索参数:', { datasetId, query: searchQuery, retrievalModel }); + + const response = await retrieveDataset(datasetId, searchQuery, retrievalModel); + setRetrieveResults(response.records || []); + if (response.records?.length === 0) { + message.info('未找到匹配的结果'); + } + } catch (err: any) { + console.error('检索失败:', err); + message.error(err.message || '检索失败'); + } finally { + setRetrieving(false); + } + }, [datasetId, searchQuery, searchMethod, topK]); + + return { + // 状态 + searchQuery, + setSearchQuery, + retrieveResults, + retrieving, + searchMethod, + setSearchMethod, + topK, + setTopK, + + // 方法 + handleRetrieve, + }; +} + +export type UseRetrieveTestReturn = ReturnType; diff --git a/app/routes/api.dataset.datasets.$datasetId.documents.$documentId.update-by-file.tsx b/app/routes/api.dataset.datasets.$datasetId.documents.$documentId.update-by-file.tsx new file mode 100644 index 0000000..8f1f8c8 --- /dev/null +++ b/app/routes/api.dataset.datasets.$datasetId.documents.$documentId.update-by-file.tsx @@ -0,0 +1,59 @@ +import { type ActionFunctionArgs } from '@remix-run/node'; +import { API_BASE_URL } from '~/config/api-config'; + +/** + * POST /api/dataset/datasets/:datasetId/documents/:documentId/update-by-file + * 通过文件更新文档(重新处理) + */ +export async function action({ request, params }: ActionFunctionArgs) { + try { + // 获取用户会话信息和 JWT + const { getUserSession } = await import("~/api/login/auth.server"); + const { frontendJWT } = await getUserSession(request); + + if (!frontendJWT) { + return new Response( + JSON.stringify({ error: 'JWT认证失败,请重新登录' }), + { status: 401, headers: { 'Content-Type': 'application/json' } } + ); + } + + const { datasetId, documentId } = params; + if (!datasetId || !documentId) { + return new Response( + JSON.stringify({ error: '缺少 datasetId 或 documentId 参数' }), + { status: 400, headers: { 'Content-Type': 'application/json' } } + ); + } + + // 获取表单数据 + const formData = await request.formData(); + + console.log('[API] Update Document By File:', { datasetId, documentId }); + + // 转发请求到 FastAPI + // Dify API: POST /datasets/{dataset_id}/documents/{document_id}/update-by-file + const apiUrl = `${API_BASE_URL}/dify_dataset/datasets/${datasetId}/documents/${documentId}/update-by-file`; + const response = await fetch(apiUrl, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${frontendJWT}`, + }, + body: formData, + }); + + const data = await response.json(); + + return new Response(JSON.stringify(data), { + status: response.status, + headers: { 'Content-Type': 'application/json' }, + }); + + } catch (error: any) { + console.error('[API] Update Document By File - Error:', error.message); + return new Response( + JSON.stringify({ error: error.message || 'Failed to update document by file' }), + { status: 500, headers: { 'Content-Type': 'application/json' } } + ); + } +} diff --git a/app/routes/cross-checking.tsx b/app/routes/cross-checking.tsx index 9e97173..e8e5380 100644 --- a/app/routes/cross-checking.tsx +++ b/app/routes/cross-checking.tsx @@ -1,4 +1,4 @@ -import { Outlet } from "react-router-dom"; +import { Outlet } from "@remix-run/react"; import {type MetaFunction} from "@remix-run/node"; export const meta: MetaFunction = () => { diff --git a/app/styles/components/dify-dataset-manager/index.css b/app/styles/components/dify-dataset-manager/index.css index 50f8bc9..4c98bb3 100644 --- a/app/styles/components/dify-dataset-manager/index.css +++ b/app/styles/components/dify-dataset-manager/index.css @@ -26,8 +26,8 @@ /* 左侧侧边栏 */ .dataset-sidebar { - width: 220px; - min-width: 220px; + width: 200px; + min-width: 200px; background: #fafafa; border-right: 1px solid #f0f0f0; display: flex; @@ -1425,3 +1425,1040 @@ .segment-manager-page .anticon-spin { color: rgb(0 104 74) !important; } + +/* ============================================================================ + * 上传配置对话框样式 + * ============================================================================ */ + +.upload-config-modal .ant-modal-header { + border-bottom: 1px solid #f0f0f0; + padding: 16px 24px; +} + +.upload-config-modal .ant-modal-title { + font-size: 16px; + font-weight: 600; + color: #1a1a1a; +} + +.upload-config-modal .ant-modal-body { + padding: 24px; +} + +.upload-config-modal .ant-modal-footer { + border-top: 1px solid #f0f0f0; + padding: 12px 24px; +} + +.upload-config-modal .ant-btn-primary { + background-color: #00684a; + border-color: #00684a; +} + +.upload-config-modal .ant-btn-primary:hover { + background-color: #005a3f; + border-color: #005a3f; +} + +/* 文件信息区域 */ +.upload-config-form .file-info-section, +.upload-progress-container .file-info-section { + margin-bottom: 16px; +} + +.upload-config-form .file-info, +.upload-progress-container .file-info { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + background: #f5f7f9; + border-radius: 8px; + border: 1px solid #e5e5e5; +} + +.upload-config-form .file-icon, +.upload-progress-container .file-icon { + font-size: 24px; + color: #00684a; +} + +.upload-config-form .file-details, +.upload-progress-container .file-details { + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; + min-width: 0; +} + +.upload-config-form .file-name, +.upload-progress-container .file-name { + font-size: 14px; + font-weight: 500; + color: #1a1a1a; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.upload-config-form .file-size, +.upload-progress-container .file-size { + font-size: 12px; + color: #666; +} + +/* 设置项样式 */ +.upload-config-form .setting-item { + margin-bottom: 16px; +} + +.upload-config-form .setting-label { + display: flex; + align-items: center; + gap: 6px; + font-size: 13px; + font-weight: 500; + color: #333; + margin-bottom: 8px; +} + +.upload-config-form .help-icon { + color: #999; + font-size: 12px; + cursor: help; +} + +.upload-config-form .checkbox-group { + display: flex; + flex-direction: column; + gap: 10px; +} + +.upload-config-form .checkbox-group .ant-checkbox-wrapper { + color: #333; + font-size: 13px; +} + +.upload-config-form .checkbox-group .ant-checkbox-checked .ant-checkbox-inner { + background-color: #00684a; + border-color: #00684a; +} + +/* 进度容器 */ +.upload-progress-container { + min-height: 200px; +} + +.upload-progress-container .progress-section { + padding: 24px 0; +} + +.upload-progress-container .status-text { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin-top: 16px; + font-size: 14px; + color: #666; +} + +.upload-progress-container .status-icon { + color: #00684a; +} + +/* 成功状态 */ +.upload-progress-container .success-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 24px; +} + +.upload-progress-container .success-icon { + font-size: 48px; + color: #52c41a; + margin-bottom: 16px; +} + +.upload-progress-container .success-text { + font-size: 16px; + font-weight: 500; + color: #1a1a1a; +} + +/* 错误状态 */ +.upload-progress-container .error-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 24px; +} + +.upload-progress-container .error-icon { + font-size: 48px; + color: #ff4d4f; + margin-bottom: 16px; +} + +.upload-progress-container .error-text { + font-size: 14px; + color: #ff4d4f; + text-align: center; +} + +/* 索引阶段指示器 */ +.upload-progress-container .indexing-stages { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 24px; + padding: 16px; + background: #f5f7f9; + border-radius: 8px; +} + +.upload-progress-container .stage-item { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; + color: #999; + padding: 4px 8px; + background: #fff; + border-radius: 4px; + border: 1px solid #e5e5e5; + transition: all 0.2s; +} + +.upload-progress-container .stage-item.active { + color: #00684a; + border-color: #00684a; + background: rgba(0, 104, 74, 0.05); +} + +.upload-progress-container .stage-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: #d9d9d9; + transition: background 0.2s; +} + +.upload-progress-container .stage-item.active .stage-dot { + background: #00684a; +} + +/* 进度条主题色 */ +.upload-config-modal .ant-progress-bg { + background-color: #00684a; +} + +.upload-config-modal .ant-progress-status-active .ant-progress-bg::before { + background: #fff; +} + +/* Divider 样式 */ +.upload-config-form .ant-divider { + margin: 16px 0; + border-color: #e5e5e5; +} + +.upload-config-form .ant-divider-inner-text { + font-size: 13px; + font-weight: 500; + color: #666; +} + +/* Select 和 Input 主题色 */ +.upload-config-modal .ant-select:hover .ant-select-selector { + border-color: #00684a !important; +} + +.upload-config-modal .ant-select-focused .ant-select-selector { + border-color: #00684a !important; + box-shadow: 0 0 0 2px rgba(0, 104, 74, 0.1) !important; +} + +.upload-config-modal .ant-input:hover, +.upload-config-modal .ant-input-number:hover { + border-color: #00684a; +} + +.upload-config-modal .ant-input:focus, +.upload-config-modal .ant-input-focused, +.upload-config-modal .ant-input-number:focus, +.upload-config-modal .ant-input-number-focused { + border-color: #00684a; + box-shadow: 0 0 0 2px rgba(0, 104, 74, 0.1); +} + +/* Spin 主题色 */ +.upload-config-modal .ant-spin .ant-spin-dot-item { + background-color: #00684a !important; +} + +/* ============================================================================ + * 文档上传页面样式 + * ============================================================================ */ + +.document-upload-page { + display: flex; + flex-direction: column; + height: 100%; + background: #fff; + overflow: hidden; +} + +/* 上传页面头部 */ +.upload-header { + display: flex; + align-items: center; + justify-content: center; + padding: 16px 24px; + border-bottom: 1px solid #f0f0f0; + flex-shrink: 0; + position: relative; +} + +.upload-header .back-btn { + position: absolute; + left: 24px; + color: #666; + font-size: 14px; + padding: 4px 12px; + height: auto; +} + +.upload-header .back-btn:hover { + color: #00684a; + background: rgba(0, 104, 74, 0.08); +} + +/* 步骤指示器 */ +.upload-steps { + display: inline-flex; + align-items: center; + gap: 0; +} + +.step-item { + display: inline-flex; + align-items: center; + gap: 8px; + color: #999; + font-size: 13px; + white-space: nowrap; +} + +/* 修复样式污染:移除其他页面可能定义的伪元素 */ +.document-upload-page .step-item::after, +.document-upload-page .step-item::before { + content: none !important; + display: none !important; +} + +.step-item.active { + color: #00684a; +} + +.step-item.completed { + color: #52c41a; +} + +.step-number { + width: 24px; + height: 24px; + border-radius: 50%; + background: #f0f0f0; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; + transition: all 0.2s; + flex-shrink: 0; +} + +.step-item.active .step-number { + background: #00684a; + color: #fff; +} + +.step-item.completed .step-number { + background: #52c41a; + color: #fff; +} + +.step-title { + font-weight: 500; +} + +.step-divider { + width: 64px; + height: 1px; + background: #d9d9d9; + margin: 0 16px; + flex-shrink: 0; +} + +.step-divider.completed { + background: #52c41a; +} + +/* 上传内容区域 */ +.upload-content { + flex: 1; + overflow-y: auto; + padding: 24px; +} + +/* 第一步:选择文件 */ +.upload-step-content.step1 { + max-width: 800px; + margin: 0 auto; +} + +.step-heading { + font-size: 24px; + font-weight: 600; + color: #1a1a1a; + margin: 0 0 8px 0; +} + +.step-description { + font-size: 14px; + color: #666; + margin: 0 0 24px 0; + line-height: 1.6; +} + +/* 文件拖拽区域 */ +.file-drop-zone { + margin-bottom: 24px; +} + +.file-drop-zone .ant-upload-drag { + border: 2px dashed #d9d9d9; + border-radius: 12px; + background: #fafafa; + padding: 40px 20px; + transition: all 0.2s; +} + +.file-drop-zone .ant-upload-drag:hover { + border-color: #00684a; + background: rgba(0, 104, 74, 0.02); +} + +.file-drop-zone .ant-upload-drag-icon { + color: #999; + font-size: 48px !important; +} + +.file-drop-zone .ant-upload-text { + font-size: 14px; + color: #333; +} + +.file-drop-zone .upload-link { + color: #00684a; + font-weight: 500; + cursor: pointer; +} + +.file-drop-zone .ant-upload-hint { + font-size: 12px; + color: #999; + margin-top: 8px; +} + +/* 已选文件区域 */ +.selected-files-section { + margin-bottom: 24px; +} + +.section-subtitle { + font-size: 14px; + font-weight: 600; + color: #1a1a1a; + margin: 0 0 12px 0; +} + +.selected-files-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.selected-file-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + background: #f5f7f9; + border-radius: 8px; + border: 1px solid #e5e5e5; +} + +.selected-file-item .file-icon { + font-size: 24px; + color: #00684a; +} + +.selected-file-item .file-info { + flex: 1; + min-width: 0; +} + +.selected-file-item .file-name { + font-size: 14px; + font-weight: 500; + color: #1a1a1a; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.selected-file-item .file-size { + font-size: 12px; + color: #666; +} + +.selected-file-item .remove-file-btn { + color: #999; +} + +.selected-file-item .remove-file-btn:hover { + color: #ff4d4f; +} + +/* 步骤操作按钮 */ +.step-actions { + display: flex; + justify-content: flex-end; + margin-top: 24px; +} + +.step-actions .next-btn { + min-width: 120px; + height: 40px; + font-size: 14px; + background: #00684a; + border-color: #00684a; +} + +.step-actions .next-btn:hover { + background: #005a3f; + border-color: #005a3f; +} + +.step-actions .next-btn:disabled { + background: #d9d9d9; + border-color: #d9d9d9; +} + +/* 第二步:分段配置与预览 */ +.upload-step-content.step2 { + height: 100%; + display: flex; + flex-direction: column; +} + +/* 处理进度区 */ +.processing-status { + background: #f5f7f9; + border-radius: 12px; + padding: 24px; + margin-bottom: 24px; +} + +.processing-file { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; +} + +.processing-file .file-icon { + font-size: 24px; + color: #00684a; +} + +.processing-file .file-name { + flex: 1; + font-size: 14px; + font-weight: 500; + color: #1a1a1a; +} + +.processing-file .status-icon { + font-size: 18px; +} + +.processing-file .status-icon.success { + color: #52c41a; +} + +.processing-file .status-icon.error { + color: #ff4d4f; +} + +.processing-file .status-icon.loading { + color: #00684a; +} + +.processing-status .status-text { + text-align: center; + font-size: 13px; + color: #666; + margin-top: 12px; +} + +/* 索引阶段指示器(Step2) */ +.processing-status .indexing-stages { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 16px; + justify-content: center; +} + +.processing-status .stage-item { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; + color: #999; + padding: 4px 10px; + background: #fff; + border-radius: 4px; + border: 1px solid #e5e5e5; + transition: all 0.2s; +} + +.processing-status .stage-item.active { + color: #00684a; + border-color: #00684a; + background: rgba(0, 104, 74, 0.05); +} + +.processing-status .stage-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: #d9d9d9; + transition: background 0.2s; +} + +.processing-status .stage-item.active .stage-dot { + background: #00684a; +} + +/* 错误状态 */ +.error-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px; + text-align: center; +} + +.error-state .error-icon { + font-size: 48px; + color: #ff4d4f; + margin-bottom: 16px; +} + +.error-state .error-text { + font-size: 14px; + color: #666; + margin-bottom: 24px; +} + +/* 索引方式选项 */ +.index-options { + display: flex; + flex-direction: column; + gap: 8px; +} + +.index-option { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 16px; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s; +} + +.index-option:hover { + border-color: #00684a; +} + +.index-option.active { + border-color: #00684a; + background: rgba(0, 104, 74, 0.05); +} + +.index-option .option-radio { + width: 16px; + height: 16px; + border-radius: 50%; + border: 2px solid #d9d9d9; + position: relative; + transition: all 0.2s; +} + +.index-option.active .option-radio { + border-color: #00684a; +} + +.index-option.active .option-radio::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 8px; + height: 8px; + border-radius: 50%; + background: #00684a; +} + +.index-option .option-label { + font-size: 14px; + color: #333; +} + +.index-option .option-badge { + font-size: 11px; + padding: 2px 6px; + border-radius: 4px; + margin-left: auto; +} + +.index-option .option-badge.recommended { + background: rgba(0, 104, 74, 0.1); + color: #00684a; +} + +/* 完成状态底部操作 */ +.completion-actions { + display: flex; + justify-content: center; + padding: 24px; + border-top: 1px solid #f0f0f0; + margin-top: auto; +} + +.completion-actions .ant-btn-primary { + min-width: 140px; + height: 40px; + font-size: 14px; + background: #00684a; + border-color: #00684a; +} + +.completion-actions .ant-btn-primary:hover { + background: #005a3f; + border-color: #005a3f; +} + +/* 上传页面的分段内容布局(复用 document-detail-content) */ +.upload-step-content .document-detail-content { + flex: 1; + min-height: 0; +} + +/* 上传页面的设置操作按钮 */ +.upload-step-content .settings-actions { + margin-top: 24px; + display: flex; + gap: 12px; +} + +.upload-step-content .settings-actions .ant-btn-primary { + background: #00684a; + border-color: #00684a; +} + +.upload-step-content .settings-actions .ant-btn-primary:hover { + background: #005a3f; + border-color: #005a3f; +} + +/* 进度条主题色 */ +.document-upload-page .ant-progress-bg { + background-color: #00684a; +} + +.document-upload-page .ant-progress-status-active .ant-progress-bg::before { + background: #fff; +} + +/* Spin 主题色 */ +.document-upload-page .ant-spin .ant-spin-dot-item { + background-color: #00684a !important; +} + +/* 预览框内的进度显示 */ +.preview-processing { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 24px; + min-height: 300px; +} + +.preview-processing .processing-file { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 24px; + width: 100%; + max-width: 400px; +} + +.preview-processing .file-icon { + font-size: 24px; + color: #00684a; +} + +.preview-processing .file-name { + flex: 1; + font-size: 14px; + font-weight: 500; + color: #1a1a1a; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.preview-processing .status-icon { + font-size: 18px; +} + +.preview-processing .status-icon.loading { + color: #00684a; +} + +.preview-processing .ant-progress { + width: 100%; + max-width: 400px; +} + +.preview-processing .status-text { + text-align: center; + font-size: 13px; + color: #666; + margin-top: 12px; +} + +.preview-processing .indexing-stages { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 24px; + justify-content: center; + max-width: 500px; +} + +.preview-processing .stage-item { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; + color: #999; + padding: 4px 10px; + background: #f5f7f9; + border-radius: 4px; + border: 1px solid #e5e5e5; + transition: all 0.2s; +} + +.preview-processing .stage-item.active { + color: #00684a; + border-color: #00684a; + background: rgba(0, 104, 74, 0.05); +} + +.preview-processing .stage-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: #d9d9d9; + transition: background 0.2s; +} + +.preview-processing .stage-item.active .stage-dot { + background: #00684a; +} + +/* 索引选项禁用状态 */ +.index-option.disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.index-option.disabled:hover { + border-color: #e5e5e5; +} + +/* 预览框内错误状态 */ +.preview-error { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 24px; + min-height: 300px; +} + +.preview-error .error-icon { + font-size: 48px; + color: #ff4d4f; + margin-bottom: 16px; +} + +.preview-error .error-text { + color: #666; + font-size: 14px; + text-align: center; +} + +/* 完成统计样式 */ +.completion-stats { + color: #666; + font-size: 14px; + margin-right: 16px; +} + +/* 文件选择下拉选项 */ +.file-select-option { + display: flex; + align-items: center; +} + +/* ============================================================================ + * 强制覆盖主题色 - 绿色 #00684a + * ============================================================================ */ + +/* 强制覆盖所有 Primary 按钮颜色 */ +.dataset-manager-wrapper .ant-btn-primary { + background-color: #00684a !important; + border-color: #00684a !important; + box-shadow: 0 2px 0 rgba(0, 104, 74, 0.1); +} + +.dataset-manager-wrapper .ant-btn-primary:hover, +.dataset-manager-wrapper .ant-btn-primary:focus { + background-color: #005a3f !important; + border-color: #005a3f !important; +} + +.dataset-manager-wrapper .ant-btn-primary:active { + background-color: #004d36 !important; + border-color: #004d36 !important; +} + +.dataset-manager-wrapper .ant-btn-primary:disabled { + background-color: rgba(0, 0, 0, 0.04) !important; + border-color: #d9d9d9 !important; + color: rgba(0, 0, 0, 0.25) !important; + box-shadow: none; +} + +/* 强制覆盖 Upload Dragger 样式 */ +.dataset-manager-wrapper .ant-upload-wrapper .ant-upload-drag:hover { + border-color: #00684a !important; +} + +.dataset-manager-wrapper .ant-upload-wrapper .ant-upload-drag .ant-upload-drag-icon .anticon { + color: #00684a !important; +} + +.dataset-manager-wrapper .ant-upload-wrapper .ant-upload-drag p.ant-upload-text { + color: #333; +} + +.dataset-manager-wrapper .ant-upload-wrapper .ant-upload-drag p.ant-upload-hint { + color: #666; +} + +/* 覆盖 Steps 组件的主题色 */ +.dataset-manager-wrapper .ant-steps .ant-steps-item-process .ant-steps-item-icon { + background-color: #00684a !important; + border-color: #00684a !important; +} + +.dataset-manager-wrapper .ant-steps .ant-steps-item-finish .ant-steps-item-icon { + border-color: #00684a !important; +} + +.dataset-manager-wrapper .ant-steps .ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon { + color: #00684a !important; +} + +.dataset-manager-wrapper .ant-steps .ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after { + background-color: #00684a !important; +} + +/* 覆盖 Checkbox 选中颜色 */ +.dataset-manager-wrapper .ant-checkbox-checked .ant-checkbox-inner { + background-color: #00684a !important; + border-color: #00684a !important; +} + +.dataset-manager-wrapper .ant-checkbox-wrapper:hover .ant-checkbox-inner, +.dataset-manager-wrapper .ant-checkbox:hover .ant-checkbox-inner, +.dataset-manager-wrapper .ant-checkbox-input:focus + .ant-checkbox-inner { + border-color: #00684a !important; +} + +/* 覆盖 Radio 选中颜色 */ +.dataset-manager-wrapper .ant-radio-checked .ant-radio-inner { + border-color: #00684a !important; + background-color: #00684a !important; +} + +.dataset-manager-wrapper .ant-radio-wrapper:hover .ant-radio-inner, +.dataset-manager-wrapper .ant-radio:hover .ant-radio-inner, +.dataset-manager-wrapper .ant-radio-input:focus + .ant-radio-inner { + border-color: #00684a !important; +} + +/* 覆盖 Switch 选中颜色 */ +.dataset-manager-wrapper .ant-switch-checked { + background-color: #00684a !important; +} + +/* 覆盖 Select 选中项颜色 */ +.dataset-manager-wrapper .ant-select-item-option-selected:not(.ant-select-item-option-disabled) { + background-color: rgba(0, 104, 74, 0.1) !important; +} + +/* 覆盖 Input/Select focus 边框颜色 */ +.dataset-manager-wrapper .ant-input:focus, +.dataset-manager-wrapper .ant-input-focused, +.dataset-manager-wrapper .ant-input-number:focus, +.dataset-manager-wrapper .ant-input-number-focused, +.dataset-manager-wrapper .ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector { + border-color: #00684a !important; + box-shadow: 0 0 0 2px rgba(0, 104, 74, 0.1) !important; +} + +.dataset-manager-wrapper .ant-input:hover, +.dataset-manager-wrapper .ant-input-number:hover, +.dataset-manager-wrapper .ant-select:not(.ant-select-disabled):hover .ant-select-selector { + border-color: #00684a !important; +} diff --git a/app/types/dify-dataset-manager/dataset-settings.ts b/app/types/dify-dataset-manager/dataset-settings.ts new file mode 100644 index 0000000..94489a7 --- /dev/null +++ b/app/types/dify-dataset-manager/dataset-settings.ts @@ -0,0 +1,25 @@ +import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; + +/** + * 知识库设置组件 Props + */ +export interface DatasetSettingsProps { + dataset: Dataset | null; + onDatasetUpdated: (dataset: Dataset) => void; +} + +/** + * 知识库设置表单值 + */ +export interface DatasetSettingsFormValues { + name: string; + description: string; +} + +/** + * 知识库设置状态 + */ +export interface DatasetSettingsState { + saving: boolean; + hasChanges: boolean; +} diff --git a/app/types/dify-dataset-manager/document-detail.ts b/app/types/dify-dataset-manager/document-detail.ts new file mode 100644 index 0000000..9147025 --- /dev/null +++ b/app/types/dify-dataset-manager/document-detail.ts @@ -0,0 +1,51 @@ +import type { Segment } from '~/api/dify-dataset/type'; +import type { Document } from '~/api/dify-dataset/type/documentTypes'; + +/** + * 文档详情组件 Props + */ +export interface DocumentDetailProps { + datasetId: string; + document: Document | null; +} + +/** + * 分段设置配置(文档详情专用) + * 注意:Dify API 支持的参数有限 + * - separator: ✅ 支持 + * - maxTokens: ✅ 支持 + * - removeExtraSpaces: ✅ 支持 + * - removeUrlsEmails: ✅ 支持 + * - useQASegment: ⚠️ 需要 doc_form: "qa_model" + */ +export interface DocumentDetailSegmentationSettings { + separator: string; + maxTokens: number; + removeExtraSpaces: boolean; + removeUrlsEmails: boolean; + useQASegment: boolean; + qaLanguage: string; +} + +/** + * 默认分段设置(文档详情) + */ +export const DEFAULT_DOCUMENT_DETAIL_SETTINGS: DocumentDetailSegmentationSettings = { + separator: '\\n\\n', + maxTokens: 500, + removeExtraSpaces: true, + removeUrlsEmails: false, + useQASegment: false, + qaLanguage: 'Chinese', +}; + +/** + * 文档详情状态 + */ +export interface DocumentDetailState { + settings: DocumentDetailSegmentationSettings; + previewSegments: Segment[]; + previewLoading: boolean; + showPreview: boolean; + saving: boolean; +} diff --git a/app/types/dify-dataset-manager/document-list.ts b/app/types/dify-dataset-manager/document-list.ts new file mode 100644 index 0000000..9bea4c2 --- /dev/null +++ b/app/types/dify-dataset-manager/document-list.ts @@ -0,0 +1,33 @@ +import type { Document, IndexingStatus } from '~/api/dify-dataset/type/documentTypes'; + +/** + * 文档列表组件 Props + */ +export interface DocumentListProps { + datasetId: string; + datasetName: string; + documents: Document[]; + loading: boolean; + total: number; + page: number; + pageSize: number; + onPageChange: (page: number) => void; + onDocumentDeleted: (documentId: string) => void; + onDocumentStatusChanged: (documentId: string, enabled: boolean) => void; + onRefresh: () => void; + onViewDocument?: (document: Document) => void; +} + +/** + * 状态标签配置类型 + */ +export interface StatusConfig { + color: string; + icon: React.ReactNode; + text: string; +} + +/** + * 状态配置映射类型 + */ +export type StatusConfigMap = Record; diff --git a/app/types/dify-dataset-manager/document-upload.ts b/app/types/dify-dataset-manager/document-upload.ts new file mode 100644 index 0000000..aaf8fbb --- /dev/null +++ b/app/types/dify-dataset-manager/document-upload.ts @@ -0,0 +1,77 @@ +import type { Segment } from '~/api/dify-dataset/type'; +import type { IndexingStatus } from '~/api/dify-dataset/type/documentTypes'; + +/** + * 分段设置配置 + */ +export interface SegmentationSettings { + separator: string; + maxTokens: number; + chunkOverlap: number; + removeExtraSpaces: boolean; + removeUrlsEmails: boolean; + indexingTechnique: 'high_quality' | 'economy'; +} + +/** + * 默认分段设置 + */ +export const DEFAULT_SEGMENTATION_SETTINGS: SegmentationSettings = { + separator: '\\n\\n', + maxTokens: 1024, + chunkOverlap: 50, + removeExtraSpaces: true, + removeUrlsEmails: false, + indexingTechnique: 'high_quality', +}; + +/** + * 单个文档的上传状态 + */ +export type DocumentStage = 'pending' | 'uploading' | 'indexing' | 'completed' | 'error'; + +/** + * 上传的文档信息(支持多文件) + */ +export interface UploadedDocument { + file: File; + documentId: string; + batch: string; + stage: DocumentStage; + indexingStatus: IndexingStatus; // 显示用的状态 + realIndexingStatus?: IndexingStatus; // 真实的后端状态 + uploadProgress: number; + error?: string; + settings: SegmentationSettings; + segments: Segment[]; + completedSegments?: number; + totalSegments?: number; +} + +/** + * 索引状态配置 + */ +export const INDEXING_STATUS_CONFIG: Record = { + waiting: { text: '等待处理...', percent: 10 }, + parsing: { text: '解析文档...', percent: 30 }, + cleaning: { text: '清洗文本...', percent: 50 }, + splitting: { text: '分段处理...', percent: 70 }, + indexing: { text: '建立索引...', percent: 85 }, + completed: { text: '处理完成', percent: 100 }, + paused: { text: '已暂停', percent: 0 }, + error: { text: '处理失败', percent: 0 }, +}; + +/** + * 支持的文件格式 + */ +export const SUPPORTED_FORMATS = 'TXT, MARKDOWN, MDX, PDF, HTML, XLSX, XLS, DOCX, CSV, VTT, PROPERTIES, MD, HTM'; + +/** + * 文档上传组件 Props + */ +export interface DocumentUploadProps { + datasetId: string; + onClose: () => void; + onSuccess: () => void; +} diff --git a/app/types/dify-dataset-manager/index.ts b/app/types/dify-dataset-manager/index.ts new file mode 100644 index 0000000..12ad836 --- /dev/null +++ b/app/types/dify-dataset-manager/index.ts @@ -0,0 +1,43 @@ +import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; +import type { Document } from '~/api/dify-dataset/type/documentTypes'; +import type { MenuTab } from './layout'; + +/** + * 知识库管理器状态 + */ +export interface DatasetManagerState { + // 知识库状态 + dataset: Dataset | null; + loadingDataset: boolean; + + // 文档状态 + documents: Document[]; + loadingDocuments: boolean; + documentTotal: number; + documentPage: number; + documentPageSize: number; + + // 初始化状态 + inited: boolean; + error: string | null; + + // 菜单状态 + activeTab: MenuTab; + + // 选中的文档 + selectedDocument: Document | null; +} + +/** + * 默认文档分页大小 + */ +export const DEFAULT_DOCUMENT_PAGE_SIZE = 20; + +// 导出所有子模块类型 +export * from './dataset-settings'; +export * from './document-detail'; +export * from './document-list'; +export * from './document-upload'; +export * from './layout'; +export * from './retrieve-test'; + diff --git a/app/types/dify-dataset-manager/layout.ts b/app/types/dify-dataset-manager/layout.ts new file mode 100644 index 0000000..d7f8436 --- /dev/null +++ b/app/types/dify-dataset-manager/layout.ts @@ -0,0 +1,34 @@ +import type { ReactNode } from 'react'; +import type { Dataset } from '~/api/dify-dataset/type/datasetTypes'; + +/** + * 菜单项类型 + */ +export type MenuTab = 'documents' | 'retrieve' | 'settings'; + +/** + * 菜单项配置 + */ +export interface MenuItem { + key: MenuTab; + icon: ReactNode; + label: string; +} + +/** + * 知识库布局组件 Props + */ +export interface DatasetLayoutProps { + /** 知识库信息 */ + dataset: Dataset | null; + /** 当前激活的菜单 */ + activeTab: MenuTab; + /** 菜单切换回调 */ + onTabChange: (tab: MenuTab) => void; + /** 是否显示返回按钮(在文档详情页时显示) */ + showBackButton?: boolean; + /** 返回按钮点击回调 */ + onBack?: () => void; + /** 子组件 */ + children: ReactNode; +} diff --git a/app/types/dify-dataset-manager/retrieve-test.ts b/app/types/dify-dataset-manager/retrieve-test.ts new file mode 100644 index 0000000..839d2ef --- /dev/null +++ b/app/types/dify-dataset-manager/retrieve-test.ts @@ -0,0 +1,35 @@ +import type { RetrieveRecord } from '~/api/dify-dataset/type'; + +/** + * 召回测试组件 Props + */ +export interface RetrieveTestProps { + datasetId: string; +} + +/** + * 检索方法类型 + * - semantic_search: 向量检索(语义搜索) + * - full_text_search: 全文检索 + * - hybrid_search: 混合检索 + */ +export type SearchMethod = 'semantic_search' | 'full_text_search' | 'hybrid_search'; + +/** + * 检索选项 + */ +export interface RetrieveOptions { + searchMethod: SearchMethod; + topK: number; +} + +/** + * 召回测试状态 + */ +export interface RetrieveTestState { + searchQuery: string; + retrieveResults: RetrieveRecord[]; + retrieving: boolean; + searchMethod: SearchMethod; + topK: number; +} diff --git a/dify_dataset.md b/dify_dataset.md new file mode 100644 index 0000000..22c43d1 --- /dev/null +++ b/dify_dataset.md @@ -0,0 +1,462 @@ +# Dify 知识库 API 功能实现清单 + +## 概述 + +本文档对比 Dify 官方知识库 API 与当前项目已实现的功能。 + +- ✅ 已实现 +- ❌ 未实现 +- 🚫 不开放 + +--- + +## 系统架构 + +### 完整数据流向 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ 第一层:React 组件 (浏览器) │ +│ 位置:app/components/dify-dataset-manager/ │ +│ 调用:客户端 API 函数 │ +└────────────────────────────┬────────────────────────────────────────┘ + │ 使用 axios 发送 HTTP 请求 + │ URL: /api/dataset/... + │ 自动携带 cookies (JWT) + ↓ +┌─────────────────────────────────────────────────────────────────────┐ +│ 第二层:客户端 API 层 (浏览器侧) │ +│ 位置:app/api/dify-dataset/api/*.ts │ +│ 作用:封装 axios 请求,提供类型安全的函数接口 │ +│ 请求:axios.get('/api/dataset/datasets', { withCredentials: true })│ +└────────────────────────────┬────────────────────────────────────────┘ + │ HTTP 请求 (浏览器 → Remix 服务器) + ↓ +┌─────────────────────────────────────────────────────────────────────┐ +│ 第三层:Remix 路由层 (Node.js 服务端) │ +│ 位置:app/routes/api.dataset.*.tsx │ +│ 作用:接收浏览器请求,验证 JWT,转发到 FastAPI │ +│ 请求:fetch(`${API_BASE_URL}/dify_dataset/...`, { headers: JWT }) │ +└────────────────────────────┬────────────────────────────────────────┘ + │ HTTP 请求 (Remix → FastAPI) + ↓ +┌─────────────────────────────────────────────────────────────────────┐ +│ 第四层:FastAPI 后端代理 (Python) │ +│ 位置:docauditai/routers/dify_dataset.py │ +│ 作用:验证用户 JWT,添加 Dify DATASET_API_KEY,转发请求 │ +└────────────────────────────┬────────────────────────────────────────┘ + │ HTTP 请求 (FastAPI → Dify) + ↓ +┌─────────────────────────────────────────────────────────────────────┐ +│ 第五层:Dify 官方知识库 API │ +│ URL:https://api.dify.ai/v1/datasets/... │ +│ 鉴权:Authorization: Bearer {DATASET_API_KEY} │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +### 为什么有两层 API? + +| 层级 | 位置 | 执行环境 | HTTP 库 | 作用 | +|------|------|----------|---------|------| +| **客户端 API** | `app/api/dify-dataset/api/*.ts` | 浏览器 | axios | 供 React 组件调用,类型安全 | +| **Remix 路由** | `app/routes/api.dataset.*.tsx` | Node.js | fetch | 接收浏览器请求,转发到 FastAPI | + +**调用链路**: +``` +React 组件 → 客户端 API (axios) → Remix 路由 (fetch) → FastAPI → Dify API +``` + +--- + +## 一、知识库管理 + +| 功能 | API 端点 | 方法 | 状态 | 路由文件 | 客户端函数 | +|------|----------|------|------|----------|-----------| +| 获取知识库列表 | /datasets | GET | ✅ | `api.dataset.datasets.tsx` | `fetchDatasets()` | +| 查看知识库详情 | /datasets/{dataset_id} | GET | ✅ | `api.dataset.datasets.$datasetId.tsx` | `fetchDataset()` | +| 创建空知识库 | /datasets | POST | ❌ | - | - | +| 修改知识库名称 | /datasets/{dataset_id} | PATCH | ✅ | `api.dataset.datasets.$datasetId.tsx` | `updateDatasetName()` | +| 删除知识库 | /datasets/{dataset_id} | DELETE | 🚫 | - | - | + +**说明**: +- 修改知识库:仅允许修改 `name` 字段,其他字段不开放 +- 删除知识库:出于安全考虑不对用户开放 + +--- + +## 二、文档管理 + +| 功能 | API 端点 | 方法 | 状态 | 路由文件 | 客户端函数 | +|------|----------|------|------|----------|-----------| +| 获取文档列表 | /datasets/{id}/documents | GET | ✅ | `api.dataset.datasets.$datasetId.documents.tsx` | `fetchDocuments()` | +| 获取文档详情 | /datasets/{id}/documents/{docId} | GET | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.tsx` | `fetchDocument()` | +| 通过文件创建文档 | /datasets/{id}/document/create-by-file | POST | ✅ | `api.dataset.datasets.$datasetId.documents.tsx` | `uploadDocument()` | +| 通过文本创建文档 | /datasets/{id}/document/create-by-text | POST | ❌ | - | - | +| 通过文件更新文档 | /datasets/{id}/documents/{docId}/update-by-file | POST | ❌ | - | - | +| 通过文本更新文档 | /datasets/{id}/documents/{docId}/update-by-text | POST | ❌ | - | - | +| 删除文档 | /datasets/{id}/documents/{docId} | DELETE | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.tsx` | `deleteDocument()` | +| 更新文档状态 | /datasets/{id}/documents/status/{action} | PATCH | ✅ | `api.dataset.datasets.$datasetId.documents.status.$action.tsx` | `toggleDocumentStatus()` | +| 获取文档嵌入状态 | /datasets/{id}/documents/{batch}/indexing-status | GET | ✅ | `api.dataset.datasets.$datasetId.documents.$batch.indexing-status.tsx` | `fetchIndexingStatus()` | +| 获取上传文件信息 | /datasets/{id}/documents/{docId}/upload-file | GET | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.upload-file.tsx` | `fetchUploadFileInfo()` | +| 索引预估(预览分段) | /datasets/{id}/indexing-estimate | POST | ✅ | `api.dataset.datasets.$datasetId.indexing-estimate.tsx` | `fetchIndexingEstimate()` | +| 重新处理文档 | /datasets/{id}/documents/reprocess | POST | ✅ | `api.dataset.datasets.$datasetId.documents.reprocess.tsx` | `reprocessDocument()` | + +**说明**: +- 上传文档:支持 multipart/form-data 格式 +- 文档状态:action 可选值为 `enable` / `disable` / `archive` / `un_archive` +- 索引预估:用于预览分段效果,不会实际修改文档 +- 重新处理文档:通过 `original_document_id` 参数使用新的分段设置重新处理已有文档 + +--- + +## 三、分段管理 + +| 功能 | API 端点 | 方法 | 状态 | 路由文件 | 客户端函数 | +|------|----------|------|------|----------|-----------| +| 获取分段列表 | /datasets/{id}/documents/{docId}/segments | GET | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.segments.tsx` | `fetchSegments()` | +| 获取分段详情 | /datasets/{id}/documents/{docId}/segments/{segId} | GET | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.tsx` | `fetchSegment()` | +| 新增分段 | /datasets/{id}/documents/{docId}/segments | POST | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.segments.tsx` | `createSegments()` | +| 更新分段 | /datasets/{id}/documents/{docId}/segments/{segId} | POST | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.tsx` | `updateSegment()` | +| 删除分段 | /datasets/{id}/documents/{docId}/segments/{segId} | DELETE | ✅ | `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.tsx` | `deleteSegment()` | + +**说明**: +- 新增分段:支持批量新增 `{ segments: [...] }` +- 更新分段:可更新 `content`, `answer`, `keywords`, `enabled` + +--- + +## 四、子分段管理(父子模式) + +| 功能 | API 端点 | 方法 | 状态 | 路由文件 | 客户端函数 | +|------|----------|------|------|----------|-----------| +| 查询子分段 | .../segments/{segId}/child_chunks | GET | ✅ | `...segments.$segmentId.child_chunks.tsx` | `fetchChildChunks()` | +| 新增子分段 | .../segments/{segId}/child_chunks | POST | ✅ | `...segments.$segmentId.child_chunks.tsx` | `createChildChunk()` | +| 更新子分段 | .../segments/{segId}/child_chunks/{chunkId} | PATCH | ✅ | `...segments.$segmentId.child_chunks.$childChunkId.tsx` | `updateChildChunk()` | +| 删除子分段 | .../segments/{segId}/child_chunks/{chunkId} | DELETE | ✅ | `...segments.$segmentId.child_chunks.$childChunkId.tsx` | `deleteChildChunk()` | + +**说明**:子分段用于 Dify 的父子模式分段策略 + +--- + +## 五、检索功能 + +| 功能 | API 端点 | 方法 | 状态 | 路由文件 | 客户端函数 | +|------|----------|------|------|----------|-----------| +| 检索知识库 | /datasets/{id}/retrieve | POST | ✅ | `api.dataset.datasets.$datasetId.retrieve.tsx` | `retrieveDataset()` | + +**检索参数详解**: +```typescript +{ + query: string; // 检索关键词 + retrieval_model: { + search_method: 'keyword_search' | 'semantic_search' | 'full_text_search' | 'hybrid_search'; + reranking_enable: boolean; // 是否开启 rerank + reranking_model?: object; // Rerank 模型配置 + top_k: number; // 返回结果数量 + score_threshold_enabled: boolean; + score_threshold: number; // 分数阈值 (0-1) + } +} +``` + +--- + +## 六、元数据管理 + +**当前状态:❌ 全部未实现** + +| 功能 | API 端点 | 方法 | 说明 | +|------|----------|------|------| +| 新增元数据 | /datasets/{id}/metadata | POST | type, name | +| 更新元数据 | /datasets/{id}/metadata/{metaId} | PATCH | name | +| 删除元数据 | /datasets/{id}/metadata/{metaId} | DELETE | | +| 查询元数据列表 | /datasets/{id}/metadata | GET | | +| 启用/禁用内置元数据 | /datasets/{id}/metadata/built-in/{action} | POST | | +| 更新文档元数据 | /datasets/{id}/documents/metadata | POST | 批量更新 | + +--- + +## 七、模型查询 + +| 功能 | API 端点 | 方法 | 状态 | 说明 | +|------|----------|------|------|------| +| 获取嵌入模型列表 | /workspaces/current/models/model-types/text-embedding | GET | ❌ | 创建知识库时需要 | + +--- + +## 八、标签管理 + +**当前状态:❌ 全部未实现** + +| 功能 | API 端点 | 方法 | 说明 | +|------|----------|------|------| +| 新增标签 | /datasets/tags | POST | name (最大50字符) | +| 获取标签列表 | /datasets/tags | GET | | +| 修改标签名称 | /datasets/tags | PATCH | name, tag_id | +| 删除标签 | /datasets/tags | DELETE | tag_id | +| 绑定知识库到标签 | /datasets/tags/binding | POST | tag_ids, target_id | +| 解绑知识库和标签 | /datasets/tags/unbinding | POST | tag_id, target_id | +| 查询知识库已绑定的标签 | /datasets/{id}/tags | POST | | + +--- + +## 功能统计 + +| 类别 | 已实现 | 未实现 | 不开放 | 完成度 | +|------|--------|--------|--------|--------| +| 知识库管理 | 3 | 1 | 1 | 75% | +| 文档管理 | 9 | 3 | 0 | 75% | +| 分段管理 | 5 | 0 | 0 | 100% | +| 子分段管理 | 4 | 0 | 0 | 100% | +| 检索功能 | 1 | 0 | 0 | 100% | +| 元数据管理 | 0 | 6 | 0 | 0% | +| 模型查询 | 0 | 1 | 0 | 0% | +| 标签管理 | 0 | 7 | 0 | 0% | +| **总计** | **22** | **18** | **1** | **55%** | + +--- + +## 代码文件清单 + +### Remix 路由层 (服务端) + +所有路由文件位于 `app/routes/` 目录: + +| 文件名 | HTTP 方法 | 功能 | +|--------|----------|------| +| `api.dataset.datasets.tsx` | GET | 获取知识库列表 | +| `api.dataset.datasets.$datasetId.tsx` | GET / PATCH | 知识库详情 / 修改名称 | +| `api.dataset.datasets.$datasetId.documents.tsx` | GET / POST | 文档列表 / 上传文档 | +| `api.dataset.datasets.$datasetId.documents.$documentId.tsx` | GET / DELETE | 文档详情 / 删除文档 | +| `api.dataset.datasets.$datasetId.documents.$documentId.upload-file.tsx` | GET | 获取上传文件信息 | +| `api.dataset.datasets.$datasetId.documents.$batch.indexing-status.tsx` | GET | 获取嵌入状态 | +| `api.dataset.datasets.$datasetId.documents.status.$action.tsx` | PATCH | 更新文档状态 | +| `api.dataset.datasets.$datasetId.indexing-estimate.tsx` | POST | 索引预估(预览分段) | +| `api.dataset.datasets.$datasetId.documents.reprocess.tsx` | POST | 重新处理文档 | +| `api.dataset.datasets.$datasetId.documents.$documentId.segments.tsx` | GET / POST | 分段列表 / 新增分段 | +| `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.tsx` | GET / POST / DELETE | 分段详情 / 更新 / 删除 | +| `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.child_chunks.tsx` | GET / POST | 子分段列表 / 新增 | +| `api.dataset.datasets.$datasetId.documents.$documentId.segments.$segmentId.child_chunks.$childChunkId.tsx` | PATCH / DELETE | 子分段更新 / 删除 | +| `api.dataset.datasets.$datasetId.retrieve.tsx` | POST | 检索知识库 | + +### 客户端 API 层 (浏览器侧) + +``` +app/api/dify-dataset/ +├── index.ts # 统一导出 +├── client.server.ts # 服务端基础请求函数(备用) +├── type/ # 类型定义 +│ ├── index.ts # 类型统一导出 +│ ├── commonTypes.ts # 通用类型 +│ ├── datasetTypes.ts # 知识库类型 +│ ├── documentTypes.ts # 文档类型 +│ └── segmentTypes.ts # 分段/子分段/检索类型 +└── api/ # API 调用函数 + ├── index.ts # 函数统一导出 + ├── datasetApi.ts # 知识库 API + ├── documentApi.ts # 文档 API + └── segmentApi.ts # 分段/子分段/检索 API +``` + +### 客户端函数清单 + +**datasetApi.ts - 知识库管理** +```typescript +fetchDatasets(page, limit) // 获取知识库列表 +fetchDataset(datasetId) // 获取知识库详情 +updateDatasetName(datasetId, name) // 修改知识库名称 +``` + +**documentApi.ts - 文档管理** +```typescript +fetchDocuments(datasetId, page, limit, keyword) // 获取文档列表 +fetchDocument(datasetId, documentId) // 获取文档详情 +deleteDocument(datasetId, documentId) // 删除文档 +toggleDocumentStatus(datasetId, documentId, enabled) // 启用/禁用文档 +uploadDocument(datasetId, file, onProgress) // 上传文档 +fetchIndexingStatus(datasetId, batch) // 获取嵌入状态 +fetchUploadFileInfo(datasetId, documentId) // 获取上传文件信息 +fetchIndexingEstimate(datasetId, fileId, processRule, docForm, docLanguage) // 索引预估(预览分段效果) +reprocessDocument(datasetId, originalDocumentId, processRule, docForm, docLanguage) // 重新处理文档 +``` + +**segmentApi.ts - 分段/子分段/检索** +```typescript +// 分段 +fetchSegments(datasetId, documentId, page, limit, keyword) +fetchSegment(datasetId, documentId, segmentId) +createSegments(datasetId, documentId, segments) +updateSegment(datasetId, documentId, segmentId, segment) +deleteSegment(datasetId, documentId, segmentId) +toggleSegmentStatus(datasetId, documentId, segmentId, enabled) + +// 子分段 +fetchChildChunks(datasetId, documentId, segmentId, page, limit, keyword) +createChildChunk(datasetId, documentId, segmentId, content) +updateChildChunk(datasetId, documentId, segmentId, childChunkId, content) +deleteChildChunk(datasetId, documentId, segmentId, childChunkId) + +// 检索 +retrieveDataset(datasetId, query, retrievalModel) +``` + +### UI 组件 + +``` +app/components/dify-dataset-manager/ +├── index.tsx # 主容器组件 - 状态管理、标签页切换 +├── layout.tsx # 布局组件 - 左侧菜单栏 + 右侧内容区 +├── document-list.tsx # 文档列表 - 表格、搜索、上传、删除 +├── document-detail.tsx # 文档详情 - 分段设置、预览块 +├── retrieve-test.tsx # 召回测试 - 知识库检索测试 +└── dataset-settings.tsx # 知识库设置 - 名称、描述修改 +``` + +### 布局结构(仿 Dify 风格) + +``` +┌─────────────────────────────────────────────────────────────┐ +│ dataset-layout │ +├──────────────────┬──────────────────────────────────────────┤ +│ dataset-sidebar │ dataset-main │ +│ │ │ +│ ┌─────────────┐ │ 根据 activeTab 渲染: │ +│ │ 知识库信息 │ │ - documents → DocumentList │ +│ │ (名称/数量) │ │ - documents + selectedDoc → DocumentDetail│ +│ └─────────────┘ │ - retrieve → RetrieveTest │ +│ │ - settings → DatasetSettings │ +│ ┌─────────────┐ │ │ +│ │ 文档 │ │ │ +│ │ 召回测试 │ │ │ +│ │ 设置 │ │ │ +│ └─────────────┘ │ │ +└──────────────────┴──────────────────────────────────────────┘ +``` + +--- + +## 鉴权机制 + +### 三层认证流程 + +``` +┌────────────────────────────────────────────────────────────────┐ +│ 浏览器 → Remix 服务器 │ +│ 认证方式:Cookie (会话中的 JWT) │ +│ axios 配置:{ withCredentials: true } │ +└────────────────────────────────────────────────────────────────┘ + ↓ +┌────────────────────────────────────────────────────────────────┐ +│ Remix 服务器 → FastAPI │ +│ 认证方式:Authorization: Bearer {frontendJWT} │ +│ JWT 来源:getUserSession(request) │ +└────────────────────────────────────────────────────────────────┘ + ↓ +┌────────────────────────────────────────────────────────────────┐ +│ FastAPI → Dify API │ +│ 认证方式:Authorization: Bearer {DATASET_API_KEY} │ +│ API Key:服务端环境变量配置 │ +└────────────────────────────────────────────────────────────────┘ +``` + +### 关键配置 + +```typescript +// app/config/api-config.ts +export const API_BASE_URL = apiConfig.baseUrl; // 如:http://10.79.97.17:8000 + +// 根据端口自动选择配置 +const portConfigs = { + '51703': { baseUrl: 'http://172.16.0.55:8073' }, // 梅州 + '51704': { baseUrl: 'http://10.79.97.17:8001' }, // 云浮 + '51707': { baseUrl: 'http://10.79.97.17:8004' }, // 省级 + // ... +}; +``` + +--- + +## 常见错误码 + +| code | status | message | +|------|--------|---------| +| no_file_uploaded | 400 | Please upload your file. | +| too_many_files | 400 | Only one file is allowed. | +| file_too_large | 413 | File size exceeded. | +| unsupported_file_type | 415 | File type not allowed. | +| high_quality_dataset_only | 400 | Current operation only supports 'high-quality' datasets. | +| dataset_not_initialized | 400 | The dataset is still being initialized or indexing. | +| archived_document_immutable | 403 | The archived document is not editable. | +| dataset_name_duplicate | 409 | The dataset name already exists. | +| invalid_action | 400 | Invalid action. | +| document_already_finished | 400 | The document has been processed. | +| document_indexing | 400 | The document is being processed and cannot be edited. | +| invalid_metadata | 400 | The metadata content is incorrect. | + +--- + +## 九、文档分段设置(上传时配置) + +### API 支持的分段参数 + +在上传文档时,可以通过 `process_rule` 参数配置分段设置: + +```typescript +{ + indexing_technique: 'high_quality' | 'economy', + process_rule: { + mode: 'automatic' | 'custom', + rules: { + pre_processing_rules: [ + { id: 'remove_extra_spaces', enabled: boolean }, // 替换连续空格 + { id: 'remove_urls_emails', enabled: boolean } // 删除URL和邮件 + ], + segmentation: { + separator: string, // 分段标识符,如 "\\n\\n" + max_tokens: number // 分段最大长度,100-4000 + } + } + } +} +``` + +### 功能支持情况 + +| 功能 | API 支持 | 参数 | 说明 | +|------|----------|------|------| +| 分段标识符 | ✅ | `separator` | 如 `\\n\\n`、`###` | +| 分段最大长度 | ✅ | `max_tokens` | 100-4000 | +| 替换连续空格 | ✅ | `remove_extra_spaces` | 预处理规则 | +| 删除URL和邮件 | ✅ | `remove_urls_emails` | 预处理规则 | +| 分段重叠长度 | ❌ | - | API 不支持 | +| Q&A 分段 | ⚠️ | `doc_form: "qa_model"` | 需特殊配置 | + +### 重要限制 + +⚠️ **已有文档无法直接修改分段设置** + +Dify API 不支持修改已上传文档的分段规则。如需应用新设置,必须: +1. 使用 `original_document_id` 参数重新上传文档 +2. 或删除文档后重新上传 + +--- + +## 优先级建议 + +### 高优先级(核心功能) +1. ~~**检索知识库**~~ ✅ 已实现 +2. ~~获取文档嵌入状态~~ ✅ 已实现 +3. **创建空知识库** - 让用户能创建新的知识库 +4. **获取嵌入模型列表** - 创建知识库时需要选择模型 + +### 中优先级(完善功能) +5. **通过文本创建文档** - 支持直接输入文本 +6. ~~**新增分段**~~ ✅ 已实现 +7. ~~修改知识库详情~~ ✅ 已实现 +8. ~~获取上传文件信息~~ ✅ 已实现 + +### 低优先级(扩展功能) +9. ~~子分段管理系列~~ ✅ 已实现(API层) +10. 元数据管理系列 +11. 标签管理系列 +12. 文档更新功能 diff --git a/package.json b/package.json index fff4802..03edd90 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ }, "dependencies": { "@ant-design/icons": "^5.6.1", + "@ant-design/x": "^2.0.0", + "@ant-design/x-markdown": "^2.0.0", "@codemirror/lang-javascript": "^6.2.3", "@codemirror/theme-one-dark": "^6.1.2", "@monaco-editor/react": "^4.7.0", @@ -27,7 +29,7 @@ "@types/jsonwebtoken": "^9.0.10", "@uiw/react-codemirror": "^4.23.10", "ahooks": "^3.8.5", - "antd": "^5.25.4", + "antd": "^6.0.0", "axios": "^1.9.0", "dayjs": "^1.11.13", "diff": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32b5a9e..a7fcf91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,12 @@ importers: '@ant-design/icons': specifier: ^5.6.1 version: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/x': + specifier: ^2.0.0 + version: 2.0.0(antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/x-markdown': + specifier: ^2.0.0 + version: 2.0.0(@types/react@18.3.23)(antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@codemirror/lang-javascript': specifier: ^6.2.3 version: 6.2.4 @@ -34,13 +40,13 @@ importers: version: 9.0.10 '@uiw/react-codemirror': specifier: ^4.23.10 - version: 4.23.14(@babel/runtime@7.27.6)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.0)(codemirror@6.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.23.14(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.0)(codemirror@6.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ahooks: specifier: ^3.8.5 version: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) antd: - specifier: ^5.25.4 - version: 5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.0.0 + version: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: specifier: ^1.9.0 version: 1.10.0 @@ -131,7 +137,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.16.2 - version: 2.16.8(@remix-run/react@2.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.8(typescript@5.8.3))(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0) + version: 2.16.8(@remix-run/react@2.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.8(typescript@5.8.3))(@types/node@24.0.8)(babel-plugin-macros@3.1.0)(jiti@1.21.7)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0) '@types/react': specifier: ^18.2.20 version: 18.3.23 @@ -203,14 +209,17 @@ packages: '@ant-design/colors@7.2.1': resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} - '@ant-design/cssinjs-utils@1.1.3': - resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@ant-design/colors@8.0.0': + resolution: {integrity: sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==} - '@ant-design/cssinjs@1.23.0': - resolution: {integrity: sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==} + '@ant-design/cssinjs-utils@2.0.2': + resolution: {integrity: sha512-Mq3Hm6fJuQeFNKSp3+yT4bjuhVbdrsyXE2RyfpJFL0xiYNZdaJ6oFaE3zFrzmHbmvTd2Wp3HCbRtkD4fU+v2ZA==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + '@ant-design/cssinjs@2.0.1': + resolution: {integrity: sha512-Lw1Z4cUQxdMmTNir67gU0HCpTl5TtkKCJPZ6UBvCqzcOTl/QmMFB6qAEoj8qFl0CuZDX9qQYa3m9+rEKfaBSbA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -219,6 +228,10 @@ packages: resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} engines: {node: '>=8.x'} + '@ant-design/fast-color@3.0.0': + resolution: {integrity: sha512-eqvpP7xEDm2S7dUzl5srEQCBTXZMmY3ekf97zI+M2DHOYyKdJGH0qua0JACHTqbkRnD/KHFQP9J1uMJ/XWVzzA==} + engines: {node: '>=8.x'} + '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} @@ -229,11 +242,35 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' + '@ant-design/icons@6.1.0': + resolution: {integrity: sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + '@ant-design/react-slick@1.1.2': resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} peerDependencies: react: '>=16.9.0' + '@ant-design/x-markdown@2.0.0': + resolution: {integrity: sha512-ERlua9VG5mO0RWeVgymo1kfzuTMRhWHOHJ+Cl++OzHhYVg8mKrP8L6Bo+Z5s8ZI2vViBfzUtEwRfr3d8ww82Zw==} + peerDependencies: + antd: ^6.0.0 + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@ant-design/x@2.0.0': + resolution: {integrity: sha512-fyOnuxeAV1D22vOj6qtw3xBeb9GM/IDVgtl0pBcnPcmKaCdjeFHhhunWMBxtHrx1zRdM76rhGAokhY5lTMYG5w==} + peerDependencies: + antd: ^6.0.0 + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -357,6 +394,10 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -369,6 +410,24 @@ packages: resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} engines: {node: '>=6.9.0'} + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@codemirror/autocomplete@6.18.6': resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} @@ -865,6 +924,12 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -906,6 +971,9 @@ packages: '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + '@monaco-editor/loader@1.7.0': resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} @@ -979,14 +1047,87 @@ packages: resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} engines: {node: '>=14.x'} - '@rc-component/color-picker@2.0.1': - resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} + '@rc-component/cascader@1.8.0': + resolution: {integrity: sha512-AYcJ6zHWua/CPp2DK2Xebu6nhcbav5PcPVVwTRb7yJTuKuwnjlB81wgtPIEgMKRv42aH3hyMYZvFgKhuxuvKmg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/context@1.4.0': - resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} + '@rc-component/checkbox@1.0.1': + resolution: {integrity: sha512-08yTH8m+bSm8TOqbybbJ9KiAuIATti6bDs2mVeSfu4QfEnyeF6X0enHVvD1NEAyuBWEAo56QtLe++MYs2D9XiQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/collapse@1.1.2': + resolution: {integrity: sha512-ilBYk1dLLJHu5Q74dF28vwtKUYQ42ZXIIDmqTuVy4rD8JQVvkXOs+KixVNbweyuIEtJYJ7+t+9GVD9dPc6N02w==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/color-picker@3.0.3': + resolution: {integrity: sha512-V7gFF9O7o5XwIWafdbOtqI4BUUkEUkgdBwp6favy3xajMX/2dDqytFaiXlcwrpq6aRyPLp5dKLAG5RFKLXMeGA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@2.0.1': + resolution: {integrity: sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/dialog@1.5.1': + resolution: {integrity: sha512-by4Sf/a3azcb89WayWuwG19/Y312xtu8N81HoVQQtnsBDylfs+dog98fTAvLinnpeoWG52m/M7QLRW6fXR3l1g==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/drawer@1.2.0': + resolution: {integrity: sha512-RZ8IoNUv/soNVMYIWdjelKXX/3LWhVrKUQAeoc966Y55cIGc+PQKni025xshsvTY/+ntq10wqlBw1WCi77MvYQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/dropdown@1.0.2': + resolution: {integrity: sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + '@rc-component/form@1.4.0': + resolution: {integrity: sha512-C8MN/2wIaW9hSrCCtJmcgCkWTQNIspN7ARXLFA4F8PGr8Qxk39U5pS3kRK51/bUJNhb/fEtdFnaViLlISGKI2A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/image@1.5.2': + resolution: {integrity: sha512-SIbYLy0IrXqyhccpKktQEvpbBti/KwgG8V/E8GJa8ycwOQmuZaCP7b/C+eQlivn4KDWpfKfoOrLKHXmVlljDgg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input-number@1.6.2': + resolution: {integrity: sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/input@1.1.2': + resolution: {integrity: sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/mentions@1.5.5': + resolution: {integrity: sha512-m39JW6ZyR0+foE1ojgOx2+GH8kMaJS279A2cI0vV0gIEZMp+2hOpPhJgKR7vMOGdhvkiXwgfM49EaPw30NonNw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/menu@1.1.5': + resolution: {integrity: sha512-+TlOCjrvm0JFk3OtSbOLX4klXK1bBdwTSJeEg1lM8P0BfdJOYxLFmKyAoUILioP4dO2A9u+lZENZOleAmA4g+A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -995,41 +1136,183 @@ packages: resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} engines: {node: '>=8.x'} - '@rc-component/mutate-observer@1.1.0': - resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} + '@rc-component/motion@1.1.5': + resolution: {integrity: sha512-IokOGL+aDqG+GDZjPDN4IFSVrThSbBB2CyHl0F58vOio+5ujLesZ1hL83/hMkazqlGM5zOF7QSbR9cRxnsy8hQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mutate-observer@2.0.1': + resolution: {integrity: sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/portal@1.1.2': - resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + '@rc-component/notification@1.2.0': + resolution: {integrity: sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/qrcode@1.0.0': - resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} + '@rc-component/pagination@1.2.0': + resolution: {integrity: sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/picker@1.7.1': + resolution: {integrity: sha512-u75rwgbYbH3M2+k22dWOCXv1YUtdb5bgrD7YXCV19H6qS6mUHxQOcqRVTU2JmUPKkq+TOaHC4kDgU83mN2G01w==} + engines: {node: '>=12.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + '@rc-component/portal@2.0.1': + resolution: {integrity: sha512-46KYuA7Udb1LAaLIdDrfmDz3wzyeEZxIURJCn+heoQVbhtW5PQkhBSQtRus+DUdsknmTFQulxSnqrbX3CI4yXw==} + engines: {node: '>=12.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/progress@1.0.2': + resolution: {integrity: sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/qrcode@1.1.1': + resolution: {integrity: sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/tour@1.15.1': - resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} + '@rc-component/rate@1.0.1': + resolution: {integrity: sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/trigger@2.2.7': - resolution: {integrity: sha512-Qggj4Z0AA2i5dJhzlfFSmg1Qrziu8dsdHOihROL5Kl18seO2Eh/ZaTYt2c8a/CyGaTChnFry7BEYew1+/fhSbA==} + '@rc-component/resize-observer@1.0.1': + resolution: {integrity: sha512-r+w+Mz1EiueGk1IgjB3ptNXLYSLZ5vnEfKHH+gfgj7JMupftyzvUUl3fRcMZe5uMM04x0n8+G2o/c6nlO2+Wag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/segmented@1.2.3': + resolution: {integrity: sha512-L7G4S6zUpqHclOXK0wKKN2/VyqHa9tfDNxkoFjWOTPtQ0ROFaBwZhbf1+9sdZfIFkxJkpcShAmDOMEIBaFFqkw==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@rc-component/select@1.2.4': + resolution: {integrity: sha512-gEWJqX2bGYwaYXwFdKe/0ryaxAcnh0IG4iegVIpg0640Hpt7sYRSY8kvvtd+SzOZZIn2n11hyuBpWsSzvUA73w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/slider@1.0.1': + resolution: {integrity: sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' + '@rc-component/steps@1.2.2': + resolution: {integrity: sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/switch@1.0.3': + resolution: {integrity: sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/table@1.8.2': + resolution: {integrity: sha512-GUuuXIGx2M3KVEcqhze8cDs0cwkSby9VRnOrm6zbnryMFUr+WUL1eu7NA1j4Gi43Rd3/CIL8OmXhRdUz1L/Xug==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tabs@1.6.0': + resolution: {integrity: sha512-2OY02yhS7E0y0Yr5LBI3o5KdM7h4yJ5lBR6V4PEC1dx/sUZggEw7vAHGCArqCcpsZ6pzjOGJbGiVhz7dSMiehA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/textarea@1.1.2': + resolution: {integrity: sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tooltip@1.3.4': + resolution: {integrity: sha512-wbxvH/UBVgGnpivBPDiGirNr2B9BhUBF4QJTWHK8hOMh6qWg/yf0g4UspH9+GlnSwSLoYOhcChmdLLFxSULBDQ==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/tour@2.2.1': + resolution: {integrity: sha512-BUCrVikGJsXli38qlJ+h2WyDD6dYxzDA9dV3o0ij6gYhAq6ooT08SUMWOikva9v4KZ2BEuluGl5bPcsjrSoBgQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tree-select@1.3.1': + resolution: {integrity: sha512-aWbsJ0c7Saqu4Fpn0RPx0EeprttyBbAeH1HQ8cG8vPHOrkG+kg4Wg3TWB+e5uVo36dneH8NJHfOICLzdblQEhA==} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/tree@1.0.2': + resolution: {integrity: sha512-h4P2P3N004VmUonkBzhisjrwME2njSxmUzZPhkFHGllAzbcRUSUGSx0dvRr0FCxYYittpMpGUHE6OMvbVX2c8Q==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + '@rc-component/trigger@3.7.1': + resolution: {integrity: sha512-+YNP8FywxKJpdqzlAp6TN8UbSK6YsQtIs3kI13mHfm87qi3qUd5Q9AGW8Unfv76kXFUSu7U7D0FygRsGH+6MiA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@rc-component/upload@1.1.0': + resolution: {integrity: sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/util@1.4.0': + resolution: {integrity: sha512-LQlShcJKu0p3JUTAenKrWtqVW0+c4PJKedOqEaef9gTVL70O3cG4xZJ7VXfm0blGzORKFEkd3oQGalaUBNZ3Lg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + '@remix-run/dev@2.16.8': resolution: {integrity: sha512-2EKByaD5CDwh7H56UFVCqc90kCZ9LukPlSwkcsR3gj7WlfL7sXtcIqIopcToAlKAeao3HDbhBlBT2CTOivxZCg==} engines: {node: '>=18.0.0'} @@ -1229,6 +1512,99 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1238,6 +1614,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} @@ -1271,6 +1650,9 @@ packages: '@types/node@24.0.8': resolution: {integrity: sha512-WytNrFSgWO/esSH9NbpWUfTMGQwCGIKfCmNlmFDNiI5gGhgMmEA+V1AEvKLeBNvvtBnailJtkrEa2OIISwrVAA==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1564,11 +1946,11 @@ packages: resolution: {integrity: sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg==} engines: {node: '>=10'} - antd@5.26.3: - resolution: {integrity: sha512-M/s9Q39h/+G7AWnS6fbNxmAI9waTH4ti022GVEXBLq2j810V1wJ3UOQps13nEilzDNcyxnFN/EIbqIgS7wSYaA==} + antd@6.0.1: + resolution: {integrity: sha512-/kCH3057suoqe1D/JJ4lxvkESZWJr1+ISTbRnbxk99gXJWaxYp7pCX+4CZSdvVDKFpU1YBkzHn9/ZVNNyHImqQ==} peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + react: '>=18.0.0' + react-dom: '>=18.0.0' any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -1675,6 +2057,10 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1794,18 +2180,35 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} charm@0.1.2: resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1858,6 +2261,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1871,6 +2277,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -1921,12 +2331,19 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -1957,6 +2374,162 @@ packages: culvert@0.1.2: resolution: {integrity: sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1983,6 +2556,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.8.36: resolution: {integrity: sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==} @@ -2064,6 +2640,9 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2119,9 +2698,22 @@ packages: docx-preview@0.3.5: resolution: {integrity: sha512-nod1jG5PkvzDIiZAcgAY4gSFQzgmAAChcuZH4Hj9dj7oCzscY3Hn8NfbUv7X7Jk4xL1lfKO113JLDhWKOt6fYw==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dompurify@3.2.7: resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -2169,6 +2761,10 @@ packages: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -2176,6 +2772,9 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -2446,6 +3045,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2649,6 +3251,9 @@ packages: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -2691,6 +3296,9 @@ packages: hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} @@ -2709,13 +3317,22 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + hosted-git-info@6.1.3: resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2723,9 +3340,24 @@ packages: html-docx-js@0.3.1: resolution: {integrity: sha512-QSrMiRhxesqxYCa3f+2Z3ttIHPzSjDOL1tCOmIDIEET7HdabxXND6tAbsFMXAgRG4RADQ3wbl74ydMmjidaDPA==} + html-dom-parser@5.1.2: + resolution: {integrity: sha512-9nD3Rj3/FuQt83AgIa1Y3ruzspwFFA54AJbQnohXN+K6fL1/bhcDQJJY5Ne4L4A163ADQFVESd/0TLyNoV0mfg==} + + html-react-parser@5.2.10: + resolution: {integrity: sha512-DjOLloguuDA+Ed7Q7PKhvMQmCl2+Yk/pfvvca68fvn15QFBbL4uHGxXwoXQ4sqS0UyuRH2lJb0S8yZCL3lvehQ==} + peerDependencies: + '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 + react: 0.14 || 15 || 16 || 17 || 18 || 19 + peerDependenciesMeta: + '@types/react': + optional: true + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -2746,6 +3378,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -2793,10 +3429,20 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} @@ -2808,9 +3454,15 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -2822,6 +3474,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2861,6 +3516,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -2891,6 +3549,9 @@ packages: resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} engines: {node: '>=0.10.0'} + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -2902,6 +3563,9 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-mobile@5.0.0: + resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -3025,6 +3689,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3080,10 +3747,17 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -3091,6 +3765,12 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3117,6 +3797,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash._arraycopy@3.0.0: resolution: {integrity: sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==} @@ -3201,6 +3884,9 @@ packages: lodash.restparam@3.6.1: resolution: {integrity: sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash.toplainobject@3.0.0: resolution: {integrity: sha512-wMI0Ju1bvSmnBS3EcRRH/3zDnZOPpDtMtNDzbbNMKuTrEpALsf+sPyMeogmv63Y11qZQO7H1xFzohIEGRMjPYA==} @@ -3221,6 +3907,9 @@ packages: lop@0.4.2: resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3258,6 +3947,16 @@ packages: engines: {node: '>= 18'} hasBin: true + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3371,6 +4070,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -3631,6 +4333,9 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} @@ -3835,6 +4540,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -3845,9 +4553,16 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -3859,6 +4574,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4003,6 +4721,12 @@ packages: engines: {node: '>=16.0.0'} hasBin: true + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4121,6 +4845,10 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -4150,6 +4878,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -4198,133 +4929,20 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - rc-cascader@3.34.0: - resolution: {integrity: sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-checkbox@3.5.0: - resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-collapse@3.9.0: - resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-dialog@9.6.0: - resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-drawer@7.3.0: - resolution: {integrity: sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-dropdown@4.2.1: - resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' - - rc-field-form@2.7.0: - resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-image@7.12.0: - resolution: {integrity: sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-input-number@9.5.0: - resolution: {integrity: sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-input@1.8.0: - resolution: {integrity: sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - rc-mentions@2.20.0: - resolution: {integrity: sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-menu@9.16.1: - resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-motion@2.9.5: resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-notification@5.6.4: - resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-overflow@1.4.1: resolution: {integrity: sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-pagination@5.1.0: - resolution: {integrity: sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-picker@4.11.3: - resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==} - engines: {node: '>=8.x'} - peerDependencies: - date-fns: '>= 2.x' - dayjs: '>= 1.x' - luxon: '>= 3.x' - moment: '>= 2.x' - react: '>=16.9.0' - react-dom: '>=16.9.0' - peerDependenciesMeta: - date-fns: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - - rc-progress@4.0.0: - resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-rate@2.13.1: - resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==} - engines: {node: '>=8.x'} + rc-overflow@1.5.0: + resolution: {integrity: sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -4335,84 +4953,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-segmented@2.7.0: - resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - rc-select@14.16.8: - resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '*' - react-dom: '*' - - rc-slider@11.1.8: - resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-steps@6.0.1: - resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-switch@4.1.0: - resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-table@7.51.1: - resolution: {integrity: sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-tabs@15.6.1: - resolution: {integrity: sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-textarea@1.10.0: - resolution: {integrity: sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-tooltip@6.4.0: - resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-tree-select@5.27.0: - resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==} - peerDependencies: - react: '*' - react-dom: '*' - - rc-tree@5.13.1: - resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==} - engines: {node: '>=10.x'} - peerDependencies: - react: '*' - react-dom: '*' - - rc-upload@4.9.2: - resolution: {integrity: sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - rc-util@5.44.4: resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} peerDependencies: @@ -4460,6 +5000,9 @@ packages: '@types/react': optional: true + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -4477,6 +5020,11 @@ packages: peerDependencies: react: '>=16.8' + react-syntax-highlighter@15.6.6: + resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + peerDependencies: + react: '>= 0.14.0' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -4503,6 +5051,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -4594,17 +5145,26 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.44.1: resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} run-series@1.1.9: resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -4757,6 +5317,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4885,9 +5448,15 @@ packages: style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + style-to-object@1.0.9: resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} @@ -4954,6 +5523,10 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -4962,9 +5535,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -4984,6 +5554,10 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5301,6 +5875,26 @@ packages: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} engines: {node: '>=4.0'} + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -5387,6 +5981,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} @@ -5412,29 +6010,35 @@ snapshots: dependencies: '@ant-design/fast-color': 2.0.6 - '@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/colors@8.0.0': dependencies: - '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@babel/runtime': 7.27.6 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/fast-color': 3.0.0 + + '@ant-design/cssinjs-utils@2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/cssinjs': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.4 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ant-design/cssinjs@1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 - classnames: 2.5.1 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 csstype: 3.1.3 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) stylis: 4.3.6 '@ant-design/fast-color@2.0.6': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 + + '@ant-design/fast-color@3.0.0': {} '@ant-design/icons-svg@4.4.2': {} @@ -5448,15 +6052,65 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@ant-design/icons@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/colors': 8.0.0 + '@ant-design/icons-svg': 4.4.2 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@ant-design/react-slick@1.1.2(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 json2mq: 0.2.0 react: 18.3.1 resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 + '@ant-design/x-markdown@2.0.0(@types/react@18.3.23)(antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/cssinjs': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/fast-color': 3.0.0 + '@ant-design/icons': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/x': 2.0.0(antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + antd: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + dompurify: 3.2.7 + html-react-parser: 5.2.10(@types/react@18.3.23)(react@18.3.1) + katex: 0.16.22 + lodash.throttle: 4.1.1 + marked: 15.0.12 + mermaid: 11.12.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-syntax-highlighter: 15.6.6(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + + '@ant-design/x@2.0.0(antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/colors': 8.0.0 + '@ant-design/cssinjs': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/fast-color': 3.0.0 + '@ant-design/icons': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.28.4 + antd: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -5625,6 +6279,8 @@ snapshots: '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -5648,6 +6304,25 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + '@codemirror/autocomplete@6.18.6': dependencies: '@codemirror/language': 6.11.2 @@ -5978,6 +6653,14 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6049,6 +6732,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + '@monaco-editor/loader@1.7.0': dependencies: state-local: 1.0.7 @@ -6177,74 +6864,333 @@ snapshots: '@rc-component/async-validator@5.0.4': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 - '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/cascader@1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/select': 1.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tree': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/checkbox@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/collapse@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/color-picker@3.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/fast-color': 3.0.0 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/context@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/dialog@1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/drawer@1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/dropdown@1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/form@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/async-validator': 5.0.4 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/image@1.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/input-number@1.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/mini-decimal': 1.1.0 + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/input@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/mentions@1.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/input': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/menu': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/textarea': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/menu@1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/mini-decimal@1.1.0': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 - '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/motion@1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/mutate-observer@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/notification@1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/pagination@1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/picker@1.7.1(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + dayjs: 1.11.13 + + '@rc-component/portal@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@remix-run/dev@2.16.8(@remix-run/react@2.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.8(typescript@5.8.3))(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0)': + '@rc-component/progress@1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/qrcode@1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/rate@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/resize-observer@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/segmented@1.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/select@1.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + rc-overflow: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/slider@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/steps@1.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/switch@1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/table@1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/context': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tabs@1.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/dropdown': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/menu': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/textarea@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/input': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tooltip@1.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tour@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/portal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tree-select@1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/select': 1.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tree': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tree@1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/trigger@3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/portal': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/upload@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/util@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + is-mobile: 5.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + + '@remix-run/dev@2.16.8(@remix-run/react@2.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(@remix-run/serve@2.16.8(typescript@5.8.3))(@types/node@24.0.8)(babel-plugin-macros@3.1.0)(jiti@1.21.7)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.8)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0)': dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.27.5 @@ -6261,7 +7207,7 @@ snapshots: '@remix-run/router': 1.23.0 '@remix-run/server-runtime': 2.16.8(typescript@5.8.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@24.0.8)(terser@5.43.1) + '@vanilla-extract/integration': 6.5.0(@types/node@24.0.8)(babel-plugin-macros@3.1.0)(terser@5.43.1) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -6488,6 +7434,123 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -6498,6 +7561,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/geojson@7946.0.16': {} + '@types/hast@2.3.10': dependencies: '@types/unist': 2.0.11 @@ -6533,6 +7598,9 @@ snapshots: dependencies: undici-types: 7.8.0 + '@types/parse-json@4.0.2': + optional: true + '@types/prop-types@15.7.15': {} '@types/react-dom@18.3.7(@types/react@18.3.23)': @@ -6657,9 +7725,9 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.38.0 - '@uiw/react-codemirror@4.23.14(@babel/runtime@7.27.6)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.0)(codemirror@6.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.23.14(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.2)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.0)(codemirror@6.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@codemirror/commands': 6.8.1 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.3 @@ -6741,14 +7809,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vanilla-extract/css@1.17.4': + '@vanilla-extract/css@1.17.4(babel-plugin-macros@3.1.0)': dependencies: '@emotion/hash': 0.9.2 '@vanilla-extract/private': 1.0.9 css-what: 6.2.2 cssesc: 3.0.0 csstype: 3.1.3 - dedent: 1.6.0 + dedent: 1.6.0(babel-plugin-macros@3.1.0) deep-object-diff: 1.1.9 deepmerge: 4.3.1 lru-cache: 10.4.3 @@ -6758,12 +7826,12 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@24.0.8)(terser@5.43.1)': + '@vanilla-extract/integration@6.5.0(@types/node@24.0.8)(babel-plugin-macros@3.1.0)(terser@5.43.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) '@vanilla-extract/babel-plugin-debug-ids': 1.2.2 - '@vanilla-extract/css': 1.17.4 + '@vanilla-extract/css': 1.17.4(babel-plugin-macros@3.1.0) esbuild: 0.17.6 eval: 0.1.8 find-up: 5.0.0 @@ -6857,55 +7925,54 @@ snapshots: ansis@4.0.0-node10: {} - antd@5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + antd@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@ant-design/colors': 7.2.1 - '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/fast-color': 2.0.6 - '@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/colors': 8.0.0 + '@ant-design/cssinjs': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/fast-color': 3.0.0 + '@ant-design/icons': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) - '@babel/runtime': 7.27.6 - '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - copy-to-clipboard: 3.3.3 + '@babel/runtime': 7.28.4 + '@rc-component/cascader': 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/checkbox': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/collapse': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/color-picker': 3.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/dialog': 1.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/drawer': 1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/dropdown': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/form': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/image': 1.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/input': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/input-number': 1.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mentions': 1.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/menu': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/motion': 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/notification': 1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/pagination': 1.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/picker': 1.7.1(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/progress': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/qrcode': 1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/rate': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/resize-observer': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/segmented': 1.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/select': 1.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/slider': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/steps': 1.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/switch': 1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/table': 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tabs': 1.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/textarea': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tooltip': 1.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tree': 1.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tree-select': 1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 3.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/upload': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/util': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 dayjs: 1.11.13 - rc-cascader: 3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-checkbox: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-collapse: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-drawer: 7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-field-form: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-image: 7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input-number: 9.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-mentions: 2.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-notification: 5.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-pagination: 5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-picker: 4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-rate: 2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-segmented: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-slider: 11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-table: 7.51.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tabs: 15.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tooltip: 6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree-select: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-upload: 4.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -7047,6 +8114,13 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.4 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + optional: true + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -7185,14 +8259,34 @@ snapshots: character-entities-html4@2.1.0: {} + character-entities-legacy@1.1.4: {} + character-entities-legacy@3.0.0: {} + character-entities@1.2.4: {} + character-entities@2.0.2: {} + character-reference-invalid@1.1.4: {} + character-reference-invalid@2.0.1: {} charm@0.1.2: {} + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -7247,6 +8341,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@1.0.8: {} + comma-separated-tokens@2.0.3: {} commander@2.15.1: {} @@ -7256,6 +8352,8 @@ snapshots: commander@4.1.1: {} + commander@7.2.0: {} + commander@8.3.0: {} compressible@2.0.18: @@ -7298,12 +8396,25 @@ snapshots: cookie@0.7.2: {} - copy-to-clipboard@3.3.3: - dependencies: - toggle-selection: 1.0.6 - core-util-is@1.0.3: {} + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + optional: true + crelt@1.0.6: {} croner@4.1.97: {} @@ -7326,6 +8437,190 @@ snapshots: culvert@0.1.2: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + damerau-levenshtein@1.0.8: {} data-uri-to-buffer@3.0.1: {} @@ -7352,6 +8647,8 @@ snapshots: dayjs@1.11.13: {} + dayjs@1.11.19: {} + dayjs@1.8.36: {} debug@2.6.9: @@ -7379,7 +8676,9 @@ snapshots: mimic-response: 3.1.0 optional: true - dedent@1.6.0: {} + dedent@1.6.0(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-extend@0.6.0: optional: true @@ -7412,6 +8711,10 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -7453,10 +8756,28 @@ snapshots: dependencies: jszip: 3.10.1 + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + dompurify@3.2.7: optionalDependencies: '@types/trusted-types': 2.0.7 + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dotenv@16.6.1: {} duck@0.1.12: @@ -7502,10 +8823,17 @@ snapshots: dependencies: ansi-colors: 4.1.3 + entities@4.5.0: {} + entities@6.0.1: {} err-code@2.0.3: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + optional: true + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -8020,6 +9348,10 @@ snapshots: dependencies: reusify: 1.1.0 + fault@1.0.4: + dependencies: + format: 0.2.2 + fault@2.0.1: dependencies: format: 0.2.2 @@ -8244,6 +9576,8 @@ snapshots: pumpify: 1.5.1 through2: 2.0.5 + hachure-fill@0.5.2: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -8303,6 +9637,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@2.2.5: {} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 @@ -8360,6 +9696,14 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -8368,8 +9712,12 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 + highlight.js@10.7.3: {} + highlight.js@11.11.1: {} + highlightjs-vue@1.0.0: {} + hosted-git-info@6.1.3: dependencies: lru-cache: 7.18.3 @@ -8380,8 +9728,30 @@ snapshots: lodash.escape: 3.2.0 lodash.merge: 3.3.2 + html-dom-parser@5.1.2: + dependencies: + domhandler: 5.0.3 + htmlparser2: 10.0.0 + + html-react-parser@5.2.10(@types/react@18.3.23)(react@18.3.1): + dependencies: + domhandler: 5.0.3 + html-dom-parser: 5.1.2 + react: 18.3.1 + react-property: 2.0.2 + style-to-js: 1.1.21 + optionalDependencies: + '@types/react': 18.3.23 + html-url-attributes@3.0.1: {} + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -8410,6 +9780,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -8444,12 +9818,18 @@ snapshots: inline-style-parser@0.2.4: {} + inline-style-parser@0.2.7: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + internmap@1.0.1: {} + + internmap@2.0.3: {} + intersection-observer@0.12.2: {} ip-address@9.0.5: @@ -8459,8 +9839,15 @@ snapshots: ipaddr.js@1.9.1: {} + is-alphabetical@1.0.4: {} + is-alphabetical@2.0.1: {} + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -8477,6 +9864,9 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: + optional: true + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -8521,6 +9911,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@1.0.4: {} + is-decimal@2.0.1: {} is-deflate@1.0.0: {} @@ -8546,12 +9938,16 @@ snapshots: is-gzip@1.0.0: {} + is-hexadecimal@1.0.4: {} + is-hexadecimal@2.0.1: {} is-interactive@1.0.0: {} is-map@2.0.3: {} + is-mobile@5.0.0: {} + is-negative-zero@2.0.3: {} is-number-object@1.1.1: @@ -8662,6 +10058,9 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: + optional: true + json-parse-even-better-errors@3.0.2: {} json-schema-traverse@0.4.1: {} @@ -8737,14 +10136,28 @@ snapshots: dependencies: json-buffer: 3.0.1 + khroma@2.1.0: {} + kleur@4.1.5: {} + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -8770,6 +10183,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash._arraycopy@3.0.0: {} lodash._arrayeach@3.0.0: {} @@ -8855,6 +10270,8 @@ snapshots: lodash.restparam@3.6.1: {} + lodash.throttle@4.1.1: {} + lodash.toplainobject@3.0.0: dependencies: lodash._basecopy: 3.0.1 @@ -8879,6 +10296,11 @@ snapshots: option: 0.2.4 underscore: 1.13.7 + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -8914,6 +10336,10 @@ snapshots: marked@14.0.0: {} + marked@15.0.12: {} + + marked@16.4.2: {} + math-intrinsics@1.1.0: {} mdast-util-definitions@5.1.2: @@ -9195,7 +10621,7 @@ snapshots: media-query-parser@2.0.2: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 media-typer@0.3.0: {} @@ -9209,6 +10635,29 @@ snapshots: merge2@1.4.1: {} + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.2.7 + katex: 0.16.22 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + methods@1.1.2: {} micromark-core-commonmark@1.1.0: @@ -9695,6 +11144,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + modern-ahocorasick@1.1.0: {} module-details-from-path@1.0.4: {} @@ -9923,6 +11379,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.6.0: {} + pako@0.2.9: {} pako@1.0.11: {} @@ -9931,6 +11389,15 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -9941,6 +11408,14 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + optional: true + parse-ms@2.1.0: {} parse5@7.3.0: @@ -9949,6 +11424,8 @@ snapshots: parseurl@1.3.3: {} + path-data-parser@0.1.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -10056,7 +11533,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.2.0: @@ -10138,6 +11615,13 @@ snapshots: - supports-color - utf-8-validate + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + possible-typed-array-names@1.1.0: {} postcss-discard-duplicates@5.1.0(postcss@8.5.6): @@ -10253,6 +11737,8 @@ snapshots: dependencies: parse-ms: 2.1.0 + prismjs@1.27.0: {} + prismjs@1.30.0: {} proc-log@3.0.0: {} @@ -10276,6 +11762,10 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + property-information@6.5.0: {} property-information@7.1.0: {} @@ -10335,319 +11825,51 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - rc-cascader@3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-checkbox@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-collapse@3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-drawer@7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-field-form@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/async-validator': 5.0.4 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-image@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-input-number@9.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/mini-decimal': 1.1.0 - classnames: 2.5.1 - rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-input@1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-mentions@2.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-menu@9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-notification@5.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rc-overflow@1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-overflow@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-picker@4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - dayjs: 1.11.13 - - rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-rate@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-select@14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-slider@11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-table@7.51.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tabs@15.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-textarea@1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tooltip@6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree-select@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-tree@5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-upload@4.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - classnames: 2.5.1 - rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 rc-virtual-list@3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 classnames: 2.5.1 rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10707,6 +11929,8 @@ snapshots: optionalDependencies: '@types/react': 18.3.23 + react-property@2.0.2: {} + react-refresh@0.14.2: {} react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -10721,6 +11945,16 @@ snapshots: '@remix-run/router': 1.23.0 react: 18.3.1 + react-syntax-highlighter@15.6.6(react@18.3.1): + dependencies: + '@babel/runtime': 7.28.4 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 18.3.1 + refractor: 3.6.0 + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -10764,6 +11998,12 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -10913,6 +12153,8 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@3.0.2: {} + rollup@4.44.1: dependencies: '@types/estree': 1.0.8 @@ -10939,12 +12181,21 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 run-series@1.1.9: {} + rw@1.3.3: {} + sade@1.8.1: dependencies: mri: 1.2.0 @@ -11127,6 +12378,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@1.1.5: {} + space-separated-tokens@2.0.2: {} spdx-correct@3.2.0: @@ -11272,10 +12525,18 @@ snapshots: dependencies: style-to-object: 1.0.9 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + style-to-object@1.0.9: dependencies: inline-style-parser: 0.2.4 @@ -11379,6 +12640,8 @@ snapshots: tiny-invariant@1.3.3: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -11388,8 +12651,6 @@ snapshots: dependencies: is-number: 7.0.0 - toggle-selection@1.0.6: {} - toidentifier@1.0.1: {} toml@3.0.0: {} @@ -11402,6 +12663,8 @@ snapshots: dependencies: typescript: 5.8.3 + ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} tsconfck@3.1.6(typescript@5.8.3): @@ -11778,6 +13041,23 @@ snapshots: ini: 1.3.8 js-git: 0.7.8 + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + w3c-keyname@2.2.8: {} warning@4.0.3: @@ -11873,6 +13153,9 @@ snapshots: yallist@4.0.0: {} + yaml@1.10.2: + optional: true + yaml@2.8.0: {} yocto-queue@0.1.0: {} diff --git a/vite.config.ts b/vite.config.ts index 58fde4f..e4062cc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -53,7 +53,7 @@ export default defineConfig({ server: { host: '0.0.0.0', // port: 5173, - port: Number(process.env.PORT) || 5173, + port: Number(process.env.PORT) || 51703, open: true, // open: false, allowedHosts: ['nas.7bm.co', 'localhost', '127.0.0.1'], // 允许的主机名列表1 @@ -69,7 +69,29 @@ export default defineConfig({ // 防止依赖预构建时触发页面刷新导致路由中断 force: false, // 预构建这些依赖,避免首次加载时出现重新构建 - include: ['react-pdf', 'pdfjs-dist', 'dayjs', '@remix-run/node', 'react-dom', 'axios', 'dayjs/plugin/utc', '@remix-run/react', 'react-router-dom', 'jszip', 'ahooks', 'antd', 'immer', '@ant-design/icons', 'react-markdown', 'remark-math', 'remark-breaks', 'rehype-katex', 'remark-gfm'], + include: [ + 'react-pdf', + 'pdfjs-dist', + 'dayjs', + '@remix-run/node', + 'react-dom', + 'axios', + 'dayjs/plugin/utc', + '@remix-run/react', + 'react-router-dom', + 'jszip', + 'ahooks', + 'antd', + 'immer', + '@ant-design/icons', + 'react-markdown', + 'remark-math', + 'remark-breaks', + 'rehype-katex', + 'remark-gfm', + // Ant Design X 相关依赖 + '@ant-design/x', + ], }, // SSR 配置 - 排除只能在客户端运行的包 // ssr: {