feat(notes): liens internes, onglet Réseau, living blocks et consentement IA
Some checks failed
CI / Lint, Test & Build (push) Failing after 1m19s
CI / Deploy production (on server) (push) Has been skipped

Rend les liens entre notes visibles et persistants (sync NoteLink au save, auto-save, graphe réseau rafraîchi), ajoute living blocks, Memory Echo, recherche globale, consentement IA explicite et consolide les prototypes design en architectural-grid.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Antigravity
2026-05-24 14:27:29 +00:00
parent 077e665dfc
commit e2672cd2c2
323 changed files with 20670 additions and 42431 deletions

View File

@@ -9,7 +9,7 @@ import { ComparisonModal } from '@/components/comparison-modal'
import { FusionModal } from '@/components/fusion-modal'
import { ReminderDialog } from '@/components/reminder-dialog'
import { ContextualAIChat } from '@/components/contextual-ai-chat'
import { EditorConnectionsSection } from '@/components/editor-connections-section'
import { MemoryEchoSection } from '@/components/memory-echo-section'
import {
Dialog,
DialogContent,
@@ -25,6 +25,7 @@ import { useLanguage } from '@/lib/i18n'
import { cn } from '@/lib/utils'
import { toast } from 'sonner'
import { Note } from '@/lib/types'
import { useState } from 'react'
interface NoteEditorDialogProps {
onClose: () => void
@@ -33,6 +34,7 @@ interface NoteEditorDialogProps {
export function NoteEditorDialog({ onClose }: NoteEditorDialogProps) {
const { state, actions, note, readOnly, notebooks, fileInputRef } = useNoteEditorContext()
const { t } = useLanguage()
const [comparisonSimilarity, setComparisonSimilarity] = useState<number | undefined>()
const handleSaveAndClose = async () => {
await actions.handleSave()
@@ -112,13 +114,10 @@ export function NoteEditorDialog({ onClose }: NoteEditorDialogProps) {
{/* Memory Echo Connections Section */}
{!readOnly && (
<EditorConnectionsSection
<MemoryEchoSection
noteId={note.id}
onOpenNote={(noteId: string) => {
onClose()
window.location.href = `/home?note=${noteId}`
}}
onCompareNotes={(noteIds: string[]) => {
onCompareNotes={(noteIds: string[], meta?: { similarity?: number }) => {
setComparisonSimilarity(meta?.similarity)
Promise.all(noteIds.map(async (id: string) => {
try {
const res = await fetch(`/api/notes/${id}`)
@@ -292,11 +291,24 @@ export function NoteEditorDialog({ onClose }: NoteEditorDialogProps) {
{state.comparisonNotes && state.comparisonNotes.length > 0 && (
<ComparisonModal
isOpen={!!state.comparisonNotes}
onClose={() => actions.setComparisonNotes([])}
onClose={() => {
setComparisonSimilarity(undefined)
actions.setComparisonNotes([])
}}
notes={state.comparisonNotes}
onOpenNote={(noteId: string) => {
onClose()
window.location.href = `/home?note=${noteId}`
similarity={comparisonSimilarity}
onMergeNotes={async (noteIds: string[]) => {
const fetchedNotes = await Promise.all(noteIds.map(async (id: string) => {
try {
const res = await fetch(`/api/notes/${id}`)
if (!res.ok) return null
const data = await res.json()
return data.success && data.data ? data.data : null
} catch {
return null
}
}))
actions.setFusionNotes(fetchedNotes.filter((n): n is Partial<Note> => n !== null))
}}
/>
)}