diff --git a/apps/client/package.json b/apps/client/package.json
index 0cff05cc..9d45fa07 100644
--- a/apps/client/package.json
+++ b/apps/client/package.json
@@ -1,7 +1,7 @@
{
"name": "client",
"private": true,
- "version": "0.23.2",
+ "version": "0.24.0",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
@@ -17,6 +17,7 @@
"@emoji-mart/react": "^1.1.1",
"@excalidraw/excalidraw": "0.18.0-864353b",
"@mantine/core": "^8.1.3",
+ "@mantine/dates": "^8.3.2",
"@mantine/form": "^8.1.3",
"@mantine/hooks": "^8.1.3",
"@mantine/modals": "^8.1.3",
@@ -26,7 +27,7 @@
"@tanstack/react-query": "^5.80.6",
"@tiptap/extension-character-count": "^2.10.3",
"alfaaz": "^1.1.0",
- "axios": "^1.9.0",
+ "axios": "^1.13.2",
"clsx": "^2.1.1",
"emoji-mart": "^5.6.0",
"file-saver": "^2.0.5",
@@ -56,7 +57,7 @@
"socket.io-client": "^4.8.1",
"tippy.js": "^6.3.7",
"tiptap-extension-global-drag-handle": "^0.1.18",
- "zod": "^3.25.56"
+ "zod": "^3.25.76"
},
"devDependencies": {
"@eslint/js": "^9.16.0",
@@ -64,10 +65,10 @@
"@types/file-saver": "^2.0.7",
"@types/js-cookie": "^3.0.6",
"@types/katex": "^0.16.7",
- "@types/node": "22.10.0",
+ "@types/node": "22.19.1",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
- "@vitejs/plugin-react": "^4.4.1",
+ "@vitejs/plugin-react": "^5.1.1",
"eslint": "^9.15.0",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.1.0",
@@ -80,6 +81,6 @@
"prettier": "^3.4.1",
"typescript": "^5.7.2",
"typescript-eslint": "^8.17.0",
- "vite": "^6.3.5"
+ "vite": "^7.2.4"
}
}
diff --git a/apps/client/public/locales/de-DE/translation.json b/apps/client/public/locales/de-DE/translation.json
index bc1bd1f2..1763e428 100644
--- a/apps/client/public/locales/de-DE/translation.json
+++ b/apps/client/public/locales/de-DE/translation.json
@@ -42,7 +42,7 @@
"Delete group": "Gruppe löschen",
"Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Sind Sie sicher, dass Sie diese Seite löschen möchten? Dadurch werden ihre Unterseiten und die Seitengeschichte gelöscht. Diese Aktion ist unwiderruflich.",
"Description": "Beschreibung",
- "Details": "Einzelheiten",
+ "Details": "Details",
"e.g ACME": "z.B. ACME",
"e.g ACME Inc": "z.B. ACME Inc.",
"e.g Developers": "z.B. Entwickler",
@@ -234,9 +234,7 @@
"Anyone with this link can join this workspace.": "Jeder mit diesem Link kann dem Arbeitsbereich beitreten.",
"Invite link": "Einladungslink",
"Copy": "Kopieren",
- "Copy to space": "In Raum kopieren",
"Copied": "Kopiert",
- "Duplicate": "Duplizieren",
"Select a user": "Benutzer auswählen",
"Select a group": "Gruppe auswählen",
"Export all pages and attachments in this space.": "Alle Seiten und Anhänge in diesem Bereich exportieren.",
@@ -527,5 +525,47 @@
"Delete SSO provider": "SSO-Anbieter löschen",
"Are you sure you want to delete this SSO provider?": "Sind Sie sicher, dass Sie diesen SSO-Anbieter löschen möchten?",
"Action": "Aktion",
- "{{ssoProviderType}} configuration": "{{ssoProviderType}}-Konfiguration"
+ "{{ssoProviderType}} configuration": "{{ssoProviderType}}-Konfiguration",
+ "Icon": "Icon",
+ "Upload image": "Bild hochladen",
+ "Remove image": "Bild entfernen",
+ "Failed to remove image": "Fehler beim Entfernen des Bildes",
+ "Image exceeds 10MB limit.": "Bild überschreitet das Limit von 10 MB.",
+ "Image removed successfully": "Bild erfolgreich entfernt",
+ "API key": "API-Schlüssel",
+ "API key created successfully": "API-Schlüssel erfolgreich erstellt",
+ "API keys": "API-Schlüssel",
+ "API management": "API-Verwaltung",
+ "Are you sure you want to revoke this API key": "Sind Sie sicher, dass Sie diesen API-Schlüssel widerrufen möchten?",
+ "Create API Key": "API-Schlüssel erstellen",
+ "Custom expiration date": "Benutzerdefiniertes Ablaufdatum",
+ "Enter a descriptive token name": "Geben Sie einen beschreibenden Token-Namen ein",
+ "Expiration": "Ablauf",
+ "Expired": "Abgelaufen",
+ "Expires": "Läuft ab",
+ "I've saved my API key": "Ich habe meinen API-Schlüssel gespeichert",
+ "Last use": "Zuletzt verwendet",
+ "No API keys found": "Keine API-Schlüssel gefunden",
+ "No expiration": "Kein Ablauf",
+ "Revoke API key": "API-Schlüssel widerrufen",
+ "Revoked successfully": "Erfolgreich widerrufen",
+ "Select expiration date": "Ablaufdatum wählen",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Diese Aktion kann nicht rückgängig gemacht werden. Alle Anwendungen, die diesen API-Schlüssel verwenden, werden nicht mehr funktionieren.",
+ "Update API key": "API-Schlüssel aktualisieren",
+ "Manage API keys for all users in the workspace": "Verwalten Sie API-Schlüssel für alle Benutzer im Arbeitsbereich",
+ "AI settings": "KI-Einstellungen",
+ "AI search": "KI-Suche",
+ "AI Answer": "KI-Antwort",
+ "Ask AI": "KI fragen",
+ "AI is thinking...": "Die KI überlegt...",
+ "Ask a question...": "Fragen stellen...",
+ "AI-powered search (Ask AI)": "KI-gestützte Suche (KI fragen)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Die KI-Suche verwendet Vektor-Einbettungen, um semantische Suchfunktionen in Ihrem Arbeitsbereich bereitzustellen.",
+ "Toggle AI search": "KI-Suche umschalten",
+ "Sources": "Quellen",
+ "Ask AI not available for attachments": "KI fragen nicht für Anhänge verfügbar",
+ "No answer available": "Keine Antwort verfügbar",
+ "Background color": "Hintergrundfarbe",
+ "Highlight color": "Hervorhebungsfarbe",
+ "Remove color": "Farbe entfernen"
}
diff --git a/apps/client/public/locales/en-US/translation.json b/apps/client/public/locales/en-US/translation.json
index 6d9e548b..8cb33378 100644
--- a/apps/client/public/locales/en-US/translation.json
+++ b/apps/client/public/locales/en-US/translation.json
@@ -533,5 +533,41 @@
"Remove image": "Remove image",
"Failed to remove image": "Failed to remove image",
"Image exceeds 10MB limit.": "Image exceeds 10MB limit.",
- "Image removed successfully": "Image removed successfully"
+ "Image removed successfully": "Image removed successfully",
+ "API key": "API key",
+ "API key created successfully": "API key created successfully",
+ "API keys": "API keys",
+ "API management": "API management",
+ "Are you sure you want to revoke this API key": "Are you sure you want to revoke this API key",
+ "Create API Key": "Create API Key",
+ "Custom expiration date": "Custom expiration date",
+ "Enter a descriptive token name": "Enter a descriptive token name",
+ "Expiration": "Expiration",
+ "Expired": "Expired",
+ "Expires": "Expires",
+ "I've saved my API key": "I've saved my API key",
+ "Last use": "Last Used",
+ "No API keys found": "No API keys found",
+ "No expiration": "No expiration",
+ "Revoke API key": "Revoke API key",
+ "Revoked successfully": "Revoked successfully",
+ "Select expiration date": "Select expiration date",
+ "This action cannot be undone. Any applications using this API key will stop working.": "This action cannot be undone. Any applications using this API key will stop working.",
+ "Update API key": "Update API key",
+ "Manage API keys for all users in the workspace": "Manage API keys for all users in the workspace",
+ "AI settings": "AI settings",
+ "AI search": "AI search",
+ "AI Answer": "AI Answer",
+ "Ask AI": "Ask AI",
+ "AI is thinking...": "AI is thinking...",
+ "Ask a question...": "Ask a question...",
+ "AI-powered search (Ask AI)": "AI-powered search (Ask AI)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.",
+ "Toggle AI search": "Toggle AI search",
+ "Sources": "Sources",
+ "Ask AI not available for attachments": "Ask AI not available for attachments",
+ "No answer available": "No answer available",
+ "Background color": "Background color",
+ "Highlight color": "Highlight color",
+ "Remove color": "Remove color"
}
diff --git a/apps/client/public/locales/es-ES/translation.json b/apps/client/public/locales/es-ES/translation.json
index 3450f27d..f99e8541 100644
--- a/apps/client/public/locales/es-ES/translation.json
+++ b/apps/client/public/locales/es-ES/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "Eliminar proveedor de SSO",
"Are you sure you want to delete this SSO provider?": "¿Está seguro de que desea eliminar este proveedor de SSO?",
"Action": "Acción",
- "{{ssoProviderType}} configuration": "Configuración de {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Configuración de {{ssoProviderType}}",
+ "Icon": "Icono",
+ "Upload image": "Subir imagen",
+ "Remove image": "Eliminar imagen",
+ "Failed to remove image": "No se ha podido eliminar la imagen",
+ "Image exceeds 10MB limit.": "La imagen excede del límite de 10 MB",
+ "Image removed successfully": "Imagen eliminada correctamente",
+ "API key": "Clave API",
+ "API key created successfully": "Clave API creada correctamente",
+ "API keys": "Claves API",
+ "API management": "Gestión de API",
+ "Are you sure you want to revoke this API key": "¿Está seguro de que desea revocar esta clave API? ",
+ "Create API Key": "Crear clave API",
+ "Custom expiration date": "Fecha de vencimiento personalizada",
+ "Enter a descriptive token name": "Introduce un nombre descriptivo del token",
+ "Expiration": "Vencimiento",
+ "Expired": "Vencido",
+ "Expires": "Vence",
+ "I've saved my API key": "He guardado mi clave API",
+ "Last use": "Último uso",
+ "No API keys found": "No se han encontrado claves API",
+ "No expiration": "Sin vencimiento",
+ "Revoke API key": "Revocar clave API",
+ "Revoked successfully": "Revocada correctamente",
+ "Select expiration date": "Seleccionar fecha de vencimiento",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Esta acción no se puede deshacer. Las aplicaciones que utilicen esta clave API dejarán de funcionar.",
+ "Update API key": "Actualizar clave API",
+ "Manage API keys for all users in the workspace": "Gestionar claves API para todos los usuarios en el espacio de trabajo",
+ "AI settings": "Configuración de IA",
+ "AI search": "Búsqueda de IA",
+ "AI Answer": "Respuesta de IA",
+ "Ask AI": "Preguntar a IA",
+ "AI is thinking...": "IA está pensando...",
+ "Ask a question...": "Haz una pregunta...",
+ "AI-powered search (Ask AI)": "Búsqueda impulsada por IA (Preguntar a IA)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La búsqueda de IA utiliza incrustaciones vectoriales para proporcionar capacidades de búsqueda semántica en todo el contenido de su espacio de trabajo.",
+ "Toggle AI search": "Alternar búsqueda de IA",
+ "Sources": "Fuentes",
+ "Ask AI not available for attachments": "Preguntar a IA no está disponible para adjuntos",
+ "No answer available": "No hay respuesta disponible",
+ "Background color": "Color de fondo",
+ "Highlight color": "Color de resaltado",
+ "Remove color": "Eliminar color"
}
diff --git a/apps/client/public/locales/fr-FR/translation.json b/apps/client/public/locales/fr-FR/translation.json
index 0dbd62ac..5644d719 100644
--- a/apps/client/public/locales/fr-FR/translation.json
+++ b/apps/client/public/locales/fr-FR/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "Supprimer le fournisseur SSO",
"Are you sure you want to delete this SSO provider?": "Êtes-vous sûr de vouloir supprimer ce fournisseur SSO ?",
"Action": "Action",
- "{{ssoProviderType}} configuration": "Configuration {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Configuration {{ssoProviderType}}",
+ "Icon": "Icône",
+ "Upload image": "Téléverser une image",
+ "Remove image": "Supprimer l'image",
+ "Failed to remove image": "Échec de la suppression de l'image",
+ "Image exceeds 10MB limit.": "L'image dépasse la limite de 10 Mo.",
+ "Image removed successfully": "Image supprimée avec succès",
+ "API key": "Clé API",
+ "API key created successfully": "Clé API créée avec succès",
+ "API keys": "Clés API",
+ "API management": "Gestion des API",
+ "Are you sure you want to revoke this API key": "Êtes-vous sûr de vouloir révoquer cette clé API",
+ "Create API Key": "Créer une clé API",
+ "Custom expiration date": "Date d'expiration personnalisée",
+ "Enter a descriptive token name": "Entrez un nom descriptif pour le jeton",
+ "Expiration": "Expiration",
+ "Expired": "Expiré(e)",
+ "Expires": "Expire",
+ "I've saved my API key": "J'ai enregistré ma clé API",
+ "Last use": "Dernière utilisation",
+ "No API keys found": "Aucune clé API trouvée",
+ "No expiration": "Pas d'expiration",
+ "Revoke API key": "Révoquer la clé API",
+ "Revoked successfully": "Révoqué(e) avec succès",
+ "Select expiration date": "Sélectionnez la date d'expiration",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Cette action ne peut pas être annulée. Toutes les applications utilisant cette clé API cesseront de fonctionner.",
+ "Update API key": "Mettre à jour la clé API",
+ "Manage API keys for all users in the workspace": "Gérer les clés API pour tous les utilisateurs dans l'espace de travail",
+ "AI settings": "Paramètres de l'IA",
+ "AI search": "Recherche IA",
+ "AI Answer": "Réponse IA",
+ "Ask AI": "Demander à l'IA",
+ "AI is thinking...": "L'IA réfléchit...",
+ "Ask a question...": "Posez une question...",
+ "AI-powered search (Ask AI)": "Recherche assistée par l'IA (Demander à l'IA)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La recherche IA utilise des incorporations vectorielles pour fournir des capacités de recherche sémantique à travers le contenu de votre espace de travail.",
+ "Toggle AI search": "Basculer la recherche IA",
+ "Sources": "Sources",
+ "Ask AI not available for attachments": "Demande à l'IA non disponible pour les pièces jointes",
+ "No answer available": "Pas de réponse disponible",
+ "Background color": "Couleur de fond",
+ "Highlight color": "Couleur de surbrillance",
+ "Remove color": "Supprimer la couleur"
}
diff --git a/apps/client/public/locales/it-IT/translation.json b/apps/client/public/locales/it-IT/translation.json
index 8ed1f2c8..8d00f451 100644
--- a/apps/client/public/locales/it-IT/translation.json
+++ b/apps/client/public/locales/it-IT/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "Elimina provider SSO",
"Are you sure you want to delete this SSO provider?": "Sei sicuro di voler eliminare questo provider SSO?",
"Action": "Azione",
- "{{ssoProviderType}} configuration": "Configurazione {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Configurazione {{ssoProviderType}}",
+ "Icon": "Icona",
+ "Upload image": "Carica immagine",
+ "Remove image": "Rimuovi immagine",
+ "Failed to remove image": "Rimozione immagine fallita",
+ "Image exceeds 10MB limit.": "L'immagine supera il limite di 10MB.",
+ "Image removed successfully": "Immagine rimossa con successo",
+ "API key": "Chiave API",
+ "API key created successfully": "Chiave API creata con successo",
+ "API keys": "Chiavi API",
+ "API management": "Gestione API",
+ "Are you sure you want to revoke this API key": "Sei sicuro di voler revocare questa chiave API",
+ "Create API Key": "Crea Chiave API",
+ "Custom expiration date": "Data di scadenza personalizzata",
+ "Enter a descriptive token name": "Inserisci un nome descrittivo del token",
+ "Expiration": "Scadenza",
+ "Expired": "Scaduto",
+ "Expires": "Scade",
+ "I've saved my API key": "Ho salvato la mia chiave API",
+ "Last use": "Ultimo utilizzo",
+ "No API keys found": "Nessuna chiave API trovata",
+ "No expiration": "Nessuna scadenza",
+ "Revoke API key": "Revoca chiave API",
+ "Revoked successfully": "Revocata con successo",
+ "Select expiration date": "Seleziona la data di scadenza",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Questa azione non può essere annullata. Qualsiasi applicazione che utilizza questa chiave API smetterà di funzionare.",
+ "Update API key": "Aggiorna chiave API",
+ "Manage API keys for all users in the workspace": "Gestisci le chiavi API per tutti gli utenti nell'area di lavoro",
+ "AI settings": "Impostazioni AI",
+ "AI search": "Ricerca AI",
+ "AI Answer": "Risposta AI",
+ "Ask AI": "Chiedi all'AI",
+ "AI is thinking...": "L'AI sta pensando...",
+ "Ask a question...": "Fai una domanda...",
+ "AI-powered search (Ask AI)": "Ricerca potenziata dall'AI (Chiedi all'AI)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La ricerca AI utilizza embeddings vettoriali per fornire capacità di ricerca semantica nel contenuto della tua area di lavoro.",
+ "Toggle AI search": "Attiva/disattiva ricerca AI",
+ "Sources": "Fonti",
+ "Ask AI not available for attachments": "Chiedere all'AI non è disponibile per gli allegati",
+ "No answer available": "Nessuna risposta disponibile",
+ "Background color": "Colore di sfondo",
+ "Highlight color": "Colore evidenziato",
+ "Remove color": "Rimuovi colore"
}
diff --git a/apps/client/public/locales/ja-JP/translation.json b/apps/client/public/locales/ja-JP/translation.json
index 4e1811f3..6ea006d7 100644
--- a/apps/client/public/locales/ja-JP/translation.json
+++ b/apps/client/public/locales/ja-JP/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "SSOプロバイダーを削除する",
"Are you sure you want to delete this SSO provider?": "このSSOプロバイダーを削除してもよろしいですか?",
"Action": "アクション",
- "{{ssoProviderType}} configuration": "{{ssoProviderType}}の構成"
+ "{{ssoProviderType}} configuration": "{{ssoProviderType}}の構成",
+ "Icon": "アイコン",
+ "Upload image": "画像をアップロード",
+ "Remove image": "画像を削除",
+ "Failed to remove image": "画像の削除に失敗しました",
+ "Image exceeds 10MB limit.": "画像が10MBの制限を超えています。",
+ "Image removed successfully": "画像が正常に削除されました",
+ "API key": "APIキー",
+ "API key created successfully": "APIキーが正常に作成されました",
+ "API keys": "APIキー",
+ "API management": "API管理",
+ "Are you sure you want to revoke this API key": "このAPIキーを無効にしてもよろしいですか",
+ "Create API Key": "APIキーを作成",
+ "Custom expiration date": "カスタム有効期限",
+ "Enter a descriptive token name": "説明的なトークン名を入力してください",
+ "Expiration": "有効期限",
+ "Expired": "期限切れ",
+ "Expires": "期限が切れます",
+ "I've saved my API key": "APIキーを保存しました",
+ "Last use": "最終使用",
+ "No API keys found": "APIキーが見つかりません",
+ "No expiration": "期限なし",
+ "Revoke API key": "APIキーを無効にする",
+ "Revoked successfully": "正常に無効化されました",
+ "Select expiration date": "有効期限を選択してください",
+ "This action cannot be undone. Any applications using this API key will stop working.": "この操作は元に戻せません。このAPIキーを使用しているアプリケーションは動作を停止します。",
+ "Update API key": "APIキーを更新",
+ "Manage API keys for all users in the workspace": "ワークスペース内のすべてのユーザーのAPIキーを管理",
+ "AI settings": "AI設定",
+ "AI search": "AI検索",
+ "AI Answer": "AI回答",
+ "Ask AI": "AIに質問する",
+ "AI is thinking...": "AIが考え中...",
+ "Ask a question...": "質問を入力...",
+ "AI-powered search (Ask AI)": "AIによる検索(AIに質問)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI検索はベクター埋め込みを使用して、ワークスペースコンテンツ全体にわたって意味検索機能を提供します。",
+ "Toggle AI search": "AI検索を切り替え",
+ "Sources": "ソース",
+ "Ask AI not available for attachments": "添付ファイルにはAI質問は利用できません",
+ "No answer available": "回答がありません",
+ "Background color": "背景色",
+ "Highlight color": "ハイライト色",
+ "Remove color": "色を削除"
}
diff --git a/apps/client/public/locales/ko-KR/translation.json b/apps/client/public/locales/ko-KR/translation.json
index c6e3dc88..6e1f5b24 100644
--- a/apps/client/public/locales/ko-KR/translation.json
+++ b/apps/client/public/locales/ko-KR/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "SSO 제공자 삭제",
"Are you sure you want to delete this SSO provider?": "이 SSO 제공자를 삭제하시겠습니까?",
"Action": "작업",
- "{{ssoProviderType}} configuration": "{{ssoProviderType}} 구성"
+ "{{ssoProviderType}} configuration": "{{ssoProviderType}} 구성",
+ "Icon": "아이콘",
+ "Upload image": "이미지 업로드",
+ "Remove image": "이미지 제거",
+ "Failed to remove image": "이미지 제거 실패",
+ "Image exceeds 10MB limit.": "이미지가 10MB 용량 제한을 초과합니다.",
+ "Image removed successfully": "이미지가 성공적으로 제거되었습니다",
+ "API key": "API 키",
+ "API key created successfully": "API 키 생성 완료",
+ "API keys": "API 키",
+ "API management": "API 관리",
+ "Are you sure you want to revoke this API key": "이 API 키를 취소하시겠습니까?",
+ "Create API Key": "API 키 생성",
+ "Custom expiration date": "사용자 정의 만료일",
+ "Enter a descriptive token name": "토큰 이름을 입력하세요",
+ "Expiration": "만료",
+ "Expired": "만료됨",
+ "Expires": "만료일",
+ "I've saved my API key": "API 키를 저장했습니다",
+ "Last use": "최근 사용",
+ "No API keys found": "API 키를 찾을 수 없습니다",
+ "No expiration": "유효기간 없음",
+ "Revoke API key": "API 키 취소",
+ "Revoked successfully": "성공적으로 취소되었습니다",
+ "Select expiration date": "만료일 선택",
+ "This action cannot be undone. Any applications using this API key will stop working.": "이 작업은 되돌릴 수 없습니다. 이 API 키를 사용하는 모든 응용 프로그램이 작동을 멈출 것입니다.",
+ "Update API key": "API 키 갱신",
+ "Manage API keys for all users in the workspace": "워크스페이스 내 모든 사용자의 API 키 관리",
+ "AI settings": "AI 설정",
+ "AI search": "AI 검색",
+ "AI Answer": "AI 답변",
+ "Ask AI": "AI에게 묻기",
+ "AI is thinking...": "AI가 생각 중입니다...",
+ "Ask a question...": "질문하세요...",
+ "AI-powered search (Ask AI)": "AI 지원 검색 (AI에게 묻기)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI 검색은 벡터 임베딩을 사용하여 작업공간 콘텐츠에 대한 의미 검색 기능을 제공합니다.",
+ "Toggle AI search": "AI 검색 전환",
+ "Sources": "출처",
+ "Ask AI not available for attachments": "AI에게 묻기 기능은 첨부 파일에 대해 사용할 수 없습니다",
+ "No answer available": "답변을 제공할 수 없습니다",
+ "Background color": "배경 색",
+ "Highlight color": "강조 색",
+ "Remove color": "색 제거"
}
diff --git a/apps/client/public/locales/nl-NL/translation.json b/apps/client/public/locales/nl-NL/translation.json
index 7429bfe1..7db6836d 100644
--- a/apps/client/public/locales/nl-NL/translation.json
+++ b/apps/client/public/locales/nl-NL/translation.json
@@ -34,7 +34,7 @@
"Create group": "Groep aanmaken",
"Create page": "Pagina aanmaken",
"Create space": "Ruimte aanmaken",
- "Create workspace": "Wwerkruimte aanmaken",
+ "Create workspace": "Werkruimte aanmaken",
"Current password": "Huidig wachtwoord",
"Dark": "Donker",
"Date": "Datum",
@@ -91,7 +91,7 @@
"Invite by email": "Uitnodigen via e-mail",
"Invite members": "Leden uitnodigen",
"Invite new members": "Nieuwe leden uitnodigen",
- "Invited members who are yet to accept their invitation will appear here.": "Uigenodigde leden die hun uitnodiging nog moeten accepteren zullen hier worden getoond.",
+ "Invited members who are yet to accept their invitation will appear here.": "Uitgenodigde leden die hun uitnodiging nog moeten accepteren zullen hier worden getoond.",
"Invited members will be granted access to spaces the groups can access": "Uitgenodigde leden wordt toegang gegeven tot ruimtes de groepen toegang toe heeft",
"Join the workspace": "Word lid van de werkruimte",
"Language": "Taal",
@@ -527,5 +527,47 @@
"Delete SSO provider": "Verwijder SSO-provider",
"Are you sure you want to delete this SSO provider?": "Weet u zeker dat u deze SSO-provider wilt verwijderen?",
"Action": "Actie",
- "{{ssoProviderType}} configuration": "{{ssoProviderType}} configuratie"
+ "{{ssoProviderType}} configuration": "{{ssoProviderType}} configuratie",
+ "Icon": "Icoon",
+ "Upload image": "Afbeelding uploaden",
+ "Remove image": "Afbeelding verwijderen",
+ "Failed to remove image": "Afbeelding verwijderen mislukt",
+ "Image exceeds 10MB limit.": "Afbeelding overschrijdt de limiet van 10MB.",
+ "Image removed successfully": "Afbeelding succesvol verwijderd",
+ "API key": "API-sleutel",
+ "API key created successfully": "API-sleutel succesvol aangemaakt",
+ "API keys": "API-sleutels",
+ "API management": "API-beheer",
+ "Are you sure you want to revoke this API key": "Weet u zeker dat u deze API-sleutel wilt intrekken",
+ "Create API Key": "API-sleutel aanmaken",
+ "Custom expiration date": "Aangepaste vervaldatum",
+ "Enter a descriptive token name": "Voer een beschrijvende tokennaam in",
+ "Expiration": "Vervaldatum",
+ "Expired": "Verlopen",
+ "Expires": "Verloopt",
+ "I've saved my API key": "Ik heb mijn API-sleutel opgeslagen",
+ "Last use": "Laatst gebruikt",
+ "No API keys found": "Geen API-sleutels gevonden",
+ "No expiration": "Geen vervaldatum",
+ "Revoke API key": "API-sleutel intrekken",
+ "Revoked successfully": "Succesvol ingetrokken",
+ "Select expiration date": "Selecteer vervaldatum",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Deze actie kan niet ongedaan worden gemaakt. Alle toepassingen die deze API-sleutel gebruiken, zullen niet meer werken.",
+ "Update API key": "API-sleutel bijwerken",
+ "Manage API keys for all users in the workspace": "Beheer API-sleutels voor alle gebruikers in de werkruimte",
+ "AI settings": "AI-instellingen",
+ "AI search": "AI-zoekopdracht",
+ "AI Answer": "AI Antwoord",
+ "Ask AI": "Vraag AI",
+ "AI is thinking...": "AI is aan het nadenken...",
+ "Ask a question...": "Stel een vraag...",
+ "AI-powered search (Ask AI)": "AI-ondersteunde zoekopdracht (Vraag AI)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI-zoekopdracht maakt gebruik van vectorembeddings om semantische zoekmogelijkheden te bieden in uw werkruimte-inhoud.",
+ "Toggle AI search": "Schakel AI-zoekopdracht in/uit",
+ "Sources": "Bronnen",
+ "Ask AI not available for attachments": "Vraag AI is niet beschikbaar voor bijlages",
+ "No answer available": "Geen antwoord beschikbaar",
+ "Background color": "Achtergrondkleur",
+ "Highlight color": "Markeerkleur",
+ "Remove color": "Kleur verwijderen"
}
diff --git a/apps/client/public/locales/pt-BR/translation.json b/apps/client/public/locales/pt-BR/translation.json
index c4564830..5d11ec7a 100644
--- a/apps/client/public/locales/pt-BR/translation.json
+++ b/apps/client/public/locales/pt-BR/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "Excluir provedor de SSO",
"Are you sure you want to delete this SSO provider?": "Tem certeza de que deseja excluir este provedor de SSO?",
"Action": "Ação",
- "{{ssoProviderType}} configuration": "Configuração de {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Configuração de {{ssoProviderType}}",
+ "Icon": "Ícone",
+ "Upload image": "Fazer upload da imagem",
+ "Remove image": "Remover imagem",
+ "Failed to remove image": "Falha ao remover imagem",
+ "Image exceeds 10MB limit.": "A imagem excede o limite de 10MB.",
+ "Image removed successfully": "Imagem removida com sucesso",
+ "API key": "Chave API",
+ "API key created successfully": "Chave API criada com sucesso",
+ "API keys": "Chaves API",
+ "API management": "Gestão de API",
+ "Are you sure you want to revoke this API key": "Tem certeza de que deseja revogar esta chave API",
+ "Create API Key": "Criar Chave API",
+ "Custom expiration date": "Data de expiração personalizada",
+ "Enter a descriptive token name": "Insira um nome descritivo para o token",
+ "Expiration": "Expiração",
+ "Expired": "Expirado",
+ "Expires": "Expira",
+ "I've saved my API key": "Salvei minha chave API",
+ "Last use": "Último uso",
+ "No API keys found": "Nenhuma chave API encontrada",
+ "No expiration": "Sem expiração",
+ "Revoke API key": "Revogar chave API",
+ "Revoked successfully": "Revogada com sucesso",
+ "Select expiration date": "Selecionar data de expiração",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Esta ação não pode ser desfeita. Qualquer aplicação usando esta chave API deixará de funcionar.",
+ "Update API key": "Atualizar chave API",
+ "Manage API keys for all users in the workspace": "Gerenciar chaves API para todos os usuários no espaço de trabalho",
+ "AI settings": "Configurações de IA",
+ "AI search": "Pesquisa IA",
+ "AI Answer": "Resposta de IA",
+ "Ask AI": "Pergunte à IA",
+ "AI is thinking...": "IA está pensando...",
+ "Ask a question...": "Faça uma pergunta...",
+ "AI-powered search (Ask AI)": "Pesquisa com IA (Pergunte à IA)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "A pesquisa IA usa vetores de incorporação para fornecer capacidades de pesquisa semântica em todo o conteúdo do seu espaço de trabalho.",
+ "Toggle AI search": "Alternar pesquisa de IA",
+ "Sources": "Fontes",
+ "Ask AI not available for attachments": "Perguntar à IA não está disponível para anexos",
+ "No answer available": "Nenhuma resposta disponível",
+ "Background color": "Cor de fundo",
+ "Highlight color": "Cor de destaque",
+ "Remove color": "Remover cor"
}
diff --git a/apps/client/public/locales/ru-RU/translation.json b/apps/client/public/locales/ru-RU/translation.json
index fab5389e..f1a9cd85 100644
--- a/apps/client/public/locales/ru-RU/translation.json
+++ b/apps/client/public/locales/ru-RU/translation.json
@@ -498,10 +498,10 @@
"Deleted at": "Удалено в",
"Preview": "Предпросмотр",
"Subpages": "Подстраницы",
- "Failed to load subpages": "Не удалось загрузить подстраницы",
+ "Failed to load subpages": "Не удалось загрузить под страницы",
"No subpages": "Нет подстраниц",
"Subpages (Child pages)": "Подстраницы (вложенные страницы)",
- "List all subpages of the current page": "Показать все подстраницы текущей страницы",
+ "List all subpages of the current page": "Показать все под страницы",
"Attachments": "Вложения",
"All spaces": "Все пространства",
"Unknown": "Неизвестно",
@@ -527,5 +527,47 @@
"Delete SSO provider": "Удалить поставщика SSO",
"Are you sure you want to delete this SSO provider?": "Вы уверены, что хотите удалить этого поставщика SSO?",
"Action": "Действие",
- "{{ssoProviderType}} configuration": "Настройка {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Настройка {{ssoProviderType}}",
+ "Icon": "Иконка",
+ "Upload image": "Загрузить изображение",
+ "Remove image": "Удалить изображение",
+ "Failed to remove image": "Не удалось удалить изображение",
+ "Image exceeds 10MB limit.": "Изображение превышает предел 10MB.",
+ "Image removed successfully": "Изображение успешно удалено",
+ "API key": "API ключ",
+ "API key created successfully": "API ключ успешно создан",
+ "API keys": "API ключи",
+ "API management": "Управление API",
+ "Are you sure you want to revoke this API key": "Вы уверены, что хотите отозвать этот API ключ",
+ "Create API Key": "Создать API ключ",
+ "Custom expiration date": "Пользовательская дата срока действия",
+ "Enter a descriptive token name": "Введите понятное имя токена",
+ "Expiration": "Срок действия",
+ "Expired": "Истек",
+ "Expires": "Истекает",
+ "I've saved my API key": "Я сохранил мой API ключ",
+ "Last use": "Последнее использование",
+ "No API keys found": "API ключи не найдены",
+ "No expiration": "Не истекает",
+ "Revoke API key": "Отозвать API ключ",
+ "Revoked successfully": "Отозван успешно",
+ "Select expiration date": "Выберете срок действия",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Это действие необратимо. Любые приложения, использующие этот API ключ, перестанут работать.",
+ "Update API key": "Обновить API ключ",
+ "Manage API keys for all users in the workspace": "Управлять API ключами для всех пользователей в рабочей области",
+ "AI settings": "Настройки ИИ",
+ "AI search": "Поиск ИИ",
+ "AI Answer": "Ответ ИИ",
+ "Ask AI": "Спросить ИИ",
+ "AI is thinking...": "ИИ обрабатывает запрос...",
+ "Ask a question...": "Задайте вопрос...",
+ "AI-powered search (Ask AI)": "Поиск на базе ИИ (Спросить ИИ)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Поиск ИИ использует векторные встраивания для обеспечения семантического поиска по содержимому вашего рабочего пространства.",
+ "Toggle AI search": "Переключить поиск ИИ",
+ "Sources": "Источники",
+ "Ask AI not available for attachments": "Функция \"Спросить ИИ\" недоступна для вложений",
+ "No answer available": "Ответ недоступен",
+ "Background color": "Цвет фона",
+ "Highlight color": "Цвет выделения",
+ "Remove color": "Удалить цвет"
}
diff --git a/apps/client/public/locales/uk-UA/translation.json b/apps/client/public/locales/uk-UA/translation.json
index e6d5427f..2fb44ad1 100644
--- a/apps/client/public/locales/uk-UA/translation.json
+++ b/apps/client/public/locales/uk-UA/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "Видалити постачальника SSO",
"Are you sure you want to delete this SSO provider?": "Ви впевнені, що хочете видалити цього постачальника SSO?",
"Action": "Дія",
- "{{ssoProviderType}} configuration": "Конфігурація {{ssoProviderType}}"
+ "{{ssoProviderType}} configuration": "Конфігурація {{ssoProviderType}}",
+ "Icon": "Іконка",
+ "Upload image": "Завантажити зображення",
+ "Remove image": "Видалити зображення",
+ "Failed to remove image": "Не вдалося видалити зображення",
+ "Image exceeds 10MB limit.": "Зображення має займати менше, ніж 10 МБ.",
+ "Image removed successfully": "Зображення видалено",
+ "API key": "Ключ API",
+ "API key created successfully": "Ключ API успішно створено",
+ "API keys": "Ключі API",
+ "API management": "Управління API",
+ "Are you sure you want to revoke this API key": "Ви впевнені, що хочете відкликати цей ключ API",
+ "Create API Key": "Створити ключ API",
+ "Custom expiration date": "Користувацька дата закінчення",
+ "Enter a descriptive token name": "Введіть описову назву токена",
+ "Expiration": "Термін дії",
+ "Expired": "Закінчився",
+ "Expires": "Закінчується",
+ "I've saved my API key": "Я зберіг свій ключ API",
+ "Last use": "Останнє використання",
+ "No API keys found": "Ключі API не знайдено",
+ "No expiration": "Без терміну дії",
+ "Revoke API key": "Відкликати ключ API",
+ "Revoked successfully": "Успішно відкликано",
+ "Select expiration date": "Виберіть дату закінчення",
+ "This action cannot be undone. Any applications using this API key will stop working.": "Цю дію не можна скасувати. Будь-які додатки, що використовують цей ключ API, перестануть працювати.",
+ "Update API key": "Оновити ключ API",
+ "Manage API keys for all users in the workspace": "Керувати ключами API для всіх користувачів у робочій області",
+ "AI settings": "Налаштування ШІ",
+ "AI search": "Пошук з ШІ",
+ "AI Answer": "Відповідь ШІ",
+ "Ask AI": "Запитати ШІ",
+ "AI is thinking...": "ШІ думає...",
+ "Ask a question...": "Задайте питання...",
+ "AI-powered search (Ask AI)": "Пошук на базі ШІ (Запитати ШІ)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Пошук з ШІ використовує векторні вбудовування для надання можливостей семантичного пошуку у вашому робочому вмісті.",
+ "Toggle AI search": "Переключити пошук з ШІ",
+ "Sources": "Джерела",
+ "Ask AI not available for attachments": "Запитати ШІ недоступно для вкладень",
+ "No answer available": "Відповідь недоступна",
+ "Background color": "Колір фону",
+ "Highlight color": "Колір підсвічування",
+ "Remove color": "Видалити колір"
}
diff --git a/apps/client/public/locales/zh-CN/translation.json b/apps/client/public/locales/zh-CN/translation.json
index 33373155..d4b25deb 100644
--- a/apps/client/public/locales/zh-CN/translation.json
+++ b/apps/client/public/locales/zh-CN/translation.json
@@ -527,5 +527,47 @@
"Delete SSO provider": "删除SSO提供商",
"Are you sure you want to delete this SSO provider?": "您确定要删除此SSO提供商吗?",
"Action": "操作",
- "{{ssoProviderType}} configuration": "{{ssoProviderType}} 配置"
+ "{{ssoProviderType}} configuration": "{{ssoProviderType}} 配置",
+ "Icon": "图标",
+ "Upload image": "上传图片",
+ "Remove image": "删除图片",
+ "Failed to remove image": "无法删除图片",
+ "Image exceeds 10MB limit.": "图片超过10MB限制。",
+ "Image removed successfully": "图片删除成功",
+ "API key": "API密钥",
+ "API key created successfully": "API密钥创建成功",
+ "API keys": "API密钥",
+ "API management": "API管理",
+ "Are you sure you want to revoke this API key": "确定要撤销此API密钥吗",
+ "Create API Key": "创建API密钥",
+ "Custom expiration date": "自定义到期日期",
+ "Enter a descriptive token name": "输入描述性令牌名称",
+ "Expiration": "到期",
+ "Expired": "已过期",
+ "Expires": "到期",
+ "I've saved my API key": "我已保存我的API密钥",
+ "Last use": "上次使用",
+ "No API keys found": "找不到API密钥",
+ "No expiration": "无到期",
+ "Revoke API key": "撤销API密钥",
+ "Revoked successfully": "撤销成功",
+ "Select expiration date": "选择到期日期",
+ "This action cannot be undone. Any applications using this API key will stop working.": "此操作无法撤销。使用此API密钥的任何应用程序将停止工作。",
+ "Update API key": "更新API密钥",
+ "Manage API keys for all users in the workspace": "管理工作空间中所有用户的API密钥",
+ "AI settings": "AI设置",
+ "AI search": "AI搜索",
+ "AI Answer": "AI回答",
+ "Ask AI": "询问AI",
+ "AI is thinking...": "AI正在思考...",
+ "Ask a question...": "提问...",
+ "AI-powered search (Ask AI)": "AI驱动的搜索(询问AI)",
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI搜索使用向量嵌入提供跨工作空间内容的语义搜索功能。",
+ "Toggle AI search": "切换AI搜索",
+ "Sources": "来源",
+ "Ask AI not available for attachments": "附件不支持询问AI",
+ "No answer available": "无可用答案",
+ "Background color": "背景颜色",
+ "Highlight color": "突出显示颜色",
+ "Remove color": "移除颜色"
}
diff --git a/apps/client/src/App.tsx b/apps/client/src/App.tsx
index 3995191d..e0df67a7 100644
--- a/apps/client/src/App.tsx
+++ b/apps/client/src/App.tsx
@@ -35,6 +35,9 @@ import SpacesPage from "@/pages/spaces/spaces.tsx";
import { MfaChallengePage } from "@/ee/mfa/pages/mfa-challenge-page";
import { MfaSetupRequiredPage } from "@/ee/mfa/pages/mfa-setup-required-page";
import SpaceTrash from "@/pages/space/space-trash.tsx";
+import UserApiKeys from "@/ee/api-key/pages/user-api-keys";
+import WorkspaceApiKeys from "@/ee/api-key/pages/workspace-api-keys";
+import AiSettings from "@/ee/ai/pages/ai-settings.tsx";
export default function App() {
const { t } = useTranslation();
@@ -96,13 +99,16 @@ export default function App() {
path={"account/preferences"}
element={ }
/>
+ } />
} />
} />
+ } />
} />
} />
} />
} />
} />
+ } />
{!isCloud() && } />}
{isCloud() && } />}
diff --git a/apps/client/src/components/common/no-table-results.tsx b/apps/client/src/components/common/no-table-results.tsx
index 124bbb9b..0f34fa2f 100644
--- a/apps/client/src/components/common/no-table-results.tsx
+++ b/apps/client/src/components/common/no-table-results.tsx
@@ -4,14 +4,15 @@ import { useTranslation } from "react-i18next";
interface NoTableResultsProps {
colSpan: number;
+ text?: string;
}
-export default function NoTableResults({ colSpan }: NoTableResultsProps) {
+export default function NoTableResults({ colSpan, text }: NoTableResultsProps) {
const { t } = useTranslation();
return (
- {t("No results found...")}
+ {text || t("No results found...")}
diff --git a/apps/client/src/components/settings/settings-queries.tsx b/apps/client/src/components/settings/settings-queries.tsx
index 2f3b46bd..bc528466 100644
--- a/apps/client/src/components/settings/settings-queries.tsx
+++ b/apps/client/src/components/settings/settings-queries.tsx
@@ -10,6 +10,7 @@ import { getWorkspaceMembers } from "@/features/workspace/services/workspace-ser
import { getLicenseInfo } from "@/ee/licence/services/license-service.ts";
import { getSsoProviders } from "@/ee/security/services/security-service.ts";
import { getShares } from "@/features/share/services/share-service.ts";
+import { getApiKeys } from "@/ee/api-key";
export const prefetchWorkspaceMembers = () => {
const params = { limit: 100, page: 1, query: "" } as QueryParams;
@@ -65,3 +66,17 @@ export const prefetchShares = () => {
queryFn: () => getShares({ page: 1, limit: 100 }),
});
};
+
+export const prefetchApiKeys = () => {
+ queryClient.prefetchQuery({
+ queryKey: ["api-key-list", { page: 1 }],
+ queryFn: () => getApiKeys({ page: 1 }),
+ });
+};
+
+export const prefetchApiKeyManagement = () => {
+ queryClient.prefetchQuery({
+ queryKey: ["api-key-list", { page: 1 }],
+ queryFn: () => getApiKeys({ page: 1, adminView: true }),
+ });
+};
diff --git a/apps/client/src/components/settings/settings-sidebar.tsx b/apps/client/src/components/settings/settings-sidebar.tsx
index fe0c7e88..75e5a7af 100644
--- a/apps/client/src/components/settings/settings-sidebar.tsx
+++ b/apps/client/src/components/settings/settings-sidebar.tsx
@@ -12,15 +12,18 @@ import {
IconLock,
IconKey,
IconWorld,
+ IconSparkles,
} from "@tabler/icons-react";
import { Link, useLocation } from "react-router-dom";
import classes from "./settings.module.css";
import { useTranslation } from "react-i18next";
import { isCloud } from "@/lib/config.ts";
import useUserRole from "@/hooks/use-user-role.tsx";
-import { useAtom } from "jotai/index";
+import { useAtom } from "jotai";
import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts";
import {
+ prefetchApiKeyManagement,
+ prefetchApiKeys,
prefetchBilling,
prefetchGroups,
prefetchLicense,
@@ -60,6 +63,14 @@ const groupedData: DataGroup[] = [
icon: IconBrush,
path: "/settings/account/preferences",
},
+ {
+ label: "API keys",
+ icon: IconKey,
+ path: "/settings/account/api-keys",
+ isCloud: true,
+ isEnterprise: true,
+ showDisabledInNonEE: true,
+ },
],
},
{
@@ -90,6 +101,22 @@ const groupedData: DataGroup[] = [
{ label: "Groups", icon: IconUsersGroup, path: "/settings/groups" },
{ label: "Spaces", icon: IconSpaces, path: "/settings/spaces" },
{ label: "Public sharing", icon: IconWorld, path: "/settings/sharing" },
+ {
+ label: "API management",
+ icon: IconKey,
+ path: "/settings/api-keys",
+ isCloud: true,
+ isEnterprise: true,
+ isAdmin: true,
+ showDisabledInNonEE: true,
+ },
+ {
+ label: "AI settings",
+ icon: IconSparkles,
+ path: "/settings/ai",
+ isAdmin: true,
+ isSelfhosted: true,
+ },
],
},
{
@@ -195,6 +222,12 @@ export default function SettingsSidebar() {
case "Public sharing":
prefetchHandler = prefetchShares;
break;
+ case "API keys":
+ prefetchHandler = prefetchApiKeys;
+ break;
+ case "API management":
+ prefetchHandler = prefetchApiKeyManagement;
+ break;
default:
break;
}
diff --git a/apps/client/src/ee/ai/components/ai-search-result.tsx b/apps/client/src/ee/ai/components/ai-search-result.tsx
new file mode 100644
index 00000000..f082f25a
--- /dev/null
+++ b/apps/client/src/ee/ai/components/ai-search-result.tsx
@@ -0,0 +1,113 @@
+import React, { useMemo } from "react";
+import { Paper, Text, Group, Stack, Loader, Box } from "@mantine/core";
+import { IconSparkles, IconFileText } from "@tabler/icons-react";
+import { Link } from "react-router-dom";
+import { IAiSearchResponse } from "../services/ai-search-service.ts";
+import { buildPageUrl } from "@/features/page/page.utils.ts";
+import { markdownToHtml } from "@docmost/editor-ext";
+import DOMPurify from "dompurify";
+import { useTranslation } from "react-i18next";
+
+interface AiSearchResultProps {
+ result?: IAiSearchResponse;
+ isLoading?: boolean;
+ streamingAnswer?: string;
+ streamingSources?: any[];
+}
+
+export function AiSearchResult({
+ result,
+ isLoading,
+ streamingAnswer = "",
+ streamingSources = [],
+}: AiSearchResultProps) {
+ const { t } = useTranslation();
+
+ // Use streaming data if available, otherwise fall back to result
+ const answer = streamingAnswer || result?.answer || "";
+ const sources =
+ streamingSources.length > 0 ? streamingSources : result?.sources || [];
+
+ // Deduplicate sources by pageId, keeping the one with highest similarity
+ const deduplicatedSources = useMemo(() => {
+ if (!sources || sources.length === 0) return [];
+
+ const pageMap = new Map();
+ sources.forEach((source) => {
+ const existing = pageMap.get(source.pageId);
+ if (!existing || source.similarity > existing.similarity) {
+ pageMap.set(source.pageId, source);
+ }
+ });
+
+ return Array.from(pageMap.values());
+ }, [sources]);
+
+ if (isLoading && !answer) {
+ return (
+
+
+
+ {t("AI is thinking...")}
+
+
+ );
+ }
+
+ if (!answer && !isLoading) {
+ return null;
+ }
+
+ return (
+
+
+
+
+
+ {t("AI Answer")}
+
+ {isLoading && }
+
+
+
+
+ {deduplicatedSources.length > 0 && (
+
+
+ {t("Sources")}
+
+ {deduplicatedSources.map((source) => (
+
+
+
+
+
+ {source.title}
+
+
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/apps/client/src/ee/ai/components/enable-ai-search.tsx b/apps/client/src/ee/ai/components/enable-ai-search.tsx
new file mode 100644
index 00000000..53b0a9bd
--- /dev/null
+++ b/apps/client/src/ee/ai/components/enable-ai-search.tsx
@@ -0,0 +1,69 @@
+import { Group, Text, Switch, MantineSize, Title } from "@mantine/core";
+import { useAtom } from "jotai";
+import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts";
+import React, { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts";
+import { notifications } from "@mantine/notifications";
+import { isCloud } from "@/lib/config.ts";
+import useLicense from "@/ee/hooks/use-license.tsx";
+
+export default function EnableAiSearch() {
+ const { t } = useTranslation();
+
+ return (
+ <>
+
+
+ {t("AI-powered search (Ask AI)")}
+
+ {t(
+ "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.",
+ )}
+
+
+
+
+
+ >
+ );
+}
+
+interface AiSearchToggleProps {
+ size?: MantineSize;
+ label?: string;
+}
+export function AiSearchToggle({ size, label }: AiSearchToggleProps) {
+ const { t } = useTranslation();
+ const [workspace, setWorkspace] = useAtom(workspaceAtom);
+ const [checked, setChecked] = useState(workspace?.settings?.ai?.search);
+ const { hasLicenseKey } = useLicense();
+
+ const hasAccess = isCloud() || (!isCloud() && hasLicenseKey);
+
+ const handleChange = async (event: React.ChangeEvent) => {
+ const value = event.currentTarget.checked;
+ try {
+ const updatedWorkspace = await updateWorkspace({ aiSearch: value });
+ setChecked(value);
+ setWorkspace(updatedWorkspace);
+ } catch (err) {
+ notifications.show({
+ message: err?.response?.data?.message,
+ color: "red",
+ });
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/client/src/ee/ai/hooks/use-ai-search.ts b/apps/client/src/ee/ai/hooks/use-ai-search.ts
new file mode 100644
index 00000000..f9c5aa88
--- /dev/null
+++ b/apps/client/src/ee/ai/hooks/use-ai-search.ts
@@ -0,0 +1,46 @@
+import { useMutation, UseMutationResult } from "@tanstack/react-query";
+import { useState, useCallback } from "react";
+import { askAi, IAiSearchResponse } from "@/ee/ai/services/ai-search-service.ts";
+import { IPageSearchParams } from "@/features/search/types/search.types.ts";
+
+// @ts-ignore
+interface UseAiSearchResult extends UseMutationResult {
+ streamingAnswer: string;
+ streamingSources: any[];
+ clearStreaming: () => void;
+}
+
+export function useAiSearch(): UseAiSearchResult {
+ const [streamingAnswer, setStreamingAnswer] = useState("");
+ const [streamingSources, setStreamingSources] = useState([]);
+
+ const clearStreaming = useCallback(() => {
+ setStreamingAnswer("");
+ setStreamingSources([]);
+ }, []);
+
+ const mutation = useMutation({
+ mutationFn: async (params: IPageSearchParams & { contentType?: string }) => {
+ setStreamingAnswer("");
+ setStreamingSources([]);
+
+ const { contentType, ...apiParams } = params;
+
+ return await askAi(apiParams, (chunk) => {
+ if (chunk.content) {
+ setStreamingAnswer((prev) => prev + chunk.content);
+ }
+ if (chunk.sources) {
+ setStreamingSources(chunk.sources);
+ }
+ });
+ },
+ });
+
+ return {
+ ...mutation,
+ streamingAnswer,
+ streamingSources,
+ clearStreaming,
+ };
+}
diff --git a/apps/client/src/ee/ai/hooks/use-ai.ts b/apps/client/src/ee/ai/hooks/use-ai.ts
new file mode 100644
index 00000000..40c1ca12
--- /dev/null
+++ b/apps/client/src/ee/ai/hooks/use-ai.ts
@@ -0,0 +1,61 @@
+import { useState, useCallback, useRef } from "react";
+import { useAiGenerateStreamMutation } from "@/ee/ai/queries/ai-query.ts";
+import { AiGenerateDto } from "@/ee/ai/types/ai.types.ts";
+
+export function useAiStream() {
+ const [content, setContent] = useState("");
+ const [isStreaming, setIsStreaming] = useState(false);
+ const abortControllerRef = useRef(null);
+ const mutation = useAiGenerateStreamMutation();
+
+ const startStream = useCallback(
+ async (data: AiGenerateDto) => {
+ setContent("");
+ setIsStreaming(true);
+
+ try {
+ const controller = await mutation.mutateAsync({
+ ...data,
+ onChunk: (chunk) => {
+ setContent((prev) => prev + chunk.content);
+ },
+ onError: (error) => {
+ console.error("AI stream error:", error);
+ setIsStreaming(false);
+ },
+ onComplete: () => {
+ setIsStreaming(false);
+ },
+ });
+
+ abortControllerRef.current = controller;
+ } catch (error) {
+ console.error("Failed to start stream:", error);
+ setIsStreaming(false);
+ }
+ },
+ [mutation]
+ );
+
+ const stopStream = useCallback(() => {
+ if (abortControllerRef.current) {
+ abortControllerRef.current.abort();
+ abortControllerRef.current = null;
+ setIsStreaming(false);
+ }
+ }, []);
+
+ const resetContent = useCallback(() => {
+ setContent("");
+ }, []);
+
+ return {
+ content,
+ isStreaming,
+ startStream,
+ stopStream,
+ resetContent,
+ isLoading: mutation.isPending,
+ error: mutation.error,
+ };
+}
\ No newline at end of file
diff --git a/apps/client/src/ee/ai/pages/ai-settings.tsx b/apps/client/src/ee/ai/pages/ai-settings.tsx
new file mode 100644
index 00000000..b9ab516d
--- /dev/null
+++ b/apps/client/src/ee/ai/pages/ai-settings.tsx
@@ -0,0 +1,46 @@
+import { Helmet } from "react-helmet-async";
+import { getAppName, isCloud } from "@/lib/config.ts";
+import SettingsTitle from "@/components/settings/settings-title.tsx";
+import React from "react";
+import useUserRole from "@/hooks/use-user-role.tsx";
+import { useTranslation } from "react-i18next";
+import useLicense from "@/ee/hooks/use-license.tsx";
+import EnableAiSearch from "@/ee/ai/components/enable-ai-search.tsx";
+import { Alert } from "@mantine/core";
+import { IconInfoCircle } from "@tabler/icons-react";
+
+export default function AiSettings() {
+ const { t } = useTranslation();
+ const { isAdmin } = useUserRole();
+ const { hasLicenseKey } = useLicense();
+
+ if (!isAdmin) {
+ return null;
+ }
+
+ const hasAccess = isCloud() || (!isCloud() && hasLicenseKey);
+
+ return (
+ <>
+
+ AI - {getAppName()}
+
+
+
+ {!hasAccess && (
+ }
+ title={t("Enterprise feature")}
+ color="blue"
+ mb="lg"
+ >
+ {t(
+ "AI is only available in the Docmost enterprise edition. Contact sales@docmost.com.",
+ )}
+
+ )}
+
+
+ >
+ );
+}
diff --git a/apps/client/src/ee/ai/queries/ai-query.ts b/apps/client/src/ee/ai/queries/ai-query.ts
new file mode 100644
index 00000000..076de9c7
--- /dev/null
+++ b/apps/client/src/ee/ai/queries/ai-query.ts
@@ -0,0 +1,44 @@
+import {
+ useMutation,
+ UseMutationResult,
+ useQuery,
+ UseQueryResult,
+} from "@tanstack/react-query";
+import {
+ generateAiContent,
+ generateAiContentStream,
+} from "@/ee/ai/services/ai-service.ts";
+import {
+ AiConfigResponse,
+ AiContentResponse,
+ AiGenerateDto,
+ AiStreamChunk,
+ AiStreamError,
+} from "@/ee/ai/types/ai.types.ts";
+
+export function useAiGenerateMutation(): UseMutationResult<
+ AiContentResponse,
+ Error,
+ AiGenerateDto
+> {
+ return useMutation({
+ mutationFn: (data: AiGenerateDto) => generateAiContent(data),
+ });
+}
+
+interface StreamCallbacks {
+ onChunk: (chunk: AiStreamChunk) => void;
+ onError?: (error: AiStreamError) => void;
+ onComplete?: () => void;
+}
+
+export function useAiGenerateStreamMutation(): UseMutationResult<
+ AbortController,
+ Error,
+ AiGenerateDto & StreamCallbacks
+> {
+ return useMutation({
+ mutationFn: ({ onChunk, onError, onComplete, ...data }) =>
+ generateAiContentStream(data, onChunk, onError, onComplete),
+ });
+}
diff --git a/apps/client/src/ee/ai/services/ai-search-service.ts b/apps/client/src/ee/ai/services/ai-search-service.ts
new file mode 100644
index 00000000..0254f5b2
--- /dev/null
+++ b/apps/client/src/ee/ai/services/ai-search-service.ts
@@ -0,0 +1,79 @@
+import api from "@/lib/api-client.ts";
+import { IPageSearchParams } from "@/features/search/types/search.types.ts";
+
+export interface IAiSearchResponse {
+ answer: string;
+ sources?: Array<{
+ pageId: string;
+ title: string;
+ slugId: string;
+ spaceSlug: string;
+ similarity: number;
+ distance: number;
+ chunkIndex: number;
+ excerpt: string;
+ }>;
+}
+
+export async function askAi(
+ params: IPageSearchParams,
+ onChunk?: (chunk: { content?: string; sources?: any[] }) => void,
+): Promise {
+ const response = await fetch("/api/ai/ask", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ credentials: "include",
+ body: JSON.stringify(params),
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const reader = response.body?.getReader();
+ const decoder = new TextDecoder();
+
+ let answer = "";
+ let sources: any[] = [];
+
+ if (reader) {
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+
+ const chunk = decoder.decode(value);
+ const lines = chunk.split("\n");
+
+ for (const line of lines) {
+ if (line.startsWith("data: ")) {
+ const data = line.slice(6);
+ if (data === "[DONE]") break;
+
+ try {
+ const parsed = JSON.parse(data);
+ if (parsed.error) {
+ throw new Error(parsed.error);
+ }
+ if (parsed.content) {
+ answer += parsed.content;
+ onChunk?.({ content: parsed.content });
+ }
+ if (parsed.sources) {
+ sources = parsed.sources;
+ onChunk?.({ sources: parsed.sources });
+ }
+ } catch (e) {
+ if (e instanceof Error) {
+ throw e;
+ }
+ // Skip invalid JSON
+ }
+ }
+ }
+ }
+ }
+
+ return { answer, sources };
+}
diff --git a/apps/client/src/ee/ai/services/ai-service.ts b/apps/client/src/ee/ai/services/ai-service.ts
new file mode 100644
index 00000000..f3634d59
--- /dev/null
+++ b/apps/client/src/ee/ai/services/ai-service.ts
@@ -0,0 +1,89 @@
+import api from "@/lib/api-client.ts";
+import {
+ AiGenerateDto,
+ AiContentResponse,
+ AiStreamChunk,
+ AiStreamError,
+} from "@/ee/ai/types/ai.types.ts";
+
+export async function generateAiContent(
+ data: AiGenerateDto,
+): Promise {
+ const req = await api.post("/ai/generate", data);
+ return req.data;
+}
+
+export async function generateAiContentStream(
+ data: AiGenerateDto,
+ onChunk: (chunk: AiStreamChunk) => void,
+ onError?: (error: AiStreamError) => void,
+ onComplete?: () => void,
+): Promise {
+ const abortController = new AbortController();
+ try {
+ const response = await fetch("/api/ai/generate/stream", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ signal: abortController.signal,
+ credentials: "include", // This ensures cookies are sent, matching axios withCredentials
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const reader = response.body?.getReader();
+ const decoder = new TextDecoder();
+
+ if (!reader) {
+ throw new Error("Response body is not readable");
+ }
+
+ const processStream = async () => {
+ try {
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+
+ const chunk = decoder.decode(value, { stream: true });
+ const lines = chunk.split("\n");
+
+ for (const line of lines) {
+ if (line.startsWith("data: ")) {
+ const data = line.slice(6);
+ if (data === "[DONE]") {
+ onComplete?.();
+ return;
+ }
+ try {
+ const parsed = JSON.parse(data);
+ if (parsed.error) {
+ onError?.(parsed);
+ } else {
+ onChunk(parsed);
+ }
+ } catch (e) {
+ // Ignore parse errors for incomplete chunks
+ }
+ }
+ }
+ }
+ } catch (error) {
+ if (error.name !== "AbortError") {
+ onError?.({ error: error.message });
+ }
+ } finally {
+ reader.releaseLock();
+ }
+ };
+
+ processStream();
+ } catch (error) {
+ onError?.({ error: error.message });
+ }
+
+ return abortController;
+}
diff --git a/apps/client/src/ee/ai/types/ai.types.ts b/apps/client/src/ee/ai/types/ai.types.ts
new file mode 100644
index 00000000..a5fbc253
--- /dev/null
+++ b/apps/client/src/ee/ai/types/ai.types.ts
@@ -0,0 +1,40 @@
+export enum AiAction {
+ IMPROVE_WRITING = "improve_writing",
+ FIX_SPELLING_GRAMMAR = "fix_spelling_grammar",
+ MAKE_SHORTER = "make_shorter",
+ MAKE_LONGER = "make_longer",
+ SIMPLIFY = "simplify",
+ CHANGE_TONE = "change_tone",
+ SUMMARIZE = "summarize",
+ CONTINUE_WRITING = "continue_writing",
+ TRANSLATE = "translate",
+ CUSTOM = "custom",
+}
+
+export interface AiGenerateDto {
+ action?: AiAction;
+ content: string;
+ prompt?: string;
+}
+
+export interface AiContentResponse {
+ content: string;
+ usage?: {
+ promptTokens: number;
+ completionTokens: number;
+ totalTokens: number;
+ };
+}
+
+export interface AiConfigResponse {
+ configured: boolean;
+ availableActions: AiAction[];
+}
+
+export interface AiStreamChunk {
+ content: string;
+}
+
+export interface AiStreamError {
+ error: string;
+}
diff --git a/apps/client/src/ee/api-key/components/api-key-created-modal.tsx b/apps/client/src/ee/api-key/components/api-key-created-modal.tsx
new file mode 100644
index 00000000..6a01ee3c
--- /dev/null
+++ b/apps/client/src/ee/api-key/components/api-key-created-modal.tsx
@@ -0,0 +1,72 @@
+import {
+ Modal,
+ Text,
+ Stack,
+ Alert,
+ Group,
+ Button,
+ TextInput,
+} from "@mantine/core";
+import { IconAlertTriangle } from "@tabler/icons-react";
+import { useTranslation } from "react-i18next";
+import { IApiKey } from "@/ee/api-key";
+import CopyTextButton from "@/components/common/copy.tsx";
+
+interface ApiKeyCreatedModalProps {
+ opened: boolean;
+ onClose: () => void;
+ apiKey: IApiKey;
+}
+
+export function ApiKeyCreatedModal({
+ opened,
+ onClose,
+ apiKey,
+}: ApiKeyCreatedModalProps) {
+ const { t } = useTranslation();
+
+ if (!apiKey) return null;
+
+ return (
+
+
+ }
+ title={t("Important")}
+ color="red"
+ >
+ {t(
+ "Make sure to copy your API key now. You won't be able to see it again!",
+ )}
+
+
+
+
+ {t("API key")}
+
+
+
+
+
+
+
+
+
+ {t("I've saved my API key")}
+
+
+
+ );
+}
diff --git a/apps/client/src/ee/api-key/components/api-key-table.tsx b/apps/client/src/ee/api-key/components/api-key-table.tsx
new file mode 100644
index 00000000..48757acc
--- /dev/null
+++ b/apps/client/src/ee/api-key/components/api-key-table.tsx
@@ -0,0 +1,143 @@
+import { ActionIcon, Group, Menu, Table, Text } from "@mantine/core";
+import { IconDots, IconEdit, IconTrash } from "@tabler/icons-react";
+import { format } from "date-fns";
+import { useTranslation } from "react-i18next";
+import { IApiKey } from "@/ee/api-key";
+import { CustomAvatar } from "@/components/ui/custom-avatar.tsx";
+import React from "react";
+import NoTableResults from "@/components/common/no-table-results";
+
+interface ApiKeyTableProps {
+ apiKeys: IApiKey[];
+ isLoading?: boolean;
+ showUserColumn?: boolean;
+ onUpdate?: (apiKey: IApiKey) => void;
+ onRevoke?: (apiKey: IApiKey) => void;
+}
+
+export function ApiKeyTable({
+ apiKeys,
+ isLoading,
+ showUserColumn = false,
+ onUpdate,
+ onRevoke,
+}: ApiKeyTableProps) {
+ const { t } = useTranslation();
+
+ const formatDate = (date: Date | string | null) => {
+ if (!date) return t("Never");
+ return format(new Date(date), "MMM dd, yyyy");
+ };
+
+ const isExpired = (expiresAt: string | null) => {
+ if (!expiresAt) return false;
+ return new Date(expiresAt) < new Date();
+ };
+
+ return (
+
+
+
+
+ {t("Name")}
+ {showUserColumn && {t("User")} }
+ {t("Last used")}
+ {t("Expires")}
+ {t("Created")}
+
+
+
+
+
+ {apiKeys && apiKeys.length > 0 ? (
+ apiKeys.map((apiKey: IApiKey, index: number) => (
+
+
+
+ {apiKey.name}
+
+
+
+ {showUserColumn && apiKey.creator && (
+
+
+
+
+ {apiKey.creator.name}
+
+
+
+ )}
+
+
+
+ {formatDate(apiKey.lastUsedAt)}
+
+
+
+
+ {apiKey.expiresAt ? (
+ isExpired(apiKey.expiresAt) ? (
+
+ {t("Expired")}
+
+ ) : (
+
+ {formatDate(apiKey.expiresAt)}
+
+ )
+ ) : (
+
+ {t("Never")}
+
+ )}
+
+
+
+
+ {formatDate(apiKey.createdAt)}
+
+
+
+
+
+
+
+
+
+
+
+ {onUpdate && (
+ }
+ onClick={() => onUpdate(apiKey)}
+ >
+ {t("Rename")}
+
+ )}
+ {onRevoke && (
+ }
+ color="red"
+ onClick={() => onRevoke(apiKey)}
+ >
+ {t("Revoke")}
+
+ )}
+
+
+
+
+ ))
+ ) : (
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/client/src/ee/api-key/components/create-api-key-modal.tsx b/apps/client/src/ee/api-key/components/create-api-key-modal.tsx
new file mode 100644
index 00000000..cade36e8
--- /dev/null
+++ b/apps/client/src/ee/api-key/components/create-api-key-modal.tsx
@@ -0,0 +1,153 @@
+import { lazy, Suspense, useState } from "react";
+import { Modal, TextInput, Button, Group, Stack, Select } from "@mantine/core";
+import { useForm } from "@mantine/form";
+import { zodResolver } from "mantine-form-zod-resolver";
+import { z } from "zod";
+import { useTranslation } from "react-i18next";
+import { useCreateApiKeyMutation } from "@/ee/api-key/queries/api-key-query";
+import { IconCalendar } from "@tabler/icons-react";
+import { IApiKey } from "@/ee/api-key";
+
+const DateInput = lazy(() =>
+ import("@mantine/dates").then((module) => ({
+ default: module.DateInput,
+ })),
+);
+
+interface CreateApiKeyModalProps {
+ opened: boolean;
+ onClose: () => void;
+ onSuccess: (response: IApiKey) => void;
+}
+
+const formSchema = z.object({
+ name: z.string().min(1, "Name is required"),
+ expiresAt: z.string().optional(),
+});
+type FormValues = z.infer;
+
+export function CreateApiKeyModal({
+ opened,
+ onClose,
+ onSuccess,
+}: CreateApiKeyModalProps) {
+ const { t } = useTranslation();
+ const [expirationOption, setExpirationOption] = useState("30");
+ const createApiKeyMutation = useCreateApiKeyMutation();
+
+ const form = useForm({
+ validate: zodResolver(formSchema),
+ initialValues: {
+ name: "",
+ expiresAt: "",
+ },
+ });
+
+ const getExpirationDate = (): string | undefined => {
+ if (expirationOption === "never") {
+ return undefined;
+ }
+ if (expirationOption === "custom") {
+ return form.values.expiresAt;
+ }
+ const days = parseInt(expirationOption);
+ const date = new Date();
+ date.setDate(date.getDate() + days);
+ return date.toISOString();
+ };
+
+ const getExpirationLabel = (days: number) => {
+ const date = new Date();
+ date.setDate(date.getDate() + days);
+ const formatted = date.toLocaleDateString("en-US", {
+ month: "short",
+ day: "2-digit",
+ year: "numeric",
+ });
+ return `${days} days (${formatted})`;
+ };
+
+ const expirationOptions = [
+ { value: "30", label: getExpirationLabel(30) },
+ { value: "60", label: getExpirationLabel(60) },
+ { value: "90", label: getExpirationLabel(90) },
+ { value: "365", label: getExpirationLabel(365) },
+ { value: "custom", label: t("Custom") },
+ { value: "never", label: t("No expiration") },
+ ];
+
+ const handleSubmit = async (data: {
+ name?: string;
+ expiresAt?: string | Date;
+ }) => {
+ const groupData = {
+ name: data.name,
+ expiresAt: getExpirationDate(),
+ };
+
+ try {
+ const createdKey = await createApiKeyMutation.mutateAsync(groupData);
+ onSuccess(createdKey);
+ form.reset();
+ onClose();
+ } catch (err) {
+ //
+ }
+ };
+
+ const handleClose = () => {
+ form.reset();
+ setExpirationOption("30");
+ onClose();
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/client/src/ee/api-key/components/revoke-api-key-modal.tsx b/apps/client/src/ee/api-key/components/revoke-api-key-modal.tsx
new file mode 100644
index 00000000..3092ead4
--- /dev/null
+++ b/apps/client/src/ee/api-key/components/revoke-api-key-modal.tsx
@@ -0,0 +1,62 @@
+import { Modal, Text, Button, Group, Stack } from "@mantine/core";
+import { useTranslation } from "react-i18next";
+
+import { useRevokeApiKeyMutation } from "@/ee/api-key/queries/api-key-query.ts";
+import { IApiKey } from "@/ee/api-key";
+
+interface RevokeApiKeyModalProps {
+ opened: boolean;
+ onClose: () => void;
+ apiKey: IApiKey | null;
+}
+
+export function RevokeApiKeyModal({
+ opened,
+ onClose,
+ apiKey,
+}: RevokeApiKeyModalProps) {
+ const { t } = useTranslation();
+ const revokeApiKeyMutation = useRevokeApiKeyMutation();
+
+ const handleRevoke = async () => {
+ if (!apiKey) return;
+ await revokeApiKeyMutation.mutateAsync({
+ apiKeyId: apiKey.id,
+ });
+ onClose();
+ };
+
+ return (
+
+
+
+ {t("Are you sure you want to revoke this API key")}{" "}
+ {apiKey?.name} ?
+
+
+ {t(
+ "This action cannot be undone. Any applications using this API key will stop working.",
+ )}
+
+
+
+
+ {t("Cancel")}
+
+
+ {t("Revoke")}
+
+
+
+
+ );
+}
diff --git a/apps/client/src/ee/api-key/components/update-api-key-modal.tsx b/apps/client/src/ee/api-key/components/update-api-key-modal.tsx
new file mode 100644
index 00000000..6edeb1c3
--- /dev/null
+++ b/apps/client/src/ee/api-key/components/update-api-key-modal.tsx
@@ -0,0 +1,80 @@
+import { Modal, TextInput, Button, Group, Stack } from "@mantine/core";
+import { useForm } from "@mantine/form";
+import { zodResolver } from "mantine-form-zod-resolver";
+import { z } from "zod";
+import { useTranslation } from "react-i18next";
+import { useUpdateApiKeyMutation } from "@/ee/api-key/queries/api-key-query";
+import { IApiKey } from "@/ee/api-key";
+import { useEffect } from "react";
+
+const formSchema = z.object({
+ name: z.string().min(1, "Name is required"),
+});
+type FormValues = z.infer;
+
+interface UpdateApiKeyModalProps {
+ opened: boolean;
+ onClose: () => void;
+ apiKey: IApiKey | null;
+}
+
+export function UpdateApiKeyModal({
+ opened,
+ onClose,
+ apiKey,
+}: UpdateApiKeyModalProps) {
+ const { t } = useTranslation();
+ const updateApiKeyMutation = useUpdateApiKeyMutation();
+
+ const form = useForm({
+ validate: zodResolver(formSchema),
+ initialValues: {
+ name: "",
+ },
+ });
+
+ useEffect(() => {
+ if (opened && apiKey) {
+ form.setValues({ name: apiKey.name });
+ }
+ }, [opened, apiKey]);
+
+ const handleSubmit = async (data: { name?: string }) => {
+ const apiKeyData = {
+ apiKeyId: apiKey.id,
+ name: data.name,
+ };
+
+ await updateApiKeyMutation.mutateAsync(apiKeyData);
+ onClose();
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/client/src/ee/api-key/index.ts b/apps/client/src/ee/api-key/index.ts
new file mode 100644
index 00000000..24bc3d1c
--- /dev/null
+++ b/apps/client/src/ee/api-key/index.ts
@@ -0,0 +1,11 @@
+export { ApiKeyTable } from "./components/api-key-table";
+export { CreateApiKeyModal } from "./components/create-api-key-modal";
+export { ApiKeyCreatedModal } from "./components/api-key-created-modal";
+export { UpdateApiKeyModal } from "./components/update-api-key-modal";
+export { RevokeApiKeyModal } from "./components/revoke-api-key-modal";
+
+// Services
+export * from "./services/api-key-service";
+
+// Types
+export * from "./types/api-key.types";
diff --git a/apps/client/src/ee/api-key/pages/user-api-keys.tsx b/apps/client/src/ee/api-key/pages/user-api-keys.tsx
new file mode 100644
index 00000000..a0aae3b6
--- /dev/null
+++ b/apps/client/src/ee/api-key/pages/user-api-keys.tsx
@@ -0,0 +1,106 @@
+import React, { useState } from "react";
+import { Button, Group, Space } from "@mantine/core";
+import { Helmet } from "react-helmet-async";
+import { useTranslation } from "react-i18next";
+import SettingsTitle from "@/components/settings/settings-title";
+import { getAppName } from "@/lib/config";
+import { ApiKeyTable } from "@/ee/api-key/components/api-key-table";
+import { CreateApiKeyModal } from "@/ee/api-key/components/create-api-key-modal";
+import { ApiKeyCreatedModal } from "@/ee/api-key/components/api-key-created-modal";
+import { UpdateApiKeyModal } from "@/ee/api-key/components/update-api-key-modal";
+import { RevokeApiKeyModal } from "@/ee/api-key/components/revoke-api-key-modal";
+import Paginate from "@/components/common/paginate";
+import { usePaginateAndSearch } from "@/hooks/use-paginate-and-search";
+import { useGetApiKeysQuery } from "@/ee/api-key/queries/api-key-query.ts";
+import { IApiKey } from "@/ee/api-key";
+
+export default function UserApiKeys() {
+ const { t } = useTranslation();
+ const { page, setPage } = usePaginateAndSearch();
+ const [createModalOpened, setCreateModalOpened] = useState(false);
+ const [createdApiKey, setCreatedApiKey] = useState(null);
+ const [updateModalOpened, setUpdateModalOpened] = useState(false);
+ const [revokeModalOpened, setRevokeModalOpened] = useState(false);
+ const [selectedApiKey, setSelectedApiKey] = useState(null);
+ const { data, isLoading } = useGetApiKeysQuery({ page });
+
+ const handleCreateSuccess = (response: IApiKey) => {
+ setCreatedApiKey(response);
+ };
+
+ const handleUpdate = (apiKey: IApiKey) => {
+ setSelectedApiKey(apiKey);
+ setUpdateModalOpened(true);
+ };
+
+ const handleRevoke = (apiKey: IApiKey) => {
+ setSelectedApiKey(apiKey);
+ setRevokeModalOpened(true);
+ };
+
+ return (
+ <>
+
+
+ {t("API keys")} - {getAppName()}
+
+
+
+
+
+
+ setCreateModalOpened(true)}>
+ {t("Create API Key")}
+
+
+
+
+
+
+
+ {data?.items.length > 0 && (
+
+ )}
+
+ setCreateModalOpened(false)}
+ onSuccess={handleCreateSuccess}
+ />
+
+ setCreatedApiKey(null)}
+ apiKey={createdApiKey}
+ />
+
+ {
+ setUpdateModalOpened(false);
+ setSelectedApiKey(null);
+ }}
+ apiKey={selectedApiKey}
+ />
+
+ {
+ setRevokeModalOpened(false);
+ setSelectedApiKey(null);
+ }}
+ apiKey={selectedApiKey}
+ />
+ >
+ );
+}
diff --git a/apps/client/src/ee/api-key/pages/workspace-api-keys.tsx b/apps/client/src/ee/api-key/pages/workspace-api-keys.tsx
new file mode 100644
index 00000000..cf459373
--- /dev/null
+++ b/apps/client/src/ee/api-key/pages/workspace-api-keys.tsx
@@ -0,0 +1,117 @@
+import React, { useState } from "react";
+import { Button, Group, Space, Text } from "@mantine/core";
+import { Helmet } from "react-helmet-async";
+import { useTranslation } from "react-i18next";
+import SettingsTitle from "@/components/settings/settings-title";
+import { getAppName } from "@/lib/config";
+import { ApiKeyTable } from "@/ee/api-key/components/api-key-table";
+import { CreateApiKeyModal } from "@/ee/api-key/components/create-api-key-modal";
+import { ApiKeyCreatedModal } from "@/ee/api-key/components/api-key-created-modal";
+import { UpdateApiKeyModal } from "@/ee/api-key/components/update-api-key-modal";
+import { RevokeApiKeyModal } from "@/ee/api-key/components/revoke-api-key-modal";
+import Paginate from "@/components/common/paginate";
+import { usePaginateAndSearch } from "@/hooks/use-paginate-and-search";
+import { useGetApiKeysQuery } from "@/ee/api-key/queries/api-key-query.ts";
+import { IApiKey } from "@/ee/api-key";
+import useUserRole from '@/hooks/use-user-role.tsx';
+
+export default function WorkspaceApiKeys() {
+ const { t } = useTranslation();
+ const { page, setPage } = usePaginateAndSearch();
+ const [createModalOpened, setCreateModalOpened] = useState(false);
+ const [createdApiKey, setCreatedApiKey] = useState(null);
+ const [updateModalOpened, setUpdateModalOpened] = useState(false);
+ const [revokeModalOpened, setRevokeModalOpened] = useState(false);
+ const [selectedApiKey, setSelectedApiKey] = useState(null);
+ const { data, isLoading } = useGetApiKeysQuery({ page, adminView: true });
+ const { isAdmin } = useUserRole();
+
+ if (!isAdmin) {
+ return null;
+ }
+
+ const handleCreateSuccess = (response: IApiKey) => {
+ setCreatedApiKey(response);
+ };
+
+ const handleUpdate = (apiKey: IApiKey) => {
+ setSelectedApiKey(apiKey);
+ setUpdateModalOpened(true);
+ };
+
+ const handleRevoke = (apiKey: IApiKey) => {
+ setSelectedApiKey(apiKey);
+ setRevokeModalOpened(true);
+ };
+
+ return (
+ <>
+
+
+ {t("API management")} - {getAppName()}
+
+
+
+
+
+
+ {t("Manage API keys for all users in the workspace")}
+
+
+
+ setCreateModalOpened(true)}>
+ {t("Create API Key")}
+
+
+
+
+
+
+
+ {data?.items.length > 0 && (
+
+ )}
+
+ setCreateModalOpened(false)}
+ onSuccess={handleCreateSuccess}
+ />
+
+ setCreatedApiKey(null)}
+ apiKey={createdApiKey}
+ />
+
+ {
+ setUpdateModalOpened(false);
+ setSelectedApiKey(null);
+ }}
+ apiKey={selectedApiKey}
+ />
+
+ {
+ setRevokeModalOpened(false);
+ setSelectedApiKey(null);
+ }}
+ apiKey={selectedApiKey}
+ />
+ >
+ );
+}
diff --git a/apps/client/src/ee/api-key/queries/api-key-query.ts b/apps/client/src/ee/api-key/queries/api-key-query.ts
new file mode 100644
index 00000000..75f2d351
--- /dev/null
+++ b/apps/client/src/ee/api-key/queries/api-key-query.ts
@@ -0,0 +1,97 @@
+import { IPagination, QueryParams } from "@/lib/types.ts";
+import {
+ keepPreviousData,
+ useMutation,
+ useQuery,
+ useQueryClient,
+ UseQueryResult,
+} from "@tanstack/react-query";
+import {
+ createApiKey,
+ getApiKeys,
+ IApiKey,
+ ICreateApiKeyRequest,
+ IUpdateApiKeyRequest,
+ revokeApiKey,
+ updateApiKey,
+} from "@/ee/api-key";
+import { notifications } from "@mantine/notifications";
+import { useTranslation } from "react-i18next";
+
+export function useGetApiKeysQuery(
+ params?: QueryParams,
+): UseQueryResult, Error> {
+ return useQuery({
+ queryKey: ["api-key-list", params],
+ queryFn: () => getApiKeys(params),
+ staleTime: 0,
+ gcTime: 0,
+ placeholderData: keepPreviousData,
+ });
+}
+
+export function useRevokeApiKeyMutation() {
+ const queryClient = useQueryClient();
+ const { t } = useTranslation();
+
+ return useMutation<
+ void,
+ Error,
+ {
+ apiKeyId: string;
+ }
+ >({
+ mutationFn: (data) => revokeApiKey(data),
+ onSuccess: (data, variables) => {
+ notifications.show({ message: t("Revoked successfully") });
+ queryClient.invalidateQueries({
+ predicate: (item) =>
+ ["api-key-list"].includes(item.queryKey[0] as string),
+ });
+ },
+ onError: (error) => {
+ const errorMessage = error["response"]?.data?.message;
+ notifications.show({ message: errorMessage, color: "red" });
+ },
+ });
+}
+
+export function useCreateApiKeyMutation() {
+ const queryClient = useQueryClient();
+ const { t } = useTranslation();
+
+ return useMutation({
+ mutationFn: (data) => createApiKey(data),
+ onSuccess: () => {
+ notifications.show({ message: t("API key created successfully") });
+ queryClient.invalidateQueries({
+ predicate: (item) =>
+ ["api-key-list"].includes(item.queryKey[0] as string),
+ });
+ },
+ onError: (error) => {
+ const errorMessage = error["response"]?.data?.message;
+ notifications.show({ message: errorMessage, color: "red" });
+ },
+ });
+}
+
+export function useUpdateApiKeyMutation() {
+ const queryClient = useQueryClient();
+ const { t } = useTranslation();
+
+ return useMutation({
+ mutationFn: (data) => updateApiKey(data),
+ onSuccess: (data, variables) => {
+ notifications.show({ message: t("Updated successfully") });
+ queryClient.invalidateQueries({
+ predicate: (item) =>
+ ["api-key-list"].includes(item.queryKey[0] as string),
+ });
+ },
+ onError: (error) => {
+ const errorMessage = error["response"]?.data?.message;
+ notifications.show({ message: errorMessage, color: "red" });
+ },
+ });
+}
diff --git a/apps/client/src/ee/api-key/services/api-key-service.ts b/apps/client/src/ee/api-key/services/api-key-service.ts
new file mode 100644
index 00000000..c83e25d0
--- /dev/null
+++ b/apps/client/src/ee/api-key/services/api-key-service.ts
@@ -0,0 +1,32 @@
+import api from "@/lib/api-client";
+import {
+ ICreateApiKeyRequest,
+ IApiKey,
+ IUpdateApiKeyRequest,
+} from "@/ee/api-key/types/api-key.types";
+import { IPagination, QueryParams } from "@/lib/types.ts";
+
+export async function getApiKeys(
+ params?: QueryParams,
+): Promise> {
+ const req = await api.post("/api-keys", { ...params });
+ return req.data;
+}
+
+export async function createApiKey(
+ data: ICreateApiKeyRequest,
+): Promise {
+ const req = await api.post("/api-keys/create", data);
+ return req.data;
+}
+
+export async function updateApiKey(
+ data: IUpdateApiKeyRequest,
+): Promise {
+ const req = await api.post("/api-keys/update", data);
+ return req.data;
+}
+
+export async function revokeApiKey(data: { apiKeyId: string }): Promise {
+ await api.post("/api-keys/revoke", data);
+}
diff --git a/apps/client/src/ee/api-key/types/api-key.types.ts b/apps/client/src/ee/api-key/types/api-key.types.ts
new file mode 100644
index 00000000..57890d1a
--- /dev/null
+++ b/apps/client/src/ee/api-key/types/api-key.types.ts
@@ -0,0 +1,23 @@
+import { IUser } from "@/features/user/types/user.types.ts";
+
+export interface IApiKey {
+ id: string;
+ name: string;
+ token?: string;
+ creatorId: string;
+ workspaceId: string;
+ expiresAt: string | null;
+ lastUsedAt: string | null;
+ createdAt: string;
+ creator: Partial;
+}
+
+export interface ICreateApiKeyRequest {
+ name: string;
+ expiresAt?: string;
+}
+
+export interface IUpdateApiKeyRequest {
+ apiKeyId: string;
+ name: string;
+}
diff --git a/apps/client/src/ee/licence/components/oss-details.tsx b/apps/client/src/ee/licence/components/oss-details.tsx
index 2856c5f8..5a3fd6c4 100644
--- a/apps/client/src/ee/licence/components/oss-details.tsx
+++ b/apps/client/src/ee/licence/components/oss-details.tsx
@@ -11,7 +11,7 @@ export default function OssDetails() {
withTableBorder
>
- To unlock enterprise features like SSO, MFA, Resolve comments, contact sales@docmost.com.
+ To unlock enterprise features like AI, SSO, MFA, Resolve comments, contact sales@docmost.com.
diff --git a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx
index 412f2bd7..a6d143ff 100644
--- a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx
+++ b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx
@@ -43,18 +43,13 @@ export const EditorBubbleMenu: FC = (props) => {
const [, setDraftCommentId] = useAtom(draftCommentIdAtom);
const showCommentPopupRef = useRef(showCommentPopup);
- const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false);
- const [isTextAlignmentSelectorOpen, setIsTextAlignmentOpen] = useState(false);
- const [isColorSelectorOpen, setIsColorSelectorOpen] = useState(false);
- const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false);
-
useEffect(() => {
showCommentPopupRef.current = showCommentPopup;
}, [showCommentPopup]);
const editorState = useEditorState({
editor: props.editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!props.editor) {
return null;
}
@@ -73,31 +68,31 @@ export const EditorBubbleMenu: FC = (props) => {
const items: BubbleMenuItem[] = [
{
name: "Bold",
- isActive: () => editorState.isBold,
+ isActive: () => editorState?.isBold,
command: () => props.editor.chain().focus().toggleBold().run(),
icon: IconBold,
},
{
name: "Italic",
- isActive: () => editorState.isItalic,
+ isActive: () => editorState?.isItalic,
command: () => props.editor.chain().focus().toggleItalic().run(),
icon: IconItalic,
},
{
name: "Underline",
- isActive: () => editorState.isUnderline,
+ isActive: () => editorState?.isUnderline,
command: () => props.editor.chain().focus().toggleUnderline().run(),
icon: IconUnderline,
},
{
name: "Strike",
- isActive: () => editorState.isStrike,
+ isActive: () => editorState?.isStrike,
command: () => props.editor.chain().focus().toggleStrike().run(),
icon: IconStrikethrough,
},
{
name: "Code",
- isActive: () => editorState.isCode,
+ isActive: () => editorState?.isCode,
command: () => props.editor.chain().focus().toggleCode().run(),
icon: IconCode,
},
@@ -105,7 +100,7 @@ export const EditorBubbleMenu: FC = (props) => {
const commentItem: BubbleMenuItem = {
name: "Comment",
- isActive: () => editorState.isComment,
+ isActive: () => editorState?.isComment,
command: () => {
const commentId = uuid7();
@@ -140,12 +135,17 @@ export const EditorBubbleMenu: FC = (props) => {
onHide: () => {
setIsNodeSelectorOpen(false);
setIsTextAlignmentOpen(false);
- setIsColorSelectorOpen(false);
setIsLinkSelectorOpen(false);
+ setIsColorSelectorOpen(false);
},
},
};
+ const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false);
+ const [isTextAlignmentSelectorOpen, setIsTextAlignmentOpen] = useState(false);
+ const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false);
+ const [isColorSelectorOpen, setIsColorSelectorOpen] = useState(false);
+
return (
@@ -155,8 +155,8 @@ export const EditorBubbleMenu: FC
= (props) => {
setIsOpen={() => {
setIsNodeSelectorOpen(!isNodeSelectorOpen);
setIsTextAlignmentOpen(false);
- setIsColorSelectorOpen(false);
setIsLinkSelectorOpen(false);
+ setIsColorSelectorOpen(false);
}}
/>
@@ -166,8 +166,8 @@ export const EditorBubbleMenu: FC = (props) => {
setIsOpen={() => {
setIsTextAlignmentOpen(!isTextAlignmentSelectorOpen);
setIsNodeSelectorOpen(false);
- setIsColorSelectorOpen(false);
setIsLinkSelectorOpen(false);
+ setIsColorSelectorOpen(false);
}}
/>
diff --git a/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx
index 34d466b2..d0907b81 100644
--- a/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx
+++ b/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx
@@ -1,5 +1,5 @@
-import { Dispatch, FC, SetStateAction } from "react";
-import { IconCheck, IconPalette } from "@tabler/icons-react";
+import React, { Dispatch, FC, SetStateAction } from "react";
+import { IconCheck, IconChevronDown, IconPalette } from "@tabler/icons-react";
import {
ActionIcon,
Button,
@@ -8,6 +8,9 @@ import {
ScrollArea,
Text,
Tooltip,
+ SimpleGrid,
+ Box,
+ Stack,
} from "@mantine/core";
import type { Editor } from "@tiptap/react";
import { useEditorState } from "@tiptap/react";
@@ -61,9 +64,12 @@ const TEXT_COLORS: BubbleColorMenuItem[] = [
name: "Gray",
color: "#A8A29E",
},
+ {
+ name: "Brown",
+ color: "#92400E",
+ },
];
-// TODO: handle dark mode
const HIGHLIGHT_COLORS: BubbleColorMenuItem[] = [
{
name: "Default",
@@ -71,35 +77,39 @@ const HIGHLIGHT_COLORS: BubbleColorMenuItem[] = [
},
{
name: "Blue",
- color: "#c1ecf9",
+ color: "#98d8f2",
},
{
name: "Green",
- color: "#acf79f",
+ color: "#7edb6c",
},
{
name: "Purple",
- color: "#f6f3f8",
+ color: "#e0d6ed",
},
{
name: "Red",
- color: "#fdebeb",
+ color: "#ffc6c2",
},
{
name: "Yellow",
- color: "#fbf4a2",
+ color: "#faf594",
},
{
name: "Orange",
- color: "#faebdd",
+ color: "#f5c8a9",
},
{
name: "Pink",
- color: "#faf1f5",
+ color: "#f5cfe0",
},
{
name: "Gray",
- color: "#f1f1ef",
+ color: "#dfdfd7",
+ },
+ {
+ name: "Brown",
+ color: "#d7c4b7",
},
];
@@ -109,22 +119,26 @@ export const ColorSelector: FC = ({
setIsOpen,
}) => {
const { t } = useTranslation();
-
+
const editorState = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!ctx.editor) {
return null;
}
-
+
const activeColors: Record = {};
TEXT_COLORS.forEach(({ color }) => {
- activeColors[`text_${color}`] = ctx.editor.isActive("textStyle", { color });
+ activeColors[`text_${color}`] = ctx.editor.isActive("textStyle", {
+ color,
+ });
});
HIGHLIGHT_COLORS.forEach(({ color }) => {
- activeColors[`highlight_${color}`] = ctx.editor.isActive("highlight", { color });
+ activeColors[`highlight_${color}`] = ctx.editor.isActive("highlight", {
+ color,
+ });
});
-
+
return activeColors;
},
});
@@ -133,67 +147,152 @@ export const ColorSelector: FC = ({
return null;
}
- const activeColorItem = TEXT_COLORS.find(({ color }) =>
- editorState[`text_${color}`]
+ const activeColorItem = TEXT_COLORS.find(
+ ({ color }) => editorState[`text_${color}`],
);
- const activeHighlightItem = HIGHLIGHT_COLORS.find(({ color }) =>
- editorState[`highlight_${color}`]
+ const activeHighlightItem = HIGHLIGHT_COLORS.find(
+ ({ color }) => editorState[`highlight_${color}`],
);
return (
-
+
- }
onClick={() => setIsOpen(!isOpen)}
+ data-text-color={activeColorItem?.color || ""}
+ data-highlight-color={activeHighlightItem?.color || ""}
+ className="color-selector-trigger"
+ style={{
+ height: "34px",
+ border: "none",
+ fontWeight: 500,
+ fontSize: rem(16),
+ paddingLeft: rem(8),
+ paddingRight: rem(4),
+ }}
>
-
-
+ A
+
- {/* make mah responsive */}
-
- {t("Color")}
-
+
+
+
+ {t("Text color")}
+
+
+ {TEXT_COLORS.map(({ name, color }, index) => (
+
+ {
+ if (name === "Default") {
+ editor.commands.unsetColor();
+ } else {
+ editor
+ .chain()
+ .focus()
+ .setColor(color || "")
+ .run();
+ }
+ setIsOpen(false);
+ }}
+ style={{
+ width: rem(28),
+ height: rem(28),
+ borderRadius: rem(6),
+ border: editorState[`text_${color}`]
+ ? "2px solid var(--mantine-color-gray-8)"
+ : "1px solid var(--mantine-color-gray-4)",
+ cursor: "pointer",
+ position: "relative",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ fontSize: rem(16),
+ fontWeight: 600,
+ color: color || "var(--mantine-color-gray-8)",
+ }}
+ >
+ A
+
+
+ ))}
+
+
-
- {TEXT_COLORS.map(({ name, color }, index) => (
- A}
- justify="left"
- fullWidth
- rightSection={
- editorState[`text_${color}`] && (
-
- )
- }
- onClick={() => {
- if (name === "Default") {
- editor.commands.unsetColor();
- } else {
- editor.chain().focus().setColor(color || "").run();
- }
- setIsOpen(false);
- }}
- style={{ border: "none" }}
- >
- {t(name)}
-
- ))}
-
+
+
+ {t("Highlight color")}
+
+
+ {HIGHLIGHT_COLORS.map(({ name, color }, index) => (
+
+ {
+ if (name === "Default") {
+ editor.commands.unsetHighlight();
+ } else {
+ editor
+ .chain()
+ .focus()
+ .toggleMark("highlight", {
+ color: color || "",
+ colorName: name.toLowerCase() || "",
+ })
+ .run();
+ }
+ setIsOpen(false);
+ }}
+ style={{
+ width: rem(28),
+ height: rem(28),
+ borderRadius: rem(4),
+ backgroundColor: color || "var(--mantine-color-gray-2)",
+ border: "1px solid var(--mantine-color-gray-4)",
+ cursor: "pointer",
+ position: "relative",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ fontSize: rem(16),
+ fontWeight: 600,
+ color: "var(--mantine-color-gray-8)",
+ }}
+ >
+ {editorState[`highlight_${color}`] ? (
+
+ ) : (
+ "A"
+ )}
+
+
+ ))}
+
+
+
+ {
+ editor.commands.unsetColor();
+ editor.commands.unsetHighlight();
+ setIsOpen(false);
+ }}
+ >
+ {t("Remove color")}
+
+
diff --git a/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx
index 57f34a44..13b2117f 100644
--- a/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx
+++ b/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx
@@ -39,7 +39,7 @@ export const NodeSelector: FC = ({
const editorState = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!editor) {
return null;
}
@@ -65,45 +65,45 @@ export const NodeSelector: FC = ({
command: () =>
editor.chain().focus().toggleNode("paragraph", "paragraph").run(),
isActive: () =>
- editorState.isParagraph &&
- !editorState.isBulletList &&
- !editorState.isOrderedList,
+ editorState?.isParagraph &&
+ !editorState?.isBulletList &&
+ !editorState?.isOrderedList,
},
{
name: "Heading 1",
icon: IconH1,
command: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
- isActive: () => editorState.isHeading1,
+ isActive: () => editorState?.isHeading1,
},
{
name: "Heading 2",
icon: IconH2,
command: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
- isActive: () => editorState.isHeading2,
+ isActive: () => editorState?.isHeading2,
},
{
name: "Heading 3",
icon: IconH3,
command: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
- isActive: () => editorState.isHeading3,
+ isActive: () => editorState?.isHeading3,
},
{
name: "To-do List",
icon: IconCheckbox,
command: () => editor.chain().focus().toggleTaskList().run(),
- isActive: () => editorState.isTaskItem,
+ isActive: () => editorState?.isTaskItem,
},
{
name: "Bullet List",
icon: IconList,
command: () => editor.chain().focus().toggleBulletList().run(),
- isActive: () => editorState.isBulletList,
+ isActive: () => editorState?.isBulletList,
},
{
name: "Numbered List",
icon: IconListNumbers,
command: () => editor.chain().focus().toggleOrderedList().run(),
- isActive: () => editorState.isOrderedList,
+ isActive: () => editorState?.isOrderedList,
},
{
name: "Blockquote",
@@ -115,13 +115,13 @@ export const NodeSelector: FC = ({
.toggleNode("paragraph", "paragraph")
.toggleBlockquote()
.run(),
- isActive: () => editorState.isBlockquote,
+ isActive: () => editorState?.isBlockquote,
},
{
name: "Code",
icon: IconCode,
command: () => editor.chain().focus().toggleCodeBlock().run(),
- isActive: () => editorState.isCodeBlock,
+ isActive: () => editorState?.isCodeBlock,
},
];
diff --git a/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx
index ae35eb48..b5277651 100644
--- a/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx
+++ b/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx
@@ -34,7 +34,7 @@ export const TextAlignmentSelector: FC = ({
const editorState = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!ctx.editor) {
return null;
}
@@ -55,25 +55,25 @@ export const TextAlignmentSelector: FC = ({
const items: BubbleMenuItem[] = [
{
name: "Align left",
- isActive: () => editorState.isAlignLeft,
+ isActive: () => editorState?.isAlignLeft,
command: () => editor.chain().focus().setTextAlign("left").run(),
icon: IconAlignLeft,
},
{
name: "Align center",
- isActive: () => editorState.isAlignCenter,
+ isActive: () => editorState?.isAlignCenter,
command: () => editor.chain().focus().setTextAlign("center").run(),
icon: IconAlignCenter,
},
{
name: "Align right",
- isActive: () => editorState.isAlignRight,
+ isActive: () => editorState?.isAlignRight,
command: () => editor.chain().focus().setTextAlign("right").run(),
icon: IconAlignRight,
},
{
name: "Justify",
- isActive: () => editorState.isAlignJustify,
+ isActive: () => editorState?.isAlignJustify,
command: () => editor.chain().focus().setTextAlign("justify").run(),
icon: IconAlignJustified,
},
diff --git a/apps/client/src/features/editor/components/callout/callout-menu.tsx b/apps/client/src/features/editor/components/callout/callout-menu.tsx
index e1bd6069..e7ee2138 100644
--- a/apps/client/src/features/editor/components/callout/callout-menu.tsx
+++ b/apps/client/src/features/editor/components/callout/callout-menu.tsx
@@ -6,7 +6,7 @@ import {
EditorMenuProps,
ShouldShowProps,
} from "@/features/editor/components/table/types/types.ts";
-import { ActionIcon, Tooltip, Divider } from "@mantine/core";
+import { ActionIcon, Tooltip } from "@mantine/core";
import {
IconAlertTriangleFilled,
IconCircleCheckFilled,
@@ -21,6 +21,17 @@ import EmojiPicker from "@/components/ui/emoji-picker.tsx";
export function CalloutMenu({ editor }: EditorMenuProps) {
const { t } = useTranslation();
+ const shouldShow = useCallback(
+ ({ state }: ShouldShowProps) => {
+ if (!state) {
+ return false;
+ }
+
+ return editor.isActive("callout");
+ },
+ [editor],
+ );
+
const editorState = useEditorState({
editor,
selector: (ctx) => {
@@ -38,17 +49,6 @@ export function CalloutMenu({ editor }: EditorMenuProps) {
},
});
- const shouldShow = useCallback(
- ({ state }: ShouldShowProps) => {
- if (!state) {
- return false;
- }
-
- return editor.isActive("callout");
- },
- [editor],
- );
-
const getReferencedVirtualElement = useCallback(() => {
if (!editor) return;
const { selection } = editor.state;
diff --git a/apps/client/src/features/editor/components/code-block/mermaid-view.tsx b/apps/client/src/features/editor/components/code-block/mermaid-view.tsx
index e871e2f4..d0109d09 100644
--- a/apps/client/src/features/editor/components/code-block/mermaid-view.tsx
+++ b/apps/client/src/features/editor/components/code-block/mermaid-view.tsx
@@ -5,6 +5,7 @@ import { v4 as uuidv4 } from "uuid";
import classes from "./code-block.module.css";
import { useTranslation } from "react-i18next";
import { useComputedColorScheme } from "@mantine/core";
+import DOMPurify from "dompurify";
interface MermaidViewProps {
props: NodeViewProps;
@@ -37,7 +38,7 @@ export default function MermaidView({ props }: MermaidViewProps) {
.catch((err) => {
if (props.editor.isEditable) {
setPreview(
- `${t("Mermaid diagram error:")} ${err}
`,
+ `${t("Mermaid diagram error:")} ${DOMPurify.sanitize(err)}
`,
);
} else {
setPreview(
diff --git a/apps/client/src/features/editor/components/common/editor-paste-handler.tsx b/apps/client/src/features/editor/components/common/editor-paste-handler.tsx
index 3a15e95d..8eee02fc 100644
--- a/apps/client/src/features/editor/components/common/editor-paste-handler.tsx
+++ b/apps/client/src/features/editor/components/common/editor-paste-handler.tsx
@@ -34,7 +34,9 @@ export const handlePaste = (
return false;
}
- createMentionAction(url, view, pos, creatorId);
+ const anchorId = match[6] ? match[6].split('#')[0] : undefined;
+ const urlWithoutAnchor = anchorId ? url.substring(0, url.indexOf("#")) : url;
+ createMentionAction(urlWithoutAnchor, view, pos, creatorId, anchorId);
return true;
}
diff --git a/apps/client/src/features/editor/components/drawio/drawio-view.tsx b/apps/client/src/features/editor/components/drawio/drawio-view.tsx
index ac3343c4..b51e8936 100644
--- a/apps/client/src/features/editor/components/drawio/drawio-view.tsx
+++ b/apps/client/src/features/editor/components/drawio/drawio-view.tsx
@@ -88,7 +88,7 @@ export default function DrawioView(props: NodeViewProps) {
};
return (
-
+
diff --git a/apps/client/src/features/editor/components/embed/embed-view.tsx b/apps/client/src/features/editor/components/embed/embed-view.tsx
index 7ce7b1a6..efdaa950 100644
--- a/apps/client/src/features/editor/components/embed/embed-view.tsx
+++ b/apps/client/src/features/editor/components/embed/embed-view.tsx
@@ -85,7 +85,7 @@ export default function EmbedView(props: NodeViewProps) {
}
return (
-
+
{embedUrl ? (
+
+
void;
export interface InternalLinkOptions {
@@ -18,7 +19,7 @@ export interface InternalLinkOptions {
export const handleInternalLink =
({ validateFn, onResolveLink }: InternalLinkOptions): LinkFn =>
- async (url: string, view, pos, creatorId) => {
+ async (url: string, view, pos, creatorId, anchorId) => {
const validated = validateFn(url, view);
if (!validated) return;
@@ -35,6 +36,7 @@ export const handleInternalLink =
entityId: page.id,
slugId: page.slugId,
creatorId: creatorId,
+ anchorId: anchorId,
});
if (!node) return;
diff --git a/apps/client/src/features/editor/components/link/link-menu.tsx b/apps/client/src/features/editor/components/link/link-menu.tsx
index a5205a04..63fd10bf 100644
--- a/apps/client/src/features/editor/components/link/link-menu.tsx
+++ b/apps/client/src/features/editor/components/link/link-menu.tsx
@@ -19,7 +19,6 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) {
if (!ctx.editor) {
return null;
}
-
const link = ctx.editor.getAttributes("link");
return {
href: link.href,
@@ -81,13 +80,13 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) {
bg="var(--mantine-color-body)"
>
) : (
diff --git a/apps/client/src/features/editor/components/mention/mention-view.tsx b/apps/client/src/features/editor/components/mention/mention-view.tsx
index d42e4a8c..1ba55380 100644
--- a/apps/client/src/features/editor/components/mention/mention-view.tsx
+++ b/apps/client/src/features/editor/components/mention/mention-view.tsx
@@ -11,7 +11,7 @@ import classes from "./mention.module.css";
export default function MentionView(props: NodeViewProps) {
const { node } = props;
- const { label, entityType, entityId, slugId } = node.attrs;
+ const { label, entityType, entityId, slugId, anchorId } = node.attrs;
const { spaceSlug } = useParams();
const { shareId } = useParams();
const {
@@ -27,10 +27,11 @@ export default function MentionView(props: NodeViewProps) {
shareId,
pageSlugId: slugId,
pageTitle: label,
+ anchorId,
});
return (
-
+
{entityType === "user" && (
@{label}
@@ -42,7 +43,7 @@ export default function MentionView(props: NodeViewProps) {
component={Link}
fw={500}
to={
- isShareRoute ? shareSlugUrl : buildPageUrl(spaceSlug, slugId, label)
+ isShareRoute ? shareSlugUrl : buildPageUrl(spaceSlug, slugId, label, anchorId)
}
underline="never"
className={classes.pageMentionLink}
diff --git a/apps/client/src/features/editor/components/subpages/subpages-view.tsx b/apps/client/src/features/editor/components/subpages/subpages-view.tsx
index 2c2c1d2f..697c1213 100644
--- a/apps/client/src/features/editor/components/subpages/subpages-view.tsx
+++ b/apps/client/src/features/editor/components/subpages/subpages-view.tsx
@@ -53,7 +53,7 @@ export default function SubpagesView(props: NodeViewProps) {
if (error && !shareId) {
return (
-
+
{t("Failed to load subpages")}
@@ -63,7 +63,7 @@ export default function SubpagesView(props: NodeViewProps) {
if (subpages.length === 0) {
return (
-
+
{t("No subpages")}
@@ -74,7 +74,7 @@ export default function SubpagesView(props: NodeViewProps) {
}
return (
-
+
{subpages.map((page) => (
diff --git a/apps/client/src/features/editor/components/table/table-background-color.tsx b/apps/client/src/features/editor/components/table/table-background-color.tsx
index 107a3474..7508d4fe 100644
--- a/apps/client/src/features/editor/components/table/table-background-color.tsx
+++ b/apps/client/src/features/editor/components/table/table-background-color.tsx
@@ -38,14 +38,14 @@ export const TableBackgroundColor: FC = ({
}) => {
const { t } = useTranslation();
const [opened, setOpened] = React.useState(false);
-
+
const editorState = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!ctx.editor) {
return null;
}
-
+
let currentColor = "";
if (ctx.editor.isActive("tableCell")) {
const attrs = ctx.editor.getAttributes("tableCell");
@@ -54,7 +54,7 @@ export const TableBackgroundColor: FC = ({
const attrs = ctx.editor.getAttributes("tableHeader");
currentColor = attrs.backgroundColor || "";
}
-
+
return {
currentColor,
isTableCell: ctx.editor.isActive("tableCell"),
@@ -62,7 +62,7 @@ export const TableBackgroundColor: FC = ({
};
},
});
-
+
if (!editor || !editorState) {
return null;
}
@@ -71,20 +71,18 @@ export const TableBackgroundColor: FC = ({
editor
.chain()
.focus()
- .updateAttributes("tableCell", {
+ .updateAttributes("tableCell", {
backgroundColor: color || null,
- backgroundColorName: color ? colorName : null
+ backgroundColorName: color ? colorName : null,
})
- .updateAttributes("tableHeader", {
+ .updateAttributes("tableHeader", {
backgroundColor: color || null,
- backgroundColorName: color ? colorName : null
+ backgroundColorName: color ? colorName : null,
})
.run();
setOpened(false);
};
- const currentColor = editorState.currentColor;
-
return (
= ({ editor }) => {
const { t } = useTranslation();
const [opened, setOpened] = React.useState(false);
-
+
const editorState = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
if (!ctx.editor) {
return null;
}
-
+
return {
isAlignLeft: ctx.editor.isActive({ textAlign: "left" }),
isAlignCenter: ctx.editor.isActive({ textAlign: "center" }),
@@ -47,7 +46,7 @@ export const TableTextAlignment: FC = ({ editor }) => {
};
},
});
-
+
if (!editor || !editorState) {
return null;
}
@@ -56,21 +55,21 @@ export const TableTextAlignment: FC = ({ editor }) => {
{
name: "Align left",
value: "left",
- isActive: () => editorState.isAlignLeft,
+ isActive: () => editorState?.isAlignLeft,
command: () => editor.chain().focus().setTextAlign("left").run(),
icon: IconAlignLeft,
},
{
name: "Align center",
value: "center",
- isActive: () => editorState.isAlignCenter,
+ isActive: () => editorState?.isAlignCenter,
command: () => editor.chain().focus().setTextAlign("center").run(),
icon: IconAlignCenter,
},
{
name: "Align right",
value: "right",
- isActive: () => editorState.isAlignRight,
+ isActive: () => editorState?.isAlignRight,
command: () => editor.chain().focus().setTextAlign("right").run(),
icon: IconAlignRight,
},
@@ -84,7 +83,7 @@ export const TableTextAlignment: FC = ({ editor }) => {
onChange={setOpened}
position="bottom"
withArrow
- transitionProps={{ transition: 'pop' }}
+ transitionProps={{ transition: "pop" }}
>
@@ -107,9 +106,7 @@ export const TableTextAlignment: FC = ({ editor }) => {
key={index}
variant="default"
leftSection={ }
- rightSection={
- item.isActive() &&
- }
+ rightSection={item.isActive() && }
justify="left"
fullWidth
onClick={() => {
@@ -126,4 +123,4 @@ export const TableTextAlignment: FC = ({ editor }) => {
);
-};
\ No newline at end of file
+};
diff --git a/apps/client/src/features/editor/components/video/video-menu.tsx b/apps/client/src/features/editor/components/video/video-menu.tsx
index 92a57372..57a012a8 100644
--- a/apps/client/src/features/editor/components/video/video-menu.tsx
+++ b/apps/client/src/features/editor/components/video/video-menu.tsx
@@ -124,9 +124,7 @@ export function VideoMenu({ editor }: EditorMenuProps) {
onClick={alignVideoLeft}
size="lg"
aria-label={t("Align left")}
- variant={
- editorState?.isAlignLeft ? "light" : "default"
- }
+ variant={editorState?.isAlignLeft ? "light" : "default"}
>
@@ -137,9 +135,7 @@ export function VideoMenu({ editor }: EditorMenuProps) {
onClick={alignVideoCenter}
size="lg"
aria-label={t("Align center")}
- variant={
- editorState?.isAlignCenter ? "light" : "default"
- }
+ variant={editorState?.isAlignCenter ? "light" : "default"}
>
@@ -150,9 +146,7 @@ export function VideoMenu({ editor }: EditorMenuProps) {
onClick={alignVideoRight}
size="lg"
aria-label={t("Align right")}
- variant={
- editorState?.isAlignRight ? "light" : "default"
- }
+ variant={editorState?.isAlignRight ? "light" : "default"}
>
@@ -160,10 +154,7 @@ export function VideoMenu({ editor }: EditorMenuProps) {
{editorState?.width && (
-
+
)}
);
diff --git a/apps/client/src/features/editor/components/video/video-view.tsx b/apps/client/src/features/editor/components/video/video-view.tsx
index d7a53b0f..d47d9a4a 100644
--- a/apps/client/src/features/editor/components/video/video-view.tsx
+++ b/apps/client/src/features/editor/components/video/video-view.tsx
@@ -15,7 +15,7 @@ export default function VideoView(props: NodeViewProps) {
}, [align]);
return (
-
+
!isChangeOrigin(transaction),
+ }),
Placeholder.configure({
placeholder: ({ node }) => {
if (node.type.name === "heading") {
@@ -248,6 +255,7 @@ type CollabExtensions = (provider: HocuspocusProvider, user: IUser) => any[];
export const collabExtensions: CollabExtensions = (provider, user) => [
Collaboration.configure({
document: provider.document,
+ provider,
}),
CollaborationCaret.configure({
provider,
diff --git a/apps/client/src/features/editor/hooks/use-editor-scroll.ts b/apps/client/src/features/editor/hooks/use-editor-scroll.ts
new file mode 100644
index 00000000..31c357a0
--- /dev/null
+++ b/apps/client/src/features/editor/hooks/use-editor-scroll.ts
@@ -0,0 +1,58 @@
+import { Editor } from "@tiptap/react";
+import { useCallback, useEffect, useState } from "react";
+
+function waitForState(checkFn: () => boolean): Promise {
+ return new Promise((resolve) => {
+ const interval = setInterval(() => {
+ if (checkFn()) {
+ clearInterval(interval);
+ resolve();
+ }
+ }, 800);
+ });
+}
+
+export const useEditorScroll = ({
+ canScroll,
+ initialScrollTo,
+}: {
+ canScroll: () => boolean;
+ initialScrollTo?: string;
+}) => {
+ const [scrollTo, setScrollTo] = useState(initialScrollTo || "");
+
+ useEffect(() => {
+ if (!initialScrollTo) {
+ setScrollTo(window.location.hash ? window.location.hash.slice(1) : "");
+ }
+ }, [initialScrollTo]);
+
+ const handleScrollTo = useCallback(async (editor: Editor, _scrollTo: string | null = null, tryCount: number = 0) => {
+ await waitForState(() => canScroll());
+ return new Promise((resolve) => {
+ const MAX_TRY_COUNT = 10;
+ if (tryCount >= MAX_TRY_COUNT) {
+ resolve(false);
+ return;
+ }
+
+ const targetId = _scrollTo || scrollTo;
+ if (!targetId) {
+ resolve(false);
+ return;
+ }
+
+ const dom = editor.view.dom.querySelector(`[id="${targetId}"]`);
+ if (dom) {
+ dom.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ resolve(true);
+ } else {
+ setTimeout(async () => {
+ resolve(await handleScrollTo(editor, targetId, tryCount + 1));
+ }, 200);
+ }
+ });
+ }, [scrollTo, canScroll]);
+
+ return { scrollTo, handleScrollTo };
+};
diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx
index 6259b2d8..9a80f506 100644
--- a/apps/client/src/features/editor/page-editor.tsx
+++ b/apps/client/src/features/editor/page-editor.tsx
@@ -1,5 +1,11 @@
import "@/features/editor/styles/index.css";
-import React, { useEffect, useMemo, useRef, useState } from "react";
+import React, {
+ useCallback,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
import { IndexeddbPersistence } from "y-indexeddb";
import * as Y from "yjs";
import {
@@ -8,7 +14,12 @@ import {
onAuthenticationFailedParameters,
WebSocketStatus,
} from "@hocuspocus/provider";
-import { EditorContent, EditorProvider, useEditor, useEditorState } from "@tiptap/react";
+import {
+ EditorContent,
+ EditorProvider,
+ useEditor,
+ useEditorState,
+} from "@tiptap/react";
import {
collabExtensions,
mainExtensions,
@@ -51,7 +62,8 @@ import { extractPageSlugId } from "@/lib";
import { FIVE_MINUTES } from "@/lib/constants.ts";
import { PageEditMode } from "@/features/user/types/user.types.ts";
import { jwtDecode } from "jwt-decode";
-import { searchSpotlight } from '@/features/search/constants.ts';
+import { searchSpotlight } from "@/features/search/constants.ts";
+import { useEditorScroll } from "./hooks/use-editor-scroll";
interface PageEditorProps {
pageId: string;
@@ -65,6 +77,13 @@ export default function PageEditor({
content,
}: PageEditorProps) {
const collaborationURL = useCollaborationUrl();
+ const isComponentMounted = useRef(false);
+ const editorCreated = useRef(false);
+
+ useEffect(() => {
+ isComponentMounted.current = true;
+ }, []);
+
const [currentUser] = useAtom(currentUserAtom);
const [, setEditor] = useAtom(pageEditorAtom);
const [, setAsideState] = useAtom(asideStateAtom);
@@ -91,6 +110,11 @@ export default function PageEditor({
const userPageEditMode =
currentUser?.user?.settings?.preferences?.pageEditMode ?? PageEditMode.Edit;
+ const canScroll = useCallback(
+ () => isComponentMounted.current && editorCreated.current,
+ [isComponentMounted, editorCreated],
+ );
+ const { handleScrollTo } = useEditorScroll({ canScroll });
// Providers only created once per pageId
const providersRef = useRef<{
local: IndexeddbPersistence;
@@ -215,7 +239,7 @@ export default function PageEditor({
event.preventDefault();
return true;
}
- if ((event.ctrlKey || event.metaKey) && event.code === 'KeyK') {
+ if ((event.ctrlKey || event.metaKey) && event.code === "KeyK") {
searchSpotlight.open();
return true;
}
@@ -252,6 +276,8 @@ export default function PageEditor({
setEditor(editor);
// @ts-ignore
editor.storage.pageId = pageId;
+ handleScrollTo(editor);
+ editorCreated.current = true;
}
},
onUpdate({ editor }) {
@@ -263,11 +289,10 @@ export default function PageEditor({
},
[pageId, editable, remoteProvider],
);
-
- // Track editor's editable state since shouldRerenderOnTransaction is false
+
const editorIsEditable = useEditorState({
editor,
- selector: ctx => {
+ selector: (ctx) => {
return ctx.editor?.isEditable ?? false;
},
});
@@ -369,20 +394,15 @@ export default function PageEditor({
const [showStatic, setShowStatic] = useState(true);
useEffect(() => {
- // Wait for both connection and sync before switching from static editor
if (
!hasConnectedOnceRef.current &&
remoteProvider?.configuration.websocketProvider.status ===
- WebSocketStatus.Connected &&
- isLocalSynced // Also wait for local sync to complete
+ WebSocketStatus.Connected
) {
hasConnectedOnceRef.current = true;
- // Small delay to ensure smooth transition
- setTimeout(() => {
- setShowStatic(false);
- }, 100);
+ setShowStatic(false);
}
- }, [remoteProvider?.configuration.websocketProvider.status, isLocalSynced]);
+ }, [remoteProvider?.configuration.websocketProvider.status]);
if (showStatic) {
return (
diff --git a/apps/client/src/features/editor/readonly-page-editor.tsx b/apps/client/src/features/editor/readonly-page-editor.tsx
index 60bbeb1b..77496fcd 100644
--- a/apps/client/src/features/editor/readonly-page-editor.tsx
+++ b/apps/client/src/features/editor/readonly-page-editor.tsx
@@ -1,13 +1,14 @@
import "@/features/editor/styles/index.css";
-import React, { useMemo } from "react";
+import React, { useCallback, useEffect, useMemo, useRef } from "react";
import { EditorProvider } from "@tiptap/react";
import { mainExtensions } from "@/features/editor/extensions/extensions";
import { Document } from "@tiptap/extension-document";
-import { Heading } from "@tiptap/extension-heading";
+import { Heading, generateNodeId, UniqueID } from "@docmost/editor-ext";
import { Text } from "@tiptap/extension-text";
import { Placeholder } from "@tiptap/extension-placeholder";
import { useAtom } from "jotai";
import { readOnlyEditorAtom } from "@/features/editor/atoms/editor-atoms.ts";
+import { useEditorScroll } from "./hooks/use-editor-scroll";
interface PageEditorProps {
title: string;
@@ -21,9 +22,34 @@ export default function ReadonlyPageEditor({
pageId,
}: PageEditorProps) {
const [, setReadOnlyEditor] = useAtom(readOnlyEditorAtom);
+ const isComponentMounted = useRef(false);
+ const editorCreated = useRef(false);
+
+ const canScroll = useCallback(
+ () => isComponentMounted.current && editorCreated.current,
+ [isComponentMounted, editorCreated],
+ );
+ const initialScrollTo = window.location.hash
+ ? window.location.hash.slice(1)
+ : "";
+ const { handleScrollTo } = useEditorScroll({ canScroll, initialScrollTo });
+
+ useEffect(() => {
+ isComponentMounted.current = true;
+ }, []);
const extensions = useMemo(() => {
- return [...mainExtensions];
+ const filteredExtensions = mainExtensions.filter(
+ (ext) => ext.name !== "uniqueID",
+ );
+
+ return [
+ ...filteredExtensions,
+ UniqueID.configure({
+ types: ["heading", "paragraph"],
+ updateDocument: false,
+ }),
+ ];
}, []);
const titleExtensions = [
@@ -60,6 +86,9 @@ export default function ReadonlyPageEditor({
}
// @ts-ignore
setReadOnlyEditor(editor);
+
+ handleScrollTo(editor);
+ editorCreated.current = true;
}
}}
>
diff --git a/apps/client/src/features/editor/styles/core.css b/apps/client/src/features/editor/styles/core.css
index 479d000d..0aed878e 100644
--- a/apps/client/src/features/editor/styles/core.css
+++ b/apps/client/src/features/editor/styles/core.css
@@ -5,7 +5,7 @@
);
color: light-dark(
var(--mantine-color-default-color),
- var(--mantine-color-dark-0)
+ var(--mantine-color-white)
);
font-size: var(--mantine-font-size-md);
line-height: var(--mantine-line-height-xl);
@@ -115,7 +115,7 @@
}
& > .react-renderer {
- margin-top: var(--mantine-spacing-sm);
+ margin-top: var(--mantine-spacing-sm);
margin-bottom: var(--mantine-spacing-sm);
&:first-child {
@@ -141,7 +141,7 @@
.selection,
*::selection {
- background-color: Highlight;
+ background-color: light-dark(Highlight, var(--mantine-color-gray-7));
}
.comment-mark {
@@ -186,6 +186,39 @@
margin-left: auto;
margin-right: auto;
}
+
+}
+
+.ProseMirror > h1,
+.ProseMirror > h2,
+.ProseMirror > h3,
+.ProseMirror > h4,
+.ProseMirror > h5,
+.ProseMirror > h6 {
+
+ > .link-btn {
+ cursor: pointer;
+ position: relative;
+
+ }
+
+ > .link-btn > .link-btn-content {
+ opacity: 0;
+ position: absolute;
+ left: 5px;
+ top: 0;
+ height: 100%;
+ transition: opacity 0.15s ease;
+ display: inline-flex;
+ justify-content: center;
+ flex-direction: column;
+ }
+
+ &:hover > .link-btn > .link-btn-content {
+ opacity: 1;
+ }
+
+ scroll-margin-top: 80px; /* match your header height */
}
.ProseMirror-icon {
@@ -209,4 +242,3 @@
.actionIconGroup {
background: var(--mantine-color-body);
}
-
diff --git a/apps/client/src/features/editor/styles/highlight.css b/apps/client/src/features/editor/styles/highlight.css
new file mode 100644
index 00000000..332f48e5
--- /dev/null
+++ b/apps/client/src/features/editor/styles/highlight.css
@@ -0,0 +1,177 @@
+/* Highlight colors with dark mode support */
+
+.ProseMirror {
+ /* Blue */
+ mark[data-color="#98d8f2"] {
+ background-color: light-dark(
+ rgb(224 242 254),
+ rgba(37, 99, 235, 0.35)
+ ) !important;
+ }
+
+ /* Green */
+ mark[data-color="#7edb6c"] {
+ background-color: light-dark(
+ rgb(220 252 231),
+ rgba(0, 138, 0, 0.35)
+ ) !important;
+ }
+
+ /* Purple */
+ mark[data-color="#e0d6ed"] {
+ background-color: light-dark(
+ rgb(243 232 255),
+ rgba(147, 51, 234, 0.35)
+ ) !important;
+ }
+
+ /* Red */
+ mark[data-color="#ffc6c2"] {
+ background-color: light-dark(
+ rgb(255 228 230),
+ rgba(224, 0, 0, 0.35)
+ ) !important;
+ }
+
+ /* Yellow */
+ mark[data-color="#faf594"] {
+ background-color: light-dark(
+ rgb(254 249 195),
+ rgba(234, 179, 8, 0.35)
+ ) !important;
+ }
+
+ /* Orange */
+ mark[data-color="#f5c8a9"] {
+ background-color: light-dark(
+ rgb(251, 236, 221),
+ rgba(255, 165, 0, 0.45)
+ ) !important;
+ }
+
+ /* Pink */
+ mark[data-color="#f5cfe0"] {
+ background-color: light-dark(
+ rgb(252, 241, 246),
+ rgba(186, 64, 129, 0.35)
+ ) !important;
+ }
+
+ /* Gray */
+ mark[data-color="#dfdfd7"] {
+ background-color: light-dark(
+ rgb(238 238 235),
+ rgba(168, 162, 158, 0.35)
+ ) !important;
+ }
+
+ /* Brown */
+ mark[data-color="#d7c4b7"] {
+ background-color: light-dark(
+ rgb(215 196 183),
+ rgba(146, 64, 14, 0.35)
+ ) !important;
+ }
+}
+
+
+/* Color selector trigger button styles */
+.color-selector-trigger[data-text-color="#2563EB"] {
+ color: #2563EB !important;
+}
+
+.color-selector-trigger[data-text-color="#008A00"] {
+ color: #008A00 !important;
+}
+
+.color-selector-trigger[data-text-color="#9333EA"] {
+ color: #9333EA !important;
+}
+
+.color-selector-trigger[data-text-color="#E00000"] {
+ color: #E00000 !important;
+}
+
+.color-selector-trigger[data-text-color="#EAB308"] {
+ color: #EAB308 !important;
+}
+
+.color-selector-trigger[data-text-color="#FFA500"] {
+ color: #FFA500 !important;
+}
+
+.color-selector-trigger[data-text-color="#BA4081"] {
+ color: #BA4081 !important;
+}
+
+.color-selector-trigger[data-text-color="#A8A29E"] {
+ color: #A8A29E !important;
+}
+
+.color-selector-trigger[data-text-color="#92400E"] {
+ color: #92400E !important;
+}
+
+/* Highlight background colors with light-dark support - solid colors for trigger button */
+.color-selector-trigger[data-highlight-color="#98d8f2"] {
+ background-color: light-dark(
+ rgb(224 242 254),
+ rgb(30 64 175)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#7edb6c"] {
+ background-color: light-dark(
+ rgb(220 252 231),
+ rgb(21 128 61)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#e0d6ed"] {
+ background-color: light-dark(
+ rgb(243 232 255),
+ rgb(107 33 168)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#ffc6c2"] {
+ background-color: light-dark(
+ rgb(255 228 230),
+ rgb(185 28 28)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#faf594"] {
+ background-color: light-dark(
+ rgb(254 249 195),
+ rgb(161 98 7)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#f5c8a9"] {
+ background-color: light-dark(
+ rgb(251 236 221),
+ rgb(194 65 12)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#f5cfe0"] {
+ background-color: light-dark(
+ rgb(252 241 246),
+ rgb(157 23 77)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#dfdfd7"] {
+ background-color: light-dark(
+ rgb(238 238 235),
+ rgb(115 115 115)
+ ) !important;
+}
+
+.color-selector-trigger[data-highlight-color="#d7c4b7"] {
+ background-color: light-dark(
+ rgb(215 196 183),
+ rgb(120 53 15)
+ ) !important;
+}
diff --git a/apps/client/src/features/editor/styles/index.css b/apps/client/src/features/editor/styles/index.css
index e426e0ba..e32a606f 100644
--- a/apps/client/src/features/editor/styles/index.css
+++ b/apps/client/src/features/editor/styles/index.css
@@ -12,3 +12,4 @@
@import "./find.css";
@import "./mention.css";
@import "./ordered-list.css";
+@import "./highlight.css";
diff --git a/apps/client/src/features/editor/title-editor.tsx b/apps/client/src/features/editor/title-editor.tsx
index f7665ecb..c3610394 100644
--- a/apps/client/src/features/editor/title-editor.tsx
+++ b/apps/client/src/features/editor/title-editor.tsx
@@ -104,7 +104,10 @@ export function TitleEditor({
});
useEffect(() => {
- const pageSlug = buildPageUrl(spaceSlug, slugId, title);
+ const anchorId = window.location.hash
+ ? window.location.hash.substring(1)
+ : undefined;
+ const pageSlug = buildPageUrl(spaceSlug, slugId, title, anchorId);
navigate(pageSlug, { replace: true });
}, [title]);
@@ -192,10 +195,43 @@ export function TitleEditor({
const { key } = event;
const { $head } = titleEditor.state.selection;
+ if (key === "Enter") {
+ event.preventDefault();
+
+ const { $from } = titleEditor.state.selection;
+ const titleText = titleEditor.getText();
+
+ // Get the text offset within the heading node (not document position)
+ const textOffset = $from.parentOffset;
+
+ const textAfterCursor = titleText.slice(textOffset);
+
+ // Delete text after cursor from title (this will be in undo history)
+ const endPos = titleEditor.state.doc.content.size;
+ if (textAfterCursor) {
+ titleEditor.commands.deleteRange({ from: $from.pos, to: endPos });
+ }
+
+ // Don't add to history so undo in page editor won't remove this split
+ pageEditor
+ .chain()
+ .command(({ tr }) => {
+ tr.setMeta("addToHistory", false);
+ return true;
+ })
+ .insertContentAt(0, {
+ type: "paragraph",
+ content: textAfterCursor
+ ? [{ type: "text", text: textAfterCursor }]
+ : undefined,
+ })
+ .focus("start")
+ .run();
+ return;
+ }
+
const shouldFocusEditor =
- key === "Enter" ||
- key === "ArrowDown" ||
- (key === "ArrowRight" && !$head.nodeAfter);
+ key === "ArrowDown" || (key === "ArrowRight" && !$head.nodeAfter);
if (shouldFocusEditor) {
pageEditor.commands.focus("start");
diff --git a/apps/client/src/features/group/components/create-group-form.tsx b/apps/client/src/features/group/components/create-group-form.tsx
index 10d4375f..a08e725a 100644
--- a/apps/client/src/features/group/components/create-group-form.tsx
+++ b/apps/client/src/features/group/components/create-group-form.tsx
@@ -1,11 +1,12 @@
import { Group, Box, Button, TextInput, Stack, Textarea } from "@mantine/core";
import React, { useState } from "react";
import { useCreateGroupMutation } from "@/features/group/queries/group-query.ts";
-import { useForm, zodResolver } from "@mantine/form";
+import { useForm } from "@mantine/form";
import * as z from "zod";
import { useNavigate } from "react-router-dom";
import { MultiUserSelect } from "@/features/group/components/multi-user-select.tsx";
import { useTranslation } from "react-i18next";
+import { zodResolver } from 'mantine-form-zod-resolver';
const formSchema = z.object({
name: z.string().trim().min(2).max(50),
diff --git a/apps/client/src/features/group/components/edit-group-form.tsx b/apps/client/src/features/group/components/edit-group-form.tsx
index 0ea679b4..a682e0b4 100644
--- a/apps/client/src/features/group/components/edit-group-form.tsx
+++ b/apps/client/src/features/group/components/edit-group-form.tsx
@@ -4,10 +4,11 @@ import {
useGroupQuery,
useUpdateGroupMutation,
} from "@/features/group/queries/group-query.ts";
-import { useForm, zodResolver } from "@mantine/form";
+import { useForm } from "@mantine/form";
import * as z from "zod";
import { useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";
+import { zodResolver } from "mantine-form-zod-resolver";
const formSchema = z.object({
name: z.string().min(2).max(50),
diff --git a/apps/client/src/features/group/queries/group-query.ts b/apps/client/src/features/group/queries/group-query.ts
index aeb7787f..01f4509e 100644
--- a/apps/client/src/features/group/queries/group-query.ts
+++ b/apps/client/src/features/group/queries/group-query.ts
@@ -22,6 +22,7 @@ import { IUser } from "@/features/user/types/user.types.ts";
import { useEffect } from "react";
import { validate as isValidUuid } from "uuid";
import { queryClient } from "@/main.tsx";
+import { useTranslation } from 'react-i18next';
export function useGetGroupsQuery(
params?: QueryParams,
@@ -73,11 +74,12 @@ export function useCreateGroupMutation() {
export function useUpdateGroupMutation() {
const queryClient = useQueryClient();
+ const { t } = useTranslation();
return useMutation>({
mutationFn: (data) => updateGroup(data),
onSuccess: (data, variables) => {
- notifications.show({ message: "Group updated successfully" });
+ notifications.show({ message: t("Group updated successfully") });
queryClient.invalidateQueries({
queryKey: ["group", variables.groupId],
});
@@ -91,11 +93,12 @@ export function useUpdateGroupMutation() {
export function useDeleteGroupMutation() {
const queryClient = useQueryClient();
+ const { t } = useTranslation();
return useMutation({
mutationFn: (groupId: string) => deleteGroup({ groupId }),
onSuccess: (data, variables) => {
- notifications.show({ message: "Group deleted successfully" });
+ notifications.show({ message: t("Group deleted successfully") });
queryClient.refetchQueries({ queryKey: ["groups"] });
},
onError: (error) => {
@@ -119,11 +122,12 @@ export function useGroupMembersQuery(
export function useAddGroupMemberMutation() {
const queryClient = useQueryClient();
+ const { t } = useTranslation();
return useMutation({
mutationFn: (data) => addGroupMember(data),
onSuccess: (data, variables) => {
- notifications.show({ message: "Added successfully" });
+ notifications.show({ message: t("Added successfully") });
queryClient.invalidateQueries({
queryKey: ["groupMembers", variables.groupId],
});
@@ -139,6 +143,7 @@ export function useAddGroupMemberMutation() {
export function useRemoveGroupMemberMutation() {
const queryClient = useQueryClient();
+ const { t } = useTranslation();
return useMutation<
void,
@@ -150,7 +155,7 @@ export function useRemoveGroupMemberMutation() {
>({
mutationFn: (data) => removeGroupMember(data),
onSuccess: (data, variables) => {
- notifications.show({ message: "Removed successfully" });
+ notifications.show({ message: t("Removed successfully") });
queryClient.invalidateQueries({
queryKey: ["groupMembers", variables.groupId],
});
diff --git a/apps/client/src/features/page/page.utils.ts b/apps/client/src/features/page/page.utils.ts
index 3ae65aab..06d0ca8d 100644
--- a/apps/client/src/features/page/page.utils.ts
+++ b/apps/client/src/features/page/page.utils.ts
@@ -15,22 +15,29 @@ export const buildPageUrl = (
spaceName: string,
pageSlugId: string,
pageTitle?: string,
+ anchorId?: string,
): string => {
+ let url: string;
if (spaceName === undefined) {
- return `/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ url = `/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ } else {
+ url = `/s/${spaceName}/p/${buildPageSlug(pageSlugId, pageTitle)}`;
}
- return `/s/${spaceName}/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ return anchorId ? `${url}#${anchorId}` : url;
};
export const buildSharedPageUrl = (opts: {
shareId: string;
pageSlugId: string;
pageTitle?: string;
+ anchorId?: string;
}): string => {
- const { shareId, pageSlugId, pageTitle } = opts;
+ const { shareId, pageSlugId, pageTitle, anchorId } = opts;
+ let url: string;
if (!shareId) {
- return `/share/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ url = `/share/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ } else {
+ url = `/share/${shareId}/p/${buildPageSlug(pageSlugId, pageTitle)}`;
}
-
- return `/share/${shareId}/p/${buildPageSlug(pageSlugId, pageTitle)}`;
+ return anchorId ? `${url}#${anchorId}` : url;
};
diff --git a/apps/client/src/features/search/components/search-spotlight-filters.tsx b/apps/client/src/features/search/components/search-spotlight-filters.tsx
index fe0b9e7c..87e03c7e 100644
--- a/apps/client/src/features/search/components/search-spotlight-filters.tsx
+++ b/apps/client/src/features/search/components/search-spotlight-filters.tsx
@@ -9,6 +9,7 @@ import {
ScrollArea,
Avatar,
Group,
+ Switch,
getDefaultZIndex,
} from "@mantine/core";
import {
@@ -17,6 +18,7 @@ import {
IconFileDescription,
IconSearch,
IconCheck,
+ IconSparkles,
} from "@tabler/icons-react";
import { useTranslation } from "react-i18next";
import { useDebouncedValue } from "@mantine/hooks";
@@ -24,15 +26,21 @@ import { useGetSpacesQuery } from "@/features/space/queries/space-query";
import { useLicense } from "@/ee/hooks/use-license";
import classes from "./search-spotlight-filters.module.css";
import { isCloud } from "@/lib/config.ts";
+import { useAtom } from "jotai/index";
+import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts";
interface SearchSpotlightFiltersProps {
onFiltersChange?: (filters: any) => void;
+ onAskClick?: () => void;
spaceId?: string;
+ isAiMode?: boolean;
}
export function SearchSpotlightFilters({
onFiltersChange,
+ onAskClick,
spaceId,
+ isAiMode = false,
}: SearchSpotlightFiltersProps) {
const { t } = useTranslation();
const { hasLicenseKey } = useLicense();
@@ -42,6 +50,7 @@ export function SearchSpotlightFilters({
const [spaceSearchQuery, setSpaceSearchQuery] = useState("");
const [debouncedSpaceQuery] = useDebouncedValue(spaceSearchQuery, 300);
const [contentType, setContentType] = useState("page");
+ const [workspace] = useAtom(workspaceAtom);
const { data: spacesData } = useGetSpacesQuery({
page: 1,
@@ -120,6 +129,31 @@ export function SearchSpotlightFilters({
return (
+ {workspace?.settings?.ai?.search === true && (
+
+ onAskClick()}
+ label={t("Ask AI")}
+ size="sm"
+ color="blue"
+ labelPosition="left"
+ styles={{
+ root: { display: "flex", alignItems: "center" },
+ label: { paddingRight: "8px", fontSize: "13px", fontWeight: 500 },
+ }}
+ />
+
+ )}
+
@@ -241,6 +275,11 @@ export function SearchSpotlightFilters({
{t("Enterprise")}
)}
+ {!option.disabled && isAiMode && option.value === "attachment" && (
+
+ {t("Ask AI not available for attachments")}
+
+ )}
{contentType === option.value && }
diff --git a/apps/client/src/features/search/components/search-spotlight.tsx b/apps/client/src/features/search/components/search-spotlight.tsx
index 045c7477..0351c1e2 100644
--- a/apps/client/src/features/search/components/search-spotlight.tsx
+++ b/apps/client/src/features/search/components/search-spotlight.tsx
@@ -1,12 +1,16 @@
import { Spotlight } from "@mantine/spotlight";
-import { IconSearch } from "@tabler/icons-react";
-import React, { useState, useMemo } from "react";
+import { IconSearch, IconSparkles } from "@tabler/icons-react";
+import { Group, Button } from "@mantine/core";
+import React, { useState, useMemo, useEffect } from "react";
import { useDebouncedValue } from "@mantine/hooks";
import { useTranslation } from "react-i18next";
+import { notifications } from "@mantine/notifications";
import { searchSpotlightStore } from "../constants.ts";
import { SearchSpotlightFilters } from "./search-spotlight-filters.tsx";
import { useUnifiedSearch } from "../hooks/use-unified-search.ts";
+import { useAiSearch } from "../../../ee/ai/hooks/use-ai-search.ts";
import { SearchResultItem } from "./search-result-item.tsx";
+import { AiSearchResult } from "../../../ee/ai/components/ai-search-result.tsx";
import { useLicense } from "@/ee/hooks/use-license.tsx";
import { isCloud } from "@/lib/config.ts";
@@ -24,6 +28,7 @@ export function SearchSpotlight({ spaceId }: SearchSpotlightProps) {
}>({
contentType: "page",
});
+ const [isAiMode, setIsAiMode] = useState(false);
// Build unified search params
const searchParams = useMemo(() => {
@@ -40,7 +45,42 @@ export function SearchSpotlight({ spaceId }: SearchSpotlightProps) {
return params;
}, [debouncedSearchQuery, filters]);
- const { data: searchResults, isLoading } = useUnifiedSearch(searchParams);
+ const { data: searchResults, isLoading } = useUnifiedSearch(
+ searchParams,
+ !isAiMode // Disable regular search when in AI mode
+ );
+ const {
+ //@ts-ignore
+ data: aiSearchResult,
+ //@ts-ignore
+ isPending: isAiLoading,
+ //@ts-ignore
+ mutate: triggerAiSearchMutation,
+ //@ts-ignore
+ reset: resetAiMutation,
+ //@ts-ignore
+ error: aiSearchError,
+ streamingAnswer,
+ streamingSources,
+ clearStreaming,
+ } = useAiSearch();
+
+ // Clear streaming state and mutation data when query changes (user is typing a new query)
+ useEffect(() => {
+ clearStreaming();
+ resetAiMutation();
+ }, [query, clearStreaming, resetAiMutation]);
+
+ // Show error notification when AI search fails
+ useEffect(() => {
+ if (aiSearchError) {
+ notifications.show({
+ message: aiSearchError.message || t("AI search failed. Please try again."),
+ color: "red",
+ position: "top-center"
+ });
+ }
+ }, [aiSearchError, t]);
// Determine result type for rendering
const isAttachmentSearch =
@@ -59,6 +99,16 @@ export function SearchSpotlight({ spaceId }: SearchSpotlightProps) {
setFilters(newFilters);
};
+ const handleAskClick = () => {
+ setIsAiMode(!isAiMode);
+ };
+
+ const handleAiSearchTrigger = () => {
+ if (query.trim() && isAiMode) {
+ triggerAiSearchMutation(searchParams);
+ }
+ };
+
return (
<>
- }
- />
+
+ }
+ style={{ flex: 1 }}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" && isAiMode && query.trim() && !isAiLoading) {
+ e.preventDefault();
+ handleAiSearchTrigger();
+ }
+ }}
+ />
+ {isAiMode && hasLicenseKey && (
+ }
+ onClick={handleAiSearchTrigger}
+ disabled={!query.trim()}
+ loading={isAiLoading}
+ >
+ Ask
+
+ )}
+
- {query.length === 0 && resultItems.length === 0 && (
- {t("Start typing to search...")}
- )}
+ {isAiMode ? (
+ <>
+ {query.length === 0 && (
+ {t("Ask a question...")}
+ )}
+ {query.length > 0 && (isAiLoading || aiSearchResult || streamingAnswer) && (
+
+ )}
+ {query.length > 0 && !isAiLoading && !aiSearchResult && (
+ {t("No answer available")}
+ )}
+ >
+ ) : (
+ <>
+ {query.length === 0 && resultItems.length === 0 && (
+ {t("Start typing to search...")}
+ )}
- {query.length > 0 && !isLoading && resultItems.length === 0 && (
- {t("No results found...")}
- )}
+ {query.length > 0 && !isLoading && resultItems.length === 0 && (
+ {t("No results found...")}
+ )}
- {resultItems.length > 0 && <>{resultItems}>}
+ {resultItems.length > 0 && <>{resultItems}>}
+ >
+ )}
>
diff --git a/apps/client/src/features/search/hooks/use-unified-search.ts b/apps/client/src/features/search/hooks/use-unified-search.ts
index dbc5563f..06663efd 100644
--- a/apps/client/src/features/search/hooks/use-unified-search.ts
+++ b/apps/client/src/features/search/hooks/use-unified-search.ts
@@ -19,6 +19,7 @@ export interface UseUnifiedSearchParams extends IPageSearchParams {
export function useUnifiedSearch(
params: UseUnifiedSearchParams,
+ enabled: boolean = true,
): UseQueryResult {
const { hasLicenseKey } = useLicense();
@@ -38,6 +39,6 @@ export function useUnifiedSearch(
return await searchPage(backendParams);
}
},
- enabled: !!params.query,
+ enabled: !!params.query && enabled,
});
}
diff --git a/apps/client/src/features/space/components/settings-modal.tsx b/apps/client/src/features/space/components/settings-modal.tsx
index 1afce237..27c49325 100644
--- a/apps/client/src/features/space/components/settings-modal.tsx
+++ b/apps/client/src/features/space/components/settings-modal.tsx
@@ -62,14 +62,17 @@ export default function SpaceSettingsModal({
-
-
+
+
+
+
+
diff --git a/apps/client/src/features/space/components/space-members.tsx b/apps/client/src/features/space/components/space-members.tsx
index 02e33eb0..06300293 100644
--- a/apps/client/src/features/space/components/space-members.tsx
+++ b/apps/client/src/features/space/components/space-members.tsx
@@ -113,7 +113,7 @@ export default function SpaceMembersList({
return (
<>
-
+
diff --git a/apps/client/src/features/workspace/services/workspace-service.ts b/apps/client/src/features/workspace/services/workspace-service.ts
index c8ac84a3..e47e2972 100644
--- a/apps/client/src/features/workspace/services/workspace-service.ts
+++ b/apps/client/src/features/workspace/services/workspace-service.ts
@@ -42,7 +42,7 @@ export async function deleteWorkspaceMember(data: {
await api.post("/workspace/members/delete", data);
}
-export async function updateWorkspace(data: Partial) {
+export async function updateWorkspace(data: Partial & { aiSearch?: boolean }) {
const req = await api.post("/workspace/update", data);
return req.data;
}
diff --git a/apps/client/src/features/workspace/types/workspace.types.ts b/apps/client/src/features/workspace/types/workspace.types.ts
index 600641c9..f7d0b964 100644
--- a/apps/client/src/features/workspace/types/workspace.types.ts
+++ b/apps/client/src/features/workspace/types/workspace.types.ts
@@ -9,7 +9,7 @@ export interface IWorkspace {
defaultSpaceId: string;
customDomain: string;
enableInvite: boolean;
- settings: any;
+ settings: IWorkspaceSettings;
status: string;
enforceSso: boolean;
stripeCustomerId: string;
@@ -24,6 +24,14 @@ export interface IWorkspace {
enforceMfa?: boolean;
}
+export interface IWorkspaceSettings {
+ ai?: IWorkspaceAiSettings;
+}
+
+export interface IWorkspaceAiSettings {
+ search?: boolean;
+}
+
export interface ICreateInvite {
role: string;
emails: string[];
diff --git a/apps/client/src/lib/constants.ts b/apps/client/src/lib/constants.ts
index eb8c9105..69ebfd4e 100644
--- a/apps/client/src/lib/constants.ts
+++ b/apps/client/src/lib/constants.ts
@@ -1,4 +1,4 @@
export const INTERNAL_LINK_REGEX =
- /^(https?:\/\/)?([^\/]+)?(\/s\/([^\/]+)\/)?p\/([a-zA-Z0-9-]+)\/?$/;
+ /^(https?:\/\/)?([^\/]+)?(\/s\/([^\/]+)\/)?p\/([a-zA-Z0-9-]+)\/?(?:#(.*))?$/;
-export const FIVE_MINUTES = 5 * 60 * 1000;
\ No newline at end of file
+export const FIVE_MINUTES = 5 * 60 * 1000;
diff --git a/apps/client/src/lib/types.ts b/apps/client/src/lib/types.ts
index fd0e3212..2a926d46 100644
--- a/apps/client/src/lib/types.ts
+++ b/apps/client/src/lib/types.ts
@@ -2,6 +2,7 @@ export interface QueryParams {
query?: string;
page?: number;
limit?: number;
+ adminView?: boolean;
}
export enum UserRole {
diff --git a/apps/client/src/main.tsx b/apps/client/src/main.tsx
index 22c3f1c1..63a775de 100644
--- a/apps/client/src/main.tsx
+++ b/apps/client/src/main.tsx
@@ -1,6 +1,8 @@
import "@mantine/core/styles.css";
import "@mantine/spotlight/styles.css";
import "@mantine/notifications/styles.css";
+import '@mantine/dates/styles.css';
+
import ReactDOM from "react-dom/client";
import App from "./App.tsx";
import { mantineCssResolver, theme } from "@/theme";
@@ -49,7 +51,7 @@ root.render(
-
+
diff --git a/apps/client/src/pages/page/page.tsx b/apps/client/src/pages/page/page.tsx
index 65a4f64f..a1dfee6f 100644
--- a/apps/client/src/pages/page/page.tsx
+++ b/apps/client/src/pages/page/page.tsx
@@ -21,6 +21,7 @@ const MemoizedHistoryModal = React.memo(HistoryModal);
export default function Page() {
const { t } = useTranslation();
const { pageSlug } = useParams();
+
const {
data: page,
isLoading,
diff --git a/apps/server/package.json b/apps/server/package.json
index 0c5ea90e..c662a7ac 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -1,6 +1,6 @@
{
"name": "server",
- "version": "0.23.2",
+ "version": "0.24.0",
"description": "",
"author": "",
"private": true,
@@ -30,6 +30,9 @@
"test:e2e": "jest --config test/jest-e2e.json"
},
"dependencies": {
+ "@ai-sdk/azure": "^2.0.47",
+ "@ai-sdk/google": "^2.0.18",
+ "@ai-sdk/openai": "^2.0.46",
"@aws-sdk/client-s3": "3.701.0",
"@aws-sdk/lib-storage": "3.701.0",
"@aws-sdk/s3-request-presigner": "3.701.0",
@@ -37,49 +40,55 @@
"@fastify/cookie": "^11.0.2",
"@fastify/multipart": "^9.0.3",
"@fastify/static": "^8.2.0",
- "@nestjs/bullmq": "^11.0.2",
- "@nestjs/common": "^11.1.3",
+ "@langchain/textsplitters": "^0.1.0",
+ "@nestjs-labs/nestjs-ioredis": "^11.0.4",
+ "@nestjs/bullmq": "^11.0.4",
+ "@nestjs/common": "^11.1.9",
"@nestjs/config": "^4.0.2",
- "@nestjs/core": "^11.1.3",
+ "@nestjs/core": "^11.1.9",
"@nestjs/event-emitter": "^3.0.1",
- "@nestjs/jwt": "^11.0.0",
+ "@nestjs/jwt": "11.0.0",
"@nestjs/mapped-types": "^2.1.0",
"@nestjs/passport": "^11.0.5",
- "@nestjs/platform-fastify": "^11.1.3",
- "@nestjs/platform-socket.io": "^11.1.3",
- "@nestjs/schedule": "^6.0.0",
+ "@nestjs/platform-fastify": "^11.1.9",
+ "@nestjs/platform-socket.io": "^11.1.9",
+ "@nestjs/schedule": "^6.0.1",
"@nestjs/terminus": "^11.0.0",
- "@nestjs/websockets": "^11.1.3",
+ "@nestjs/websockets": "^11.1.9",
"@node-saml/passport-saml": "^5.1.0",
"@react-email/components": "0.0.28",
"@react-email/render": "1.0.2",
"@socket.io/redis-adapter": "^8.3.0",
- "bcrypt": "^5.1.1",
- "bullmq": "^5.53.2",
+ "ai": "^5.0.65",
+ "ai-sdk-ollama": "^0.12.0",
+ "bcrypt": "^6.0.0",
+ "bullmq": "^5.65.0",
"cache-manager": "^6.4.3",
"cheerio": "^1.1.0",
"class-transformer": "^0.5.1",
- "class-validator": "^0.14.1",
+ "class-validator": "^0.14.3",
"cookie": "^1.0.2",
"fs-extra": "^11.3.0",
- "happy-dom": "^18.0.1",
+ "happy-dom": "20.0.10",
+ "ioredis": "^5.4.1",
"jsonwebtoken": "^9.0.2",
"kysely": "^0.28.2",
"kysely-migration-cli": "^0.4.2",
"ldapts": "^7.4.0",
- "mammoth": "^1.10.0",
+ "mammoth": "^1.11.0",
"mime-types": "^2.1.35",
"nanoid": "3.3.11",
"nestjs-kysely": "^1.2.0",
- "nodemailer": "^7.0.3",
+ "nodemailer": "^7.0.11",
"openid-client": "^5.7.1",
"otpauth": "^9.4.0",
"p-limit": "^6.2.0",
"passport-google-oauth20": "^2.0.0",
"passport-jwt": "^4.0.1",
- "pdfjs-dist": "^5.4.54",
- "pg": "^8.16.0",
+ "pdfjs-dist": "^5.4.394",
+ "pg": "^8.16.3",
"pg-tsquery": "^8.4.2",
+ "pgvector": "^0.2.1",
"postmark": "^4.0.5",
"react": "^18.3.1",
"reflect-metadata": "^0.2.2",
@@ -89,7 +98,8 @@
"socket.io": "^4.8.1",
"stripe": "^17.5.0",
"tmp-promise": "^3.0.3",
- "ws": "^8.18.2",
+ "typesense": "^2.1.0",
+ "ws": "^8.18.3",
"yauzl": "^3.2.0"
},
"devDependencies": {
diff --git a/apps/server/src/app.module.ts b/apps/server/src/app.module.ts
index 052faed2..56691444 100644
--- a/apps/server/src/app.module.ts
+++ b/apps/server/src/app.module.ts
@@ -16,6 +16,8 @@ import { ExportModule } from './integrations/export/export.module';
import { ImportModule } from './integrations/import/import.module';
import { SecurityModule } from './integrations/security/security.module';
import { TelemetryModule } from './integrations/telemetry/telemetry.module';
+import { RedisModule } from '@nestjs-labs/nestjs-ioredis';
+import { RedisConfigService } from './integrations/redis/redis-config.service';
const enterpriseModules = [];
try {
@@ -36,6 +38,9 @@ try {
CoreModule,
DatabaseModule,
EnvironmentModule,
+ RedisModule.forRootAsync({
+ useClass: RedisConfigService,
+ }),
CollaborationModule,
WsModule,
QueueModule,
diff --git a/apps/server/src/collaboration/collaboration.util.ts b/apps/server/src/collaboration/collaboration.util.ts
index 387a4350..16ca5bd5 100644
--- a/apps/server/src/collaboration/collaboration.util.ts
+++ b/apps/server/src/collaboration/collaboration.util.ts
@@ -2,13 +2,13 @@ import { StarterKit } from '@tiptap/starter-kit';
import { TextAlign } from '@tiptap/extension-text-align';
import { Superscript } from '@tiptap/extension-superscript';
import SubScript from '@tiptap/extension-subscript';
-import { Highlight } from '@tiptap/extension-highlight';
import { Typography } from '@tiptap/extension-typography';
import { TextStyle } from '@tiptap/extension-text-style';
import { Color } from '@tiptap/extension-color';
import { Youtube } from '@tiptap/extension-youtube';
import { TaskList, TaskItem } from '@tiptap/extension-list';
import {
+ Heading,
Callout,
Comment,
CustomCodeBlock,
@@ -31,10 +31,12 @@ import {
Embed,
Mention,
Subpages,
+ Highlight,
+ UniqueID,
+ addUniqueIdsToDoc,
} from '@docmost/editor-ext';
import { generateText, getSchema, JSONContent } from '@tiptap/core';
-import { generateHTML } from '../common/helpers/prosemirror/html';
-import { generateJSON } from '../common/helpers/prosemirror/html';
+import { generateHTML, generateJSON } from '../common/helpers/prosemirror/html';
// @tiptap/html library works best for generating prosemirror json state but not HTML
// see: https://github.com/ueberdosis/tiptap/issues/5352
// see:https://github.com/ueberdosis/tiptap/issues/4089
@@ -46,6 +48,11 @@ export const tiptapExtensions = [
codeBlock: false,
link: false,
trailingNode: false,
+ heading: false,
+ }),
+ Heading,
+ UniqueID.configure({
+ types: ['heading', 'paragraph'],
}),
Comment,
TextAlign.configure({ types: ['heading', 'paragraph'] }),
@@ -88,7 +95,14 @@ export function jsonToHtml(tiptapJson: any) {
}
export function htmlToJson(html: string) {
- return generateJSON(html, tiptapExtensions);
+ const pmJson = generateJSON(html, tiptapExtensions);
+
+ try {
+ return addUniqueIdsToDoc(pmJson, tiptapExtensions);
+ } catch (error) {
+ console.warn('failed to add unique ids to doc', error);
+ return pmJson;
+ }
}
export function jsonToText(tiptapJson: JSONContent) {
diff --git a/apps/server/src/collaboration/extensions/persistence.extension.ts b/apps/server/src/collaboration/extensions/persistence.extension.ts
index 88284fd2..54c4a89e 100644
--- a/apps/server/src/collaboration/extensions/persistence.extension.ts
+++ b/apps/server/src/collaboration/extensions/persistence.extension.ts
@@ -35,6 +35,7 @@ export class PersistenceExtension implements Extension {
@InjectKysely() private readonly db: KyselyDB,
private eventEmitter: EventEmitter2,
@InjectQueue(QueueName.GENERAL_QUEUE) private generalQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
) {}
async onLoadDocument(data: onLoadDocumentPayload) {
@@ -168,6 +169,11 @@ export class PersistenceExtension implements Extension {
workspaceId: page.workspaceId,
mentions: pageMentions,
} as IPageBacklinkJob);
+
+ await this.aiQueue.add(QueueJob.PAGE_CONTENT_UPDATED, {
+ pageIds: [pageId],
+ workspaceId: page.workspaceId,
+ });
}
}
diff --git a/apps/server/src/common/events/event.contants.ts b/apps/server/src/common/events/event.contants.ts
index 23149288..c766fe59 100644
--- a/apps/server/src/common/events/event.contants.ts
+++ b/apps/server/src/common/events/event.contants.ts
@@ -1,3 +1,18 @@
export enum EventName {
COLLAB_PAGE_UPDATED = 'collab.page.updated',
-}
\ No newline at end of file
+ PAGE_CREATED = 'page.created',
+ PAGE_UPDATED = 'page.updated',
+ PAGE_CONTENT_UPDATED = 'page-content-updated',
+ PAGE_MOVED_TO_SPACE = 'page-moved-to-space',
+ PAGE_DELETED = 'page.deleted',
+ PAGE_SOFT_DELETED = 'page.soft_deleted',
+ PAGE_RESTORED = 'page.restored',
+
+ SPACE_CREATED = 'space.created',
+ SPACE_UPDATED = 'space.updated',
+ SPACE_DELETED = 'space.deleted',
+
+ WORKSPACE_CREATED = 'workspace.created',
+ WORKSPACE_UPDATED = 'workspace.updated',
+ WORKSPACE_DELETED = 'workspace.deleted',
+}
diff --git a/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts b/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts
index 8398b689..635ee6a4 100644
--- a/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts
+++ b/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts
@@ -1,6 +1,6 @@
-import type { Node, Schema } from '@tiptap/pm/model'
+import type { Node, Schema } from '@tiptap/pm/model';
import { DOMSerializer } from '@tiptap/pm/model';
-import { Window } from 'happy-dom'
+import { Window } from 'happy-dom';
/**
* Returns the HTML string representation of a given document node.
@@ -15,29 +15,40 @@ import { Window } from 'happy-dom'
* const html = getHTMLFromFragment(doc, schema)
* ```
*/
-export function getHTMLFromFragment(doc: Node, schema: Schema, options?: { document?: Document }): string {
+export function getHTMLFromFragment(
+ doc: Node,
+ schema: Schema,
+ options?: { document?: Document },
+): string {
if (options?.document) {
- const wrap = options.document.createElement('div')
+ const wrap = options.document.createElement('div');
- DOMSerializer.fromSchema(schema).serializeFragment(doc.content, { document: options.document }, wrap)
- return wrap.innerHTML
+ DOMSerializer.fromSchema(schema).serializeFragment(
+ doc.content,
+ { document: options.document },
+ wrap,
+ );
+ return wrap.innerHTML;
}
- const localWindow = new Window()
- let result: string
+ const localWindow = new Window();
+ let result: string;
try {
- const fragment = DOMSerializer.fromSchema(schema).serializeFragment(doc.content, {
- document: localWindow.document as unknown as Document,
- })
+ const fragment = DOMSerializer.fromSchema(schema).serializeFragment(
+ doc.content,
+ {
+ document: localWindow.document as unknown as Document,
+ },
+ );
- const serializer = new localWindow.XMLSerializer()
- result = serializer.serializeToString(fragment as any)
+ const serializer = new localWindow.XMLSerializer();
+ result = serializer.serializeToString(fragment as any);
} finally {
// clean up happy-dom to avoid memory leaks
- localWindow.happyDOM.abort()
- localWindow.happyDOM.close()
+ localWindow.happyDOM.abort();
+ localWindow.happyDOM.close();
}
- return result
+ return result;
}
diff --git a/apps/server/src/common/validator/is-iso6391.ts b/apps/server/src/common/validator/is-iso6391.ts
new file mode 100644
index 00000000..888157f0
--- /dev/null
+++ b/apps/server/src/common/validator/is-iso6391.ts
@@ -0,0 +1,34 @@
+// MIT - https://github.com/typestack/class-validator/pull/2626
+import isISO6391Validator from 'validator/lib/isISO6391';
+import { buildMessage, ValidateBy, ValidationOptions } from 'class-validator';
+
+export const IS_ISO6391 = 'isISO6391';
+
+/**
+ * Check if the string is a valid [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) officially assigned language code.
+ */
+export function isISO6391(value: unknown): boolean {
+ return typeof value === 'string' && isISO6391Validator(value);
+}
+
+/**
+ * Check if the string is a valid [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) officially assigned language code.
+ */
+export function IsISO6391(
+ validationOptions?: ValidationOptions,
+): PropertyDecorator {
+ return ValidateBy(
+ {
+ name: IS_ISO6391,
+ validator: {
+ validate: (value, args): boolean => isISO6391(value),
+ defaultMessage: buildMessage(
+ (eachPrefix) =>
+ eachPrefix + '$property must be a valid ISO 639-1 language code',
+ validationOptions,
+ ),
+ },
+ },
+ validationOptions,
+ );
+}
diff --git a/apps/server/src/core/auth/dto/jwt-payload.ts b/apps/server/src/core/auth/dto/jwt-payload.ts
index 06322712..0f7db401 100644
--- a/apps/server/src/core/auth/dto/jwt-payload.ts
+++ b/apps/server/src/core/auth/dto/jwt-payload.ts
@@ -4,6 +4,7 @@ export enum JwtType {
EXCHANGE = 'exchange',
ATTACHMENT = 'attachment',
MFA_TOKEN = 'mfa_token',
+ API_KEY = 'api_key',
}
export type JwtPayload = {
sub: string;
@@ -36,3 +37,10 @@ export interface JwtMfaTokenPayload {
workspaceId: string;
type: 'mfa_token';
}
+
+export type JwtApiKeyPayload = {
+ sub: string;
+ workspaceId: string;
+ apiKeyId: string;
+ type: 'api_key';
+};
diff --git a/apps/server/src/core/auth/services/token.service.ts b/apps/server/src/core/auth/services/token.service.ts
index f1c4c5c0..0415b22d 100644
--- a/apps/server/src/core/auth/services/token.service.ts
+++ b/apps/server/src/core/auth/services/token.service.ts
@@ -6,6 +6,7 @@ import {
import { JwtService } from '@nestjs/jwt';
import { EnvironmentService } from '../../../integrations/environment/environment.service';
import {
+ JwtApiKeyPayload,
JwtAttachmentPayload,
JwtCollabPayload,
JwtExchangePayload,
@@ -77,10 +78,7 @@ export class TokenService {
return this.jwtService.sign(payload, { expiresIn: '1h' });
}
- async generateMfaToken(
- user: User,
- workspaceId: string,
- ): Promise {
+ async generateMfaToken(user: User, workspaceId: string): Promise {
if (user.deactivatedAt || user.deletedAt) {
throw new ForbiddenException();
}
@@ -93,6 +91,27 @@ export class TokenService {
return this.jwtService.sign(payload, { expiresIn: '5m' });
}
+ async generateApiToken(opts: {
+ apiKeyId: string;
+ user: User;
+ workspaceId: string;
+ expiresIn?: string | number;
+ }): Promise {
+ const { apiKeyId, user, workspaceId, expiresIn } = opts;
+ if (user.deactivatedAt || user.deletedAt) {
+ throw new ForbiddenException();
+ }
+
+ const payload: JwtApiKeyPayload = {
+ sub: user.id,
+ apiKeyId: apiKeyId,
+ workspaceId,
+ type: JwtType.API_KEY,
+ };
+
+ return this.jwtService.sign(payload, expiresIn ? { expiresIn } : {});
+ }
+
async verifyJwt(token: string, tokenType: string) {
const payload = await this.jwtService.verifyAsync(token, {
secret: this.environmentService.getAppSecret(),
diff --git a/apps/server/src/core/auth/strategies/jwt.strategy.ts b/apps/server/src/core/auth/strategies/jwt.strategy.ts
index c31a597b..7616fb61 100644
--- a/apps/server/src/core/auth/strategies/jwt.strategy.ts
+++ b/apps/server/src/core/auth/strategies/jwt.strategy.ts
@@ -2,11 +2,12 @@ import { Injectable, Logger, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-jwt';
import { EnvironmentService } from '../../../integrations/environment/environment.service';
-import { JwtPayload, JwtType } from '../dto/jwt-payload';
+import { JwtApiKeyPayload, JwtPayload, JwtType } from '../dto/jwt-payload';
import { WorkspaceRepo } from '@docmost/db/repos/workspace/workspace.repo';
import { UserRepo } from '@docmost/db/repos/user/user.repo';
import { FastifyRequest } from 'fastify';
import { extractBearerTokenFromHeader } from '../../../common/helpers';
+import { ModuleRef } from '@nestjs/core';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
@@ -16,6 +17,7 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
private userRepo: UserRepo,
private workspaceRepo: WorkspaceRepo,
private readonly environmentService: EnvironmentService,
+ private moduleRef: ModuleRef,
) {
super({
jwtFromRequest: (req: FastifyRequest) => {
@@ -27,8 +29,8 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
});
}
- async validate(req: any, payload: JwtPayload) {
- if (!payload.workspaceId || payload.type !== JwtType.ACCESS) {
+ async validate(req: any, payload: JwtPayload | JwtApiKeyPayload) {
+ if (!payload.workspaceId) {
throw new UnauthorizedException();
}
@@ -36,6 +38,14 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
throw new UnauthorizedException('Workspace does not match');
}
+ if (payload.type === JwtType.API_KEY) {
+ return this.validateApiKey(req, payload as JwtApiKeyPayload);
+ }
+
+ if (payload.type !== JwtType.ACCESS) {
+ throw new UnauthorizedException();
+ }
+
const workspace = await this.workspaceRepo.findById(payload.workspaceId);
if (!workspace) {
@@ -49,4 +59,30 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
return { user, workspace };
}
+
+ private async validateApiKey(req: any, payload: JwtApiKeyPayload) {
+ let ApiKeyModule: any;
+ let isApiKeyModuleReady = false;
+
+ try {
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ ApiKeyModule = require('./../../../ee/api-key/api-key.service');
+ isApiKeyModuleReady = true;
+ } catch (err) {
+ this.logger.debug(
+ 'API Key module requested but enterprise module not bundled in this build',
+ );
+ isApiKeyModuleReady = false;
+ }
+
+ if (isApiKeyModuleReady) {
+ const ApiKeyService = this.moduleRef.get(ApiKeyModule.ApiKeyService, {
+ strict: false,
+ });
+
+ return ApiKeyService.validateApiKey(payload);
+ }
+
+ throw new UnauthorizedException('Enterprise API Key module missing');
+ }
}
diff --git a/apps/server/src/core/casl/abilities/workspace-ability.factory.ts b/apps/server/src/core/casl/abilities/workspace-ability.factory.ts
index 2fcac679..7344fcbb 100644
--- a/apps/server/src/core/casl/abilities/workspace-ability.factory.ts
+++ b/apps/server/src/core/casl/abilities/workspace-ability.factory.ts
@@ -40,6 +40,7 @@ function buildWorkspaceOwnerAbility() {
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Group);
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Member);
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Attachment);
+ can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.API);
return build();
}
@@ -55,6 +56,7 @@ function buildWorkspaceAdminAbility() {
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Group);
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Member);
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Attachment);
+ can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.API);
return build();
}
@@ -68,6 +70,7 @@ function buildWorkspaceMemberAbility() {
can(WorkspaceCaslAction.Read, WorkspaceCaslSubject.Space);
can(WorkspaceCaslAction.Read, WorkspaceCaslSubject.Group);
can(WorkspaceCaslAction.Manage, WorkspaceCaslSubject.Attachment);
+ can(WorkspaceCaslAction.Create, WorkspaceCaslSubject.API);
return build();
}
diff --git a/apps/server/src/core/casl/interfaces/workspace-ability.type.ts b/apps/server/src/core/casl/interfaces/workspace-ability.type.ts
index 99d56ffe..00d1677d 100644
--- a/apps/server/src/core/casl/interfaces/workspace-ability.type.ts
+++ b/apps/server/src/core/casl/interfaces/workspace-ability.type.ts
@@ -11,6 +11,7 @@ export enum WorkspaceCaslSubject {
Space = 'space',
Group = 'group',
Attachment = 'attachment',
+ API = 'api_key',
}
export type IWorkspaceAbility =
@@ -18,4 +19,5 @@ export type IWorkspaceAbility =
| [WorkspaceCaslAction, WorkspaceCaslSubject.Member]
| [WorkspaceCaslAction, WorkspaceCaslSubject.Space]
| [WorkspaceCaslAction, WorkspaceCaslSubject.Group]
- | [WorkspaceCaslAction, WorkspaceCaslSubject.Attachment];
+ | [WorkspaceCaslAction, WorkspaceCaslSubject.Attachment]
+ | [WorkspaceCaslAction, WorkspaceCaslSubject.API];
diff --git a/apps/server/src/core/page/page.controller.ts b/apps/server/src/core/page/page.controller.ts
index 450874f7..97275440 100644
--- a/apps/server/src/core/page/page.controller.ts
+++ b/apps/server/src/core/page/page.controller.ts
@@ -1,23 +1,23 @@
import {
- Controller,
- Post,
+ BadRequestException,
Body,
+ Controller,
+ ForbiddenException,
HttpCode,
HttpStatus,
- UseGuards,
- ForbiddenException,
NotFoundException,
- BadRequestException,
+ Post,
+ UseGuards,
} from '@nestjs/common';
import { PageService } from './services/page.service';
import { CreatePageDto } from './dto/create-page.dto';
import { UpdatePageDto } from './dto/update-page.dto';
import { MovePageDto, MovePageToSpaceDto } from './dto/move-page.dto';
import {
+ DeletePageDto,
PageHistoryIdDto,
PageIdDto,
PageInfoDto,
- DeletePageDto,
} from './dto/page.dto';
import { PageHistoryService } from './services/page-history.service';
import { AuthUser } from '../../common/decorators/auth-user.decorator';
@@ -106,7 +106,11 @@ export class PageController {
@HttpCode(HttpStatus.OK)
@Post('delete')
- async delete(@Body() deletePageDto: DeletePageDto, @AuthUser() user: User) {
+ async delete(
+ @Body() deletePageDto: DeletePageDto,
+ @AuthUser() user: User,
+ @AuthWorkspace() workspace: Workspace,
+ ) {
const page = await this.pageRepo.findById(deletePageDto.pageId);
if (!page) {
@@ -122,19 +126,27 @@ export class PageController {
'Only space admins can permanently delete pages',
);
}
- await this.pageService.forceDelete(deletePageDto.pageId);
+ await this.pageService.forceDelete(deletePageDto.pageId, workspace.id);
} else {
// Soft delete requires page manage permissions
if (ability.cannot(SpaceCaslAction.Manage, SpaceCaslSubject.Page)) {
throw new ForbiddenException();
}
- await this.pageService.remove(deletePageDto.pageId, user.id);
+ await this.pageService.removePage(
+ deletePageDto.pageId,
+ user.id,
+ workspace.id,
+ );
}
}
@HttpCode(HttpStatus.OK)
@Post('restore')
- async restore(@Body() pageIdDto: PageIdDto, @AuthUser() user: User) {
+ async restore(
+ @Body() pageIdDto: PageIdDto,
+ @AuthUser() user: User,
+ @AuthWorkspace() workspace: Workspace,
+ ) {
const page = await this.pageRepo.findById(pageIdDto.pageId);
if (!page) {
@@ -146,13 +158,11 @@ export class PageController {
throw new ForbiddenException();
}
- await this.pageRepo.restorePage(pageIdDto.pageId);
+ await this.pageRepo.restorePage(pageIdDto.pageId, workspace.id);
- // Return the restored page data with hasChildren info
- const restoredPage = await this.pageRepo.findById(pageIdDto.pageId, {
+ return this.pageRepo.findById(pageIdDto.pageId, {
includeHasChildren: true,
});
- return restoredPage;
}
@HttpCode(HttpStatus.OK)
diff --git a/apps/server/src/core/page/page.module.ts b/apps/server/src/core/page/page.module.ts
index 42693e3d..9dfba84a 100644
--- a/apps/server/src/core/page/page.module.ts
+++ b/apps/server/src/core/page/page.module.ts
@@ -9,6 +9,6 @@ import { StorageModule } from '../../integrations/storage/storage.module';
controllers: [PageController],
providers: [PageService, PageHistoryService, TrashCleanupService],
exports: [PageService, PageHistoryService],
- imports: [StorageModule]
+ imports: [StorageModule],
})
export class PageModule {}
diff --git a/apps/server/src/core/page/services/page.service.ts b/apps/server/src/core/page/services/page.service.ts
index a538eedf..9bfb5e1c 100644
--- a/apps/server/src/core/page/services/page.service.ts
+++ b/apps/server/src/core/page/services/page.service.ts
@@ -38,6 +38,8 @@ import { StorageService } from '../../../integrations/storage/storage.service';
import { InjectQueue } from '@nestjs/bullmq';
import { Queue } from 'bullmq';
import { QueueJob, QueueName } from '../../../integrations/queue/constants';
+import { EventName } from '../../../common/events/event.contants';
+import { EventEmitter2 } from '@nestjs/event-emitter';
@Injectable()
export class PageService {
@@ -49,6 +51,8 @@ export class PageService {
@InjectKysely() private readonly db: KyselyDB,
private readonly storageService: StorageService,
@InjectQueue(QueueName.ATTACHMENT_QUEUE) private attachmentQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
+ private eventEmitter: EventEmitter2,
) {}
async findById(
@@ -231,21 +235,33 @@ export class PageService {
);
}
- // update spaceId in shares
if (pageIds.length > 0) {
+ // update spaceId in shares
await trx
.updateTable('shares')
.set({ spaceId: spaceId })
.where('pageId', 'in', pageIds)
.execute();
- }
- // Update attachments
- await this.attachmentRepo.updateAttachmentsByPageId(
- { spaceId },
- pageIds,
- trx,
- );
+ // Update comments
+ await trx
+ .updateTable('comments')
+ .set({ spaceId: spaceId })
+ .where('pageId', 'in', pageIds)
+ .execute();
+
+ // Update attachments
+ await this.attachmentRepo.updateAttachmentsByPageId(
+ { spaceId },
+ pageIds,
+ trx,
+ );
+
+ await this.aiQueue.add(QueueJob.PAGE_MOVED_TO_SPACE, {
+ pageId: pageIds,
+ workspaceId: rootPage.workspaceId
+ });
+ }
});
}
@@ -371,15 +387,21 @@ export class PageService {
workspaceId: page.workspaceId,
creatorId: authUser.id,
lastUpdatedById: authUser.id,
- parentPageId: page.parentPageId
- ? pageMap.get(page.parentPageId)?.newPageId
- : null,
+ parentPageId: page.id === rootPage.id
+ ? (isDuplicateInSameSpace ? rootPage.parentPageId : null)
+ : (page.parentPageId ? pageMap.get(page.parentPageId)?.newPageId : null),
};
}),
);
await this.db.insertInto('pages').values(insertablePages).execute();
+ const insertedPageIds = insertablePages.map((page) => page.id);
+ this.eventEmitter.emit(EventName.PAGE_CREATED, {
+ pageIds: insertedPageIds,
+ workspaceId: authUser.workspaceId,
+ });
+
//TODO: best to handle this in a queue
const attachmentsIds = Array.from(attachmentMap.keys());
if (attachmentsIds.length > 0) {
@@ -565,7 +587,7 @@ export class PageService {
return await this.pageRepo.getDeletedPagesInSpace(spaceId, pagination);
}
- async forceDelete(pageId: string): Promise {
+ async forceDelete(pageId: string, workspaceId: string): Promise {
// Get all descendant IDs (including the page itself) using recursive CTE
const descendants = await this.db
.withRecursive('page_descendants', (db) =>
@@ -606,10 +628,18 @@ export class PageService {
if (pageIds.length > 0) {
await this.db.deleteFrom('pages').where('id', 'in', pageIds).execute();
+ this.eventEmitter.emit(EventName.PAGE_DELETED, {
+ pageIds: pageIds,
+ workspaceId,
+ });
}
}
- async remove(pageId: string, userId: string): Promise {
- await this.pageRepo.removePage(pageId, userId);
+ async removePage(
+ pageId: string,
+ userId: string,
+ workspaceId: string,
+ ): Promise {
+ await this.pageRepo.removePage(pageId, userId, workspaceId);
}
}
diff --git a/apps/server/src/core/search/dto/search-response.dto.ts b/apps/server/src/core/search/dto/search-response.dto.ts
index bf8db9d1..8f5b343d 100644
--- a/apps/server/src/core/search/dto/search-response.dto.ts
+++ b/apps/server/src/core/search/dto/search-response.dto.ts
@@ -1,3 +1,5 @@
+import { Space } from '@docmost/db/types/entity.types';
+
export class SearchResponseDto {
id: string;
title: string;
@@ -8,4 +10,5 @@ export class SearchResponseDto {
highlight: string;
createdAt: Date;
updatedAt: Date;
+ space: Partial;
}
diff --git a/apps/server/src/core/search/search.controller.ts b/apps/server/src/core/search/search.controller.ts
index 35083faf..c968c344 100644
--- a/apps/server/src/core/search/search.controller.ts
+++ b/apps/server/src/core/search/search.controller.ts
@@ -5,6 +5,7 @@ import {
ForbiddenException,
HttpCode,
HttpStatus,
+ Logger,
Post,
UseGuards,
} from '@nestjs/common';
@@ -24,13 +25,19 @@ import {
} from '../casl/interfaces/space-ability.type';
import { AuthUser } from '../../common/decorators/auth-user.decorator';
import { Public } from 'src/common/decorators/public.decorator';
+import { EnvironmentService } from '../../integrations/environment/environment.service';
+import { ModuleRef } from '@nestjs/core';
@UseGuards(JwtAuthGuard)
@Controller('search')
export class SearchController {
+ private readonly logger = new Logger(SearchController.name);
+
constructor(
private readonly searchService: SearchService,
private readonly spaceAbility: SpaceAbilityFactory,
+ private readonly environmentService: EnvironmentService,
+ private moduleRef: ModuleRef,
) {}
@HttpCode(HttpStatus.OK)
@@ -53,7 +60,14 @@ export class SearchController {
}
}
- return this.searchService.searchPage(searchDto.query, searchDto, {
+ if (this.environmentService.getSearchDriver() === 'typesense') {
+ return this.searchTypesense(searchDto, {
+ userId: user.id,
+ workspaceId: workspace.id,
+ });
+ }
+
+ return this.searchService.searchPage(searchDto, {
userId: user.id,
workspaceId: workspace.id,
});
@@ -81,8 +95,47 @@ export class SearchController {
throw new BadRequestException('shareId is required');
}
- return this.searchService.searchPage(searchDto.query, searchDto, {
+ if (this.environmentService.getSearchDriver() === 'typesense') {
+ return this.searchTypesense(searchDto, {
+ workspaceId: workspace.id,
+ });
+ }
+
+ return this.searchService.searchPage(searchDto, {
workspaceId: workspace.id,
});
}
+
+ async searchTypesense(
+ searchParams: SearchDTO,
+ opts: {
+ userId?: string;
+ workspaceId: string;
+ },
+ ) {
+ const { userId, workspaceId } = opts;
+ let TypesenseModule: any;
+ try {
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
+ TypesenseModule = require('./../../ee/typesense/services/page-search.service');
+
+ const PageSearchService = this.moduleRef.get(
+ TypesenseModule.PageSearchService,
+ {
+ strict: false,
+ },
+ );
+
+ return PageSearchService.searchPage(searchParams, {
+ userId: userId,
+ workspaceId,
+ });
+ } catch (err) {
+ this.logger.debug(
+ 'Typesense module requested but enterprise module not bundled in this build',
+ );
+ }
+
+ throw new BadRequestException('Enterprise Typesense search module missing');
+ }
}
diff --git a/apps/server/src/core/search/search.service.ts b/apps/server/src/core/search/search.service.ts
index 60432ce8..29508797 100644
--- a/apps/server/src/core/search/search.service.ts
+++ b/apps/server/src/core/search/search.service.ts
@@ -21,13 +21,14 @@ export class SearchService {
) {}
async searchPage(
- query: string,
searchParams: SearchDTO,
opts: {
userId?: string;
workspaceId: string;
},
): Promise {
+ const { query } = searchParams;
+
if (query.length < 1) {
return;
}
@@ -61,7 +62,7 @@ export class SearchService {
)
.where('deletedAt', 'is', null)
.orderBy('rank', 'desc')
- .limit(searchParams.limit | 20)
+ .limit(searchParams.limit | 25)
.offset(searchParams.offset || 0);
if (!searchParams.shareId) {
diff --git a/apps/server/src/core/share/share.service.ts b/apps/server/src/core/share/share.service.ts
index 15cdbab2..d065f860 100644
--- a/apps/server/src/core/share/share.service.ts
+++ b/apps/server/src/core/share/share.service.ts
@@ -69,8 +69,8 @@ export class ShareService {
return await this.shareRepo.insertShare({
key: nanoIdGen().toLowerCase(),
pageId: page.id,
- includeSubPages: createShareDto.includeSubPages || true,
- searchIndexing: createShareDto.searchIndexing || true,
+ includeSubPages: createShareDto.includeSubPages ?? false,
+ searchIndexing: createShareDto.searchIndexing ?? false,
creatorId: authUserId,
spaceId: page.spaceId,
workspaceId,
diff --git a/apps/server/src/core/workspace/dto/update-workspace.dto.ts b/apps/server/src/core/workspace/dto/update-workspace.dto.ts
index a0182a77..2b61c7ee 100644
--- a/apps/server/src/core/workspace/dto/update-workspace.dto.ts
+++ b/apps/server/src/core/workspace/dto/update-workspace.dto.ts
@@ -18,4 +18,16 @@ export class UpdateWorkspaceDto extends PartialType(CreateWorkspaceDto) {
@IsOptional()
@IsBoolean()
enforceMfa: boolean;
+
+ @IsOptional()
+ @IsBoolean()
+ restrictApiToAdmins: boolean;
+
+ @IsOptional()
+ @IsBoolean()
+ aiSearch: boolean;
+
+ @IsOptional()
+ @IsBoolean()
+ generativeAi: boolean;
}
diff --git a/apps/server/src/core/workspace/services/workspace.service.ts b/apps/server/src/core/workspace/services/workspace.service.ts
index 694eaa44..1a5e7f8d 100644
--- a/apps/server/src/core/workspace/services/workspace.service.ts
+++ b/apps/server/src/core/workspace/services/workspace.service.ts
@@ -33,6 +33,7 @@ import { InjectQueue } from '@nestjs/bullmq';
import { QueueJob, QueueName } from '../../../integrations/queue/constants';
import { Queue } from 'bullmq';
import { generateRandomSuffixNumbers } from '../../../common/helpers';
+import { isPageEmbeddingsTableExists } from '@docmost/db/helpers/helpers';
@Injectable()
export class WorkspaceService {
@@ -50,6 +51,7 @@ export class WorkspaceService {
@InjectKysely() private readonly db: KyselyDB,
@InjectQueue(QueueName.ATTACHMENT_QUEUE) private attachmentQueue: Queue,
@InjectQueue(QueueName.BILLING_QUEUE) private billingQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
) {}
async findById(workspaceId: string) {
@@ -303,6 +305,60 @@ export class WorkspaceService {
}
}
+ if (typeof updateWorkspaceDto.restrictApiToAdmins !== 'undefined') {
+ await this.workspaceRepo.updateApiSettings(
+ workspaceId,
+ 'restrictToAdmins',
+ updateWorkspaceDto.restrictApiToAdmins,
+ );
+ delete updateWorkspaceDto.restrictApiToAdmins;
+ }
+
+ if (typeof updateWorkspaceDto.aiSearch !== 'undefined') {
+ await this.workspaceRepo.updateAiSettings(
+ workspaceId,
+ 'search',
+ updateWorkspaceDto.aiSearch,
+ );
+
+ if (updateWorkspaceDto.aiSearch) {
+ const tableExists = await isPageEmbeddingsTableExists(this.db);
+ if (!tableExists) {
+ throw new BadRequestException(
+ 'Failed to activate. Make sure pgvector postgres extension is installed.',
+ );
+ }
+
+ await this.aiQueue.add(QueueJob.WORKSPACE_CREATE_EMBEDDINGS, {
+ workspaceId,
+ });
+ } else {
+ // Schedule deletion after 24 hours
+ const deleteJobId = `ai-search-disabled-${workspaceId}`;
+ await this.aiQueue.add(
+ QueueJob.WORKSPACE_DELETE_EMBEDDINGS,
+ { workspaceId },
+ {
+ jobId: deleteJobId,
+ delay: 24 * 60 * 60 * 1000,
+ removeOnComplete: true,
+ removeOnFail: true,
+ },
+ );
+ }
+
+ delete updateWorkspaceDto.aiSearch;
+ }
+
+ if (typeof updateWorkspaceDto.generativeAi !== 'undefined') {
+ await this.workspaceRepo.updateAiSettings(
+ workspaceId,
+ 'generative',
+ updateWorkspaceDto.generativeAi,
+ );
+ delete updateWorkspaceDto.generativeAi;
+ }
+
await this.workspaceRepo.updateWorkspace(updateWorkspaceDto, workspaceId);
const workspace = await this.workspaceRepo.findById(workspaceId, {
diff --git a/apps/server/src/database/database.module.ts b/apps/server/src/database/database.module.ts
index 68c35dd3..bd331ada 100644
--- a/apps/server/src/database/database.module.ts
+++ b/apps/server/src/database/database.module.ts
@@ -25,6 +25,7 @@ import { MigrationService } from '@docmost/db/services/migration.service';
import { UserTokenRepo } from './repos/user-token/user-token.repo';
import { BacklinkRepo } from '@docmost/db/repos/backlink/backlink.repo';
import { ShareRepo } from '@docmost/db/repos/share/share.repo';
+import { PageListener } from '@docmost/db/listeners/page.listener';
// https://github.com/brianc/node-postgres/issues/811
types.setTypeParser(types.builtins.INT8, (val) => Number(val));
@@ -75,7 +76,8 @@ types.setTypeParser(types.builtins.INT8, (val) => Number(val));
AttachmentRepo,
UserTokenRepo,
BacklinkRepo,
- ShareRepo
+ ShareRepo,
+ PageListener,
],
exports: [
WorkspaceRepo,
@@ -90,7 +92,7 @@ types.setTypeParser(types.builtins.INT8, (val) => Number(val));
AttachmentRepo,
UserTokenRepo,
BacklinkRepo,
- ShareRepo
+ ShareRepo,
],
})
export class DatabaseModule
diff --git a/apps/server/src/database/helpers/helpers.ts b/apps/server/src/database/helpers/helpers.ts
new file mode 100644
index 00000000..076fc5de
--- /dev/null
+++ b/apps/server/src/database/helpers/helpers.ts
@@ -0,0 +1,22 @@
+import { sql } from 'kysely';
+import { KyselyDB } from '@docmost/db/types/kysely.types';
+
+export async function isPageEmbeddingsTableExists(db: KyselyDB) {
+ return tableExists({ db, tableName: 'page_embeddings' });
+}
+
+export async function tableExists(opts: {
+ db: KyselyDB;
+ tableName: string;
+}): Promise {
+ const { db, tableName } = opts;
+ const result = await sql<{ exists: boolean }>`
+ SELECT EXISTS (
+ SELECT 1 FROM information_schema.tables
+ WHERE table_schema = COALESCE(current_schema(), 'public')
+ AND table_name = ${tableName}
+ ) as exists
+ `.execute(db);
+
+ return result.rows[0]?.exists ?? false;
+}
diff --git a/apps/server/src/database/listeners/page.listener.ts b/apps/server/src/database/listeners/page.listener.ts
new file mode 100644
index 00000000..705fd102
--- /dev/null
+++ b/apps/server/src/database/listeners/page.listener.ts
@@ -0,0 +1,80 @@
+import { Injectable, Logger } from '@nestjs/common';
+import { OnEvent } from '@nestjs/event-emitter';
+import { EventName } from '../../common/events/event.contants';
+import { InjectQueue } from '@nestjs/bullmq';
+import { QueueJob, QueueName } from '../../integrations/queue/constants';
+import { Queue } from 'bullmq';
+import { EnvironmentService } from '../../integrations/environment/environment.service';
+
+export class PageEvent {
+ pageIds: string[];
+ workspaceId: string;
+}
+
+@Injectable()
+export class PageListener {
+ private readonly logger = new Logger(PageListener.name);
+
+ constructor(
+ private readonly environmentService: EnvironmentService,
+ @InjectQueue(QueueName.SEARCH_QUEUE) private searchQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
+ ) {}
+
+ @OnEvent(EventName.PAGE_CREATED)
+ async handlePageCreated(event: PageEvent) {
+ const { pageIds, workspaceId } = event;
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.PAGE_CREATED, {
+ pageIds,
+ });
+ }
+
+ await this.aiQueue.add(QueueJob.PAGE_CREATED, { pageIds, workspaceId });
+ }
+
+ @OnEvent(EventName.PAGE_UPDATED)
+ async handlePageUpdated(event: PageEvent) {
+ const { pageIds } = event;
+
+ await this.searchQueue.add(QueueJob.PAGE_UPDATED, { pageIds });
+ }
+
+ @OnEvent(EventName.PAGE_DELETED)
+ async handlePageDeleted(event: PageEvent) {
+ const { pageIds, workspaceId } = event;
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.PAGE_DELETED, { pageIds });
+ }
+
+ await this.aiQueue.add(QueueJob.PAGE_DELETED, { pageIds, workspaceId });
+ }
+
+ @OnEvent(EventName.PAGE_SOFT_DELETED)
+ async handlePageSoftDeleted(event: PageEvent) {
+ const { pageIds, workspaceId } = event;
+
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.PAGE_SOFT_DELETED, { pageIds });
+ }
+
+ await this.aiQueue.add(QueueJob.PAGE_SOFT_DELETED, {
+ pageIds,
+ workspaceId,
+ });
+ }
+
+ @OnEvent(EventName.PAGE_RESTORED)
+ async handlePageRestored(event: PageEvent) {
+ const { pageIds, workspaceId } = event;
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.PAGE_RESTORED, { pageIds });
+ }
+
+ await this.aiQueue.add(QueueJob.PAGE_RESTORED, { pageIds, workspaceId });
+ }
+
+ isTypesense(): boolean {
+ return this.environmentService.getSearchDriver() === 'typesense';
+ }
+}
diff --git a/apps/server/src/database/listeners/space.listener.ts b/apps/server/src/database/listeners/space.listener.ts
new file mode 100644
index 00000000..af6e3a22
--- /dev/null
+++ b/apps/server/src/database/listeners/space.listener.ts
@@ -0,0 +1,36 @@
+import { Injectable, Logger } from '@nestjs/common';
+import { OnEvent } from '@nestjs/event-emitter';
+import { EventName } from '../../common/events/event.contants';
+import { InjectQueue } from '@nestjs/bullmq';
+import { QueueJob, QueueName } from '../../integrations/queue/constants';
+import { Queue } from 'bullmq';
+import { EnvironmentService } from '../../integrations/environment/environment.service';
+
+export class SpaceEvent {
+ spaceId: string;
+}
+
+@Injectable()
+export class SpaceListener {
+ private readonly logger = new Logger(SpaceListener.name);
+
+ constructor(
+ private readonly environmentService: EnvironmentService,
+ @InjectQueue(QueueName.SEARCH_QUEUE) private searchQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
+ ) {}
+
+ @OnEvent(EventName.SPACE_DELETED)
+ async handleSpaceDeleted(event: SpaceEvent) {
+ const { spaceId } = event;
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.SPACE_DELETED, { spaceId });
+ }
+
+ await this.aiQueue.add(QueueJob.SPACE_DELETED, { spaceId });
+ }
+
+ isTypesense(): boolean {
+ return this.environmentService.getSearchDriver() === 'typesense';
+ }
+}
diff --git a/apps/server/src/database/listeners/workspace.listener.ts b/apps/server/src/database/listeners/workspace.listener.ts
new file mode 100644
index 00000000..6e7d3155
--- /dev/null
+++ b/apps/server/src/database/listeners/workspace.listener.ts
@@ -0,0 +1,36 @@
+import { Injectable, Logger } from '@nestjs/common';
+import { OnEvent } from '@nestjs/event-emitter';
+import { EventName } from '../../common/events/event.contants';
+import { InjectQueue } from '@nestjs/bullmq';
+import { QueueJob, QueueName } from '../../integrations/queue/constants';
+import { Queue } from 'bullmq';
+import { EnvironmentService } from '../../integrations/environment/environment.service';
+
+export class WorkspaceEvent {
+ workspaceId: string;
+}
+
+@Injectable()
+export class WorkspaceListener {
+ private readonly logger = new Logger(WorkspaceListener.name);
+
+ constructor(
+ private readonly environmentService: EnvironmentService,
+ @InjectQueue(QueueName.SEARCH_QUEUE) private searchQueue: Queue,
+ @InjectQueue(QueueName.AI_QUEUE) private aiQueue: Queue,
+ ) {}
+
+ @OnEvent(EventName.WORKSPACE_DELETED)
+ async handlePageDeleted(event: WorkspaceEvent) {
+ const { workspaceId } = event;
+ if (this.isTypesense()) {
+ await this.searchQueue.add(QueueJob.WORKSPACE_DELETED, { workspaceId });
+ }
+
+ await this.aiQueue.add(QueueJob.WORKSPACE_DELETED, { workspaceId });
+ }
+
+ isTypesense(): boolean {
+ return this.environmentService.getSearchDriver() === 'typesense';
+ }
+}
diff --git a/apps/server/src/database/migrations/20250912T101500-api-keys.ts b/apps/server/src/database/migrations/20250912T101500-api-keys.ts
new file mode 100644
index 00000000..da130ff7
--- /dev/null
+++ b/apps/server/src/database/migrations/20250912T101500-api-keys.ts
@@ -0,0 +1,30 @@
+import { Kysely, sql } from 'kysely';
+
+export async function up(db: Kysely): Promise {
+ await db.schema
+ .createTable('api_keys')
+ .addColumn('id', 'uuid', (col) =>
+ col.primaryKey().defaultTo(sql`gen_uuid_v7()`),
+ )
+ .addColumn('name', 'text', (col) => col)
+ .addColumn('creator_id', 'uuid', (col) =>
+ col.notNull().references('users.id').onDelete('cascade'),
+ )
+ .addColumn('workspace_id', 'uuid', (col) =>
+ col.notNull().references('workspaces.id').onDelete('cascade'),
+ )
+ .addColumn('expires_at', 'timestamptz')
+ .addColumn('last_used_at', 'timestamptz')
+ .addColumn('created_at', 'timestamptz', (col) =>
+ col.notNull().defaultTo(sql`now()`),
+ )
+ .addColumn('updated_at', 'timestamptz', (col) =>
+ col.notNull().defaultTo(sql`now()`),
+ )
+ .addColumn('deleted_at', 'timestamptz', (col) => col)
+ .execute();
+}
+
+export async function down(db: Kysely): Promise {
+ await db.schema.dropTable('api_keys').execute();
+}
diff --git a/apps/server/src/database/pagination/pagination-options.ts b/apps/server/src/database/pagination/pagination-options.ts
index e0481910..63d02f18 100644
--- a/apps/server/src/database/pagination/pagination-options.ts
+++ b/apps/server/src/database/pagination/pagination-options.ts
@@ -1,4 +1,5 @@
import {
+ IsBoolean,
IsNumber,
IsOptional,
IsPositive,
@@ -23,4 +24,8 @@ export class PaginationOptions {
@IsOptional()
@IsString()
query: string;
+
+ @IsOptional()
+ @IsBoolean()
+ adminView: boolean;
}
diff --git a/apps/server/src/database/repos/page/page.repo.ts b/apps/server/src/database/repos/page/page.repo.ts
index e577cc43..3b948a48 100644
--- a/apps/server/src/database/repos/page/page.repo.ts
+++ b/apps/server/src/database/repos/page/page.repo.ts
@@ -14,32 +14,17 @@ import { ExpressionBuilder, sql } from 'kysely';
import { DB } from '@docmost/db/types/db';
import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres';
import { SpaceMemberRepo } from '@docmost/db/repos/space/space-member.repo';
+import { EventEmitter2 } from '@nestjs/event-emitter';
+import { EventName } from '../../../common/events/event.contants';
@Injectable()
export class PageRepo {
constructor(
@InjectKysely() private readonly db: KyselyDB,
private spaceMemberRepo: SpaceMemberRepo,
+ private eventEmitter: EventEmitter2,
) {}
- withHasChildren(eb: ExpressionBuilder) {
- return eb
- .selectFrom('pages as child')
- .select((eb) =>
- eb
- .case()
- .when(eb.fn.countAll(), '>', 0)
- .then(true)
- .else(false)
- .end()
- .as('count'),
- )
- .whereRef('child.parentPageId', '=', 'pages.id')
- .where('child.deletedAt', 'is', null)
- .limit(1)
- .as('hasChildren');
- }
-
private baseFields: Array = [
'id',
'slugId',
@@ -63,6 +48,7 @@ export class PageRepo {
pageId: string,
opts?: {
includeContent?: boolean;
+ includeTextContent?: boolean;
includeYdoc?: boolean;
includeSpace?: boolean;
includeCreator?: boolean;
@@ -80,6 +66,7 @@ export class PageRepo {
.select(this.baseFields)
.$if(opts?.includeContent, (qb) => qb.select('content'))
.$if(opts?.includeYdoc, (qb) => qb.select('ydoc'))
+ .$if(opts?.includeTextContent, (qb) => qb.select('textContent'))
.$if(opts?.includeHasChildren, (qb) =>
qb.select((eb) => this.withHasChildren(eb)),
);
@@ -126,7 +113,7 @@ export class PageRepo {
pageIds: string[],
trx?: KyselyTransaction,
) {
- return dbOrTx(this.db, trx)
+ const result = await dbOrTx(this.db, trx)
.updateTable('pages')
.set({ ...updatePageData, updatedAt: new Date() })
.where(
@@ -135,6 +122,13 @@ export class PageRepo {
pageIds,
)
.executeTakeFirst();
+
+ this.eventEmitter.emit(EventName.PAGE_UPDATED, {
+ pageIds: pageIds,
+ workspaceId: updatePageData.workspaceId,
+ });
+
+ return result;
}
async insertPage(
@@ -142,11 +136,18 @@ export class PageRepo {
trx?: KyselyTransaction,
): Promise {
const db = dbOrTx(this.db, trx);
- return db
+ const result = await db
.insertInto('pages')
.values(insertablePage)
.returning(this.baseFields)
.executeTakeFirst();
+
+ this.eventEmitter.emit(EventName.PAGE_CREATED, {
+ pageIds: [result.id],
+ workspaceId: result.workspaceId,
+ });
+
+ return result;
}
async deletePage(pageId: string): Promise {
@@ -161,7 +162,11 @@ export class PageRepo {
await query.execute();
}
- async removePage(pageId: string, deletedById: string): Promise {
+ async removePage(
+ pageId: string,
+ deletedById: string,
+ workspaceId: string,
+ ): Promise {
const currentDate = new Date();
const descendants = await this.db
@@ -196,10 +201,15 @@ export class PageRepo {
await trx.deleteFrom('shares').where('pageId', 'in', pageIds).execute();
});
+
+ this.eventEmitter.emit(EventName.PAGE_SOFT_DELETED, {
+ pageIds: pageIds,
+ workspaceId,
+ });
}
}
- async restorePage(pageId: string): Promise {
+ async restorePage(pageId: string, workspaceId: string): Promise {
// First, check if the page being restored has a deleted parent
const pageToRestore = await this.db
.selectFrom('pages')
@@ -259,6 +269,10 @@ export class PageRepo {
.where('id', '=', pageId)
.execute();
}
+ this.eventEmitter.emit(EventName.PAGE_RESTORED, {
+ pageIds: pageIds,
+ workspaceId: workspaceId,
+ });
}
async getRecentPagesInSpace(spaceId: string, pagination: PaginationOptions) {
@@ -379,6 +393,24 @@ export class PageRepo {
).as('contributors');
}
+ withHasChildren(eb: ExpressionBuilder) {
+ return eb
+ .selectFrom('pages as child')
+ .select((eb) =>
+ eb
+ .case()
+ .when(eb.fn.countAll(), '>', 0)
+ .then(true)
+ .else(false)
+ .end()
+ .as('count'),
+ )
+ .whereRef('child.parentPageId', '=', 'pages.id')
+ .where('child.deletedAt', 'is', null)
+ .limit(1)
+ .as('hasChildren');
+ }
+
async getPageAndDescendants(
parentPageId: string,
opts: { includeContent: boolean },
diff --git a/apps/server/src/database/repos/space/space.repo.ts b/apps/server/src/database/repos/space/space.repo.ts
index d92f9828..ed0d6b1e 100644
--- a/apps/server/src/database/repos/space/space.repo.ts
+++ b/apps/server/src/database/repos/space/space.repo.ts
@@ -12,10 +12,15 @@ import { PaginationOptions } from '../../pagination/pagination-options';
import { executeWithPagination } from '@docmost/db/pagination/pagination';
import { DB } from '@docmost/db/types/db';
import { validate as isValidUUID } from 'uuid';
+import { EventEmitter2 } from '@nestjs/event-emitter';
+import { EventName } from '../../../common/events/event.contants';
@Injectable()
export class SpaceRepo {
- constructor(@InjectKysely() private readonly db: KyselyDB) {}
+ constructor(
+ @InjectKysely() private readonly db: KyselyDB,
+ private eventEmitter: EventEmitter2,
+ ) {}
async findById(
spaceId: string,
@@ -110,7 +115,11 @@ export class SpaceRepo {
if (pagination.query) {
query = query.where((eb) =>
- eb(sql`f_unaccent(name)`, 'ilike', sql`f_unaccent(${'%' + pagination.query + '%'})`).or(
+ eb(
+ sql`f_unaccent(name)`,
+ 'ilike',
+ sql`f_unaccent(${'%' + pagination.query + '%'})`,
+ ).or(
sql`f_unaccent(description)`,
'ilike',
sql`f_unaccent(${'%' + pagination.query + '%'})`,
@@ -155,5 +164,9 @@ export class SpaceRepo {
.where('id', '=', spaceId)
.where('workspaceId', '=', workspaceId)
.execute();
+
+ this.eventEmitter.emit(EventName.SPACE_DELETED, {
+ spaceId,
+ });
}
}
diff --git a/apps/server/src/database/repos/workspace/workspace.repo.ts b/apps/server/src/database/repos/workspace/workspace.repo.ts
index 6a15fcd9..d17db49b 100644
--- a/apps/server/src/database/repos/workspace/workspace.repo.ts
+++ b/apps/server/src/database/repos/workspace/workspace.repo.ts
@@ -157,4 +157,40 @@ export class WorkspaceRepo {
return activeUsers.length;
}
+
+ async updateApiSettings(
+ workspaceId: string,
+ prefKey: string,
+ prefValue: string | boolean,
+ ) {
+ return this.db
+ .updateTable('workspaces')
+ .set({
+ settings: sql`COALESCE(settings, '{}'::jsonb)
+ || jsonb_build_object('api', COALESCE(settings->'api', '{}'::jsonb)
+ || jsonb_build_object('${sql.raw(prefKey)}', ${sql.lit(prefValue)}))`,
+ updatedAt: new Date(),
+ })
+ .where('id', '=', workspaceId)
+ .returning(this.baseFields)
+ .executeTakeFirst();
+ }
+
+ async updateAiSettings(
+ workspaceId: string,
+ prefKey: string,
+ prefValue: string | boolean,
+ ) {
+ return this.db
+ .updateTable('workspaces')
+ .set({
+ settings: sql`COALESCE(settings, '{}'::jsonb)
+ || jsonb_build_object('ai', COALESCE(settings->'ai', '{}'::jsonb)
+ || jsonb_build_object('${sql.raw(prefKey)}', ${sql.lit(prefValue)}))`,
+ updatedAt: new Date(),
+ })
+ .where('id', '=', workspaceId)
+ .returning(this.baseFields)
+ .executeTakeFirst();
+ }
}
diff --git a/apps/server/src/database/types/db.d.ts b/apps/server/src/database/types/db.d.ts
index 2f8baaf7..fe5b8fab 100644
--- a/apps/server/src/database/types/db.d.ts
+++ b/apps/server/src/database/types/db.d.ts
@@ -3,13 +3,18 @@
* Please do not edit it manually.
*/
-import type { ColumnType } from "kysely";
+import type { ColumnType } from 'kysely';
-export type Generated = T extends ColumnType
- ? ColumnType
- : ColumnType;
+export type Generated =
+ T extends ColumnType
+ ? ColumnType
+ : ColumnType;
-export type Int8 = ColumnType;
+export type Int8 = ColumnType<
+ string,
+ bigint | number | string,
+ bigint | number | string
+>;
export type Json = JsonValue;
@@ -25,6 +30,18 @@ export type JsonValue = JsonArray | JsonObject | JsonPrimitive;
export type Timestamp = ColumnType;
+export interface ApiKeys {
+ createdAt: Generated;
+ deletedAt: Timestamp | null;
+ expiresAt: Timestamp | null;
+ id: Generated;
+ lastUsedAt: Timestamp | null;
+ name: string | null;
+ updatedAt: Generated;
+ creatorId: string;
+ workspaceId: string;
+}
+
export interface Attachments {
createdAt: Generated;
creatorId: string;
@@ -344,6 +361,7 @@ export interface Workspaces {
}
export interface DB {
+ apiKeys: ApiKeys;
attachments: Attachments;
authAccounts: AuthAccounts;
authProviders: AuthProviders;
diff --git a/apps/server/src/database/types/db.interface.ts b/apps/server/src/database/types/db.interface.ts
new file mode 100644
index 00000000..969e2059
--- /dev/null
+++ b/apps/server/src/database/types/db.interface.ts
@@ -0,0 +1,47 @@
+import {
+ ApiKeys,
+ Attachments,
+ AuthAccounts,
+ AuthProviders,
+ Backlinks,
+ Billing,
+ Comments,
+ FileTasks,
+ Groups,
+ GroupUsers,
+ PageHistory,
+ Pages,
+ Shares,
+ SpaceMembers,
+ Spaces,
+ UserMfa,
+ Users,
+ UserTokens,
+ WorkspaceInvitations,
+ Workspaces,
+} from '@docmost/db/types/db';
+import { PageEmbeddings } from '@docmost/db/types/embeddings.types';
+
+export interface DbInterface {
+ attachments: Attachments;
+ authAccounts: AuthAccounts;
+ authProviders: AuthProviders;
+ backlinks: Backlinks;
+ billing: Billing;
+ comments: Comments;
+ fileTasks: FileTasks;
+ groups: Groups;
+ groupUsers: GroupUsers;
+ pageEmbeddings: PageEmbeddings;
+ pageHistory: PageHistory;
+ pages: Pages;
+ shares: Shares;
+ spaceMembers: SpaceMembers;
+ spaces: Spaces;
+ userMfa: UserMfa;
+ users: Users;
+ userTokens: UserTokens;
+ workspaceInvitations: WorkspaceInvitations;
+ workspaces: Workspaces;
+ apiKeys: ApiKeys;
+}
diff --git a/apps/server/src/database/types/embeddings.types.ts b/apps/server/src/database/types/embeddings.types.ts
new file mode 100644
index 00000000..2f4e1509
--- /dev/null
+++ b/apps/server/src/database/types/embeddings.types.ts
@@ -0,0 +1,20 @@
+import { Json, Timestamp, Generated } from '@docmost/db/types/db';
+
+// embeddings type
+export interface PageEmbeddings {
+ id: Generated;
+ pageId: string;
+ spaceId: string;
+ modelName: string;
+ modelDimensions: number;
+ workspaceId: string;
+ attachmentId: string;
+ embedding: number[];
+ chunkIndex: Generated;
+ chunkStart: Generated;
+ chunkLength: Generated;
+ metadata: Generated;
+ createdAt: Generated;
+ updatedAt: Generated;
+ deletedAt: Timestamp | null;
+}
diff --git a/apps/server/src/database/types/entity.types.ts b/apps/server/src/database/types/entity.types.ts
index b23fa775..7f273dce 100644
--- a/apps/server/src/database/types/entity.types.ts
+++ b/apps/server/src/database/types/entity.types.ts
@@ -19,7 +19,9 @@ import {
Shares,
FileTasks,
UserMfa as _UserMFA,
+ ApiKeys,
} from './db';
+import { PageEmbeddings } from '@docmost/db/types/embeddings.types';
// Workspace
export type Workspace = Selectable;
@@ -119,3 +121,13 @@ export type UpdatableFileTask = Updateable>;
export type UserMFA = Selectable<_UserMFA>;
export type InsertableUserMFA = Insertable<_UserMFA>;
export type UpdatableUserMFA = Updateable>;
+
+// Api Keys
+export type ApiKey = Selectable;
+export type InsertableApiKey = Insertable;
+export type UpdatableApiKey = Updateable>;
+
+// Page Embedding
+export type PageEmbedding = Selectable;
+export type InsertablePageEmbedding = Insertable;
+export type UpdatablePageEmbedding = Updateable>;
diff --git a/apps/server/src/database/types/kysely.types.ts b/apps/server/src/database/types/kysely.types.ts
index 39dae715..d1bf8adc 100644
--- a/apps/server/src/database/types/kysely.types.ts
+++ b/apps/server/src/database/types/kysely.types.ts
@@ -1,5 +1,5 @@
-import { DB } from './db';
import { Kysely, Transaction } from 'kysely';
+import { DbInterface } from '@docmost/db/types/db.interface';
-export type KyselyDB = Kysely;
-export type KyselyTransaction = Transaction;
+export type KyselyDB = Kysely;
+export type KyselyTransaction = Transaction;
diff --git a/apps/server/src/ee b/apps/server/src/ee
index d2ead431..18e00b18 160000
--- a/apps/server/src/ee
+++ b/apps/server/src/ee
@@ -1 +1 @@
-Subproject commit d2ead431819025e735e8b8e63d6d898d76c417e6
+Subproject commit 18e00b18666060e43906740fd28c8a64800637c8
diff --git a/apps/server/src/integrations/environment/environment.service.ts b/apps/server/src/integrations/environment/environment.service.ts
index 3ce728ea..30624f58 100644
--- a/apps/server/src/integrations/environment/environment.service.ts
+++ b/apps/server/src/integrations/environment/environment.service.ts
@@ -10,6 +10,10 @@ export class EnvironmentService {
return this.configService.get('NODE_ENV', 'development');
}
+ isDevelopment(): boolean {
+ return this.getNodeEnv() === 'development';
+ }
+
getAppUrl(): string {
const rawUrl =
this.configService.get('APP_URL') ||
@@ -213,4 +217,64 @@ export class EnvironmentService {
getPostHogKey(): string {
return this.configService.get('POSTHOG_KEY');
}
+
+ getSearchDriver(): string {
+ return this.configService
+ .get('SEARCH_DRIVER', 'database')
+ .toLowerCase();
+ }
+
+ getTypesenseUrl(): string {
+ return this.configService
+ .get('TYPESENSE_URL', 'http://localhost:8108')
+ .toLowerCase();
+ }
+
+ getTypesenseApiKey(): string {
+ return this.configService.get('TYPESENSE_API_KEY');
+ }
+
+ getTypesenseLocale(): string {
+ return this.configService
+ .get('TYPESENSE_LOCALE', 'en')
+ .toLowerCase();
+ }
+
+ getAiDriver(): string {
+ return this.configService.get('AI_DRIVER');
+ }
+
+ getAiEmbeddingModel(): string {
+ return this.configService.get('AI_EMBEDDING_MODEL');
+ }
+
+ getAiCompletionModel(): string {
+ return this.configService.get('AI_COMPLETION_MODEL');
+ }
+
+ getAiEmbeddingDimension(): number {
+ return parseInt(
+ this.configService.get('AI_EMBEDDING_DIMENSION'),
+ 10,
+ );
+ }
+
+ getOpenAiApiKey(): string {
+ return this.configService.get('OPENAI_API_KEY');
+ }
+
+ getOpenAiApiUrl(): string {
+ return this.configService.get('OPENAI_API_URL');
+ }
+
+ getGeminiApiKey(): string {
+ return this.configService.get('GEMINI_API_KEY');
+ }
+
+ getOllamaApiUrl(): string {
+ return this.configService.get(
+ 'OLLAMA_API_URL',
+ 'http://localhost:11434',
+ );
+ }
}
diff --git a/apps/server/src/integrations/environment/environment.validation.ts b/apps/server/src/integrations/environment/environment.validation.ts
index a2aeb6dd..752e3d41 100644
--- a/apps/server/src/integrations/environment/environment.validation.ts
+++ b/apps/server/src/integrations/environment/environment.validation.ts
@@ -3,12 +3,14 @@ import {
IsNotEmpty,
IsNotIn,
IsOptional,
+ IsString,
IsUrl,
MinLength,
ValidateIf,
validateSync,
} from 'class-validator';
import { plainToInstance } from 'class-transformer';
+import { IsISO6391 } from '../../common/validator/is-iso6391';
export class EnvironmentVariables {
@IsNotEmpty()
@@ -68,6 +70,85 @@ export class EnvironmentVariables {
)
@ValidateIf((obj) => obj.CLOUD === 'true'.toLowerCase())
SUBDOMAIN_HOST: string;
+
+ @IsOptional()
+ @IsIn(['database', 'typesense'])
+ @IsString()
+ SEARCH_DRIVER: string;
+
+ @IsOptional()
+ @IsUrl(
+ {
+ protocols: ['http', 'https'],
+ require_tld: false,
+ allow_underscores: true,
+ },
+ {
+ message:
+ 'TYPESENSE_URL must be a valid typesense url e.g http://localhost:8108',
+ },
+ )
+ @ValidateIf((obj) => obj.SEARCH_DRIVER === 'typesense')
+ TYPESENSE_URL: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.SEARCH_DRIVER === 'typesense')
+ @IsNotEmpty()
+ @IsString()
+ TYPESENSE_API_KEY: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.SEARCH_DRIVER === 'typesense')
+ @IsISO6391()
+ @IsString()
+ TYPESENSE_LOCALE: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER)
+ @IsIn(['openai', 'gemini', 'ollama'])
+ @IsString()
+ AI_DRIVER: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER)
+ @IsString()
+ @IsNotEmpty()
+ AI_EMBEDDING_MODEL: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_EMBEDDING_DIMENSION)
+ @IsIn(['768', '1024', '1536'])
+ @IsString()
+ AI_EMBEDDING_DIMENSION: string;
+
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER)
+ @IsString()
+ @IsNotEmpty()
+ AI_COMPLETION_MODEL: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'openai')
+ @IsString()
+ @IsNotEmpty()
+ OPENAI_API_KEY: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER && obj.OPENAI_API_URL && obj.AI_DRIVER === 'openai')
+ @IsUrl({ protocols: ['http', 'https'], require_tld: false })
+ OPENAI_API_URL: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'gemini')
+ @IsString()
+ @IsNotEmpty()
+ GEMINI_API_KEY: string;
+
+ @IsOptional()
+ @ValidateIf((obj) => obj.AI_DRIVER && obj.AI_DRIVER === 'ollama')
+ @IsUrl({ protocols: ['http', 'https'], require_tld: false })
+ OLLAMA_API_URL: string;
}
export function validate(config: Record) {
diff --git a/apps/server/src/integrations/import/services/file-import-task.service.ts b/apps/server/src/integrations/import/services/file-import-task.service.ts
index f7d93ec0..5cf39054 100644
--- a/apps/server/src/integrations/import/services/file-import-task.service.ts
+++ b/apps/server/src/integrations/import/services/file-import-task.service.ts
@@ -32,6 +32,8 @@ import { ImportAttachmentService } from './import-attachment.service';
import { ModuleRef } from '@nestjs/core';
import { PageService } from '../../../core/page/services/page.service';
import { ImportPageNode } from '../dto/file-task-dto';
+import { EventEmitter2 } from '@nestjs/event-emitter';
+import { EventName } from '../../../common/events/event.contants';
@Injectable()
export class FileImportTaskService {
@@ -45,6 +47,7 @@ export class FileImportTaskService {
@InjectKysely() private readonly db: KyselyDB,
private readonly importAttachmentService: ImportAttachmentService,
private moduleRef: ModuleRef,
+ private eventEmitter: EventEmitter2,
) {}
async processZIpImport(fileTaskId: string): Promise {
@@ -172,6 +175,67 @@ export class FileImportTaskService {
});
}
+ // Create placeholder pages for folders without corresponding files
+ const foldersWithContent = new Set();
+
+ pagesMap.forEach((page) => {
+ const segments = page.filePath.split('/');
+ segments.pop(); // remove filename
+
+ // Build up all folder paths and mark them as having content
+ let currentPath = '';
+ for (const segment of segments) {
+ currentPath = currentPath ? `${currentPath}/${segment}` : segment;
+ foldersWithContent.add(currentPath); // All ancestor folders have content
+ }
+ });
+
+ // Determine if there's a single root container folder
+ const rootLevelItems = new Set();
+ pagesMap.forEach((page) => {
+ const firstSegment = page.filePath.split('/')[0];
+ rootLevelItems.add(firstSegment);
+ });
+
+ // If all files are in a single root folder and no files at root level exist
+ let skipRootFolder: string | null = null;
+ if (rootLevelItems.size === 1) {
+ const onlyRootItem = Array.from(rootLevelItems)[0];
+ // Check if this is a folder (not a file at root)
+ const hasRootFiles = Array.from(pagesMap.keys()).some(
+ (filePath) => !filePath.includes('/'),
+ );
+ if (!hasRootFiles) {
+ skipRootFolder = onlyRootItem;
+ }
+ }
+
+ // For each folder with content, create a placeholder page if no corresponding .md or .html exists
+ foldersWithContent.forEach((folderPath) => {
+ if (
+ skipRootFolder &&
+ folderPath?.toLowerCase() === skipRootFolder?.toLowerCase()
+ ) {
+ return;
+ }
+
+ const mdPath = `${folderPath}.md`;
+ const htmlPath = `${folderPath}.html`;
+
+ if (!pagesMap.has(mdPath) && !pagesMap.has(htmlPath)) {
+ const folderName = path.basename(folderPath);
+ pagesMap.set(mdPath, {
+ id: v7(),
+ slugId: generateSlugId(),
+ name: stripNotionID(folderName),
+ content: '',
+ parentPageId: null,
+ fileExtension: '.md',
+ filePath: mdPath,
+ });
+ }
+ });
+
// parent/child linking
pagesMap.forEach((page, filePath) => {
const segments = filePath.split('/');
@@ -313,10 +377,23 @@ export class FileImportTaskService {
for (const [filePath, page] of levelPages) {
const absPath = path.join(extractDir, filePath);
- let content = await fs.readFile(absPath, 'utf-8');
+ let content = '';
- if (page.fileExtension.toLowerCase() === '.md') {
- content = await markdownToHtml(content);
+ // Check if file exists (placeholder pages won't have physical files)
+ try {
+ await fs.access(absPath);
+ content = await fs.readFile(absPath, 'utf-8');
+
+ if (page.fileExtension.toLowerCase() === '.md') {
+ content = await markdownToHtml(content);
+ }
+ } catch (err: any) {
+ if (err?.code === 'ENOENT') {
+ // Use empty content, title will be the folder name
+ content = '';
+ } else {
+ throw err;
+ }
}
const htmlContent =
@@ -396,6 +473,13 @@ export class FileImportTaskService {
}
}
+ if (validPageIds.size > 0) {
+ this.eventEmitter.emit(EventName.PAGE_CREATED, {
+ pageIds: Array.from(validPageIds),
+ workspaceId: fileTask.workspaceId,
+ });
+ }
+
this.logger.log(
`Successfully imported ${totalPagesProcessed} pages with ${filteredBacklinks.length} backlinks`,
);
diff --git a/apps/server/src/integrations/import/utils/file.utils.ts b/apps/server/src/integrations/import/utils/file.utils.ts
index b3d39cda..0b27554b 100644
--- a/apps/server/src/integrations/import/utils/file.utils.ts
+++ b/apps/server/src/integrations/import/utils/file.utils.ts
@@ -103,6 +103,14 @@ function extractZipInternal(
zipfile.on('entry', (entry) => {
const name = entry.fileName.toString('utf8');
const safe = name.replace(/^\/+/, '');
+
+ const validationError = yauzl.validateFileName(safe);
+ if (validationError) {
+ console.warn(`Skipping invalid entry (${validationError})`);
+ zipfile.readEntry();
+ return;
+ }
+
if (safe.startsWith('__MACOSX/')) {
zipfile.readEntry();
return;
@@ -110,6 +118,15 @@ function extractZipInternal(
const fullPath = path.join(target, safe);
+ const resolved = path.resolve(fullPath);
+ const targetResolved = path.resolve(target);
+
+ if (!resolved.startsWith(targetResolved + path.sep)) {
+ console.warn(`Skipping entry (path outside target): ${safe}`);
+ zipfile.readEntry();
+ return;
+ }
+
// Handle directories
if (/\/$/.test(name)) {
try {
diff --git a/apps/server/src/integrations/queue/constants/queue.constants.ts b/apps/server/src/integrations/queue/constants/queue.constants.ts
index 4a1b1d1c..5c7aa29a 100644
--- a/apps/server/src/integrations/queue/constants/queue.constants.ts
+++ b/apps/server/src/integrations/queue/constants/queue.constants.ts
@@ -4,6 +4,8 @@ export enum QueueName {
GENERAL_QUEUE = '{general-queue}',
BILLING_QUEUE = '{billing-queue}',
FILE_TASK_QUEUE = '{file-task-queue}',
+ SEARCH_QUEUE = '{search-queue}',
+ AI_QUEUE = '{ai-queue}',
}
export enum QueueJob {
@@ -12,7 +14,6 @@ export enum QueueJob {
ATTACHMENT_INDEX_CONTENT = 'attachment-index-content',
ATTACHMENT_INDEXING = 'attachment-indexing',
DELETE_PAGE_ATTACHMENTS = 'delete-page-attachments',
- PAGE_CONTENT_UPDATE = 'page-content-update',
DELETE_USER_AVATARS = 'delete-user-avatars',
@@ -25,4 +26,36 @@ export enum QueueJob {
IMPORT_TASK = 'import-task',
EXPORT_TASK = 'export-task',
+
+ SEARCH_INDEX_PAGE = 'search-index-page',
+ SEARCH_INDEX_PAGES = 'search-index-pages',
+ SEARCH_INDEX_COMMENT = 'search-index-comment',
+ SEARCH_INDEX_COMMENTS = 'search-index-comments',
+ SEARCH_INDEX_ATTACHMENT = 'search-index-attachment',
+ SEARCH_INDEX_ATTACHMENTS = 'search-index-attachments',
+ SEARCH_REMOVE_PAGE = 'search-remove-page',
+ SEARCH_REMOVE_ASSET = 'search-remove-attachment',
+ SEARCH_REMOVE_FACE = 'search-remove-comment',
+ TYPESENSE_FLUSH = 'typesense-flush',
+
+ PAGE_CREATED = 'page-created',
+ PAGE_CONTENT_UPDATED = 'page-content-updated',
+ PAGE_MOVED_TO_SPACE = 'page-moved-to-space',
+ PAGE_UPDATED = 'page-updated',
+ PAGE_SOFT_DELETED = 'page-soft-deleted',
+ PAGE_RESTORED = 'page-restored',
+ PAGE_DELETED = 'page-deleted',
+
+ SPACE_CREATED = 'space-created',
+ SPACE_UPDATED = 'space-updated',
+ SPACE_DELETED = 'space-deleted',
+
+ WORKSPACE_CREATED = 'workspace-created',
+ WORKSPACE_SPACE_UPDATED = 'workspace-updated',
+ WORKSPACE_DELETED = 'workspace-deleted',
+ WORKSPACE_CREATE_EMBEDDINGS = 'workspace-create-embeddings',
+ WORKSPACE_DELETE_EMBEDDINGS = 'workspace-delete-embeddings',
+
+ GENERATE_PAGE_EMBEDDINGS = 'generate-page-embeddings',
+ DELETE_PAGE_EMBEDDINGS = 'delete-page-embeddings',
}
diff --git a/apps/server/src/integrations/queue/queue.module.ts b/apps/server/src/integrations/queue/queue.module.ts
index 81aa0a5f..6787e010 100644
--- a/apps/server/src/integrations/queue/queue.module.ts
+++ b/apps/server/src/integrations/queue/queue.module.ts
@@ -57,6 +57,22 @@ import { BacklinksProcessor } from './processors/backlinks.processor';
attempts: 1,
},
}),
+ BullModule.registerQueue({
+ name: QueueName.SEARCH_QUEUE,
+ defaultJobOptions: {
+ removeOnComplete: true,
+ removeOnFail: true,
+ attempts: 2,
+ },
+ }),
+ BullModule.registerQueue({
+ name: QueueName.AI_QUEUE,
+ defaultJobOptions: {
+ removeOnComplete: true,
+ removeOnFail: true,
+ attempts: 1,
+ },
+ }),
],
exports: [BullModule],
providers: [BacklinksProcessor],
diff --git a/apps/server/src/integrations/redis/redis-config.service.ts b/apps/server/src/integrations/redis/redis-config.service.ts
new file mode 100644
index 00000000..719f89f1
--- /dev/null
+++ b/apps/server/src/integrations/redis/redis-config.service.ts
@@ -0,0 +1,26 @@
+import { Injectable } from '@nestjs/common';
+import {
+ RedisModuleOptions,
+ RedisOptionsFactory,
+} from '@nestjs-labs/nestjs-ioredis';
+import { createRetryStrategy, parseRedisUrl } from '../../common/helpers';
+import { EnvironmentService } from '../environment/environment.service';
+
+@Injectable()
+export class RedisConfigService implements RedisOptionsFactory {
+ constructor(private readonly environmentService: EnvironmentService) {}
+ createRedisOptions(): RedisModuleOptions {
+ const redisConfig = parseRedisUrl(this.environmentService.getRedisUrl());
+ return {
+ readyLog: true,
+ config: {
+ host: redisConfig.host,
+ port: redisConfig.port,
+ password: redisConfig.password,
+ db: redisConfig.db,
+ family: redisConfig.family,
+ retryStrategy: createRetryStrategy(),
+ },
+ };
+ }
+}
diff --git a/package.json b/package.json
index 3174d143..7b8bcaa3 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "docmost",
"homepage": "https://docmost.com",
- "version": "0.23.2",
+ "version": "0.24.0",
"private": true,
"scripts": {
"build": "nx run-many -t build",
@@ -21,41 +21,42 @@
"@braintree/sanitize-url": "^7.1.0",
"@docmost/editor-ext": "workspace:*",
"@floating-ui/dom": "^1.7.3",
- "@hocuspocus/extension-redis": "^3.2.3",
- "@hocuspocus/provider": "^3.2.3",
- "@hocuspocus/server": "^3.2.3",
- "@hocuspocus/transformer": "^3.2.3",
+ "@hocuspocus/extension-redis": "3.4.1",
+ "@hocuspocus/provider": "3.4.1",
+ "@hocuspocus/server": "3.4.1",
+ "@hocuspocus/transformer": "3.4.1",
"@joplin/turndown": "^4.0.74",
"@joplin/turndown-plugin-gfm": "^1.0.56",
"@sindresorhus/slugify": "1.1.0",
- "@tiptap/core": "^3.6.1",
- "@tiptap/extension-code-block": "^3.6.1",
- "@tiptap/extension-collaboration": "^3.6.1",
- "@tiptap/extension-collaboration-caret": "^3.6.1",
- "@tiptap/extension-color": "^3.6.1",
- "@tiptap/extension-document": "^3.6.1",
- "@tiptap/extension-heading": "^3.6.1",
- "@tiptap/extension-highlight": "^3.6.1",
- "@tiptap/extension-history": "^3.6.1",
- "@tiptap/extension-image": "^3.6.1",
- "@tiptap/extension-link": "^3.6.1",
- "@tiptap/extension-list": "^3.6.1",
- "@tiptap/extension-list-item": "^3.6.1",
- "@tiptap/extension-list-keymap": "^3.6.1",
- "@tiptap/extension-placeholder": "^3.6.1",
- "@tiptap/extension-subscript": "^3.6.1",
- "@tiptap/extension-superscript": "^3.6.1",
- "@tiptap/extension-table": "^3.6.1",
- "@tiptap/extension-text": "^3.6.1",
- "@tiptap/extension-text-align": "^3.6.1",
- "@tiptap/extension-text-style": "^3.6.1",
- "@tiptap/extension-typography": "^3.6.1",
- "@tiptap/extension-youtube": "^3.6.1",
- "@tiptap/html": "^3.6.1",
- "@tiptap/pm": "^3.6.1",
- "@tiptap/react": "^3.6.1",
- "@tiptap/starter-kit": "^3.6.1",
- "@tiptap/suggestion": "^3.6.1",
+ "@tiptap/core": "3.13.0",
+ "@tiptap/extension-code-block": "3.13.0",
+ "@tiptap/extension-collaboration": "3.13.0",
+ "@tiptap/extension-collaboration-caret": "3.13.0",
+ "@tiptap/extension-color": "3.13.0",
+ "@tiptap/extension-document": "3.13.0",
+ "@tiptap/extension-heading": "3.13.0",
+ "@tiptap/extension-highlight": "3.13.0",
+ "@tiptap/extension-history": "3.13.0",
+ "@tiptap/extension-image": "3.13.0",
+ "@tiptap/extension-link": "3.13.0",
+ "@tiptap/extension-list": "3.13.0",
+ "@tiptap/extension-list-item": "3.13.0",
+ "@tiptap/extension-list-keymap": "3.13.0",
+ "@tiptap/extension-placeholder": "3.13.0",
+ "@tiptap/extension-subscript": "3.13.0",
+ "@tiptap/extension-superscript": "3.13.0",
+ "@tiptap/extension-table": "3.13.0",
+ "@tiptap/extension-text": "3.13.0",
+ "@tiptap/extension-text-align": "3.13.0",
+ "@tiptap/extension-text-style": "3.13.0",
+ "@tiptap/extension-typography": "3.13.0",
+ "@tiptap/extension-unique-id": "^3.13.0",
+ "@tiptap/extension-youtube": "3.13.0",
+ "@tiptap/html": "3.13.0",
+ "@tiptap/pm": "3.13.0",
+ "@tiptap/react": "3.13.0",
+ "@tiptap/starter-kit": "3.13.0",
+ "@tiptap/suggestion": "3.13.0",
"@types/qrcode": "^1.5.5",
"bytes": "^3.1.2",
"cross-env": "^7.0.3",
@@ -71,6 +72,7 @@
"qrcode": "^1.5.4",
"uuid": "^11.1.0",
"y-indexeddb": "^9.0.12",
+ "y-prosemirror": "1.3.7",
"yjs": "^13.6.27"
},
"devDependencies": {
@@ -93,7 +95,9 @@
"react-arborist@3.4.0": "patches/react-arborist@3.4.0.patch"
},
"overrides": {
- "jsdom": "25.0.1"
+ "jsdom": "25.0.1",
+ "jsonwebtoken": "9.0.3",
+ "y-prosemirror": "1.3.7"
},
"neverBuiltDependencies": []
}
diff --git a/packages/editor-ext/src/index.ts b/packages/editor-ext/src/index.ts
index 2ace4511..d26592a2 100644
--- a/packages/editor-ext/src/index.ts
+++ b/packages/editor-ext/src/index.ts
@@ -20,4 +20,7 @@ export * from "./lib/markdown";
export * from "./lib/search-and-replace";
export * from "./lib/embed-provider";
export * from "./lib/subpages";
+export * from "./lib/highlight";
+export * from "./lib/heading/heading";
+export * from "./lib/unique-id";
export * from "./lib/tippy-bubble-menu";
diff --git a/packages/editor-ext/src/lib/heading/heading.ts b/packages/editor-ext/src/lib/heading/heading.ts
new file mode 100644
index 00000000..909524fd
--- /dev/null
+++ b/packages/editor-ext/src/lib/heading/heading.ts
@@ -0,0 +1,78 @@
+import TiptapHeading, {
+ HeadingOptions as TiptapHeadingOptions,
+} from "@tiptap/extension-heading";
+import { mergeAttributes } from "@tiptap/react";
+import { Decoration, DecorationSet } from "prosemirror-view";
+import { Plugin } from "prosemirror-state";
+
+const copyIcon = ` `;
+const successIcon = ` `;
+
+export const Heading = TiptapHeading.extend({
+ addProseMirrorPlugins() {
+ return [
+ new Plugin({
+ props: {
+ decorations(state) {
+ const decorations: Decoration[] = [];
+ const { doc } = state;
+
+ doc.descendants((node, pos) => {
+ if (node.type.name === "heading" && node.content.size > 0) {
+ const deco = Decoration.widget(
+ pos + node.nodeSize - 1,
+ () => {
+ const icon = document.createElement("span");
+ icon.classList.add("link-btn");
+ icon.innerHTML = " ";
+ icon.contentEditable = "false";
+
+ const linkBtnContent = document.createElement("span");
+ linkBtnContent.classList.add("link-btn-content");
+ linkBtnContent.innerHTML = copyIcon;
+ icon.appendChild(linkBtnContent);
+
+ icon.addEventListener("mousedown", (e) =>
+ e.preventDefault(),
+ );
+ icon.addEventListener("click", (e) => {
+ e.stopPropagation();
+ e.preventDefault();
+ const id = node.attrs.id;
+ const baseUrl = window.location.href.split('#')[0];
+ const url = `${baseUrl}#${id}`;
+ navigator.clipboard.writeText(url);
+ linkBtnContent.innerHTML = successIcon;
+ setTimeout(
+ () => (linkBtnContent.innerHTML = copyIcon),
+ 2000,
+ );
+ });
+
+ return icon;
+ },
+ { side: 1 }, // render after node content
+ );
+ decorations.push(deco);
+ }
+ });
+
+ return DecorationSet.create(doc, decorations);
+ },
+ },
+ }),
+ ];
+ },
+ renderHTML({ node, HTMLAttributes }) {
+ const hasLevel = this.options.levels.includes(node.attrs.level);
+ const level = hasLevel ? node.attrs.level : this.options.levels[0];
+
+ return [
+ `h${level}`,
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ id: node.attrs.id,
+ }),
+ 0,
+ ];
+ },
+});
diff --git a/packages/editor-ext/src/lib/highlight.ts b/packages/editor-ext/src/lib/highlight.ts
new file mode 100644
index 00000000..becef994
--- /dev/null
+++ b/packages/editor-ext/src/lib/highlight.ts
@@ -0,0 +1,40 @@
+import {
+ Highlight as TiptapHighlight,
+ type HighlightOptions,
+} from "@tiptap/extension-highlight";
+
+export const Highlight = TiptapHighlight.extend({
+ addAttributes() {
+ return {
+ ...this.parent?.(),
+ color: {
+ default: null,
+ parseHTML: (element) =>
+ element.getAttribute("data-color") || element.style.backgroundColor,
+ renderHTML: (attributes) => {
+ if (!attributes.color) {
+ return {};
+ }
+
+ return {
+ "data-color": attributes.color,
+ style: `background-color: ${attributes.color}; color: inherit`,
+ };
+ },
+ },
+ colorName: {
+ default: null,
+ parseHTML: (element) =>
+ element.getAttribute("data-highlight-color-name") || null,
+ renderHTML: (attributes) => {
+ if (!attributes.colorName) {
+ return {};
+ }
+ return {
+ "data-highlight-color-name": attributes.colorName.toLowerCase(),
+ };
+ },
+ },
+ };
+ },
+});
diff --git a/packages/editor-ext/src/lib/mention.ts b/packages/editor-ext/src/lib/mention.ts
index edbf9c11..714175e4 100644
--- a/packages/editor-ext/src/lib/mention.ts
+++ b/packages/editor-ext/src/lib/mention.ts
@@ -33,6 +33,11 @@ export interface MentionNodeAttrs {
* the id of the user who initiated the mention
*/
creatorId?: string;
+
+ /**
+ * the anchor hash for page mentions (e.g., "heading-1")
+ */
+ anchorId?: string;
}
export type MentionOptions<
@@ -160,6 +165,7 @@ export const Mention = Node.create({
inline: true,
selectable: true,
atom: true,
+ draggable: true,
addAttributes() {
return {
@@ -246,6 +252,20 @@ export const Mention = Node.create({
};
},
},
+
+ anchorId: {
+ default: null,
+ parseHTML: (element) => element.getAttribute("data-anchor-id"),
+ renderHTML: (attributes) => {
+ if (!attributes.anchorId) {
+ return {};
+ }
+
+ return {
+ "data-anchor-id": attributes.anchorId,
+ };
+ },
+ },
};
},
diff --git a/packages/editor-ext/src/lib/subpages/subpages.ts b/packages/editor-ext/src/lib/subpages/subpages.ts
index 620f0342..59eb9896 100644
--- a/packages/editor-ext/src/lib/subpages/subpages.ts
+++ b/packages/editor-ext/src/lib/subpages/subpages.ts
@@ -28,7 +28,7 @@ export const Subpages = Node.create({
group: "block",
atom: true,
- draggable: false,
+ draggable: true,
parseHTML() {
return [
diff --git a/packages/editor-ext/src/lib/table/row.ts b/packages/editor-ext/src/lib/table/row.ts
index c01866e7..7839afdf 100644
--- a/packages/editor-ext/src/lib/table/row.ts
+++ b/packages/editor-ext/src/lib/table/row.ts
@@ -1,6 +1,5 @@
import { TableRow as TiptapTableRow } from "@tiptap/extension-table";
export const TableRow = TiptapTableRow.extend({
- allowGapCursor: false,
content: "(tableCell | tableHeader)*",
});
diff --git a/packages/editor-ext/src/lib/trailing-node.ts b/packages/editor-ext/src/lib/trailing-node.ts
index f3a67cfa..a4d77b3d 100644
--- a/packages/editor-ext/src/lib/trailing-node.ts
+++ b/packages/editor-ext/src/lib/trailing-node.ts
@@ -64,6 +64,12 @@ export const TrailingNode = Extension.create({
return value
}
+ // Ignore transactions from UniqueID extension to prevent infinite loops
+ // when UniqueID adds IDs to newly inserted trailing nodes
+ if (tr.getMeta('__uniqueIDTransaction')) {
+ return value
+ }
+
const lastNode = tr.doc.lastChild
return !nodeEqualsType({ node: lastNode, types: disabledNodes })
},
diff --git a/packages/editor-ext/src/lib/unique-id/index.ts b/packages/editor-ext/src/lib/unique-id/index.ts
new file mode 100644
index 00000000..6bd61fbb
--- /dev/null
+++ b/packages/editor-ext/src/lib/unique-id/index.ts
@@ -0,0 +1,2 @@
+export { UniqueID } from "./unique-id";
+export * from "./unique-id.util";
diff --git a/packages/editor-ext/src/lib/unique-id/unique-id.ts b/packages/editor-ext/src/lib/unique-id/unique-id.ts
new file mode 100644
index 00000000..8436cbd2
--- /dev/null
+++ b/packages/editor-ext/src/lib/unique-id/unique-id.ts
@@ -0,0 +1,11 @@
+import { generateNodeId } from "../utils";
+import { UniqueID as TiptapUniqueID } from "@tiptap/extension-unique-id";
+
+export const UniqueID = TiptapUniqueID.extend({
+ addOptions() {
+ return {
+ ...this.parent?.(),
+ generateID: () => generateNodeId(),
+ };
+ },
+});
diff --git a/packages/editor-ext/src/lib/unique-id/unique-id.util.ts b/packages/editor-ext/src/lib/unique-id/unique-id.util.ts
new file mode 100644
index 00000000..8d1991ed
--- /dev/null
+++ b/packages/editor-ext/src/lib/unique-id/unique-id.util.ts
@@ -0,0 +1,78 @@
+import type { Extensions, JSONContent } from "@tiptap/core";
+import { findChildren, getSchema } from "@tiptap/core";
+import { Node } from "@tiptap/pm/model";
+import { EditorState } from "@tiptap/pm/state";
+import type { UniqueID } from "./unique-id";
+
+/**
+ * Creates a new document with unique IDs added to the nodes. Does the same
+ * thing as the UniqueID extension, but without the need to create an `Editor`
+ * instance. This lets you add unique IDs to the document in the server.
+ *
+ * When you call it, include the `UniqueID` extension in the `extensions` array.
+ * The configuration from the `UniqueID` extension will be picked up
+ * automatically, including its configuration options like `types` and
+ * `attributeName`.
+ *
+ * @see `UniqueID` extension for more information.
+ *
+ * @throws {Error} If the `UniqueID` extension is not found in the extensions array.
+ *
+ * @example
+ * const doc = {
+ * type: 'doc',
+ * content: [
+ * { type: 'paragraph', content: [{ type: 'text', text: 'Hello, world!' }] }
+ * ]
+ * }
+ * const newDoc = addUniqueIds(doc, [StarterKit, UniqueID.configure({ types: ['paragraph', 'heading'] })])
+ * console.log(newDoc)
+ * // Result:
+ * // {
+ * // type: 'doc',
+ * // content: [
+ * // { type: 'paragraph', content: [{ type: 'text', text: 'Hello, world!' }], id: '123' }
+ * // ]
+ * // }
+ *
+ * @param doc - A Tiptap JSON document to add unique IDs to.
+ * @param extensions - The extensions to use. Must include the `UniqueID` extension.
+ * @returns The updated Tiptap JSON document, with the unique IDs added to the nodes.
+ */
+export function addUniqueIdsToDoc(
+ doc: JSONContent,
+ extensions: Extensions,
+): JSONContent {
+ // Find the UniqueID extension in the extensions array. If it's not found, throw an error.
+ const uniqueIDExtension = extensions.find(
+ (ext) => ext.name === "uniqueID",
+ ) as typeof UniqueID | undefined;
+ if (!uniqueIDExtension) {
+ throw new Error("UniqueID extension not found in the extensions array");
+ }
+ const { types, attributeName, generateID } = uniqueIDExtension.options;
+
+ // Convert the JSON content to a ProseMirror node
+ const schema = getSchema([
+ ...extensions.filter((ext) => ext.name !== "uniqueID"),
+ uniqueIDExtension,
+ ]);
+ const contentNode = Node.fromJSON(schema, doc);
+
+ // Find nodes that don't have a unique ID
+ const nodesWithoutId = findChildren(contentNode, (node) => {
+ return !node.attrs[attributeName] && types.includes(node.type.name);
+ });
+
+ // Edit the document to add unique IDs to the nodes that don't have a unique ID
+ let tr = EditorState.create({
+ doc: contentNode,
+ }).tr;
+ // eslint-disable-next-line no-restricted-syntax
+ for (const { node, pos } of nodesWithoutId) {
+ tr = tr.setNodeAttribute(pos, attributeName, generateID({ node, pos }));
+ }
+
+ // Return the updated document
+ return tr.doc.toJSON();
+}
diff --git a/packages/editor-ext/src/lib/utils.ts b/packages/editor-ext/src/lib/utils.ts
index 27ba8ede..31faf7e9 100644
--- a/packages/editor-ext/src/lib/utils.ts
+++ b/packages/editor-ext/src/lib/utils.ts
@@ -5,6 +5,7 @@ import { Node, ResolvedPos } from "@tiptap/pm/model";
import { Table } from "@tiptap/extension-table";
import { sanitizeUrl as braintreeSanitizeUrl } from "@braintree/sanitize-url";
import { EditorView } from '@tiptap/pm/view';
+import { customAlphabet } from "nanoid";
export const isRectSelected = (rect: any) => (selection: CellSelection) => {
const map = TableMap.get(selection.$anchorCell.node(-1));
@@ -383,9 +384,12 @@ export function icon(name: string) {
export function sanitizeUrl(url: string | undefined): string {
if (!url) return "";
-
+
const sanitized = braintreeSanitizeUrl(url);
-
+
// Return empty string instead of "about:blank"
return sanitized === "about:blank" ? "" : sanitized;
}
+
+const alphabet = "abcdefghijklmnopqrstuvwxyz";
+export const generateNodeId = customAlphabet(alphabet, 12);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 08ba0316..800f2ec3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -6,6 +6,8 @@ settings:
overrides:
jsdom: 25.0.1
+ jsonwebtoken: 9.0.3
+ y-prosemirror: 1.3.7
patchedDependencies:
react-arborist@3.4.0:
@@ -26,17 +28,17 @@ importers:
specifier: ^1.7.3
version: 1.7.3
'@hocuspocus/extension-redis':
- specifier: ^3.2.3
- version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ specifier: 3.4.1
+ version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
'@hocuspocus/provider':
- specifier: ^3.2.3
- version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ specifier: 3.4.1
+ version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
'@hocuspocus/server':
- specifier: ^3.2.3
- version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ specifier: 3.4.1
+ version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
'@hocuspocus/transformer':
- specifier: ^3.2.3
- version: 3.2.3(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)
+ specifier: 3.4.1
+ version: 3.4.1(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)
'@joplin/turndown':
specifier: ^4.0.74
version: 4.0.74
@@ -47,89 +49,92 @@ importers:
specifier: 1.1.0
version: 1.1.0
'@tiptap/core':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/pm@3.13.0)
'@tiptap/extension-code-block':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-collaboration':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)
'@tiptap/extension-collaboration-caret':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))
'@tiptap/extension-color':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)))
'@tiptap/extension-document':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-heading':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-highlight':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-history':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
'@tiptap/extension-image':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-link':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-list':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-list-item':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
'@tiptap/extension-list-keymap':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
'@tiptap/extension-placeholder':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
'@tiptap/extension-subscript':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-superscript':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-table':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-text':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-text-align':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-text-style':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/extension-typography':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-unique-id':
+ specifier: ^3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@tiptap/extension-youtube':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
'@tiptap/html':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@18.0.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(happy-dom@20.0.10)
'@tiptap/pm':
- specifier: ^3.6.1
- version: 3.6.1
+ specifier: 3.13.0
+ version: 3.13.0
'@tiptap/react':
- specifier: ^3.6.1
- version: 3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: 3.13.0
+ version: 3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tiptap/starter-kit':
- specifier: ^3.6.1
- version: 3.6.1
+ specifier: 3.13.0
+ version: 3.13.0
'@tiptap/suggestion':
- specifier: ^3.6.1
- version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ specifier: 3.13.0
+ version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
'@types/qrcode':
specifier: ^1.5.5
version: 1.5.5
@@ -175,13 +180,16 @@ importers:
y-indexeddb:
specifier: ^9.0.12
version: 9.0.12(yjs@13.6.27)
+ y-prosemirror:
+ specifier: 1.3.7
+ version: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
yjs:
specifier: ^13.6.27
version: 13.6.27
devDependencies:
'@nx/js':
specifier: 20.4.5
- version: 20.4.5(@babel/traverse@7.27.0)(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(nx@20.4.5(@swc/core@1.5.25(@swc/helpers@0.5.5)))(typescript@5.7.3)
+ version: 20.4.5(@babel/traverse@7.28.5)(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.19.1)(nx@20.4.5(@swc/core@1.5.25(@swc/helpers@0.5.5)))(typescript@5.7.3)
'@types/bytes':
specifier: ^3.1.5
version: 3.1.5
@@ -221,6 +229,9 @@ importers:
'@mantine/core':
specifier: ^8.1.3
version: 8.1.3(@mantine/hooks@8.1.3(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/dates':
+ specifier: ^8.3.2
+ version: 8.3.2(@mantine/core@8.1.3(@mantine/hooks@8.1.3(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@8.1.3(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@mantine/form':
specifier: ^8.1.3
version: 8.1.3(react@18.3.1)
@@ -244,13 +255,13 @@ importers:
version: 5.80.6(react@18.3.1)
'@tiptap/extension-character-count':
specifier: ^2.10.3
- version: 2.14.0(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ version: 2.14.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
alfaaz:
specifier: ^1.1.0
version: 1.1.0
axios:
- specifier: ^1.9.0
- version: 1.9.0
+ specifier: ^1.13.2
+ version: 1.13.2
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -289,7 +300,7 @@ importers:
version: 3.3.0
mantine-form-zod-resolver:
specifier: ^1.3.0
- version: 1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.56)
+ version: 1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.76)
mermaid:
specifier: ^11.11.0
version: 11.11.0
@@ -304,7 +315,7 @@ importers:
version: 18.3.1
react-arborist:
specifier: 3.4.0
- version: 3.4.0(patch_hash=419b3b02e24afe928cc006a006f6e906666aff19aa6fd7daaa788ccc2202678a)(@types/node@22.10.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 3.4.0(patch_hash=419b3b02e24afe928cc006a006f6e906666aff19aa6fd7daaa788ccc2202678a)(@types/node@22.19.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-clear-modal:
specifier: ^2.0.15
version: 2.0.15(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -339,8 +350,8 @@ importers:
specifier: ^0.1.18
version: 0.1.18
zod:
- specifier: ^3.25.56
- version: 3.25.56
+ specifier: ^3.25.76
+ version: 3.25.76
devDependencies:
'@eslint/js':
specifier: ^9.16.0
@@ -358,8 +369,8 @@ importers:
specifier: ^0.16.7
version: 0.16.7
'@types/node':
- specifier: 22.10.0
- version: 22.10.0
+ specifier: 22.19.1
+ version: 22.19.1
'@types/react':
specifier: ^18.3.12
version: 18.3.12
@@ -367,8 +378,8 @@ importers:
specifier: ^18.3.1
version: 18.3.1
'@vitejs/plugin-react':
- specifier: ^4.4.1
- version: 4.4.1(vite@6.3.5(@types/node@22.10.0)(jiti@1.21.0)(less@4.2.0)(sass@1.51.0)(sugarss@4.0.1(postcss@8.4.49))(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))
+ specifier: ^5.1.1
+ version: 5.1.1(vite@7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))
eslint:
specifier: ^9.15.0
version: 9.15.0(jiti@1.21.0)
@@ -406,11 +417,20 @@ importers:
specifier: ^8.17.0
version: 8.17.0(eslint@9.15.0(jiti@1.21.0))(typescript@5.7.2)
vite:
- specifier: ^6.3.5
- version: 6.3.5(@types/node@22.10.0)(jiti@1.21.0)(less@4.2.0)(sass@1.51.0)(sugarss@4.0.1(postcss@8.4.49))(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)
+ specifier: ^7.2.4
+ version: 7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)
apps/server:
dependencies:
+ '@ai-sdk/azure':
+ specifier: ^2.0.47
+ version: 2.0.47(zod@3.25.76)
+ '@ai-sdk/google':
+ specifier: ^2.0.18
+ version: 2.0.18(zod@3.25.76)
+ '@ai-sdk/openai':
+ specifier: ^2.0.46
+ version: 2.0.46(zod@3.25.76)
'@aws-sdk/client-s3':
specifier: 3.701.0
version: 3.701.0
@@ -432,45 +452,51 @@ importers:
'@fastify/static':
specifier: ^8.2.0
version: 8.2.0
+ '@langchain/textsplitters':
+ specifier: ^0.1.0
+ version: 0.1.0(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76)))
+ '@nestjs-labs/nestjs-ioredis':
+ specifier: ^11.0.4
+ version: 11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(ioredis@5.4.1)
'@nestjs/bullmq':
- specifier: ^11.0.2
- version: 11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(bullmq@5.53.2)
+ specifier: ^11.0.4
+ version: 11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(bullmq@5.65.0)
'@nestjs/common':
- specifier: ^11.1.3
- version: 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ specifier: ^11.1.9
+ version: 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/config':
specifier: ^4.0.2
- version: 4.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
+ version: 4.0.2(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
'@nestjs/core':
- specifier: ^11.1.3
- version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ specifier: ^11.1.9
+ version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/event-emitter':
specifier: ^3.0.1
- version: 3.0.1(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)
+ version: 3.0.1(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@nestjs/jwt':
- specifier: ^11.0.0
- version: 11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))
+ specifier: 11.0.0
+ version: 11.0.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))
'@nestjs/mapped-types':
specifier: ^2.1.0
- version: 2.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)
+ version: 2.1.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)
'@nestjs/passport':
specifier: ^11.0.5
- version: 11.0.5(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)
+ version: 11.0.5(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)
'@nestjs/platform-fastify':
- specifier: ^11.1.3
- version: 11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)
+ specifier: ^11.1.9
+ version: 11.1.9(@fastify/static@8.2.0)(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@nestjs/platform-socket.io':
- specifier: ^11.1.3
- version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2)
+ specifier: ^11.1.9
+ version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(rxjs@7.8.2)
'@nestjs/schedule':
- specifier: ^6.0.0
- version: 6.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)
+ specifier: ^6.0.1
+ version: 6.0.1(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@nestjs/terminus':
specifier: ^11.0.0
- version: 11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ version: 11.0.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/websockets':
- specifier: ^11.1.3
- version: 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ specifier: ^11.1.9
+ version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-socket.io@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@node-saml/passport-saml':
specifier: ^5.1.0
version: 5.1.0
@@ -483,12 +509,18 @@ importers:
'@socket.io/redis-adapter':
specifier: ^8.3.0
version: 8.3.0(socket.io-adapter@2.5.4)
+ ai:
+ specifier: ^5.0.65
+ version: 5.0.65(zod@3.25.76)
+ ai-sdk-ollama:
+ specifier: ^0.12.0
+ version: 0.12.0(ai@5.0.65(zod@3.25.76))(zod@3.25.76)
bcrypt:
- specifier: ^5.1.1
- version: 5.1.1
+ specifier: ^6.0.0
+ version: 6.0.0
bullmq:
- specifier: ^5.53.2
- version: 5.53.2
+ specifier: ^5.65.0
+ version: 5.65.0
cache-manager:
specifier: ^6.4.3
version: 6.4.3
@@ -499,8 +531,8 @@ importers:
specifier: ^0.5.1
version: 0.5.1
class-validator:
- specifier: ^0.14.1
- version: 0.14.1
+ specifier: ^0.14.3
+ version: 0.14.3
cookie:
specifier: ^1.0.2
version: 1.0.2
@@ -508,11 +540,14 @@ importers:
specifier: ^11.3.0
version: 11.3.0
happy-dom:
- specifier: ^18.0.1
- version: 18.0.1
+ specifier: 20.0.10
+ version: 20.0.10
+ ioredis:
+ specifier: ^5.4.1
+ version: 5.4.1
jsonwebtoken:
- specifier: ^9.0.2
- version: 9.0.2
+ specifier: 9.0.3
+ version: 9.0.3
kysely:
specifier: ^0.28.2
version: 0.28.2
@@ -523,8 +558,8 @@ importers:
specifier: ^7.4.0
version: 7.4.0
mammoth:
- specifier: ^1.10.0
- version: 1.10.0
+ specifier: ^1.11.0
+ version: 1.11.0
mime-types:
specifier: ^2.1.35
version: 2.1.35
@@ -533,10 +568,10 @@ importers:
version: 3.3.11
nestjs-kysely:
specifier: ^1.2.0
- version: 1.2.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(kysely@0.28.2)(reflect-metadata@0.2.2)
+ version: 1.2.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(kysely@0.28.2)(reflect-metadata@0.2.2)
nodemailer:
- specifier: ^7.0.3
- version: 7.0.3
+ specifier: ^7.0.11
+ version: 7.0.11
openid-client:
specifier: ^5.7.1
version: 5.7.1
@@ -553,14 +588,17 @@ importers:
specifier: ^4.0.1
version: 4.0.1
pdfjs-dist:
- specifier: ^5.4.54
- version: 5.4.54
+ specifier: ^5.4.394
+ version: 5.4.394
pg:
- specifier: ^8.16.0
- version: 8.16.0
+ specifier: ^8.16.3
+ version: 8.16.3
pg-tsquery:
specifier: ^8.4.2
version: 8.4.2
+ pgvector:
+ specifier: ^0.2.1
+ version: 0.2.1
postmark:
specifier: ^4.0.5
version: 4.0.5
@@ -588,9 +626,12 @@ importers:
tmp-promise:
specifier: ^3.0.3
version: 3.0.3
+ typesense:
+ specifier: ^2.1.0
+ version: 2.1.0(@babel/runtime@7.25.6)
ws:
- specifier: ^8.18.2
- version: 8.18.2
+ specifier: ^8.18.3
+ version: 8.18.3
yauzl:
specifier: ^3.2.0
version: 3.2.0
@@ -606,7 +647,7 @@ importers:
version: 11.0.1(chokidar@4.0.3)(typescript@5.7.3)
'@nestjs/testing':
specifier: ^11.0.10
- version: 11.0.10(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)
+ version: 11.0.10(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@types/bcrypt':
specifier: ^5.0.2
version: 5.0.2
@@ -660,7 +701,7 @@ importers:
version: 29.7.0(@types/node@22.13.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3))
kysely-codegen:
specifier: ^0.17.0
- version: 0.17.0(kysely@0.28.2)(pg@8.16.0)
+ version: 0.17.0(kysely@0.28.2)(pg@8.16.3)
prettier:
specifier: ^3.5.1
version: 3.5.1
@@ -703,6 +744,40 @@ packages:
'@adobe/css-tools@4.3.3':
resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==}
+ '@ai-sdk/azure@2.0.47':
+ resolution: {integrity: sha512-rPvjnBWVTVRCDs47qfBWxXxx4i4h7itemyKux21qibB7y24rubqmZGx9lYcI5pyBL057uROhBa9Y5VVHf/ESYw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
+ '@ai-sdk/gateway@1.0.36':
+ resolution: {integrity: sha512-G/CLHzyOy9mhbimSBmV+o59M7ao/NfRFrrhC+eHGp+0qT0diP3IDW5VdkPHKFmDp4Iq7wb4/yOCe7Yk2fQtSrg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
+ '@ai-sdk/google@2.0.18':
+ resolution: {integrity: sha512-ycGAqouueHjU0hB6JHYmUhXYCnN67PqI8+9jCv13MbuE0g+b9w78HiPuab5ResakY0cq3ynFDvbiu8jAGo1RZQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
+ '@ai-sdk/openai@2.0.46':
+ resolution: {integrity: sha512-3FHZdiTLbjnHw0rbu1yOPW8FruHrzN6SlJYsaLSQgbxYfE5y+60Nj4Xp8/k7rtD3FmrjkKcp/XTMSbAJWfoJig==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
+ '@ai-sdk/provider-utils@3.0.11':
+ resolution: {integrity: sha512-4hgHj89VqyOHzGaV85TkcgvO8WjecVF35TOUVg+C56vnzpWSgdIZu/ZWZNdZ6BTrv8y0N1toBWW7XcWiRRicLg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
+ '@ai-sdk/provider@2.0.0':
+ resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==}
+ engines: {node: '>=18'}
+
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
@@ -923,6 +998,10 @@ packages:
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/compat-data@7.26.2':
resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==}
engines: {node: '>=6.9.0'}
@@ -931,6 +1010,10 @@ packages:
resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.28.5':
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/core@7.24.5':
resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==}
engines: {node: '>=6.9.0'}
@@ -947,6 +1030,10 @@ packages:
resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
engines: {node: '>=6.9.0'}
+ '@babel/core@7.28.5':
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/generator@7.24.1':
resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==}
engines: {node: '>=6.9.0'}
@@ -963,6 +1050,10 @@ packages:
resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-annotate-as-pure@7.22.5':
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
engines: {node: '>=6.9.0'}
@@ -979,6 +1070,10 @@ packages:
resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-create-class-features-plugin@7.23.7':
resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==}
engines: {node: '>=6.9.0'}
@@ -1008,6 +1103,10 @@ packages:
resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-hoist-variables@7.24.6':
resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==}
engines: {node: '>=6.9.0'}
@@ -1028,6 +1127,10 @@ packages:
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-module-transforms@7.23.3':
resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
engines: {node: '>=6.9.0'}
@@ -1046,6 +1149,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-optimise-call-expression@7.22.5':
resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
engines: {node: '>=6.9.0'}
@@ -1058,6 +1167,10 @@ packages:
resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-remap-async-to-generator@7.22.20':
resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==}
engines: {node: '>=6.9.0'}
@@ -1106,6 +1219,10 @@ packages:
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-identifier@7.22.20':
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
engines: {node: '>=6.9.0'}
@@ -1118,10 +1235,18 @@ packages:
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.25.9':
resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-wrap-function@7.22.20':
resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
engines: {node: '>=6.9.0'}
@@ -1138,6 +1263,10 @@ packages:
resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==}
engines: {node: '>=6.9.0'}
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/highlight@7.24.2':
resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
engines: {node: '>=6.9.0'}
@@ -1157,6 +1286,11 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/parser@7.28.5':
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
'@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3':
resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==}
engines: {node: '>=6.9.0'}
@@ -1528,14 +1662,14 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-jsx-self@7.25.9':
- resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-jsx-source@7.25.9':
- resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -1658,6 +1792,10 @@ packages:
resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.25.9':
resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
engines: {node: '>=6.9.0'}
@@ -1666,6 +1804,10 @@ packages:
resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==}
engines: {node: '>=6.9.0'}
+ '@babel/traverse@7.28.5':
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.23.6':
resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
engines: {node: '>=6.9.0'}
@@ -1686,6 +1828,10 @@ packages:
resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.28.5':
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
@@ -1707,6 +1853,9 @@ packages:
'@casl/ability': ^3.0.0 || ^4.0.0 || ^5.1.0 || ^6.0.0
react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ '@cfworker/json-schema@4.1.1':
+ resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==}
+
'@chevrotain/cst-dts-gen@11.0.3':
resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
@@ -2153,8 +2302,8 @@ packages:
'@fastify/cookie@11.0.2':
resolution: {integrity: sha512-GWdwdGlgJxyvNv+QcKiGNevSspMQXncjMZ1J8IvuDQk0jvkzgWWZFNC2En3s+nHndZBGV8IbLwOI/sxCZw/mzA==}
- '@fastify/cors@11.0.1':
- resolution: {integrity: sha512-dmZaE7M1f4SM8ZZuk5RhSsDJ+ezTgI7v3HHRj8Ow9CneczsPLZV6+2j2uwdaSLn8zhTv6QV0F4ZRcqdalGx1pQ==}
+ '@fastify/cors@11.1.0':
+ resolution: {integrity: sha512-sUw8ed8wP2SouWZTIbA7V2OQtMNpLj2W6qJOYhNdcmINTu6gsxVYXjQiM9mdi8UUDlcoDDJ/W2syPo1WB2QjYA==}
'@fastify/deepmerge@2.0.2':
resolution: {integrity: sha512-3wuLdX5iiiYeZWP6bQrjqhrcvBIf0NHbQH1Ur1WbHvoiuTYUEItgygea3zs8aHpiitn0lOB8gX20u1qO+FDm7Q==}
@@ -2219,33 +2368,33 @@ packages:
'@floating-ui/utils@0.2.8':
resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
- '@hocuspocus/common@3.2.3':
- resolution: {integrity: sha512-P8COsx2HVXS7NbDEKe9KSt5Hd1A95hZhyTabiNPlU/Pi+7K1RJuHqIkIRr4oIxGzujvpLq/LSwBHP4NYUk+cGA==}
+ '@hocuspocus/common@3.4.1':
+ resolution: {integrity: sha512-29Dpa3nslBvM4dksIoskovYt/aecJomEeWE5Wmzr+lNFJje15P/L/47WcogguRd/IqYIu2auNTyKlouvSRrDAQ==}
- '@hocuspocus/extension-redis@3.2.3':
- resolution: {integrity: sha512-keHKNPBiQBMSOS4ZuKnD15pfOUD5phr8mhW68P9IRIlJcrW8FJG2NBtW8oR38wKMzRtXKG3eKrs03B2KLteScA==}
+ '@hocuspocus/extension-redis@3.4.1':
+ resolution: {integrity: sha512-41M2tpcA5PIPXlrE8368ZQwYBBC0M0IGkDdp3yPmfQnD0idAC67biJ68E1SzgMgPPmFcQ7bPkZ4iNphaVZapQw==}
peerDependencies:
y-protocols: ^1.0.6
yjs: ^13.6.8
- '@hocuspocus/provider@3.2.3':
- resolution: {integrity: sha512-M62Fly7s6sKKGGFze46fypjV3jv2Y2l8PA6/+IgbQRWH275p8NjGP1U7yMOxi52PLFrgaEoy+fQyW93iJ2jqaw==}
+ '@hocuspocus/provider@3.4.1':
+ resolution: {integrity: sha512-lFNxXf2NsyhT8fvxX/N6caki97hbUUGOM79tAoeJty/Y6hKfQyY6ythvkeVdqk+yvx/RiVogrW4PLjazRGprGg==}
peerDependencies:
y-protocols: ^1.0.6
yjs: ^13.6.8
- '@hocuspocus/server@3.2.3':
- resolution: {integrity: sha512-JVidUfVWQJXC2ngDAMvrAK99V5NoGo/5/R/VvJU6bkOwHKfvl/UpFQjP9FwIiDQ/Uwj9P0mQr1gyWs2Tx4k7/w==}
+ '@hocuspocus/server@3.4.1':
+ resolution: {integrity: sha512-VgHmu71CFwyCYOlkLovAqaFrUKGq+OSsIw13PaMLMUrnLT3EdMqFzfkw9b82Qbf23WoN3yvMCPklNjnjg5/Brg==}
peerDependencies:
y-protocols: ^1.0.6
yjs: ^13.6.8
- '@hocuspocus/transformer@3.2.3':
- resolution: {integrity: sha512-gpClIVctiTvad7Q/ON9uFShpgm2BLlx09SGSlmyu1ddMA6Vbky9YD1lSq+ioj17z0TYaehyF7w6bBxmooAzUfA==}
+ '@hocuspocus/transformer@3.4.1':
+ resolution: {integrity: sha512-dVutZ/xEUT3ddC5muI53R1sgWyyrKORCh/lvkYNCq7bQPeBMUC3o/0GxSvQ2C6mO1Ytdh0MmA5IHPeY+N7XYDw==}
peerDependencies:
'@tiptap/core': ^3.0.1
'@tiptap/pm': ^3.0.1
- y-prosemirror: ^1.2.1
+ y-prosemirror: 1.3.7
yjs: ^13.6.8
'@humanfs/core@0.19.1':
@@ -2526,8 +2675,8 @@ packages:
'@ioredis/commands@1.2.0':
resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
- '@ioredis/commands@1.3.1':
- resolution: {integrity: sha512-bYtU8avhGIcje3IhvF9aSjsa5URMZBHnwKtOvXsT4sfYy9gppW11gLPT/9oNqlJZD47yPKveQFTAFWpHjKvUoQ==}
+ '@ioredis/commands@1.4.0':
+ resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==}
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
@@ -2613,10 +2762,16 @@ packages:
'@joplin/turndown@4.0.74':
resolution: {integrity: sha512-yISsLt6wQCVtJHWf6XaSQv3hw4FxzmL8jLa7GJNZAIpFSg9cWBp9f9+tIbEwT6fzCFt1Vs9dQJSVujUYP/hTzA==}
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.1':
resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
engines: {node: '>=6.0.0'}
@@ -2641,12 +2796,25 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
'@keyv/serialize@1.0.3':
resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==}
+ '@langchain/core@0.3.72':
+ resolution: {integrity: sha512-WsGWVZYnlKffj2eEfDocPNiaTRoxyYiLSQdQ7oxZvxGZBqo/90vpjbC33UGK1uPNBM4kT+pkdaol/MnvKUh8TQ==}
+ engines: {node: '>=18'}
+
+ '@langchain/textsplitters@0.1.0':
+ resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@langchain/core': '>=0.2.21 <0.4.0'
+
'@lifeomic/attempt@3.0.3':
resolution: {integrity: sha512-GlM2AbzrErd/TmLL3E8hAHmb5Q7VhDJp35vIbyPVA5Rz55LZuRr8pwL3qrwwkVNo05gMX1J44gURKb4MHQZo7w==}
@@ -2665,6 +2833,15 @@ packages:
react: ^18.x || ^19.x
react-dom: ^18.x || ^19.x
+ '@mantine/dates@8.3.2':
+ resolution: {integrity: sha512-qO9Aft+icFGSeLFTbbHfef/UIKpmUzwujsYuRFw8o6cqOqhqjlC9ObE/3DATxvS+vK9BxODUZYGtE2sI4XUO3Q==}
+ peerDependencies:
+ '@mantine/core': 8.3.2
+ '@mantine/hooks': 8.3.2
+ dayjs: '>=1.0.0'
+ react: ^18.x || ^19.x
+ react-dom: ^18.x || ^19.x
+
'@mantine/form@8.1.3':
resolution: {integrity: sha512-OoSVv2cyjKRZ+C4Rw63VsnO3qjKGZHJkd6DSJTVRQHXfDr10hxmC5yXgxGKsxGQ+xFd4ZCdtzPUU2BoWbHfZAA==}
peerDependencies:
@@ -2704,10 +2881,6 @@ packages:
peerDependencies:
react: ^18.x || ^19.x
- '@mapbox/node-pre-gyp@1.0.11':
- resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
- hasBin: true
-
'@mermaid-js/parser@0.6.2':
resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==}
@@ -2741,81 +2914,89 @@ packages:
cpu: [x64]
os: [win32]
- '@napi-rs/canvas-android-arm64@0.1.77':
- resolution: {integrity: sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==}
+ '@napi-rs/canvas-android-arm64@0.1.82':
+ resolution: {integrity: sha512-bvZhN0iI54ouaQOrgJV96H2q7J3ZoufnHf4E1fUaERwW29Rz4rgicohnAg4venwBJZYjGl5Yl3CGmlAl1LZowQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
- '@napi-rs/canvas-darwin-arm64@0.1.77':
- resolution: {integrity: sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg==}
+ '@napi-rs/canvas-darwin-arm64@0.1.82':
+ resolution: {integrity: sha512-InuBHKCyuFqhNwNr4gpqazo5Xp6ltKflqOLiROn4hqAS8u21xAHyYCJRgHwd+a5NKmutFTaRWeUIT/vxWbU/iw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@napi-rs/canvas-darwin-x64@0.1.77':
- resolution: {integrity: sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ==}
+ '@napi-rs/canvas-darwin-x64@0.1.82':
+ resolution: {integrity: sha512-aQGV5Ynn96onSXcuvYb2y7TRXD/t4CL2EGmnGqvLyeJX1JLSNisKQlWN/1bPDDXymZYSdUqbXehj5qzBlOx+RQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.77':
- resolution: {integrity: sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ==}
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
+ resolution: {integrity: sha512-YIUpmHWeHGGRhWitT1KJkgj/JPXPfc9ox8oUoyaGPxolLGPp5AxJkq8wIg8CdFGtutget968dtwmx71m8o3h5g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@napi-rs/canvas-linux-arm64-gnu@0.1.77':
- resolution: {integrity: sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA==}
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
+ resolution: {integrity: sha512-AwLzwLBgmvk7kWeUgItOUor/QyG31xqtD26w1tLpf4yE0hiXTGp23yc669aawjB6FzgIkjh1NKaNS52B7/qEBQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@napi-rs/canvas-linux-arm64-musl@0.1.77':
- resolution: {integrity: sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg==}
+ '@napi-rs/canvas-linux-arm64-musl@0.1.82':
+ resolution: {integrity: sha512-moZWuqepAwWBffdF4JDadt8TgBD02iMhG6I1FHZf8xO20AsIp9rB+p0B8Zma2h2vAF/YMjeFCDmW5un6+zZz9g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.77':
- resolution: {integrity: sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA==}
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
+ resolution: {integrity: sha512-w9++2df2kG9eC9LWYIHIlMLuhIrKGQYfUxs97CwgxYjITeFakIRazI9LYWgVzEc98QZ9x9GQvlicFsrROV59MQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
- '@napi-rs/canvas-linux-x64-gnu@0.1.77':
- resolution: {integrity: sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ==}
+ '@napi-rs/canvas-linux-x64-gnu@0.1.82':
+ resolution: {integrity: sha512-lZulOPwrRi6hEg/17CaqdwWEUfOlIJuhXxincx1aVzsVOCmyHf+xFq4i6liJl1P+x2v6Iz2Z/H5zHvXJCC7Bwg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@napi-rs/canvas-linux-x64-musl@0.1.77':
- resolution: {integrity: sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA==}
+ '@napi-rs/canvas-linux-x64-musl@0.1.82':
+ resolution: {integrity: sha512-Be9Wf5RTv1w6GXlTph55K3PH3vsAh1Ax4T1FQY1UYM0QfD0yrwGdnJ8/fhqw7dEgMjd59zIbjJQC8C3msbGn5g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@napi-rs/canvas-win32-x64-msvc@0.1.77':
- resolution: {integrity: sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A==}
+ '@napi-rs/canvas-win32-x64-msvc@0.1.82':
+ resolution: {integrity: sha512-LN/i8VrvxTDmEEK1c10z2cdOTkWT76LlTGtyZe5Kr1sqoSomKeExAjbilnu1+oee5lZUgS5yfZ2LNlVhCeARuw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@napi-rs/canvas@0.1.77':
- resolution: {integrity: sha512-N9w2DkEKE1AXGp3q55GBOP6BEoFrqChDiFqJtKViTpQCWNOSVuMz7LkoGehbnpxtidppbsC36P0kCZNqJKs29w==}
+ '@napi-rs/canvas@0.1.82':
+ resolution: {integrity: sha512-FGjyUBoF0sl1EenSiE4UV2WYu76q6F9GSYedq5EiOCOyGYoQ/Owulcv6rd7v/tWOpljDDtefXXIaOCJrVKem4w==}
engines: {node: '>= 10'}
'@napi-rs/wasm-runtime@0.2.4':
resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==}
- '@nestjs/bull-shared@11.0.2':
- resolution: {integrity: sha512-dFlttJvBqIFD6M8JVFbkrR4Feb39OTAJPJpFVILU50NOJCM4qziRw3dSNG84Q3v+7/M6xUGMFdZRRGvBBKxoSA==}
+ '@nestjs-labs/nestjs-ioredis@11.0.4':
+ resolution: {integrity: sha512-4jPNOrxDiwNMIN5OLmsMWhA782kxv/ZBxkySX9l8n6sr55acHX/BciaFsOXVa/ILsm+Y7893y98/6WNhmEoiNQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0 || ^11.0.0
+ '@nestjs/core': ^10.0.0 || ^11.0.0
+ ioredis: ^5.0.0
+
+ '@nestjs/bull-shared@11.0.4':
+ resolution: {integrity: sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==}
peerDependencies:
'@nestjs/common': ^10.0.0 || ^11.0.0
'@nestjs/core': ^10.0.0 || ^11.0.0
- '@nestjs/bullmq@11.0.2':
- resolution: {integrity: sha512-Lq6lGpKkETsm0RDcUktlzsthFoE3A5QTMp2FwPi1eztKqKD6/90KS1TcnC9CJFzjpUaYnQzIMrlNs55e+/wsHA==}
+ '@nestjs/bullmq@11.0.4':
+ resolution: {integrity: sha512-wBzK9raAVG0/6NTMdvLGM4/FQ1lsB35/pYS8L6a0SDgkTiLpd7mAjQ8R692oMx5s7IjvgntaZOuTUrKYLNfIkA==}
peerDependencies:
'@nestjs/common': ^10.0.0 || ^11.0.0
'@nestjs/core': ^10.0.0 || ^11.0.0
@@ -2834,8 +3015,8 @@ packages:
'@swc/core':
optional: true
- '@nestjs/common@11.1.3':
- resolution: {integrity: sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==}
+ '@nestjs/common@11.1.9':
+ resolution: {integrity: sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==}
peerDependencies:
class-transformer: '>=0.4.1'
class-validator: '>=0.13.2'
@@ -2853,8 +3034,8 @@ packages:
'@nestjs/common': ^10.0.0 || ^11.0.0
rxjs: ^7.1.0
- '@nestjs/core@11.1.3':
- resolution: {integrity: sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==}
+ '@nestjs/core@11.1.9':
+ resolution: {integrity: sha512-a00B0BM4X+9z+t3UxJqIZlemIwCQdYoPKrMcM+ky4z3pkqqG1eTWexjs+YXpGObnLnjtMPVKWlcZHp3adDYvUw==}
engines: {node: '>= 20'}
peerDependencies:
'@nestjs/common': ^11.0.0
@@ -2901,8 +3082,8 @@ packages:
'@nestjs/common': ^10.0.0 || ^11.0.0
passport: ^0.5.0 || ^0.6.0 || ^0.7.0
- '@nestjs/platform-fastify@11.1.3':
- resolution: {integrity: sha512-SMIjGV6eAxQv6+/2OumIdNivVLebql6THWjXv8Uh4dR1CI6ipp3gMbpoiYbHP7AGXv8pzuGmpakli86VP9P8NQ==}
+ '@nestjs/platform-fastify@11.1.9':
+ resolution: {integrity: sha512-OOCyg36CP+WrJn7KIk1E/XdCPegcIdH5zi2txwqUtQNshl6c0VWv+8qotyOncPwEFuiOgnn3fuGveQj7DPNKgA==}
peerDependencies:
'@fastify/static': ^8.0.0
'@fastify/view': ^10.0.0 || ^11.0.0
@@ -2914,15 +3095,15 @@ packages:
'@fastify/view':
optional: true
- '@nestjs/platform-socket.io@11.1.3':
- resolution: {integrity: sha512-jQ+ccprmh3kKolBp+bb97zoaS3vKaiyeNqyctGqV4CSG8P6mXSaaUObWxAsw6Jdgn5YQAVEBWJ6FhvF4s6QZbg==}
+ '@nestjs/platform-socket.io@11.1.9':
+ resolution: {integrity: sha512-OaAW+voXo5BXbFKd9Ot3SL05tEucRMhZRdw5wdWZf/RpIl9hB6G6OHr8DDxNbUGvuQWzNnZHCDHx3EQJzjcIyA==}
peerDependencies:
'@nestjs/common': ^11.0.0
'@nestjs/websockets': ^11.0.0
rxjs: ^7.1.0
- '@nestjs/schedule@6.0.0':
- resolution: {integrity: sha512-aQySMw6tw2nhitELXd3EiRacQRgzUKD9mFcUZVOJ7jPLqIBvXOyvRWLsK9SdurGA+jjziAlMef7iB5ZEFFoQpw==}
+ '@nestjs/schedule@6.0.1':
+ resolution: {integrity: sha512-v3yO6cSPAoBSSyH67HWnXHzuhPhSNZhRmLY38JvCt2sqY8sPMOODpcU1D79iUMFf7k16DaMEbL4Mgx61ZhiC8Q==}
peerDependencies:
'@nestjs/common': ^10.0.0 || ^11.0.0
'@nestjs/core': ^10.0.0 || ^11.0.0
@@ -2993,8 +3174,8 @@ packages:
'@nestjs/platform-express':
optional: true
- '@nestjs/websockets@11.1.3':
- resolution: {integrity: sha512-IjhWKfRf0D247JxYIEs8USblJJbcxUsKJpzbCPaZ7TrVy4LrpG3IRQDlSTOw599TRIYP5ixyH9C0+v5DyaI9uA==}
+ '@nestjs/websockets@11.1.9':
+ resolution: {integrity: sha512-kkkdeTVcc3X7ZzvVqUVpOAJoh49kTRUjWNUXo5jmG+27OvZoHfs/vuSiqxidrrbIgydSqN15HUsf1wZwQUrxCQ==}
peerDependencies:
'@nestjs/common': ^11.0.0
'@nestjs/core': ^11.0.0
@@ -3174,6 +3355,9 @@ packages:
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
+ '@pinojs/redact@0.4.0':
+ resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
+
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -3575,103 +3759,116 @@ packages:
'@remirror/core-constants@3.0.0':
resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
- '@rollup/rollup-android-arm-eabi@4.40.0':
- resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==}
+ '@rolldown/pluginutils@1.0.0-beta.47':
+ resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==}
+
+ '@rollup/rollup-android-arm-eabi@4.53.3':
+ resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.40.0':
- resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==}
+ '@rollup/rollup-android-arm64@4.53.3':
+ resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.40.0':
- resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==}
+ '@rollup/rollup-darwin-arm64@4.53.3':
+ resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.40.0':
- resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==}
+ '@rollup/rollup-darwin-x64@4.53.3':
+ resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.40.0':
- resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==}
+ '@rollup/rollup-freebsd-arm64@4.53.3':
+ resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.40.0':
- resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==}
+ '@rollup/rollup-freebsd-x64@4.53.3':
+ resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
- resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
+ resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.40.0':
- resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==}
+ '@rollup/rollup-linux-arm-musleabihf@4.53.3':
+ resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.40.0':
- resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==}
+ '@rollup/rollup-linux-arm64-gnu@4.53.3':
+ resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.40.0':
- resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==}
+ '@rollup/rollup-linux-arm64-musl@4.53.3':
+ resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
- resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==}
+ '@rollup/rollup-linux-loong64-gnu@4.53.3':
+ resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==}
cpu: [loong64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
- resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==}
+ '@rollup/rollup-linux-ppc64-gnu@4.53.3':
+ resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.40.0':
- resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==}
+ '@rollup/rollup-linux-riscv64-gnu@4.53.3':
+ resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-riscv64-musl@4.40.0':
- resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==}
+ '@rollup/rollup-linux-riscv64-musl@4.53.3':
+ resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.40.0':
- resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==}
+ '@rollup/rollup-linux-s390x-gnu@4.53.3':
+ resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.40.0':
- resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==}
+ '@rollup/rollup-linux-x64-gnu@4.53.3':
+ resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.40.0':
- resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==}
+ '@rollup/rollup-linux-x64-musl@4.53.3':
+ resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.40.0':
- resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==}
+ '@rollup/rollup-openharmony-arm64@4.53.3':
+ resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.53.3':
+ resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.40.0':
- resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==}
+ '@rollup/rollup-win32-ia32-msvc@4.53.3':
+ resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.40.0':
- resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==}
+ '@rollup/rollup-win32-x64-gnu@4.53.3':
+ resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.53.3':
+ resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==}
cpu: [x64]
os: [win32]
@@ -3917,6 +4114,9 @@ packages:
peerDependencies:
socket.io-adapter: ^2.5.4
+ '@standard-schema/spec@1.0.0':
+ resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
+
'@swc/core-darwin-arm64@1.5.25':
resolution: {integrity: sha512-YbD0SBgVJS2DM0vwJTU5m7+wOyCjHPBDMf3nCBJQzFZzOLzK11eRW7SzU2jhJHr9HI9sKcNFfN4lIC2Sj+4inA==}
engines: {node: '>=10'}
@@ -4016,31 +4216,31 @@ packages:
peerDependencies:
react: ^18 || ^19
- '@tiptap/core@3.6.1':
- resolution: {integrity: sha512-Ascvlh0PmScOJyPxcgPOqFLSOruY/7JjPYdTyqShOIks1S2dr3w8A07omQCmeEHI0mX9L2eZyR2qXwFlyMdfEA==}
+ '@tiptap/core@3.13.0':
+ resolution: {integrity: sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==}
peerDependencies:
- '@tiptap/pm': ^3.6.1
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-blockquote@3.6.1':
- resolution: {integrity: sha512-/2oa6GfL1eo2NOZ0Eyr+z56esZTDQDE2g3yz68BRJ7d4qWOLECm7an8R/lUex9qFNfpoI+XolSRmbsMzsnvsFA==}
+ '@tiptap/extension-blockquote@3.13.0':
+ resolution: {integrity: sha512-K1z/PAIIwEmiWbzrP//4cC7iG1TZknDlF1yb42G7qkx2S2X4P0NiqX7sKOej3yqrPjKjGwPujLMSuDnCF87QkQ==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-bold@3.6.1':
- resolution: {integrity: sha512-sverZOvkPB0D4GEJ8c8OlIA7jsY40AS6grXZERTBSKsAJQI+dwuq+dfe9oo8T6U0Lv0MaLO4UgxU9lB/UmST2Q==}
+ '@tiptap/extension-bold@3.13.0':
+ resolution: {integrity: sha512-VYiDN9EEwR6ShaDLclG8mphkb/wlIzqfk7hxaKboq1G+NSDj8PcaSI9hldKKtTCLeaSNu6UR5nkdu/YHdzYWTw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-bubble-menu@3.6.1':
- resolution: {integrity: sha512-0x8waHgxi5soPzKnzimVuIBRz5HUA+OLjbxwPKHrV9mDGK0biDCIG140+Qm+LfCBWnc50+5oLUpfG5PSOcwjhA==}
+ '@tiptap/extension-bubble-menu@3.13.0':
+ resolution: {integrity: sha512-qZ3j2DBsqP9DjG2UlExQ+tHMRhAnWlCKNreKddKocb/nAFrPdBCtvkqIEu+68zPlbLD4ukpoyjUklRJg+NipFg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-bullet-list@3.6.1':
- resolution: {integrity: sha512-0CxnGXsQdtk+1CDuNjQ8Q3F+7VRoMXWrDKv23+EHp/zkp0Mv9gJx77AMU3RwUZdrvNL4UP6hllb+11eM2Qi5xQ==}
+ '@tiptap/extension-bullet-list@3.13.0':
+ resolution: {integrity: sha512-fFQmmEUoPzRGiQJ/KKutG35ZX21GE+1UCDo8Q6PoWH7Al9lex47nvyeU1BiDYOhcTKgIaJRtEH5lInsOsRJcSA==}
peerDependencies:
- '@tiptap/extension-list': ^3.6.1
+ '@tiptap/extension-list': ^3.13.0
'@tiptap/extension-character-count@2.14.0':
resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==}
@@ -4048,222 +4248,228 @@ packages:
'@tiptap/core': ^2.7.0
'@tiptap/pm': ^2.7.0
- '@tiptap/extension-code-block@3.6.1':
- resolution: {integrity: sha512-9UFxNYUZHFH0lr1ionpPEJgfMpsaE6RpeBLTGotCh3Ls4Qmd//1wKS/H5fm1T74rLFVrRaPCAQXEB7tPWZbfng==}
+ '@tiptap/extension-code-block@3.13.0':
+ resolution: {integrity: sha512-kIwfQ4iqootsWg9e74iYJK54/YMIj6ahUxEltjZRML5z/h4gTDcQt2eTpnEC8yjDjHeUVOR94zH9auCySyk9CQ==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-code@3.6.1':
- resolution: {integrity: sha512-9uDCXFqt8hcdeYIO65ao0U83o/OhChwTreJ/wTSJkp1eeO3D5zxYkrORLsD/ukNhRr15BhU47226elwfC2wLTg==}
+ '@tiptap/extension-code@3.13.0':
+ resolution: {integrity: sha512-sF5raBni6iSVpXWvwJCAcOXw5/kZ+djDHx1YSGWhopm4+fsj0xW7GvVO+VTwiFjZGKSw+K5NeAxzcQTJZd3Vhw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-collaboration-caret@3.6.1':
- resolution: {integrity: sha512-if/YS2LdDi4T5vHo4VlUXyytDN2kkZbphJqYrkFINLsWZJ6wBUrM3QfWQQqAtFDpMLsQBSiq+EbmzeQNp6l/5w==}
+ '@tiptap/extension-collaboration-caret@3.13.0':
+ resolution: {integrity: sha512-n8DEiWcVb0mTsf0kVjNx/cU00GACOVoyzu1g376W2qJTntcPPPjSYv+GWyyYHMEiH4i2GOPeuyoMShwf+SJWug==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
- '@tiptap/y-tiptap': ^3.0.0-beta.3
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
+ '@tiptap/y-tiptap': ^3.0.0
- '@tiptap/extension-collaboration@3.6.1':
- resolution: {integrity: sha512-c0hkH/90pf/3Aevy2MgW7Hg2yeV4fkeOFoBWEu5nwA1YeulJL+usGQrudhpBSgzAvpv94OZXkdVQjJwRq1hvzg==}
+ '@tiptap/extension-collaboration@3.13.0':
+ resolution: {integrity: sha512-Ovi1z2gLMF5XO7uiD/bRxa6tX5dgFJ2aYF5vbfLci+4UeKWIFjn9tg0H5PU2A2c+BIOzlhLWA2YpPb2ucK7sSg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
- '@tiptap/y-tiptap': ^3.0.0-beta.3
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
+ '@tiptap/y-tiptap': ^3.0.0
yjs: ^13
- '@tiptap/extension-color@3.6.1':
- resolution: {integrity: sha512-WCq4DRxawCsb0oeZQFGPMKCy1Vc8Wvob7BeUhtHeZtlZNkzFenVSYE8kBwK+J+rbvuaQxaPB10VejOC8NWcqtA==}
+ '@tiptap/extension-color@3.13.0':
+ resolution: {integrity: sha512-I+PTZ31p6GhCjUVpCh1qertTK6T07MVGuLm/LP+c14ByMoZ0L0nVgw0YbWhDqLYWbkI9davv0fuI3dQ0gKSPlA==}
peerDependencies:
- '@tiptap/extension-text-style': ^3.6.1
+ '@tiptap/extension-text-style': ^3.13.0
- '@tiptap/extension-document@3.6.1':
- resolution: {integrity: sha512-PT084IHWHhmZ058Svcr+9l6Ih9m7uql8jJ23Jv1khtBg4WysDY+SPNNjZhFgWIaA1jZ/Ml7lqkGwWaON1749og==}
+ '@tiptap/extension-document@3.13.0':
+ resolution: {integrity: sha512-RjU7hTJwjKXIdY57o/Pc+Yr8swLkrwT7PBQ/m+LCX5oO/V2wYoWCjoBYnK5KSHrWlNy/aLzC33BvLeqZZ9nzlQ==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-dropcursor@3.6.1':
- resolution: {integrity: sha512-JOTQfvW8r6FNd9G7+q7c0XwSDoNJQIhXRltY5m5GHT37EN60pMS2eIFYNAnBMNu7yZ6H6uxRnGmMLsnnn+2LCw==}
+ '@tiptap/extension-dropcursor@3.13.0':
+ resolution: {integrity: sha512-m7GPT3c/83ni+bbU8c+3dpNa8ug+aQ4phNB1Q52VQG3oTonDJnZS7WCtn3lB/Hi1LqoqMtEHwhepU2eD+JeXqQ==}
peerDependencies:
- '@tiptap/extensions': ^3.6.1
+ '@tiptap/extensions': ^3.13.0
- '@tiptap/extension-floating-menu@3.6.1':
- resolution: {integrity: sha512-vY2WYPDwlOFOSGrlHufRQ6pQETVb6E7+4zjuaqTgWKc2YwDeiIf+w8pRuIeFyMmRJ0oMyIs+TqWQf4Fg0dlt/A==}
+ '@tiptap/extension-floating-menu@3.13.0':
+ resolution: {integrity: sha512-OsezV2cMofZM4c13gvgi93IEYBUzZgnu8BXTYZQiQYekz4bX4uulBmLa1KOA9EN71FzS+SoLkXHU0YzlbLjlxA==}
peerDependencies:
'@floating-ui/dom': ^1.0.0
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-gapcursor@3.6.1':
- resolution: {integrity: sha512-DzOxPQbUoZ+01xRLVmvzsZDMJMJBPXblQPnIVjAw0aqovpAx0XBMNJVHl6OfYLIjs8T9aKAJdE8N3KfjgJr7BA==}
+ '@tiptap/extension-gapcursor@3.13.0':
+ resolution: {integrity: sha512-KVxjQKkd964nin+1IdM2Dvej/Jy4JTMcMgq5seusUhJ9T9P8F9s2D5Iefwgkps3OCzub/aF+eAsZe+1P5KSIgA==}
peerDependencies:
- '@tiptap/extensions': ^3.6.1
+ '@tiptap/extensions': ^3.13.0
- '@tiptap/extension-hard-break@3.6.1':
- resolution: {integrity: sha512-lGY+EVJQDtw3EUPYy5kxlnzB3oYVh0wKVNUOBeUv23oOURFldOYcPv5ZVT8dXPqLZPVeeAYHlqxzXgd8iZ6sKw==}
+ '@tiptap/extension-hard-break@3.13.0':
+ resolution: {integrity: sha512-nH1OBaO+/pakhu+P1jF208mPgB70IKlrR/9d46RMYoYbqJTNf4KVLx5lHAOHytIhjcNg+MjyTfJWfkK+dyCCyg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-heading@3.6.1':
- resolution: {integrity: sha512-EsJrPUPxQqPwJNuboX/Z/l+f2YleJWYMJ75TyCfBrPhOkcaXasiUSyfK/qm9NxcFOGPTgnTMAhE9PfQ04eptQQ==}
+ '@tiptap/extension-heading@3.13.0':
+ resolution: {integrity: sha512-8VKWX8waYPtUWN97J89em9fOtxNteh6pvUEd0htcOAtoxjt2uZjbW5N4lKyWhNKifZBrVhH2Cc2NUPuftCVgxw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-highlight@3.6.1':
- resolution: {integrity: sha512-sNzwL0OZRpxAef9LE4SS3AbNyMBsxyGw3MJF34+Bdcu2VpaqoM3XFn664cD7iAsyTJI9eY0eLhZTMcKsdAlBaw==}
+ '@tiptap/extension-highlight@3.13.0':
+ resolution: {integrity: sha512-VlXyO8gWhWd0W5ln4Qyr/P1RoAVZkk9ge0jjNsb1bOc078wuvufQ9f6DquMxx0WpcaCXy+DBQLE0GUUqoLvjsQ==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-history@3.6.1':
- resolution: {integrity: sha512-zEL3mbzwsjGEP5Sg6DCpKlP+ZhHO5Q/IWg6Wqjm64o8WFPnBgGjyr3CyFUpaNr79Op0CxT7Cd6uh248l39I1dA==}
+ '@tiptap/extension-history@3.13.0':
+ resolution: {integrity: sha512-uLQahZh5uPv0jlmVho3xPeleaRs7WaZ9lBl03I/cI9EMho9BmF38pXYghjSXUmcsUwsGy0dZbfmE3Skn8iUwxA==}
peerDependencies:
- '@tiptap/extensions': ^3.6.1
+ '@tiptap/extensions': ^3.13.0
- '@tiptap/extension-horizontal-rule@3.6.1':
- resolution: {integrity: sha512-fadO1GWVNzl7WcfL0SODHQcz9krNmV9H4TvbVbOnl9FxlWgEm0NcP43j0DQVMlGAhbUHGjDY6Sf85qrkPtbstw==}
+ '@tiptap/extension-horizontal-rule@3.13.0':
+ resolution: {integrity: sha512-ZUFyORtjj22ib8ykbxRhWFQOTZjNKqOsMQjaAGof30cuD2DN5J5pMz7Haj2fFRtLpugWYH+f0Mi+WumQXC3hCw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-image@3.6.1':
- resolution: {integrity: sha512-3ze2Et/p9YwQ34RkX8cIuClNiGup0/OfTy22GtjGPMpRPTSt8LTwz9vUEmENCdwfFYidyNSoh2rXA1gXKRfNFQ==}
+ '@tiptap/extension-image@3.13.0':
+ resolution: {integrity: sha512-223uzLUkIa1rkK7aQK3AcIXe6LbCtmnpVb7sY5OEp+LpSaSPyXwyrZ4A0EO1o98qXG68/0B2OqMntFtA9c5Fbw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-italic@3.6.1':
- resolution: {integrity: sha512-rb5AvhT+IZ8PjXpnG7cir92zQYWOj6gH/icMkOyi/4jtuRSWRMCOO3nh/eVqK6xL0sa7e57fLIliepm4PBJy+Q==}
+ '@tiptap/extension-italic@3.13.0':
+ resolution: {integrity: sha512-XbVTgmzk1kgUMTirA6AGdLTcKHUvEJoh3R4qMdPtwwygEOe7sBuvKuLtF6AwUtpnOM+Y3tfWUTNEDWv9AcEdww==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-link@3.6.1':
- resolution: {integrity: sha512-jT85DLWC64yakmlsYz0mRbeDCiseoG0Ad8uxMIXYjsKNmAcAQWkoJ6oyA728YSGvh7fxMYNrWxa/A+raPvpnjQ==}
+ '@tiptap/extension-link@3.13.0':
+ resolution: {integrity: sha512-LuFPJ5GoL12GHW4A+USsj60O90pLcwUPdvEUSWewl9USyG6gnLnY/j5ZOXPYH7LiwYW8+lhq7ABwrDF2PKyBbA==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-list-item@3.6.1':
- resolution: {integrity: sha512-xNHs1fgt2gmkgDcyzU4Qb9t2mLmPx+z3KGsxwn5O2LUvjR5OkToNrpUX08aY3psBCB7gYZpwLafGP2TKVa6DlA==}
+ '@tiptap/extension-list-item@3.13.0':
+ resolution: {integrity: sha512-63NbcS/XeQP2jcdDEnEAE3rjJICDj8y1SN1h/MsJmSt1LusnEo8WQ2ub86QELO6XnD3M04V03cY6Knf6I5mTkw==}
peerDependencies:
- '@tiptap/extension-list': ^3.6.1
+ '@tiptap/extension-list': ^3.13.0
- '@tiptap/extension-list-keymap@3.6.1':
- resolution: {integrity: sha512-jbpG0qc7s45Bl17yM8NrxxlwWjmTwID6gxkwVV+Zrgt2JzZ8VN/+O1ux5Rg8o448IKHmq2hS0NeakyqVT+ntAA==}
+ '@tiptap/extension-list-keymap@3.13.0':
+ resolution: {integrity: sha512-P+HtIa1iwosb1feFc8B/9MN5EAwzS+/dZ0UH0CTF2E4wnp5Z9OMxKl1IYjfiCwHzZrU5Let+S/maOvJR/EmV0g==}
peerDependencies:
- '@tiptap/extension-list': ^3.6.1
+ '@tiptap/extension-list': ^3.13.0
- '@tiptap/extension-list@3.6.1':
- resolution: {integrity: sha512-eMUp/ZsxZHr4bpyoyXsw8S00GXs/Ys2egN7jkKOgRA5Px1JpASgSp7bcG5R0ItBZ7z7LhNTWfaE+jfRJ1hgkZQ==}
+ '@tiptap/extension-list@3.13.0':
+ resolution: {integrity: sha512-MMFH0jQ4LeCPkJJFyZ77kt6eM/vcKujvTbMzW1xSHCIEA6s4lEcx9QdZMPpfmnOvTzeoVKR4nsu2t2qT9ZXzAw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-ordered-list@3.6.1':
- resolution: {integrity: sha512-8gpQ6TrpJC6olW1Wg5JSsTYfeD0ykntlp7T/EzFz9790+B66W1tIvP8A57f1iq5Upmmx1NJv8V5tQ1F5OZEYVQ==}
+ '@tiptap/extension-ordered-list@3.13.0':
+ resolution: {integrity: sha512-QuDyLzuK/3vCvx9GeKhgvHWrGECBzmJyAx6gli2HY+Iil7XicbfltV4nvhIxgxzpx3LDHLKzJN9pBi+2MzX60g==}
peerDependencies:
- '@tiptap/extension-list': ^3.6.1
+ '@tiptap/extension-list': ^3.13.0
- '@tiptap/extension-paragraph@3.6.1':
- resolution: {integrity: sha512-daINH5O/GHBtQnCmDdpiYDSgdvasV2fmv5aljKG1uI56iN770vyUde3NCIYTk6EYCA8COFMWKFfxK8D2JJDdCg==}
+ '@tiptap/extension-paragraph@3.13.0':
+ resolution: {integrity: sha512-9csQde1i0yeZI5oQQ9e1GYNtGL2JcC2d8Fwtw9FsGC8yz2W0h+Fmk+3bc2kobbtO5LGqupSc1fKM8fAg5rSRDg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-placeholder@3.6.1':
- resolution: {integrity: sha512-AhNI+75OqoJKtt5SChzacbPco9jnfV9rkHCF4yVenlK0Z3IQ/iOgAjLUbYqveXzNmLdhyt7lZn3yaCPXwCldJA==}
+ '@tiptap/extension-placeholder@3.13.0':
+ resolution: {integrity: sha512-Au4ktRBraQktX9gjSzGWyJV6kPof7+kOhzE8ej+rOMjIrHbx3DCHy1CJWftSO9BbqIyonjsFmm4nE+vjzZ3Z5Q==}
peerDependencies:
- '@tiptap/extensions': ^3.6.1
+ '@tiptap/extensions': ^3.13.0
- '@tiptap/extension-strike@3.6.1':
- resolution: {integrity: sha512-iSx0k/QZkiFoGVLJksMrDgwYSE4ntljEt5qys9gkU6PP3LDUicaYjpVcFN93F1ycxQ7LyQRVq9azRxQ+tIT35Q==}
+ '@tiptap/extension-strike@3.13.0':
+ resolution: {integrity: sha512-VHhWNqTAMOfrC48m2FcPIZB0nhl6XHQviAV16SBc+EFznKNv9tQUsqQrnuQ2y6ZVfqq5UxvZ3hKF/JlN/Ff7xw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-subscript@3.6.1':
- resolution: {integrity: sha512-GxJB9+JQq+x1Z+ykn1pm3G3M73gXZfhqzraI47jYinqOftv/DHZ6sPxgQJFVInlAseMD5KdqWmJ7YlXWVJisRQ==}
+ '@tiptap/extension-subscript@3.13.0':
+ resolution: {integrity: sha512-8Lq1ATTDUyolue42UbWXAotHPY4Y0r6pMTJyZ9Dqxbv5VrlBk6XeApkGwq6etBXMUsENJycLHlBk3PVqhzGrfw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-superscript@3.6.1':
- resolution: {integrity: sha512-Zwpr+5alDail0GAe+u1TWVbprpJcRLbHpDZq1fro3ea3KdtQjr8TcXPBVRvJ+66URahAT2BxKTQ5esruKj2cBQ==}
+ '@tiptap/extension-superscript@3.13.0':
+ resolution: {integrity: sha512-ljeaxgPy85IyRCYItKtd23fKmKlHbABq/sP4QGZ5D0PRYX5jF1dt8SEVVkDaoUu7YATRVa7MKl/NzKmTuVStjQ==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-table@3.6.1':
- resolution: {integrity: sha512-DRVy+hqysOWeB6RCaveV06+eTpq8JnBFowx8fkAdcyyLVPEaeZvnIvulL8vMYJjSOqxJ7rCLoqhK2N6CXbewiQ==}
+ '@tiptap/extension-table@3.13.0':
+ resolution: {integrity: sha512-LcH9KE4QBUJ6IPwt1Uo5iU7zatFjUUvXbctIu2fKQ9nqJ7nNSFxRhkNyporVFkTWYH7/rb0qMoF1VxSUGefG5w==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extension-text-align@3.6.1':
- resolution: {integrity: sha512-zegYnbKAPGV5FcPWefucBWfirbROSLl52qkl6+5okHDyeGOKBmo1FPZieikopK+kTmwgzRQZUyCejybQQuW2ZA==}
+ '@tiptap/extension-text-align@3.13.0':
+ resolution: {integrity: sha512-hebIus9tdXWb+AmhO+LTeUxZLdb0tqwdeaL/0wYxJQR5DeCTlJe6huXacMD/BkmnlEpRhxzQH0FrmXAd0d4Wgg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-text-style@3.6.1':
- resolution: {integrity: sha512-aWmziUtNP6DnY0aKSt6HS7DcJgfP6zuAbVEuUsHLZAy4c9DAtKZbFuwLvIY7TvSG9haAKD8TWc8TATEpSct0UQ==}
+ '@tiptap/extension-text-style@3.13.0':
+ resolution: {integrity: sha512-M7ob3pfYNYgFPihncEp33r9477hXQgC8j3iU8BsewvPlSx2bMSy5jp2XHDXyEX8dV6flr7acH4GkXXw+DHpaPA==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-text@3.6.1':
- resolution: {integrity: sha512-B/UMoYhg9C12JnCJI5oRoJx4yKVsBQQ4cnb3iaRfvXzm1sUQPOsLjK75kLQGKDfVWYMwj13InSXZ+WD+BVuLvA==}
+ '@tiptap/extension-text@3.13.0':
+ resolution: {integrity: sha512-VcZIna93rixw7hRkHGCxDbL3kvJWi80vIT25a2pXg0WP1e7Pi3nBYvZIL4SQtkbBCji9EHrbZx3p8nNPzfazYw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-typography@3.6.1':
- resolution: {integrity: sha512-zAL3uO5A2/3raoApI0YYHE+HbK1cx92gfakUREDfzWG45M6C+D7TCIX320qvqUhzjVWK+qrFaWQddAX5w8VQJA==}
+ '@tiptap/extension-typography@3.13.0':
+ resolution: {integrity: sha512-Pvxc0Mu3fIgcqOVpU5DqK55F+/ShvX020HmbsPY+Z7SED9fkan5QVn3n2nm13A2TQ+RWDlPAnHe7Gh0d/KsL5Q==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-underline@3.6.1':
- resolution: {integrity: sha512-I1A2PHyKX9D/FtlP4qBmG7HN81zndFB9Qf+7sZub6L7gS4IiHwtu0bj48uwhAyoZZzxm+bDvdZvGVrZWjhbFCg==}
+ '@tiptap/extension-underline@3.13.0':
+ resolution: {integrity: sha512-VDQi+UYw0tFnfghpthJTFmtJ3yx90kXeDwFvhmT8G+O+si5VmP05xYDBYBmYCix5jqKigJxEASiBL0gYOgMDEg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/extension-youtube@3.6.1':
- resolution: {integrity: sha512-5SQthR8hLhS7u2XoPfba0aYU94OXkyE3KD7p1AsCbbajdeV9UTOvZekRb4Fw2AcbvmXK2dB3NnC/s4oH/giXLw==}
+ '@tiptap/extension-unique-id@3.13.0':
+ resolution: {integrity: sha512-2L5cH3QnEtgUHLVagLVt5SVUFSeoz5KQktGDHPfM64oO8KxM1C9USHF+fd5fGKC6kM8t1RSuBfHxA+ZOZnAzDg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/extensions@3.6.1':
- resolution: {integrity: sha512-2k5h4mhEBZ6sSEPgJSTXi+xB2fYIEQaqq3jLOk3Po9wQsCDLk4+HT6N/5HIjry+q3xoct/WQ9FZ9w9UTTdyLMQ==}
+ '@tiptap/extension-youtube@3.13.0':
+ resolution: {integrity: sha512-KG6NtdpK9VheacN4imjhDJ8G1V2tJZd/LRr+QID8dYEMQe9vKbqIXgA0kO91t+f+iH8NwgNPmi3a/BQogvoqJg==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
- '@tiptap/html@3.6.1':
- resolution: {integrity: sha512-aic1EmKBwePFGy9svBoIPXgk7BD+pea5NzNKgQzXo3madZ0uPXnrazyLSpfQn3dgXwa9dXDB0XTuOp3jGo/SaQ==}
+ '@tiptap/extensions@3.13.0':
+ resolution: {integrity: sha512-i7O0ptSibEtTy+2PIPsNKEvhTvMaFJg1W4Oxfnbuxvaigs7cJV9Q0lwDUcc7CPsNw2T1+44wcxg431CzTvdYoA==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
- happy-dom: ^18.0.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/pm@3.6.1':
- resolution: {integrity: sha512-4F3qKhLQYlHGfayO0dQD3hiX3VeSCkdoKQQ+gIegNhwX5IWboQleVMueo7rcKN8WarTkysbYnILcWgx5OYcKew==}
-
- '@tiptap/react@3.6.1':
- resolution: {integrity: sha512-5J1a1JNxhuMYrrAb2NZfs7AX/Pc6xBvVQJnNJ6vR9QZWlBgSe67iJK/bh8KPB7jxrzbItKQ2Brp3v46QLZXPDw==}
+ '@tiptap/html@3.13.0':
+ resolution: {integrity: sha512-WAwb2FiXkvnCsa7CjLSK3cOihL+M6vu3cP1D+Bfcgy0c4DP78tDRny2z6crDUj6b5CvOejyxj2iqhV48gxiDMA==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
+ happy-dom: ^20.0.2
+
+ '@tiptap/pm@3.13.0':
+ resolution: {integrity: sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==}
+
+ '@tiptap/react@3.13.0':
+ resolution: {integrity: sha512-VqpqNZ9qtPr3pWK4NsZYxXgLSEiAnzl6oS7tEGmkkvJbcGSC+F7R13Xc9twv/zT5QCLxaHdEbmxHbuAIkrMgJQ==}
+ peerDependencies:
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
'@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
- '@tiptap/starter-kit@3.6.1':
- resolution: {integrity: sha512-gmQCHEcZxjnVqTInhNx3z7Vuvz+mmIVcXiCSLd5cA9/8PkHo3ttxijfc3lXe4V2ed6RPBWU/FUHFxcUmxqc5Vg==}
+ '@tiptap/starter-kit@3.13.0':
+ resolution: {integrity: sha512-Ojn6sRub04CRuyQ+9wqN62JUOMv+rG1vXhc2s6DCBCpu28lkCMMW+vTe7kXJcEdbot82+5swPbERw9vohswFzg==}
- '@tiptap/suggestion@3.6.1':
- resolution: {integrity: sha512-C2bDamOCqcWbyB4Ogvk1pCUkbrnIMOsVYyt8sd1JsjZUA/QYTBWt8Bt/3venI1mx6ad47oCsU16KDQRKKfu+cA==}
+ '@tiptap/suggestion@3.13.0':
+ resolution: {integrity: sha512-IXNvyLITpPiuXHn/q1ntztPYJZMFjPAokKj+OQz3MFNYlzAX3I409KD/EwwCubisRIAFiNX0ZjIIXxxZ3AhFTw==}
peerDependencies:
- '@tiptap/core': ^3.6.1
- '@tiptap/pm': ^3.6.1
+ '@tiptap/core': ^3.13.0
+ '@tiptap/pm': ^3.13.0
- '@tiptap/y-tiptap@3.0.0':
- resolution: {integrity: sha512-HIeJZCj+KYJde2x6fONzo4o6kd7gW7eonwhQsv2p2VQnUgwNXMVhN+D6Z3AH/2i541Sq33y1PO4U/1ThCPjqbA==}
+ '@tiptap/y-tiptap@3.0.1':
+ resolution: {integrity: sha512-F3hj5X77ckmyIywbCQpKgyX3xKra2/acJPWaV5R9wqp0cUPBmm62FYbkQ6HaqxH1VhCkUhhAZcDSQjbjj7tnWw==}
engines: {node: '>=16.0.0', npm: '>=8.0.0'}
peerDependencies:
prosemirror-model: ^1.7.1
@@ -4272,8 +4478,8 @@ packages:
y-protocols: ^1.0.1
yjs: ^13.5.38
- '@tokenizer/inflate@0.2.7':
- resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==}
+ '@tokenizer/inflate@0.3.1':
+ resolution: {integrity: sha512-4oeoZEBQdLdt5WmP/hx1KZ6D3/Oid/0cUb2nk4F0pTDAWy+KCH3/EnAkZF/bvckWo8I33EqBm01lIPgmgc8rCA==}
engines: {node: '>=18'}
'@tokenizer/token@0.3.0':
@@ -4444,6 +4650,9 @@ packages:
'@types/estree@1.0.7':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
'@types/express-serve-static-core@4.17.43':
resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
@@ -4504,8 +4713,8 @@ packages:
'@types/linkify-it@5.0.0':
resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
- '@types/luxon@3.6.2':
- resolution: {integrity: sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==}
+ '@types/luxon@3.7.1':
+ resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==}
'@types/markdown-it@14.1.2':
resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
@@ -4531,15 +4740,15 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@20.19.17':
- resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==}
-
- '@types/node@22.10.0':
- resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==}
+ '@types/node@20.19.19':
+ resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==}
'@types/node@22.13.4':
resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==}
+ '@types/node@22.19.1':
+ resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==}
+
'@types/nodemailer@6.4.17':
resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==}
@@ -4591,6 +4800,9 @@ packages:
'@types/react@18.3.12':
resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
+ '@types/retry@0.12.0':
+ resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
+
'@types/send@0.17.4':
resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
@@ -4621,8 +4833,8 @@ packages:
'@types/uuid@10.0.0':
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
- '@types/validator@13.12.0':
- resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==}
+ '@types/validator@13.15.10':
+ resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
@@ -4766,11 +4978,15 @@ packages:
'@ucast/mongo@2.4.3':
resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==}
- '@vitejs/plugin-react@4.4.1':
- resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ '@vercel/oidc@3.0.2':
+ resolution: {integrity: sha512-JekxQ0RApo4gS4un/iMGsIL1/k4KUBe3HmnGcDvzHuFBdQdudEJgTqcsJC7y6Ul4Yw5CeykgvQbX2XeEJd0+DA==}
+ engines: {node: '>= 20'}
+
+ '@vitejs/plugin-react@5.1.1':
+ resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
- vite: ^4.2.0 || ^5.0.0 || ^6.0.0
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
'@webassemblyjs/ast@1.14.1':
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
@@ -4842,17 +5058,10 @@ packages:
resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==}
hasBin: true
- abbrev@1.1.1:
- resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
-
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- abort-controller@3.0.0:
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
- engines: {node: '>=6.5'}
-
abstract-logging@2.0.1:
resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==}
@@ -4888,14 +5097,22 @@ packages:
resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
engines: {node: '>= 10.0.0'}
- agent-base@6.0.2:
- resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
- engines: {node: '>= 6.0.0'}
-
agent-base@7.1.1:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
+ ai-sdk-ollama@0.12.0:
+ resolution: {integrity: sha512-EEKIfIpkyAavrlEKlZ7nZCxTUPq4yBThBLLU3kTD4l7htpdqMjhOEyqm5DlKdQvLEW0MgCMsptw7yXbevRSfIQ==}
+ engines: {node: '>=22'}
+ peerDependencies:
+ ai: ^5.0.60
+
+ ai@5.0.65:
+ resolution: {integrity: sha512-orwsNKAoAmTwHkoy7TG/7nc65SD3hy7k+x8xVHIzfw8CibZm/U2cdbR1ZUex6H2Rpf+uoZpvyQ05FWBJNw7V8A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+
ajv-formats@2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
peerDependencies:
@@ -4977,14 +5194,6 @@ packages:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
- aproba@2.0.0:
- resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
-
- are-we-there-yet@2.0.0:
- resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
- engines: {node: '>=10'}
- deprecated: This package is no longer supported.
-
arg@4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
@@ -5038,6 +5247,9 @@ packages:
async-lock@1.4.1:
resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==}
+ async-mutex@0.5.0:
+ resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==}
+
async@3.2.5:
resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
@@ -5055,8 +5267,8 @@ packages:
avvio@9.1.0:
resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==}
- axios@1.9.0:
- resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
+ axios@1.13.2:
+ resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==}
babel-jest@29.7.0:
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
@@ -5130,9 +5342,9 @@ packages:
resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==}
engines: {node: '>=6.0.0'}
- bcrypt@5.1.1:
- resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==}
- engines: {node: '>= 10.0.0'}
+ bcrypt@6.0.0:
+ resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==}
+ engines: {node: '>= 18'}
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
@@ -5204,8 +5416,8 @@ packages:
builtins@5.0.1:
resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==}
- bullmq@5.53.2:
- resolution: {integrity: sha512-xHgxrP/yNJHD7VCw1h+eRBh+2TCPBCM39uC9gCyksYc6ufcJP+HTZ/A2lzB2x7qMFWrvsX7tM40AT2BmdkYL/Q==}
+ bullmq@5.65.0:
+ resolution: {integrity: sha512-fyOcyf2ad4zrNmE18vdF/ie7DrW0TwhLt5e0DkqDxbRpDNiUdYqgp2QZJW2ntnUN08T2mDMC4deUUhF2UOAmeQ==}
busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
@@ -5218,6 +5430,10 @@ packages:
cache-manager@6.4.3:
resolution: {integrity: sha512-VV5eq/QQ5rIVix7/aICO4JyvSeEv9eIQuKL5iFwgM2BrcYoE0A/D1mNsAHJAsB0WEbNdBlKkn6Tjz6fKzh/cKQ==}
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
@@ -5289,10 +5505,6 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
- chownr@2.0.0:
- resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
- engines: {node: '>=10'}
-
chrome-trace-event@1.0.3:
resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
engines: {node: '>=6.0'}
@@ -5307,8 +5519,8 @@ packages:
class-transformer@0.5.1:
resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==}
- class-validator@0.14.1:
- resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==}
+ class-validator@0.14.3:
+ resolution: {integrity: sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==}
cli-boxes@2.2.1:
resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
@@ -5383,10 +5595,6 @@ packages:
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
- color-support@1.1.3:
- resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
- hasBin: true
-
color@4.2.3:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
@@ -5450,8 +5658,8 @@ packages:
resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==}
engines: {node: ^14.18.0 || >=16.10.0}
- console-control-strings@1.1.0:
- resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+ console-table-printer@2.14.6:
+ resolution: {integrity: sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==}
content-disposition@0.5.4:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
@@ -5525,8 +5733,8 @@ packages:
resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
engines: {node: '>=12.0.0'}
- cron@4.3.0:
- resolution: {integrity: sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==}
+ cron@4.3.3:
+ resolution: {integrity: sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==}
engines: {node: '>=18.x'}
cross-env@7.0.3:
@@ -5832,9 +6040,6 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
- delegates@1.0.0:
- resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
-
denque@2.1.0:
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
engines: {node: '>=0.10'}
@@ -5847,10 +6052,6 @@ packages:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
- detect-libc@2.0.3:
- resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
- engines: {node: '>=8'}
-
detect-libc@2.0.4:
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
engines: {node: '>=8'}
@@ -5945,6 +6146,10 @@ packages:
duck@0.1.12:
resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==}
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
@@ -6028,6 +6233,10 @@ packages:
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
engines: {node: '>= 0.4'}
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
@@ -6043,10 +6252,18 @@ packages:
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'}
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
es-set-tostringtag@2.0.3:
resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
engines: {node: '>= 0.4'}
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
es-shim-unscopables@1.0.2:
resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
@@ -6179,17 +6396,20 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
- event-target-shim@5.0.1:
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
- engines: {node: '>=6'}
-
eventemitter2@6.4.9:
resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==}
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
+ eventsource-parser@3.0.6:
+ resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
+ engines: {node: '>=18.0.0'}
+
execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@@ -6218,6 +6438,10 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ fast-equals@5.3.4:
+ resolution: {integrity: sha512-d+yU9iNQbbC098NOuMlAIth/g+owbpX/uuOkH/DQcC2fMMyjOlX292Op29DrUKq388m4UUyOdWakUH/msGypOg==}
+ engines: {node: '>=6.0.0'}
+
fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'}
@@ -6234,10 +6458,6 @@ packages:
fast-querystring@1.1.2:
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
- fast-redact@3.5.0:
- resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
- engines: {node: '>=6'}
-
fast-safe-stringify@2.1.1:
resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
@@ -6251,8 +6471,8 @@ packages:
fastify-plugin@5.0.1:
resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==}
- fastify@5.3.3:
- resolution: {integrity: sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==}
+ fastify@5.6.2:
+ resolution: {integrity: sha512-dPugdGnsvYkBlENLhCgX8yhyGCsCPrpA8lFWbTNU428l+YOnLgYHR69hzV8HWPC79n536EqzqQtvhtdaCE0dKg==}
fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
@@ -6268,8 +6488,9 @@ packages:
picomatch:
optional: true
- fdir@6.4.5:
- resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
@@ -6293,8 +6514,8 @@ packages:
file-saver@2.0.5:
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
- file-type@21.0.0:
- resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==}
+ file-type@21.1.0:
+ resolution: {integrity: sha512-boU4EHmP3JXkwDo4uhyBhTt5pPstxB6eEXKJBu2yu2l7aAMMm7QQYQEzssJmKReZYrFdFOJS8koVo6bXIBGDqA==}
engines: {node: '>=20'}
filelist@1.0.4:
@@ -6358,6 +6579,10 @@ packages:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
formidable@3.5.1:
resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==}
@@ -6382,10 +6607,6 @@ packages:
resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
engines: {node: '>=14.14'}
- fs-minipass@2.1.0:
- resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
- engines: {node: '>= 8'}
-
fs-monkey@1.0.5:
resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==}
@@ -6411,11 +6632,6 @@ packages:
resolution: {integrity: sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==}
engines: {node: '>= 0.6.0'}
- gauge@3.0.2:
- resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
- engines: {node: '>=10'}
- deprecated: This package is no longer supported.
-
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@@ -6428,6 +6644,10 @@ packages:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
@@ -6436,6 +6656,10 @@ packages:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -6516,8 +6740,8 @@ packages:
hachure-fill@0.5.2:
resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
- happy-dom@18.0.1:
- resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==}
+ happy-dom@20.0.10:
+ resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==}
engines: {node: '>=20.0.0'}
has-bigints@1.0.2:
@@ -6546,13 +6770,14 @@ packages:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
has-tostringtag@1.0.2:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
- has-unicode@2.0.1:
- resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
-
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
@@ -6606,10 +6831,6 @@ packages:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
- https-proxy-agent@5.0.1:
- resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
- engines: {node: '>= 6'}
-
https-proxy-agent@7.0.5:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
@@ -6698,8 +6919,8 @@ packages:
resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
engines: {node: '>=12.22.0'}
- ioredis@5.7.0:
- resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==}
+ ioredis@5.8.2:
+ resolution: {integrity: sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==}
engines: {node: '>=12.22.0'}
ipaddr.js@2.2.0:
@@ -7094,6 +7315,9 @@ packages:
resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
engines: {node: '>=14'}
+ js-tiktoken@1.0.21:
+ resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -7143,6 +7367,9 @@ packages:
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -7160,8 +7387,8 @@ packages:
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
- jsonwebtoken@9.0.2:
- resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ jsonwebtoken@9.0.3:
+ resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==}
engines: {node: '>=12', npm: '>=6'}
jsx-ast-utils@3.3.5:
@@ -7171,11 +7398,11 @@ packages:
jszip@3.10.1:
resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
- jwa@1.4.1:
- resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+ jwa@2.0.1:
+ resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
- jws@3.2.2:
- resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+ jws@4.0.1:
+ resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
jwt-decode@4.0.0:
resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==}
@@ -7255,6 +7482,23 @@ packages:
resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
engines: {node: '>=16.0.0'}
+ langsmith@0.3.61:
+ resolution: {integrity: sha512-b7Cpfj3xpWQO41G3xXeG6uzPzBcWfkEo5cK62WOcTqsKCchN2i42z7q45QQrbU6mdLwXp6pjRfnvr7wFu+Y5iQ==}
+ peerDependencies:
+ '@opentelemetry/api': '*'
+ '@opentelemetry/exporter-trace-otlp-proto': '*'
+ '@opentelemetry/sdk-trace-base': '*'
+ openai: '*'
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@opentelemetry/exporter-trace-otlp-proto':
+ optional: true
+ '@opentelemetry/sdk-trace-base':
+ optional: true
+ openai:
+ optional: true
+
layout-base@1.0.2:
resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
@@ -7286,13 +7530,18 @@ packages:
engines: {node: '>=16'}
hasBin: true
+ lib0@0.2.114:
+ resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+
lib0@0.2.88:
resolution: {integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==}
engines: {node: '>=16'}
hasBin: true
- libphonenumber-js@1.10.58:
- resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==}
+ libphonenumber-js@1.12.29:
+ resolution: {integrity: sha512-P2aLrbeqHbmh8+9P35LXQfXOKc7XJ0ymUKl7tyeyQjdRNfzunXWxQXGc4yl3fUf28fqLRfPY+vIVvFXK7KEBTw==}
lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
@@ -7313,8 +7562,8 @@ packages:
linkifyjs@4.3.2:
resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==}
- load-esm@1.0.2:
- resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==}
+ load-esm@1.0.3:
+ resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
engines: {node: '>=13.2.0'}
loader-runner@4.3.0:
@@ -7413,14 +7662,14 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
- luxon@3.5.0:
- resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
- engines: {node: '>=12'}
-
luxon@3.6.1:
resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==}
engines: {node: '>=12'}
+ luxon@3.7.2:
+ resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==}
+ engines: {node: '>=12'}
+
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
@@ -7428,10 +7677,6 @@ packages:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
- make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
-
make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
@@ -7442,8 +7687,8 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
- mammoth@1.10.0:
- resolution: {integrity: sha512-9HOmqt8uJ5rz7q8XrECU5gRjNftCq4GNG0YIrA6f9iQPCeLgpvgcmRBHi9NQWJQIpT/MAXeg1oKliAK1xoB3eg==}
+ mammoth@1.11.0:
+ resolution: {integrity: sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==}
engines: {node: '>=12.0.0'}
hasBin: true
@@ -7473,6 +7718,10 @@ packages:
engines: {node: '>= 16'}
hasBin: true
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
md-to-react-email@5.0.2:
resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==}
peerDependencies:
@@ -7635,30 +7884,13 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
-
- minipass@5.0.0:
- resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
- engines: {node: '>=8'}
-
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- minizlib@2.1.2:
- resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
- engines: {node: '>= 8'}
-
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
- mkdirp@1.0.4:
- resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
- engines: {node: '>=10'}
- hasBin: true
-
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
@@ -7686,6 +7918,10 @@ packages:
multimath@2.0.0:
resolution: {integrity: sha512-toRx66cAMJ+Ccz7pMIg38xSIrtnbozk0dchXezwQDMgQmbGpfxjtv68H+L00iFL8hxDaVjrmwAFSb3I6bg8Q2g==}
+ mustache@4.2.0:
+ resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
+ hasBin: true
+
mute-stream@2.0.0:
resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -7754,8 +7990,9 @@ packages:
node-abort-controller@3.1.1:
resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
- node-addon-api@5.1.0:
- resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==}
+ node-addon-api@8.5.0:
+ resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==}
+ engines: {node: ^18 || ^20 || >= 21}
node-emoji@1.11.0:
resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
@@ -7773,6 +8010,10 @@ packages:
resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==}
hasBin: true
+ node-gyp-build@4.8.4:
+ resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
+ hasBin: true
+
node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
@@ -7782,18 +8023,13 @@ packages:
node-releases@2.0.18:
resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
- nodemailer@7.0.3:
- resolution: {integrity: sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==}
+ nodemailer@7.0.11:
+ resolution: {integrity: sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==}
engines: {node: '>=6.0.0'}
non-layered-tidy-tree-layout@2.0.2:
resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==}
- nopt@5.0.0:
- resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
- engines: {node: '>=6'}
- hasBin: true
-
nopt@7.2.0:
resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -7814,10 +8050,6 @@ packages:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
- npmlog@5.0.1:
- resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
- deprecated: This package is no longer supported.
-
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
@@ -7882,6 +8114,9 @@ packages:
resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==}
engines: {node: ^10.13.0 || >=12.0.0}
+ ollama@0.6.0:
+ resolution: {integrity: sha512-FHjdU2Ok5x2HZsxPui/MBJZ5J+HzmxoWYa/p9wk736eT+uAhS8nvIICar5YgwlG5MFNjDR6UA5F3RSKq+JseOA==}
+
on-exit-leak-free@2.1.2:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
@@ -7900,6 +8135,18 @@ packages:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
+ openai@6.2.0:
+ resolution: {integrity: sha512-qqjzHls7F5xkXNGy9P1Ei1rorI5LWupUUFWP66zPU8FlZbiITX8SFcHMKNZg/NATJ0LpIZcMUFxSwQmdeQPwSw==}
+ hasBin: true
+ peerDependencies:
+ ws: ^8.18.0
+ zod: ^3.25 || ^4.0
+ peerDependenciesMeta:
+ ws:
+ optional: true
+ zod:
+ optional: true
+
openid-client@5.7.1:
resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==}
@@ -7931,6 +8178,10 @@ packages:
otpauth@9.4.0:
resolution: {integrity: sha512-fHIfzIG5RqCkK9cmV8WU+dPQr9/ebR5QOwGZn2JAr1RQF+lmAuLL2YdtdqvmBjNmgJlYk3KZ4a0XokaEhg1Jsw==}
+ p-finally@1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+
p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
@@ -7951,6 +8202,18 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
+ p-queue@6.6.2:
+ resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
+ engines: {node: '>=8'}
+
+ p-retry@4.6.2:
+ resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
+ engines: {node: '>=8'}
+
+ p-timeout@3.2.0:
+ resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
+ engines: {node: '>=8'}
+
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
@@ -8039,9 +8302,8 @@ packages:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22}
- path-to-regexp@8.2.0:
- resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
- engines: {node: '>=16'}
+ path-to-regexp@8.3.0:
+ resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
@@ -8053,28 +8315,24 @@ packages:
pause@0.0.1:
resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==}
- pdfjs-dist@5.4.54:
- resolution: {integrity: sha512-TBAiTfQw89gU/Z4LW98Vahzd2/LoCFprVGvGbTgFt+QCB1F+woyOPmNNVgLa6djX9Z9GGTnj7qE1UzpOVJiINw==}
+ pdfjs-dist@5.4.394:
+ resolution: {integrity: sha512-9ariAYGqUJzx+V/1W4jHyiyCep6IZALmDzoaTLZ6VNu8q9LWi1/ukhzHgE2Xsx96AZi0mbZuK4/ttIbqSbLypg==}
engines: {node: '>=20.16.0 || >=22.3.0'}
peberminta@0.9.0:
resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
- peek-readable@7.0.0:
- resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==}
- engines: {node: '>=18'}
-
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
perfect-freehand@1.2.0:
resolution: {integrity: sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==}
- pg-cloudflare@1.2.5:
- resolution: {integrity: sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==}
+ pg-cloudflare@1.2.7:
+ resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==}
- pg-connection-string@2.9.0:
- resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==}
+ pg-connection-string@2.9.1:
+ resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==}
pg-int8@1.0.1:
resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
@@ -8084,13 +8342,13 @@ packages:
resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==}
engines: {node: '>=4'}
- pg-pool@3.10.0:
- resolution: {integrity: sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==}
+ pg-pool@3.10.1:
+ resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==}
peerDependencies:
pg: '>=8.0'
- pg-protocol@1.10.0:
- resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==}
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
pg-protocol@1.7.0:
resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==}
@@ -8107,9 +8365,9 @@ packages:
resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==}
engines: {node: '>=10'}
- pg@8.16.0:
- resolution: {integrity: sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==}
- engines: {node: '>= 8.0.0'}
+ pg@8.16.3:
+ resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==}
+ engines: {node: '>= 16.0.0'}
peerDependencies:
pg-native: '>=3.0.1'
peerDependenciesMeta:
@@ -8119,6 +8377,10 @@ packages:
pgpass@1.0.5:
resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+ pgvector@0.2.1:
+ resolution: {integrity: sha512-nKaQY9wtuiidwLMdVIce1O3kL0d+FxrigCVzsShnoqzOSaWWWOvuctb/sYwlai5cTwwzRSNa+a/NtN2kVZGNJw==}
+ engines: {node: '>= 18'}
+
pica@7.1.1:
resolution: {integrity: sha512-WY73tMvNzXWEld2LicT9Y260L43isrZ85tPuqRyvtkljSDLmnNFQmZICt4xUJMVulmcc6L9O7jbBrtx3DOz/YQ==}
@@ -8139,18 +8401,22 @@ packages:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
- pino-abstract-transport@1.2.0:
- resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==}
+ pino-abstract-transport@2.0.0:
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
pino-std-serializers@7.0.0:
resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==}
- pino@9.1.0:
- resolution: {integrity: sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==}
+ pino@10.1.0:
+ resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==}
hasBin: true
pirates@4.0.6:
@@ -8238,8 +8504,8 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.3:
- resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
postgres-array@2.0.0:
@@ -8323,19 +8589,12 @@ packages:
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
- process-warning@3.0.0:
- resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==}
-
process-warning@4.0.0:
resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==}
process-warning@5.0.0:
resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
- process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
-
prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
@@ -8535,8 +8794,8 @@ packages:
react-promise-suspense@0.3.4:
resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==}
- react-refresh@0.17.0:
- resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
+ react-refresh@0.18.0:
+ resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
engines: {node: '>=0.10.0'}
react-remove-scroll-bar@2.3.8:
@@ -8616,10 +8875,6 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
- readable-stream@4.5.2:
- resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -8736,6 +8991,10 @@ packages:
resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==}
engines: {node: '>=10'}
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -8751,8 +9010,8 @@ packages:
robust-predicates@3.0.2:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
- rollup@4.40.0:
- resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==}
+ rollup@4.53.3:
+ resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -8923,6 +9182,9 @@ packages:
simple-swizzle@0.2.4:
resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+ simple-wcswidth@1.1.2:
+ resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -9071,8 +9333,8 @@ packages:
strnum@1.0.5:
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
- strtok3@10.2.2:
- resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==}
+ strtok3@10.3.4:
+ resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==}
engines: {node: '>=18'}
styled-jsx@5.1.1:
@@ -9103,10 +9365,12 @@ packages:
superagent@9.0.2:
resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==}
engines: {node: '>=14.18.0'}
+ deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net
supertest@7.0.0:
resolution: {integrity: sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==}
engines: {node: '>=14.18.0'}
+ deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net
supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
@@ -9142,10 +9406,6 @@ packages:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
- tar@6.2.1:
- resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
- engines: {node: '>=10'}
-
terser-webpack-plugin@5.3.11:
resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==}
engines: {node: '>= 10.13.0'}
@@ -9181,8 +9441,8 @@ packages:
resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
engines: {node: '>=12.0.0'}
- tinyglobby@0.2.14:
- resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
tippy.js@6.3.7:
@@ -9417,6 +9677,12 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ typesense@2.1.0:
+ resolution: {integrity: sha512-a/IRTL+dRXlpRDU4UodyGj8hl5xBz3nKihVRd/KfSFAfFPGcpdX6lxIgwdXy3O6VLNNiEsN8YwIsPHQPVT0vNw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@babel/runtime': ^7.23.2
+
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
@@ -9534,8 +9800,8 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
- use-sync-external-store@1.5.0:
- resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -9549,6 +9815,10 @@ packages:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
+ uuid@10.0.0:
+ resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
+ hasBin: true
+
uuid@11.1.0:
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
@@ -9573,27 +9843,27 @@ packages:
resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- validator@13.12.0:
- resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
+ validator@13.15.23:
+ resolution: {integrity: sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==}
engines: {node: '>= 0.10'}
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vite@6.3.5:
- resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ vite@7.2.4:
+ resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@types/node': ^20.19.0 || >=22.12.0
jiti: '>=1.21.0'
- less: '*'
+ less: ^4.0.0
lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
@@ -9700,6 +9970,9 @@ packages:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
+ whatwg-fetch@3.6.20:
+ resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
whatwg-mimetype@3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
@@ -9743,9 +10016,6 @@ packages:
engines: {node: '>= 8'}
hasBin: true
- wide-align@1.1.5:
- resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
-
widest-line@3.1.0:
resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
engines: {node: '>=8'}
@@ -9793,8 +10063,8 @@ packages:
utf-8-validate:
optional: true
- ws@8.18.2:
- resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -9861,8 +10131,8 @@ packages:
peerDependencies:
yjs: ^13.0.0
- y-prosemirror@1.2.3:
- resolution: {integrity: sha512-0e9QB78hcAT3l+ml26x+f7K9xmP1tqHGzbKTfe+JuPpKFBLpr2NUwH7D+J7uKhtMAmOhHUMFtd7Zd2mNKyP2+A==}
+ y-prosemirror@1.3.7:
+ resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==}
engines: {node: '>=16.0.0', npm: '>=8.0.0'}
peerDependencies:
prosemirror-model: ^1.7.1
@@ -9939,8 +10209,13 @@ packages:
resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
engines: {node: '>=18'}
- zod@3.25.56:
- resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==}
+ zod-to-json-schema@3.24.6:
+ resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==}
+ peerDependencies:
+ zod: ^3.24.1
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zustand@4.5.6:
resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==}
@@ -9963,6 +10238,43 @@ snapshots:
'@adobe/css-tools@4.3.3': {}
+ '@ai-sdk/azure@2.0.47(zod@3.25.76)':
+ dependencies:
+ '@ai-sdk/openai': 2.0.46(zod@3.25.76)
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ zod: 3.25.76
+
+ '@ai-sdk/gateway@1.0.36(zod@3.25.76)':
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ '@vercel/oidc': 3.0.2
+ zod: 3.25.76
+
+ '@ai-sdk/google@2.0.18(zod@3.25.76)':
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ zod: 3.25.76
+
+ '@ai-sdk/openai@2.0.46(zod@3.25.76)':
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ zod: 3.25.76
+
+ '@ai-sdk/provider-utils@3.0.11(zod@3.25.76)':
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@standard-schema/spec': 1.0.0
+ eventsource-parser: 3.0.6
+ zod: 3.25.76
+
+ '@ai-sdk/provider@2.0.0':
+ dependencies:
+ json-schema: 0.4.0
+
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -10568,10 +10880,18 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.0.1
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
'@babel/compat-data@7.26.2': {}
'@babel/compat-data@7.26.8': {}
+ '@babel/compat-data@7.28.5': {}
+
'@babel/core@7.24.5':
dependencies:
'@ampproject/remapping': 2.3.0
@@ -10645,7 +10965,27 @@ snapshots:
'@babel/traverse': 7.27.0
'@babel/types': 7.27.0
convert-source-map: 2.0.0
- debug: 4.4.0
+ debug: 4.4.1
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.1
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -10682,6 +11022,14 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.0.2
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.0.2
+
'@babel/helper-annotate-as-pure@7.22.5':
dependencies:
'@babel/types': 7.26.0
@@ -10706,6 +11054,14 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.24.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
'@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -10746,6 +11102,8 @@ snapshots:
'@babel/template': 7.24.6
'@babel/types': 7.24.6
+ '@babel/helper-globals@7.28.0': {}
+
'@babel/helper-hoist-variables@7.24.6':
dependencies:
'@babel/types': 7.24.6
@@ -10769,6 +11127,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-transforms@7.23.3(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -10814,6 +11179,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-optimise-call-expression@7.22.5':
dependencies:
'@babel/types': 7.26.0
@@ -10822,6 +11196,8 @@ snapshots:
'@babel/helper-plugin-utils@7.25.9': {}
+ '@babel/helper-plugin-utils@7.27.1': {}
+
'@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -10864,14 +11240,20 @@ snapshots:
'@babel/helper-string-parser@7.25.9': {}
+ '@babel/helper-string-parser@7.27.1': {}
+
'@babel/helper-validator-identifier@7.22.20': {}
'@babel/helper-validator-identifier@7.24.6': {}
'@babel/helper-validator-identifier@7.25.9': {}
+ '@babel/helper-validator-identifier@7.28.5': {}
+
'@babel/helper-validator-option@7.25.9': {}
+ '@babel/helper-validator-option@7.27.1': {}
+
'@babel/helper-wrap-function@7.22.20':
dependencies:
'@babel/helper-function-name': 7.24.6
@@ -10893,6 +11275,11 @@ snapshots:
'@babel/template': 7.27.0
'@babel/types': 7.27.0
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+
'@babel/highlight@7.24.2':
dependencies:
'@babel/helper-validator-identifier': 7.22.20
@@ -10912,6 +11299,10 @@ snapshots:
dependencies:
'@babel/types': 7.27.0
+ '@babel/parser@7.28.5':
+ dependencies:
+ '@babel/types': 7.28.5
+
'@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -11429,15 +11820,15 @@ snapshots:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)':
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.26.10
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)':
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.26.10
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.26.0)':
dependencies:
@@ -11649,6 +12040,12 @@ snapshots:
'@babel/parser': 7.27.0
'@babel/types': 7.27.0
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
'@babel/traverse@7.25.9':
dependencies:
'@babel/code-frame': 7.26.2
@@ -11668,11 +12065,23 @@ snapshots:
'@babel/parser': 7.27.0
'@babel/template': 7.27.0
'@babel/types': 7.27.0
- debug: 4.4.0
+ debug: 4.4.1
globals: 11.12.0
transitivePeerDependencies:
- supports-color
+ '@babel/traverse@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.1
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/types@7.23.6':
dependencies:
'@babel/helper-string-parser': 7.23.4
@@ -11701,6 +12110,11 @@ snapshots:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+ '@babel/types@7.28.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
'@bcoe/v8-coverage@0.2.3': {}
'@braintree/sanitize-url@6.0.2': {}
@@ -11720,6 +12134,8 @@ snapshots:
'@casl/ability': 6.7.2
react: 18.3.1
+ '@cfworker/json-schema@4.1.1': {}
+
'@chevrotain/cst-dts-gen@11.0.3':
dependencies:
'@chevrotain/gast': 11.0.3
@@ -12064,7 +12480,7 @@ snapshots:
cookie: 1.0.2
fastify-plugin: 5.0.1
- '@fastify/cors@11.0.1':
+ '@fastify/cors@11.1.0':
dependencies:
fastify-plugin: 5.0.1
toad-cache: 3.7.0
@@ -12092,7 +12508,7 @@ snapshots:
dependencies:
'@fastify/error': 4.0.0
fastify-plugin: 5.0.1
- path-to-regexp: 8.2.0
+ path-to-regexp: 8.3.0
reusify: 1.0.4
'@fastify/multipart@9.0.3':
@@ -12161,18 +12577,17 @@ snapshots:
'@floating-ui/utils@0.2.8': {}
- '@hocuspocus/common@3.2.3':
+ '@hocuspocus/common@3.4.1':
dependencies:
- lib0: 0.2.108
+ lib0: 0.2.114
- '@hocuspocus/extension-redis@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
+ '@hocuspocus/extension-redis@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- '@hocuspocus/server': 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
- '@sesamecare-oss/redlock': 1.4.0(ioredis@5.7.0)
- ioredis: 5.7.0
+ '@hocuspocus/server': 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ '@sesamecare-oss/redlock': 1.4.0(ioredis@5.8.2)
+ ioredis: 5.8.2
kleur: 4.1.5
lodash.debounce: 4.0.8
- uuid: 11.1.0
y-protocols: 1.0.6(yjs@13.6.27)
yjs: 13.6.27
transitivePeerDependencies:
@@ -12180,38 +12595,38 @@ snapshots:
- supports-color
- utf-8-validate
- '@hocuspocus/provider@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
+ '@hocuspocus/provider@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- '@hocuspocus/common': 3.2.3
+ '@hocuspocus/common': 3.4.1
'@lifeomic/attempt': 3.0.3
- lib0: 0.2.108
- ws: 8.18.2
+ lib0: 0.2.114
+ ws: 8.18.3
y-protocols: 1.0.6(yjs@13.6.27)
yjs: 13.6.27
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- '@hocuspocus/server@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
+ '@hocuspocus/server@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- '@hocuspocus/common': 3.2.3
+ '@hocuspocus/common': 3.4.1
async-lock: 1.4.1
+ async-mutex: 0.5.0
kleur: 4.1.5
- lib0: 0.2.108
- uuid: 11.1.0
- ws: 8.18.2
+ lib0: 0.2.114
+ ws: 8.18.3
y-protocols: 1.0.6(yjs@13.6.27)
yjs: 13.6.27
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- '@hocuspocus/transformer@3.2.3(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)':
+ '@hocuspocus/transformer@3.4.1(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
- '@tiptap/starter-kit': 3.6.1
- y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
+ '@tiptap/starter-kit': 3.13.0
+ y-prosemirror: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
yjs: 13.6.27
'@humanfs/core@0.19.1': {}
@@ -12460,7 +12875,7 @@ snapshots:
'@ioredis/commands@1.2.0': {}
- '@ioredis/commands@1.3.1': {}
+ '@ioredis/commands@1.4.0': {}
'@isaacs/cliui@8.0.2':
dependencies:
@@ -12484,7 +12899,7 @@ snapshots:
'@jest/console@29.7.0':
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
@@ -12497,14 +12912,14 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@22.13.4)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3))
+ jest-config: 29.7.0(@types/node@22.19.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3))
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -12529,7 +12944,7 @@ snapshots:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
jest-mock: 29.7.0
'@jest/expect-utils@29.7.0':
@@ -12547,7 +12962,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -12569,7 +12984,7 @@ snapshots:
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -12639,7 +13054,7 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/yargs': 17.0.32
chalk: 4.1.2
@@ -12656,12 +13071,22 @@ snapshots:
- supports-color
- utf-8-validate
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.4.15
'@jridgewell/trace-mapping': 0.3.25
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
'@jridgewell/resolve-uri@3.1.1': {}
'@jridgewell/resolve-uri@3.1.2': {}
@@ -12682,6 +13107,11 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
'@jridgewell/trace-mapping@0.3.9':
dependencies:
'@jridgewell/resolve-uri': 3.1.1
@@ -12691,6 +13121,31 @@ snapshots:
dependencies:
buffer: 6.0.3
+ '@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76))':
+ dependencies:
+ '@cfworker/json-schema': 4.1.1
+ ansi-styles: 5.2.0
+ camelcase: 6.3.0
+ decamelize: 1.2.0
+ js-tiktoken: 1.0.21
+ langsmith: 0.3.61(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76))
+ mustache: 4.2.0
+ p-queue: 6.6.2
+ p-retry: 4.6.2
+ uuid: 10.0.0
+ zod: 3.25.76
+ zod-to-json-schema: 3.24.6(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@opentelemetry/api'
+ - '@opentelemetry/exporter-trace-otlp-proto'
+ - '@opentelemetry/sdk-trace-base'
+ - openai
+
+ '@langchain/textsplitters@0.1.0(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76)))':
+ dependencies:
+ '@langchain/core': 0.3.72(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76))
+ js-tiktoken: 1.0.21
+
'@lifeomic/attempt@3.0.3': {}
'@lukeed/csprng@1.1.0': {}
@@ -12711,6 +13166,15 @@ snapshots:
transitivePeerDependencies:
- '@types/react'
+ '@mantine/dates@8.3.2(@mantine/core@8.1.3(@mantine/hooks@8.1.3(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@8.1.3(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@mantine/core': 8.1.3(@mantine/hooks@8.1.3(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mantine/hooks': 8.1.3(react@18.3.1)
+ clsx: 2.1.1
+ dayjs: 1.11.13
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
'@mantine/form@8.1.3(react@18.3.1)':
dependencies:
fast-deep-equal: 3.1.3
@@ -12749,21 +13213,6 @@ snapshots:
dependencies:
react: 18.3.1
- '@mapbox/node-pre-gyp@1.0.11':
- dependencies:
- detect-libc: 2.0.3
- https-proxy-agent: 5.0.1
- make-dir: 3.1.0
- node-fetch: 2.7.0
- nopt: 5.0.0
- npmlog: 5.0.1
- rimraf: 3.0.2
- semver: 7.7.2
- tar: 6.2.1
- transitivePeerDependencies:
- - encoding
- - supports-color
-
'@mermaid-js/parser@0.6.2':
dependencies:
langium: 3.3.1
@@ -12786,48 +13235,48 @@ snapshots:
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2':
optional: true
- '@napi-rs/canvas-android-arm64@0.1.77':
+ '@napi-rs/canvas-android-arm64@0.1.82':
optional: true
- '@napi-rs/canvas-darwin-arm64@0.1.77':
+ '@napi-rs/canvas-darwin-arm64@0.1.82':
optional: true
- '@napi-rs/canvas-darwin-x64@0.1.77':
+ '@napi-rs/canvas-darwin-x64@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.77':
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm64-gnu@0.1.77':
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm64-musl@0.1.77':
+ '@napi-rs/canvas-linux-arm64-musl@0.1.82':
optional: true
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.77':
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-x64-gnu@0.1.77':
+ '@napi-rs/canvas-linux-x64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-x64-musl@0.1.77':
+ '@napi-rs/canvas-linux-x64-musl@0.1.82':
optional: true
- '@napi-rs/canvas-win32-x64-msvc@0.1.77':
+ '@napi-rs/canvas-win32-x64-msvc@0.1.82':
optional: true
- '@napi-rs/canvas@0.1.77':
+ '@napi-rs/canvas@0.1.82':
optionalDependencies:
- '@napi-rs/canvas-android-arm64': 0.1.77
- '@napi-rs/canvas-darwin-arm64': 0.1.77
- '@napi-rs/canvas-darwin-x64': 0.1.77
- '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.77
- '@napi-rs/canvas-linux-arm64-gnu': 0.1.77
- '@napi-rs/canvas-linux-arm64-musl': 0.1.77
- '@napi-rs/canvas-linux-riscv64-gnu': 0.1.77
- '@napi-rs/canvas-linux-x64-gnu': 0.1.77
- '@napi-rs/canvas-linux-x64-musl': 0.1.77
- '@napi-rs/canvas-win32-x64-msvc': 0.1.77
+ '@napi-rs/canvas-android-arm64': 0.1.82
+ '@napi-rs/canvas-darwin-arm64': 0.1.82
+ '@napi-rs/canvas-darwin-x64': 0.1.82
+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.82
+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-arm64-musl': 0.1.82
+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-x64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-x64-musl': 0.1.82
+ '@napi-rs/canvas-win32-x64-msvc': 0.1.82
optional: true
'@napi-rs/wasm-runtime@0.2.4':
@@ -12836,18 +13285,25 @@ snapshots:
'@emnapi/runtime': 1.2.0
'@tybys/wasm-util': 0.9.0
- '@nestjs/bull-shared@11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)':
+ '@nestjs-labs/nestjs-ioredis@11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(ioredis@5.4.1)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ ioredis: 5.4.1
tslib: 2.8.1
- '@nestjs/bullmq@11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(bullmq@5.53.2)':
+ '@nestjs/bull-shared@11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
- '@nestjs/bull-shared': 11.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- bullmq: 5.53.2
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ tslib: 2.8.1
+
+ '@nestjs/bullmq@11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(bullmq@5.65.0)':
+ dependencies:
+ '@nestjs/bull-shared': 11.0.4(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ bullmq: 5.65.0
tslib: 2.8.1
'@nestjs/cli@11.0.4(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)':
@@ -12879,87 +13335,87 @@ snapshots:
- uglify-js
- webpack-cli
- '@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ '@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
- file-type: 21.0.0
+ file-type: 21.1.0
iterare: 1.2.1
- load-esm: 1.0.2
+ load-esm: 1.0.3
reflect-metadata: 0.2.2
rxjs: 7.8.2
tslib: 2.8.1
uid: 2.0.2
optionalDependencies:
class-transformer: 0.5.1
- class-validator: 0.14.1
+ class-validator: 0.14.3
transitivePeerDependencies:
- supports-color
- '@nestjs/config@4.0.2(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)':
+ '@nestjs/config@4.0.2(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
dotenv: 16.4.7
dotenv-expand: 12.0.1
lodash: 4.17.21
rxjs: 7.8.2
- '@nestjs/core@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ '@nestjs/core@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nuxt/opencollective': 0.4.1
fast-safe-stringify: 2.1.1
iterare: 1.2.1
- path-to-regexp: 8.2.0
+ path-to-regexp: 8.3.0
reflect-metadata: 0.2.2
rxjs: 7.8.2
tslib: 2.8.1
uid: 2.0.2
optionalDependencies:
- '@nestjs/websockets': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/websockets': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-socket.io@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/event-emitter@3.0.1(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)':
+ '@nestjs/event-emitter@3.0.1(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
eventemitter2: 6.4.9
- '@nestjs/jwt@11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))':
+ '@nestjs/jwt@11.0.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@types/jsonwebtoken': 9.0.7
- jsonwebtoken: 9.0.2
+ jsonwebtoken: 9.0.3
- '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)':
+ '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
reflect-metadata: 0.2.2
optionalDependencies:
class-transformer: 0.5.1
- class-validator: 0.14.1
+ class-validator: 0.14.3
- '@nestjs/passport@11.0.5(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)':
+ '@nestjs/passport@11.0.5(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
passport: 0.7.0
- '@nestjs/platform-fastify@11.1.3(@fastify/static@8.2.0)(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)':
+ '@nestjs/platform-fastify@11.1.9(@fastify/static@8.2.0)(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
- '@fastify/cors': 11.0.1
+ '@fastify/cors': 11.1.0
'@fastify/formbody': 8.0.2
'@fastify/middie': 9.0.3
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
fast-querystring: 1.1.2
- fastify: 5.3.3
+ fastify: 5.6.2
light-my-request: 6.6.0
- path-to-regexp: 8.2.0
+ path-to-regexp: 8.3.0
tslib: 2.8.1
optionalDependencies:
'@fastify/static': 8.2.0
- '@nestjs/platform-socket.io@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2)':
+ '@nestjs/platform-socket.io@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(rxjs@7.8.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/websockets': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/websockets': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-socket.io@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
rxjs: 7.8.2
socket.io: 4.8.1
tslib: 2.8.1
@@ -12968,11 +13424,11 @@ snapshots:
- supports-color
- utf-8-validate
- '@nestjs/schedule@6.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)':
+ '@nestjs/schedule@6.0.1(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- cron: 4.3.0
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ cron: 4.3.3
'@nestjs/schematics@11.0.1(chokidar@4.0.3)(typescript@5.7.3)':
dependencies:
@@ -12985,32 +13441,32 @@ snapshots:
transitivePeerDependencies:
- chokidar
- '@nestjs/terminus@11.0.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ '@nestjs/terminus@11.0.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
boxen: 5.1.2
check-disk-space: 3.4.0
reflect-metadata: 0.2.2
rxjs: 7.8.2
- '@nestjs/testing@11.0.10(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)':
+ '@nestjs/testing@11.0.10(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
tslib: 2.8.1
- '@nestjs/websockets@11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(@nestjs/platform-socket.io@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ '@nestjs/websockets@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-socket.io@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
iterare: 1.2.1
object-hash: 3.0.0
reflect-metadata: 0.2.2
rxjs: 7.8.2
tslib: 2.8.1
optionalDependencies:
- '@nestjs/platform-socket.io': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(rxjs@7.8.2)
+ '@nestjs/platform-socket.io': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(rxjs@7.8.2)
'@next/env@14.2.10': {}
@@ -13099,7 +13555,7 @@ snapshots:
tslib: 2.8.1
yargs-parser: 21.1.1
- '@nx/js@20.4.5(@babel/traverse@7.27.0)(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(nx@20.4.5(@swc/core@1.5.25(@swc/helpers@0.5.5)))(typescript@5.7.3)':
+ '@nx/js@20.4.5(@babel/traverse@7.28.5)(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.19.1)(nx@20.4.5(@swc/core@1.5.25(@swc/helpers@0.5.5)))(typescript@5.7.3)':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.26.0)
@@ -13113,7 +13569,7 @@ snapshots:
'@zkochan/js-yaml': 0.0.7
babel-plugin-const-enum: 1.2.0(@babel/core@7.26.0)
babel-plugin-macros: 3.1.0
- babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.0)(@babel/traverse@7.27.0)
+ babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.0)(@babel/traverse@7.28.5)
chalk: 4.1.2
columnify: 1.6.0
detect-port: 1.5.1
@@ -13128,7 +13584,7 @@ snapshots:
semver: 7.7.2
source-map-support: 0.5.19
tinyglobby: 0.2.12
- ts-node: 10.9.1(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3)
+ ts-node: 10.9.1(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.19.1)(typescript@5.7.3)
tsconfig-paths: 4.2.0
tslib: 2.8.0
transitivePeerDependencies:
@@ -13187,8 +13643,9 @@ snapshots:
'@one-ini/wasm@0.1.1': {}
- '@opentelemetry/api@1.9.0':
- optional: true
+ '@opentelemetry/api@1.9.0': {}
+
+ '@pinojs/redact@0.4.0': {}
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -13545,64 +14002,72 @@ snapshots:
'@remirror/core-constants@3.0.0': {}
- '@rollup/rollup-android-arm-eabi@4.40.0':
+ '@rolldown/pluginutils@1.0.0-beta.47': {}
+
+ '@rollup/rollup-android-arm-eabi@4.53.3':
optional: true
- '@rollup/rollup-android-arm64@4.40.0':
+ '@rollup/rollup-android-arm64@4.53.3':
optional: true
- '@rollup/rollup-darwin-arm64@4.40.0':
+ '@rollup/rollup-darwin-arm64@4.53.3':
optional: true
- '@rollup/rollup-darwin-x64@4.40.0':
+ '@rollup/rollup-darwin-x64@4.53.3':
optional: true
- '@rollup/rollup-freebsd-arm64@4.40.0':
+ '@rollup/rollup-freebsd-arm64@4.53.3':
optional: true
- '@rollup/rollup-freebsd-x64@4.40.0':
+ '@rollup/rollup-freebsd-x64@4.53.3':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.40.0':
+ '@rollup/rollup-linux-arm-musleabihf@4.53.3':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.40.0':
+ '@rollup/rollup-linux-arm64-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.40.0':
+ '@rollup/rollup-linux-arm64-musl@4.53.3':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
+ '@rollup/rollup-linux-loong64-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
+ '@rollup/rollup-linux-ppc64-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.40.0':
+ '@rollup/rollup-linux-riscv64-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.40.0':
+ '@rollup/rollup-linux-riscv64-musl@4.53.3':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.40.0':
+ '@rollup/rollup-linux-s390x-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.40.0':
+ '@rollup/rollup-linux-x64-gnu@4.53.3':
optional: true
- '@rollup/rollup-linux-x64-musl@4.40.0':
+ '@rollup/rollup-linux-x64-musl@4.53.3':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.40.0':
+ '@rollup/rollup-openharmony-arm64@4.53.3':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.40.0':
+ '@rollup/rollup-win32-arm64-msvc@4.53.3':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.40.0':
+ '@rollup/rollup-win32-ia32-msvc@4.53.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.53.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.53.3':
optional: true
'@selderee/plugin-htmlparser2@0.11.0':
@@ -13610,9 +14075,9 @@ snapshots:
domhandler: 5.0.3
selderee: 0.11.0
- '@sesamecare-oss/redlock@1.4.0(ioredis@5.7.0)':
+ '@sesamecare-oss/redlock@1.4.0(ioredis@5.8.2)':
dependencies:
- ioredis: 5.7.0
+ ioredis: 5.8.2
'@sinclair/typebox@0.27.8': {}
@@ -13980,6 +14445,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@standard-schema/spec@1.0.0': {}
+
'@swc/core-darwin-arm64@1.5.25':
optional: true
@@ -14062,194 +14529,200 @@ snapshots:
'@tanstack/query-core': 5.80.6
react: 18.3.1
- '@tiptap/core@3.6.1(@tiptap/pm@3.6.1)':
+ '@tiptap/core@3.13.0(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/pm': 3.6.1
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-blockquote@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-blockquote@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-bold@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-bold@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-bubble-menu@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-bubble-menu@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
'@floating-ui/dom': 1.7.3
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
optional: true
- '@tiptap/extension-bullet-list@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-bullet-list@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-code-block@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-code-block@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-code@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-code@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-collaboration-caret@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))':
+ '@tiptap/extension-collaboration-caret@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
- '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
+ '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
- '@tiptap/extension-collaboration@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)':
+ '@tiptap/extension-collaboration@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
- '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
+ '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)
yjs: 13.6.27
- '@tiptap/extension-color@3.6.1(@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)))':
+ '@tiptap/extension-color@3.13.0(@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)))':
dependencies:
- '@tiptap/extension-text-style': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
+ '@tiptap/extension-text-style': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
- '@tiptap/extension-document@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-document@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-dropcursor@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-dropcursor@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-floating-menu@3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-floating-menu@3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
'@floating-ui/dom': 1.7.3
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
optional: true
- '@tiptap/extension-gapcursor@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-gapcursor@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-hard-break@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-hard-break@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-heading@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-heading@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-highlight@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-highlight@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-history@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-history@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-horizontal-rule@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-horizontal-rule@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-image@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-image@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-italic@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-italic@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-link@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-link@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
linkifyjs: 4.3.2
- '@tiptap/extension-list-item@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-list-item@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-list-keymap@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-list-keymap@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-ordered-list@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-ordered-list@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-paragraph@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-paragraph@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-placeholder@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-placeholder@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
- '@tiptap/extension-strike@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-strike@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-subscript@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-subscript@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-superscript@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-superscript@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-table@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-table@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/extension-text-align@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-text-align@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-text@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-text@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-typography@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-typography@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-underline@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-underline@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/extension-youtube@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))':
+ '@tiptap/extension-unique-id@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
+ uuid: 10.0.0
- '@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/extension-youtube@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
- '@tiptap/html@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@18.0.1)':
+ '@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
- happy-dom: 18.0.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/pm@3.6.1':
+ '@tiptap/html@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(happy-dom@20.0.10)':
+ dependencies:
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
+ happy-dom: 20.0.10
+
+ '@tiptap/pm@3.13.0':
dependencies:
prosemirror-changeset: 2.3.1
prosemirror-collab: 1.3.1
@@ -14270,67 +14743,67 @@ snapshots:
prosemirror-transform: 1.10.4
prosemirror-view: 1.40.0
- '@tiptap/react@3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@tiptap/react@3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
'@types/use-sync-external-store': 0.0.6
- fast-deep-equal: 3.1.3
+ fast-equals: 5.3.4
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- use-sync-external-store: 1.5.0(react@18.3.1)
+ use-sync-external-store: 1.6.0(react@18.3.1)
optionalDependencies:
- '@tiptap/extension-bubble-menu': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/extension-floating-menu': 3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
+ '@tiptap/extension-bubble-menu': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/extension-floating-menu': 3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
transitivePeerDependencies:
- '@floating-ui/dom'
- '@tiptap/starter-kit@3.6.1':
+ '@tiptap/starter-kit@3.13.0':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/extension-blockquote': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-bold': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-bullet-list': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-code': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-code-block': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/extension-document': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-dropcursor': 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-gapcursor': 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-hard-break': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-heading': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-horizontal-rule': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/extension-italic': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-link': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/extension-list-item': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-list-keymap': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-ordered-list': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))
- '@tiptap/extension-paragraph': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-strike': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-text': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extension-underline': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))
- '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/extension-blockquote': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-bold': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-bullet-list': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-code': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-code-block': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/extension-document': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-dropcursor': 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-gapcursor': 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-hard-break': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-heading': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-horizontal-rule': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/extension-italic': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-link': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/extension-list-item': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-list-keymap': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-ordered-list': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))
+ '@tiptap/extension-paragraph': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-strike': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-text': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extension-underline': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))
+ '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/suggestion@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)':
+ '@tiptap/suggestion@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)':
dependencies:
- '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1)
- '@tiptap/pm': 3.6.1
+ '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0)
+ '@tiptap/pm': 3.13.0
- '@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
+ '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)':
dependencies:
- lib0: 0.2.108
+ lib0: 0.2.114
prosemirror-model: 1.25.1
prosemirror-state: 1.4.3
prosemirror-view: 1.40.0
y-protocols: 1.0.6(yjs@13.6.27)
yjs: 13.6.27
- '@tokenizer/inflate@0.2.7':
+ '@tokenizer/inflate@0.3.1':
dependencies:
- debug: 4.4.0
+ debug: 4.4.1
fflate: 0.8.2
token-types: 6.0.0
transitivePeerDependencies:
@@ -14352,43 +14825,43 @@ snapshots:
'@types/asn1@0.2.4':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.26.2
- '@babel/types': 7.26.0
+ '@babel/parser': 7.27.0
+ '@babel/types': 7.27.0
'@types/babel__generator': 7.6.8
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.20.5
'@types/babel__generator@7.6.8':
dependencies:
- '@babel/types': 7.26.0
+ '@babel/types': 7.27.0
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.26.2
- '@babel/types': 7.26.0
+ '@babel/parser': 7.27.0
+ '@babel/types': 7.27.0
'@types/babel__traverse@7.20.5':
dependencies:
- '@babel/types': 7.24.6
+ '@babel/types': 7.27.0
'@types/bcrypt@5.0.2':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/bytes@3.1.5': {}
'@types/connect@3.4.38':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/cookie@0.4.1': {}
@@ -14398,7 +14871,7 @@ snapshots:
'@types/cors@2.8.17':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/d3-array@3.2.1': {}
@@ -14537,9 +15010,11 @@ snapshots:
'@types/estree@1.0.7': {}
+ '@types/estree@1.0.8': {}
+
'@types/express-serve-static-core@4.17.43':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/qs': 6.9.14
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
@@ -14563,13 +15038,13 @@ snapshots:
'@types/fs-extra@11.0.4':
dependencies:
'@types/jsonfile': 6.1.4
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/geojson@7946.0.14': {}
'@types/graceful-fs@4.1.9':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/hast@3.0.4':
dependencies:
@@ -14598,21 +15073,21 @@ snapshots:
'@types/jsonfile@6.1.4':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/jsonwebtoken@9.0.6':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/jsonwebtoken@9.0.7':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/katex@0.16.7': {}
'@types/linkify-it@5.0.0': {}
- '@types/luxon@3.6.2': {}
+ '@types/luxon@3.7.1': {}
'@types/markdown-it@14.1.2':
dependencies:
@@ -14635,25 +15110,25 @@ snapshots:
'@types/ms@2.1.0': {}
- '@types/node@20.19.17':
+ '@types/node@20.19.19':
dependencies:
undici-types: 6.21.0
- '@types/node@22.10.0':
- dependencies:
- undici-types: 6.20.0
-
'@types/node@22.13.4':
dependencies:
undici-types: 6.20.0
+ '@types/node@22.19.1':
+ dependencies:
+ undici-types: 6.21.0
+
'@types/nodemailer@6.4.17':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/oauth@0.9.6':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/parse-json@4.0.2': {}
@@ -14689,7 +15164,7 @@ snapshots:
'@types/pg@8.11.11':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
pg-protocol: 1.7.0
pg-types: 4.0.2
@@ -14697,7 +15172,7 @@ snapshots:
'@types/qrcode@1.5.5':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/qs@6.14.0': {}
@@ -14714,16 +15189,18 @@ snapshots:
'@types/prop-types': 15.7.11
csstype: 3.1.3
+ '@types/retry@0.12.0': {}
+
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/serve-static@1.15.5':
dependencies:
'@types/http-errors': 2.0.4
'@types/mime': 3.0.4
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/stack-utils@2.0.3': {}
@@ -14731,7 +15208,7 @@ snapshots:
dependencies:
'@types/cookiejar': 2.1.5
'@types/methods': 1.1.4
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/supertest@6.0.2':
dependencies:
@@ -14749,21 +15226,21 @@ snapshots:
'@types/uuid@10.0.0': {}
- '@types/validator@13.12.0': {}
+ '@types/validator@13.15.10': {}
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.5.14':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/xml-encryption@1.2.4':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/xml2js@0.4.14':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@types/yargs-parser@21.0.3': {}
@@ -14773,7 +15250,7 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
'@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.15.0(jiti@1.21.0))(typescript@5.7.2))(eslint@9.15.0(jiti@1.21.0))(typescript@5.7.2)':
dependencies:
@@ -14950,14 +15427,17 @@ snapshots:
dependencies:
'@ucast/core': 1.10.2
- '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.10.0)(jiti@1.21.0)(less@4.2.0)(sass@1.51.0)(sugarss@4.0.1(postcss@8.4.49))(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))':
+ '@vercel/oidc@3.0.2': {}
+
+ '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
- '@babel/core': 7.26.10
- '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10)
- '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10)
+ '@babel/core': 7.28.5
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5)
+ '@rolldown/pluginutils': 1.0.0-beta.47
'@types/babel__core': 7.20.5
- react-refresh: 0.17.0
- vite: 6.3.5(@types/node@22.10.0)(jiti@1.21.0)(less@4.2.0)(sass@1.51.0)(sugarss@4.0.1(postcss@8.4.49))(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)
+ react-refresh: 0.18.0
+ vite: 7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -15056,14 +15536,8 @@ snapshots:
dependencies:
argparse: 2.0.1
- abbrev@1.1.1: {}
-
abbrev@2.0.0: {}
- abort-controller@3.0.0:
- dependencies:
- event-target-shim: 5.0.1
-
abstract-logging@2.0.1: {}
accepts@1.3.8:
@@ -15085,18 +15559,29 @@ snapshots:
address@1.2.2: {}
- agent-base@6.0.2:
- dependencies:
- debug: 4.4.0
- transitivePeerDependencies:
- - supports-color
-
agent-base@7.1.1:
dependencies:
debug: 4.4.0
transitivePeerDependencies:
- supports-color
+ ai-sdk-ollama@0.12.0(ai@5.0.65(zod@3.25.76))(zod@3.25.76):
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ ai: 5.0.65(zod@3.25.76)
+ ollama: 0.6.0
+ transitivePeerDependencies:
+ - zod
+
+ ai@5.0.65(zod@3.25.76):
+ dependencies:
+ '@ai-sdk/gateway': 1.0.36(zod@3.25.76)
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.11(zod@3.25.76)
+ '@opentelemetry/api': 1.9.0
+ zod: 3.25.76
+
ajv-formats@2.1.1(ajv@8.12.0):
optionalDependencies:
ajv: 8.12.0
@@ -15170,13 +15655,6 @@ snapshots:
normalize-path: 3.0.0
picomatch: 2.3.1
- aproba@2.0.0: {}
-
- are-we-there-yet@2.0.0:
- dependencies:
- delegates: 1.0.0
- readable-stream: 3.6.2
-
arg@4.1.3: {}
argparse@1.0.10:
@@ -15255,6 +15733,10 @@ snapshots:
async-lock@1.4.1: {}
+ async-mutex@0.5.0:
+ dependencies:
+ tslib: 2.8.1
+
async@3.2.5: {}
asynckit@0.4.0: {}
@@ -15270,10 +15752,10 @@ snapshots:
'@fastify/error': 4.0.0
fastq: 1.17.1
- axios@1.9.0:
+ axios@1.13.2:
dependencies:
follow-redirects: 1.15.6
- form-data: 4.0.0
+ form-data: 4.0.5
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
@@ -15327,7 +15809,7 @@ snapshots:
babel-plugin-jest-hoist@29.6.3:
dependencies:
'@babel/template': 7.25.9
- '@babel/types': 7.26.0
+ '@babel/types': 7.27.0
'@types/babel__core': 7.20.5
'@types/babel__traverse': 7.20.5
@@ -15361,12 +15843,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.0)(@babel/traverse@7.27.0):
+ babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.0)(@babel/traverse@7.28.5):
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
optionalDependencies:
- '@babel/traverse': 7.27.0
+ '@babel/traverse': 7.28.5
babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5):
dependencies:
@@ -15422,13 +15904,10 @@ snapshots:
base64url@3.0.1: {}
- bcrypt@5.1.1:
+ bcrypt@6.0.0:
dependencies:
- '@mapbox/node-pre-gyp': 1.0.11
- node-addon-api: 5.1.0
- transitivePeerDependencies:
- - encoding
- - supports-color
+ node-addon-api: 8.5.0
+ node-gyp-build: 4.8.4
binary-extensions@2.3.0: {}
@@ -15514,15 +15993,15 @@ snapshots:
dependencies:
semver: 7.7.2
- bullmq@5.53.2:
+ bullmq@5.65.0:
dependencies:
cron-parser: 4.9.0
- ioredis: 5.4.1
+ ioredis: 5.8.2
msgpackr: 1.11.2
node-abort-controller: 3.1.1
semver: 7.7.2
tslib: 2.8.1
- uuid: 9.0.1
+ uuid: 11.1.0
transitivePeerDependencies:
- supports-color
@@ -15536,6 +16015,11 @@ snapshots:
dependencies:
keyv: 5.3.3
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
call-bind@1.0.7:
dependencies:
es-define-property: 1.0.0
@@ -15628,8 +16112,6 @@ snapshots:
dependencies:
readdirp: 4.0.2
- chownr@2.0.0: {}
-
chrome-trace-event@1.0.3: {}
ci-info@3.9.0: {}
@@ -15638,11 +16120,11 @@ snapshots:
class-transformer@0.5.1: {}
- class-validator@0.14.1:
+ class-validator@0.14.3:
dependencies:
- '@types/validator': 13.12.0
- libphonenumber-js: 1.10.58
- validator: 13.12.0
+ '@types/validator': 13.15.10
+ libphonenumber-js: 1.12.29
+ validator: 13.15.23
cli-boxes@2.2.1: {}
@@ -15705,8 +16187,6 @@ snapshots:
color-name: 1.1.4
simple-swizzle: 0.2.4
- color-support@1.1.3: {}
-
color@4.2.3:
dependencies:
color-convert: 2.0.1
@@ -15766,7 +16246,9 @@ snapshots:
consola@3.4.0: {}
- console-control-strings@1.1.0: {}
+ console-table-printer@2.14.6:
+ dependencies:
+ simple-wcswidth: 1.1.2
content-disposition@0.5.4:
dependencies:
@@ -15846,13 +16328,13 @@ snapshots:
cron-parser@4.9.0:
dependencies:
- luxon: 3.5.0
-
- cron@4.3.0:
- dependencies:
- '@types/luxon': 3.6.2
luxon: 3.6.1
+ cron@4.3.3:
+ dependencies:
+ '@types/luxon': 3.7.1
+ luxon: 3.7.2
+
cross-env@7.0.3:
dependencies:
cross-spawn: 7.0.3
@@ -16168,16 +16650,12 @@ snapshots:
delayed-stream@1.0.0: {}
- delegates@1.0.0: {}
-
denque@2.1.0: {}
depd@2.0.0: {}
dequal@2.0.3: {}
- detect-libc@2.0.3: {}
-
detect-libc@2.0.4: {}
detect-newline@3.1.0: {}
@@ -16273,6 +16751,12 @@ snapshots:
dependencies:
underscore: 1.13.7
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
eastasianwidth@0.2.0: {}
ecdsa-sig-formatter@1.0.11:
@@ -16329,7 +16813,7 @@ snapshots:
dependencies:
'@types/cookie': 0.4.1
'@types/cors': 2.8.17
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
accepts: 1.3.8
base64id: 2.0.0
cookie: 0.7.2
@@ -16417,6 +16901,8 @@ snapshots:
dependencies:
get-intrinsic: 1.2.4
+ es-define-property@1.0.1: {}
+
es-errors@1.3.0: {}
es-iterator-helpers@1.2.0:
@@ -16443,12 +16929,23 @@ snapshots:
dependencies:
es-errors: 1.3.0
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
es-set-tostringtag@2.0.3:
dependencies:
get-intrinsic: 1.2.4
has-tostringtag: 1.0.2
hasown: 2.0.2
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
es-shim-unscopables@1.0.2:
dependencies:
hasown: 2.0.2
@@ -16679,12 +17176,14 @@ snapshots:
esutils@2.0.3: {}
- event-target-shim@5.0.1: {}
-
eventemitter2@6.4.9: {}
+ eventemitter3@4.0.7: {}
+
events@3.3.0: {}
+ eventsource-parser@3.0.6: {}
+
execa@5.1.1:
dependencies:
cross-spawn: 7.0.6
@@ -16721,6 +17220,8 @@ snapshots:
fast-deep-equal@3.1.3: {}
+ fast-equals@5.3.4: {}
+
fast-glob@3.3.2:
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -16746,8 +17247,6 @@ snapshots:
dependencies:
fast-decode-uri-component: 1.0.1
- fast-redact@3.5.0: {}
-
fast-safe-stringify@2.1.1: {}
fast-uri@3.0.6: {}
@@ -16758,7 +17257,7 @@ snapshots:
fastify-plugin@5.0.1: {}
- fastify@5.3.3:
+ fastify@5.6.2:
dependencies:
'@fastify/ajv-compiler': 4.0.2
'@fastify/error': 4.0.0
@@ -16769,7 +17268,7 @@ snapshots:
fast-json-stringify: 6.0.1
find-my-way: 9.2.0
light-my-request: 6.6.0
- pino: 9.1.0
+ pino: 10.1.0
process-warning: 5.0.0
rfdc: 1.3.1
secure-json-parse: 4.0.0
@@ -16788,9 +17287,9 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
- fdir@6.4.5(picomatch@4.0.2):
+ fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
- picomatch: 4.0.2
+ picomatch: 4.0.3
fflate@0.4.8: {}
@@ -16806,10 +17305,10 @@ snapshots:
file-saver@2.0.5: {}
- file-type@21.0.0:
+ file-type@21.1.0:
dependencies:
- '@tokenizer/inflate': 0.2.7
- strtok3: 10.2.2
+ '@tokenizer/inflate': 0.3.1
+ strtok3: 10.3.4
token-types: 6.0.0
uint8array-extras: 1.4.0
transitivePeerDependencies:
@@ -16886,6 +17385,14 @@ snapshots:
combined-stream: 1.0.8
mime-types: 2.1.35
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
formidable@3.5.1:
dependencies:
dezalgo: 1.0.4
@@ -16914,10 +17421,6 @@ snapshots:
jsonfile: 6.1.0
universalify: 2.0.1
- fs-minipass@2.1.0:
- dependencies:
- minipass: 3.3.6
-
fs-monkey@1.0.5: {}
fs.realpath@1.0.0: {}
@@ -16938,18 +17441,6 @@ snapshots:
fuzzy@0.1.3: {}
- gauge@3.0.2:
- dependencies:
- aproba: 2.0.0
- color-support: 1.1.3
- console-control-strings: 1.1.0
- has-unicode: 2.0.1
- object-assign: 4.1.1
- signal-exit: 3.0.7
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wide-align: 1.1.5
-
gensync@1.0.0-beta.2: {}
get-caller-file@2.0.5: {}
@@ -16962,10 +17453,28 @@ snapshots:
has-symbols: 1.0.3
hasown: 2.0.2
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
get-nonce@1.0.1: {}
get-package-type@0.1.0: {}
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
get-stream@6.0.1: {}
get-symbol-description@1.0.2:
@@ -17054,9 +17563,9 @@ snapshots:
hachure-fill@0.5.2: {}
- happy-dom@18.0.1:
+ happy-dom@20.0.10:
dependencies:
- '@types/node': 20.19.17
+ '@types/node': 20.19.19
'@types/whatwg-mimetype': 3.0.2
whatwg-mimetype: 3.0.0
@@ -17076,12 +17585,12 @@ snapshots:
has-symbols@1.0.3: {}
+ has-symbols@1.1.0: {}
+
has-tostringtag@1.0.2:
dependencies:
has-symbols: 1.0.3
- has-unicode@2.0.1: {}
-
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
@@ -17149,13 +17658,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- https-proxy-agent@5.0.1:
- dependencies:
- agent-base: 6.0.2
- debug: 4.4.0
- transitivePeerDependencies:
- - supports-color
-
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.1
@@ -17249,9 +17751,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
- ioredis@5.7.0:
+ ioredis@5.8.2:
dependencies:
- '@ioredis/commands': 1.3.1
+ '@ioredis/commands': 1.4.0
cluster-key-slot: 1.1.2
debug: 4.4.1
denque: 2.1.0
@@ -17402,7 +17904,7 @@ snapshots:
istanbul-lib-instrument@5.2.1:
dependencies:
- '@babel/core': 7.26.0
+ '@babel/core': 7.26.10
'@babel/parser': 7.26.2
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
@@ -17412,7 +17914,7 @@ snapshots:
istanbul-lib-instrument@6.0.2:
dependencies:
- '@babel/core': 7.26.0
+ '@babel/core': 7.26.10
'@babel/parser': 7.26.2
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
@@ -17484,7 +17986,7 @@ snapshots:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.1(babel-plugin-macros@3.1.0)
@@ -17554,6 +18056,37 @@ snapshots:
- babel-plugin-macros
- supports-color
+ jest-config@29.7.0(@types/node@22.19.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3)):
+ dependencies:
+ '@babel/core': 7.24.6
+ '@jest/test-sequencer': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.24.6)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-circus: 29.7.0(babel-plugin-macros@3.1.0)
+ jest-environment-node: 29.7.0
+ jest-get-type: 29.6.3
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-runner: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ micromatch: 4.0.8
+ parse-json: 5.2.0
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ optionalDependencies:
+ '@types/node': 22.19.1
+ ts-node: 10.9.2(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3)
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
@@ -17578,7 +18111,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -17588,7 +18121,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -17627,7 +18160,7 @@ snapshots:
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
jest-util: 29.7.0
jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -17662,7 +18195,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -17690,7 +18223,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
cjs-module-lexer: 1.2.3
collect-v8-coverage: 1.0.2
@@ -17736,7 +18269,7 @@ snapshots:
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -17755,7 +18288,7 @@ snapshots:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -17764,13 +18297,13 @@ snapshots:
jest-worker@27.5.1:
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
merge-stream: 2.0.0
supports-color: 8.1.1
jest-worker@29.7.0:
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -17822,6 +18355,10 @@ snapshots:
js-cookie@3.0.5: {}
+ js-tiktoken@1.0.21:
+ dependencies:
+ base64-js: 1.5.1
+
js-tokens@4.0.0: {}
js-yaml@3.14.1:
@@ -17854,7 +18391,7 @@ snapshots:
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
- ws: 8.18.2
+ ws: 8.18.3
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
@@ -17879,6 +18416,8 @@ snapshots:
json-schema-traverse@1.0.0: {}
+ json-schema@0.4.0: {}
+
json-stable-stringify-without-jsonify@1.0.1: {}
json5@2.2.3: {}
@@ -17893,9 +18432,9 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
- jsonwebtoken@9.0.2:
+ jsonwebtoken@9.0.3:
dependencies:
- jws: 3.2.2
+ jws: 4.0.1
lodash.includes: 4.3.0
lodash.isboolean: 3.0.3
lodash.isinteger: 4.0.4
@@ -17920,15 +18459,15 @@ snapshots:
readable-stream: 2.3.8
setimmediate: 1.0.5
- jwa@1.4.1:
+ jwa@2.0.1:
dependencies:
buffer-equal-constant-time: 1.0.1
ecdsa-sig-formatter: 1.0.11
safe-buffer: 5.2.1
- jws@3.2.2:
+ jws@4.0.1:
dependencies:
- jwa: 1.4.1
+ jwa: 2.0.1
safe-buffer: 5.2.1
jwt-decode@4.0.0: {}
@@ -17955,7 +18494,7 @@ snapshots:
kolorist@1.8.0: {}
- kysely-codegen@0.17.0(kysely@0.28.2)(pg@8.16.0):
+ kysely-codegen@0.17.0(kysely@0.28.2)(pg@8.16.3):
dependencies:
chalk: 4.1.2
dotenv: 16.4.5
@@ -17966,7 +18505,7 @@ snapshots:
minimist: 1.2.8
pluralize: 8.0.0
optionalDependencies:
- pg: 8.16.0
+ pg: 8.16.3
kysely-migration-cli@0.4.2:
dependencies:
@@ -17983,6 +18522,19 @@ snapshots:
vscode-languageserver-textdocument: 1.0.12
vscode-uri: 3.0.8
+ langsmith@0.3.61(@opentelemetry/api@1.9.0)(openai@6.2.0(ws@8.18.3)(zod@3.25.76)):
+ dependencies:
+ '@types/uuid': 10.0.0
+ chalk: 4.1.2
+ console-table-printer: 2.14.6
+ p-queue: 6.6.2
+ p-retry: 4.6.2
+ semver: 7.7.2
+ uuid: 10.0.0
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.0
+ openai: 6.2.0(ws@8.18.3)(zod@3.25.76)
+
layout-base@1.0.2: {}
layout-base@2.0.1: {}
@@ -18026,11 +18578,15 @@ snapshots:
dependencies:
isomorphic.js: 0.2.5
+ lib0@0.2.114:
+ dependencies:
+ isomorphic.js: 0.2.5
+
lib0@0.2.88:
dependencies:
isomorphic.js: 0.2.5
- libphonenumber-js@1.10.58: {}
+ libphonenumber-js@1.12.29: {}
lie@3.3.0:
dependencies:
@@ -18052,7 +18608,7 @@ snapshots:
linkifyjs@4.3.2: {}
- load-esm@1.0.2: {}
+ load-esm@1.0.3: {}
loader-runner@4.3.0: {}
@@ -18137,10 +18693,10 @@ snapshots:
dependencies:
yallist: 4.0.0
- luxon@3.5.0: {}
-
luxon@3.6.1: {}
+ luxon@3.7.2: {}
+
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -18151,10 +18707,6 @@ snapshots:
semver: 5.7.2
optional: true
- make-dir@3.1.0:
- dependencies:
- semver: 6.3.1
-
make-dir@4.0.0:
dependencies:
semver: 7.7.2
@@ -18165,7 +18717,7 @@ snapshots:
dependencies:
tmpl: 1.0.5
- mammoth@1.10.0:
+ mammoth@1.11.0:
dependencies:
'@xmldom/xmldom': 0.8.10
argparse: 1.0.10
@@ -18178,10 +18730,10 @@ snapshots:
underscore: 1.13.7
xmlbuilder: 10.1.1
- mantine-form-zod-resolver@1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.56):
+ mantine-form-zod-resolver@1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.76):
dependencies:
'@mantine/form': 8.1.3(react@18.3.1)
- zod: 3.25.56
+ zod: 3.25.76
markdown-it@14.1.0:
dependencies:
@@ -18198,6 +18750,8 @@ snapshots:
marked@7.0.4: {}
+ math-intrinsics@1.1.0: {}
+
md-to-react-email@5.0.2(react@18.3.1):
dependencies:
marked: 7.0.4
@@ -18402,7 +18956,7 @@ snapshots:
micromark@3.2.0:
dependencies:
'@types/debug': 4.1.12
- debug: 4.4.0
+ debug: 4.4.1
decode-named-character-reference: 1.1.0
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@@ -18472,23 +19026,10 @@ snapshots:
minimist@1.2.8: {}
- minipass@3.3.6:
- dependencies:
- yallist: 4.0.0
-
- minipass@5.0.0: {}
-
minipass@7.1.2: {}
- minizlib@2.1.2:
- dependencies:
- minipass: 3.3.6
- yallist: 4.0.0
-
mitt@3.0.1: {}
- mkdirp@1.0.4: {}
-
mlly@1.8.0:
dependencies:
acorn: 8.15.0
@@ -18525,6 +19066,8 @@ snapshots:
glur: 1.1.2
object-assign: 4.1.1
+ mustache@4.2.0: {}
+
mute-stream@2.0.0: {}
nanoid@3.3.11: {}
@@ -18547,10 +19090,10 @@ snapshots:
neo-async@2.6.2: {}
- nestjs-kysely@1.2.0(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.3)(kysely@0.28.2)(reflect-metadata@0.2.2):
+ nestjs-kysely@1.2.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(kysely@0.28.2)(reflect-metadata@0.2.2):
dependencies:
- '@nestjs/common': 11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
- '@nestjs/core': 11.1.3(@nestjs/common@11.1.3(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/websockets@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
kysely: 0.28.2
reflect-metadata: 0.2.2
@@ -18583,7 +19126,7 @@ snapshots:
node-abort-controller@3.1.1: {}
- node-addon-api@5.1.0: {}
+ node-addon-api@8.5.0: {}
node-emoji@1.11.0:
dependencies:
@@ -18596,20 +19139,18 @@ snapshots:
node-gyp-build-optional-packages@5.0.7:
optional: true
+ node-gyp-build@4.8.4: {}
+
node-int64@0.4.0: {}
node-machine-id@1.1.12: {}
node-releases@2.0.18: {}
- nodemailer@7.0.3: {}
+ nodemailer@7.0.11: {}
non-layered-tidy-tree-layout@2.0.2: {}
- nopt@5.0.0:
- dependencies:
- abbrev: 1.1.1
-
nopt@7.2.0:
dependencies:
abbrev: 2.0.0
@@ -18629,13 +19170,6 @@ snapshots:
dependencies:
path-key: 3.1.1
- npmlog@5.0.1:
- dependencies:
- are-we-there-yet: 2.0.0
- console-control-strings: 1.1.0
- gauge: 3.0.2
- set-blocking: 2.0.0
-
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
@@ -18648,7 +19182,7 @@ snapshots:
'@yarnpkg/lockfile': 1.1.0
'@yarnpkg/parsers': 3.0.2
'@zkochan/js-yaml': 0.0.7
- axios: 1.9.0
+ axios: 1.13.2
chalk: 4.1.2
cli-cursor: 3.1.0
cli-spinners: 2.6.1
@@ -18735,6 +19269,10 @@ snapshots:
oidc-token-hash@5.0.3: {}
+ ollama@0.6.0:
+ dependencies:
+ whatwg-fetch: 3.6.20
+
on-exit-leak-free@2.1.2: {}
once@1.4.0:
@@ -18753,6 +19291,12 @@ snapshots:
is-docker: 2.2.1
is-wsl: 2.2.0
+ openai@6.2.0(ws@8.18.3)(zod@3.25.76):
+ optionalDependencies:
+ ws: 8.18.3
+ zod: 3.25.76
+ optional: true
+
openid-client@5.7.1:
dependencies:
jose: 4.15.9
@@ -18804,6 +19348,8 @@ snapshots:
dependencies:
'@noble/hashes': 1.7.1
+ p-finally@1.0.0: {}
+
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
@@ -18824,6 +19370,20 @@ snapshots:
dependencies:
p-limit: 3.1.0
+ p-queue@6.6.2:
+ dependencies:
+ eventemitter3: 4.0.7
+ p-timeout: 3.2.0
+
+ p-retry@4.6.2:
+ dependencies:
+ '@types/retry': 0.12.0
+ retry: 0.13.1
+
+ p-timeout@3.2.0:
+ dependencies:
+ p-finally: 1.0.0
+
p-try@2.2.0: {}
package-json-from-dist@1.0.0: {}
@@ -18876,7 +19436,7 @@ snapshots:
passport-jwt@4.0.1:
dependencies:
- jsonwebtoken: 9.0.2
+ jsonwebtoken: 9.0.3
passport-strategy: 1.0.0
passport-oauth2@1.8.0:
@@ -18915,7 +19475,7 @@ snapshots:
lru-cache: 11.0.2
minipass: 7.1.2
- path-to-regexp@8.2.0: {}
+ path-to-regexp@8.3.0: {}
path-type@4.0.0: {}
@@ -18923,32 +19483,30 @@ snapshots:
pause@0.0.1: {}
- pdfjs-dist@5.4.54:
+ pdfjs-dist@5.4.394:
optionalDependencies:
- '@napi-rs/canvas': 0.1.77
+ '@napi-rs/canvas': 0.1.82
peberminta@0.9.0: {}
- peek-readable@7.0.0: {}
-
pend@1.2.0: {}
perfect-freehand@1.2.0: {}
- pg-cloudflare@1.2.5:
+ pg-cloudflare@1.2.7:
optional: true
- pg-connection-string@2.9.0: {}
+ pg-connection-string@2.9.1: {}
pg-int8@1.0.1: {}
pg-numeric@1.0.2: {}
- pg-pool@3.10.0(pg@8.16.0):
+ pg-pool@3.10.1(pg@8.16.3):
dependencies:
- pg: 8.16.0
+ pg: 8.16.3
- pg-protocol@1.10.0: {}
+ pg-protocol@1.10.3: {}
pg-protocol@1.7.0: {}
@@ -18972,20 +19530,22 @@ snapshots:
postgres-interval: 3.0.0
postgres-range: 1.1.4
- pg@8.16.0:
+ pg@8.16.3:
dependencies:
- pg-connection-string: 2.9.0
- pg-pool: 3.10.0(pg@8.16.0)
- pg-protocol: 1.10.0
+ pg-connection-string: 2.9.1
+ pg-pool: 3.10.1(pg@8.16.3)
+ pg-protocol: 1.10.3
pg-types: 2.2.0
pgpass: 1.0.5
optionalDependencies:
- pg-cloudflare: 1.2.5
+ pg-cloudflare: 1.2.7
pgpass@1.0.5:
dependencies:
split2: 4.2.0
+ pgvector@0.2.1: {}
+
pica@7.1.1:
dependencies:
glur: 1.1.2
@@ -19004,24 +19564,25 @@ snapshots:
picomatch@4.0.2: {}
+ picomatch@4.0.3: {}
+
pify@4.0.1:
optional: true
- pino-abstract-transport@1.2.0:
+ pino-abstract-transport@2.0.0:
dependencies:
- readable-stream: 4.5.2
split2: 4.2.0
pino-std-serializers@7.0.0: {}
- pino@9.1.0:
+ pino@10.1.0:
dependencies:
+ '@pinojs/redact': 0.4.0
atomic-sleep: 1.0.0
- fast-redact: 3.5.0
on-exit-leak-free: 2.1.2
- pino-abstract-transport: 1.2.0
+ pino-abstract-transport: 2.0.0
pino-std-serializers: 7.0.0
- process-warning: 3.0.0
+ process-warning: 5.0.0
quick-format-unescaped: 4.0.4
real-require: 0.2.0
safe-stable-stringify: 2.4.3
@@ -19117,7 +19678,7 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.5.3:
+ postcss@8.5.6:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
@@ -19154,7 +19715,7 @@ snapshots:
postmark@4.0.5:
dependencies:
- axios: 1.9.0
+ axios: 1.13.2
transitivePeerDependencies:
- debug
@@ -19178,14 +19739,10 @@ snapshots:
process-nextick-args@2.0.1: {}
- process-warning@3.0.0: {}
-
process-warning@4.0.0: {}
process-warning@5.0.0: {}
- process@0.11.10: {}
-
prompts@2.4.2:
dependencies:
kleur: 3.0.3
@@ -19335,10 +19892,10 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- react-arborist@3.4.0(patch_hash=419b3b02e24afe928cc006a006f6e906666aff19aa6fd7daaa788ccc2202678a)(@types/node@22.10.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ react-arborist@3.4.0(patch_hash=419b3b02e24afe928cc006a006f6e906666aff19aa6fd7daaa788ccc2202678a)(@types/node@22.19.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
- react-dnd: 14.0.5(@types/node@22.10.0)(@types/react@18.3.12)(react@18.3.1)
+ react-dnd: 14.0.5(@types/node@22.19.1)(@types/react@18.3.12)(react@18.3.1)
react-dnd-html5-backend: 14.1.0
react-dom: 18.3.1(react@18.3.1)
react-window: 1.8.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -19360,7 +19917,7 @@ snapshots:
dependencies:
dnd-core: 14.0.1
- react-dnd@14.0.5(@types/node@22.10.0)(@types/react@18.3.12)(react@18.3.1):
+ react-dnd@14.0.5(@types/node@22.19.1)(@types/react@18.3.12)(react@18.3.1):
dependencies:
'@react-dnd/invariant': 2.0.0
'@react-dnd/shallowequal': 2.0.0
@@ -19369,7 +19926,7 @@ snapshots:
hoist-non-react-statics: 3.3.2
react: 18.3.1
optionalDependencies:
- '@types/node': 22.10.0
+ '@types/node': 22.19.1
'@types/react': 18.3.12
react-dom@18.3.1(react@18.3.1):
@@ -19445,7 +20002,7 @@ snapshots:
dependencies:
fast-deep-equal: 2.0.1
- react-refresh@0.17.0: {}
+ react-refresh@0.18.0: {}
react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@18.3.1):
dependencies:
@@ -19535,14 +20092,6 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
- readable-stream@4.5.2:
- dependencies:
- abort-controller: 3.0.0
- buffer: 6.0.3
- events: 3.3.0
- process: 0.11.10
- string_decoder: 1.3.0
-
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -19652,6 +20201,8 @@ snapshots:
ret@0.5.0: {}
+ retry@0.13.1: {}
+
reusify@1.0.4: {}
rfdc@1.3.1: {}
@@ -19662,30 +20213,32 @@ snapshots:
robust-predicates@3.0.2: {}
- rollup@4.40.0:
+ rollup@4.53.3:
dependencies:
- '@types/estree': 1.0.7
+ '@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.40.0
- '@rollup/rollup-android-arm64': 4.40.0
- '@rollup/rollup-darwin-arm64': 4.40.0
- '@rollup/rollup-darwin-x64': 4.40.0
- '@rollup/rollup-freebsd-arm64': 4.40.0
- '@rollup/rollup-freebsd-x64': 4.40.0
- '@rollup/rollup-linux-arm-gnueabihf': 4.40.0
- '@rollup/rollup-linux-arm-musleabihf': 4.40.0
- '@rollup/rollup-linux-arm64-gnu': 4.40.0
- '@rollup/rollup-linux-arm64-musl': 4.40.0
- '@rollup/rollup-linux-loongarch64-gnu': 4.40.0
- '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0
- '@rollup/rollup-linux-riscv64-gnu': 4.40.0
- '@rollup/rollup-linux-riscv64-musl': 4.40.0
- '@rollup/rollup-linux-s390x-gnu': 4.40.0
- '@rollup/rollup-linux-x64-gnu': 4.40.0
- '@rollup/rollup-linux-x64-musl': 4.40.0
- '@rollup/rollup-win32-arm64-msvc': 4.40.0
- '@rollup/rollup-win32-ia32-msvc': 4.40.0
- '@rollup/rollup-win32-x64-msvc': 4.40.0
+ '@rollup/rollup-android-arm-eabi': 4.53.3
+ '@rollup/rollup-android-arm64': 4.53.3
+ '@rollup/rollup-darwin-arm64': 4.53.3
+ '@rollup/rollup-darwin-x64': 4.53.3
+ '@rollup/rollup-freebsd-arm64': 4.53.3
+ '@rollup/rollup-freebsd-x64': 4.53.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.53.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.53.3
+ '@rollup/rollup-linux-arm64-gnu': 4.53.3
+ '@rollup/rollup-linux-arm64-musl': 4.53.3
+ '@rollup/rollup-linux-loong64-gnu': 4.53.3
+ '@rollup/rollup-linux-ppc64-gnu': 4.53.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.53.3
+ '@rollup/rollup-linux-riscv64-musl': 4.53.3
+ '@rollup/rollup-linux-s390x-gnu': 4.53.3
+ '@rollup/rollup-linux-x64-gnu': 4.53.3
+ '@rollup/rollup-linux-x64-musl': 4.53.3
+ '@rollup/rollup-openharmony-arm64': 4.53.3
+ '@rollup/rollup-win32-arm64-msvc': 4.53.3
+ '@rollup/rollup-win32-ia32-msvc': 4.53.3
+ '@rollup/rollup-win32-x64-gnu': 4.53.3
+ '@rollup/rollup-win32-x64-msvc': 4.53.3
fsevents: 2.3.3
rope-sequence@1.3.4: {}
@@ -19889,6 +20442,8 @@ snapshots:
dependencies:
is-arrayish: 0.3.4
+ simple-wcswidth@1.1.2: {}
+
sisteransi@1.0.5: {}
slash@3.0.0: {}
@@ -20078,15 +20633,14 @@ snapshots:
stripe@17.5.0:
dependencies:
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
qs: 6.12.0
strnum@1.0.5: {}
- strtok3@10.2.2:
+ strtok3@10.3.4:
dependencies:
'@tokenizer/token': 0.3.0
- peek-readable: 7.0.0
styled-jsx@5.1.1(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react@18.3.1):
dependencies:
@@ -20155,15 +20709,6 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
- tar@6.2.1:
- dependencies:
- chownr: 2.0.0
- fs-minipass: 2.1.0
- minipass: 5.0.0
- minizlib: 2.1.2
- mkdirp: 1.0.4
- yallist: 4.0.0
-
terser-webpack-plugin@5.3.11(@swc/core@1.5.25(@swc/helpers@0.5.5))(webpack@5.98.0(@swc/core@1.5.25(@swc/helpers@0.5.5))):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
@@ -20199,10 +20744,10 @@ snapshots:
fdir: 6.4.3(picomatch@4.0.2)
picomatch: 4.0.2
- tinyglobby@0.2.14:
+ tinyglobby@0.2.15:
dependencies:
- fdir: 6.4.5(picomatch@4.0.2)
- picomatch: 4.0.2
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
tippy.js@6.3.7:
dependencies:
@@ -20304,14 +20849,14 @@ snapshots:
typescript: 5.7.3
webpack: 5.98.0(@swc/core@1.5.25(@swc/helpers@0.5.5))
- ts-node@10.9.1(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.13.4)(typescript@5.7.3):
+ ts-node@10.9.1(@swc/core@1.5.25(@swc/helpers@0.5.5))(@types/node@22.19.1)(typescript@5.7.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 22.13.4
+ '@types/node': 22.19.1
acorn: 8.14.0
acorn-walk: 8.3.2
arg: 4.1.3
@@ -20448,6 +20993,15 @@ snapshots:
typescript@5.7.3: {}
+ typesense@2.1.0(@babel/runtime@7.25.6):
+ dependencies:
+ '@babel/runtime': 7.25.6
+ axios: 1.13.2
+ loglevel: 1.9.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - debug
+
uc.micro@2.1.0: {}
ufo@1.6.1: {}
@@ -20540,7 +21094,7 @@ snapshots:
dependencies:
react: 18.3.1
- use-sync-external-store@1.5.0(react@18.3.1):
+ use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
react: 18.3.1
@@ -20550,6 +21104,8 @@ snapshots:
utils-merge@1.0.1: {}
+ uuid@10.0.0: {}
+
uuid@11.1.0: {}
uuid@9.0.1: {}
@@ -20573,25 +21129,23 @@ snapshots:
dependencies:
builtins: 5.0.1
- validator@13.12.0: {}
+ validator@13.15.23: {}
vary@1.1.2: {}
- vite@6.3.5(@types/node@22.10.0)(jiti@1.21.0)(less@4.2.0)(sass@1.51.0)(sugarss@4.0.1(postcss@8.4.49))(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0):
+ vite@7.2.4(@types/node@22.19.1)(jiti@1.21.0)(less@4.2.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0):
dependencies:
esbuild: 0.25.0
- fdir: 6.4.5(picomatch@4.0.2)
- picomatch: 4.0.2
- postcss: 8.5.3
- rollup: 4.40.0
- tinyglobby: 0.2.14
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.53.3
+ tinyglobby: 0.2.15
optionalDependencies:
- '@types/node': 22.10.0
+ '@types/node': 22.19.1
fsevents: 2.3.3
jiti: 1.21.0
less: 4.2.0
- sass: 1.51.0
- sugarss: 4.0.1(postcss@8.4.49)
terser: 5.39.0
tsx: 4.19.3
yaml: 2.7.0
@@ -20682,6 +21236,8 @@ snapshots:
dependencies:
iconv-lite: 0.6.3
+ whatwg-fetch@3.6.20: {}
+
whatwg-mimetype@3.0.0: {}
whatwg-mimetype@4.0.0: {}
@@ -20746,10 +21302,6 @@ snapshots:
dependencies:
isexe: 2.0.0
- wide-align@1.1.5:
- dependencies:
- string-width: 4.2.3
-
widest-line@3.1.0:
dependencies:
string-width: 4.2.3
@@ -20783,7 +21335,7 @@ snapshots:
ws@8.17.1: {}
- ws@8.18.2: {}
+ ws@8.18.3: {}
xml-crypto@6.1.2:
dependencies:
@@ -20827,9 +21379,9 @@ snapshots:
lib0: 0.2.88
yjs: 13.6.27
- y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27):
+ y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27):
dependencies:
- lib0: 0.2.108
+ lib0: 0.2.114
prosemirror-model: 1.25.1
prosemirror-state: 1.4.3
prosemirror-view: 1.40.0
@@ -20838,7 +21390,7 @@ snapshots:
y-protocols@1.0.6(yjs@13.6.27):
dependencies:
- lib0: 0.2.108
+ lib0: 0.2.114
yjs: 13.6.27
y18n@4.0.3: {}
@@ -20901,7 +21453,11 @@ snapshots:
yoctocolors-cjs@2.1.2: {}
- zod@3.25.56: {}
+ zod-to-json-schema@3.24.6(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
zustand@4.5.6(@types/react@18.3.12)(react@18.3.1):
dependencies: