Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
79bf707
feat(onboarding): boutons d'aide « i » sur les modules + guides
D4kooo May 29, 2026
a6d3b03
fix(a11y): accessibility, theming & perf pass across all modules
D4kooo May 31, 2026
baa5aa2
chore(deps): override tmp + postcss (correctifs audit)
D4kooo Jun 1, 2026
b4a05c4
feat(projects): projet = dossier + RAG scopé (docs + conversations)
D4kooo Jun 1, 2026
0d57b9d
feat(chat): vérité des coûts & contrôle d'exécution (sprint prod-read…
D4kooo Jun 1, 2026
95ea27c
fix(rag): intégrité & transparence du RAG (sprint prod-ready P3)
D4kooo Jun 1, 2026
d1210d7
feat(rag): transparence de l'indexation + réindexation (sprint prod-r…
D4kooo Jun 1, 2026
e4f78ab
feat(documents): import multi-fichiers, feedback de rejet, déplacemen…
D4kooo Jun 1, 2026
fb420aa
feat(chat): citations Légifrance & Pappers cliquables (sprint prod-re…
D4kooo Jun 1, 2026
4802921
feat(chat): trail d'audit multi-agents persistant + export JSON (P2 H…
D4kooo Jun 1, 2026
360762b
feat(chat): afficher les compétences (skills) appliquées (P2 H4)
D4kooo Jun 1, 2026
ca35ca2
feat(tabular): export CSV, format de colonne, timeout des lignes coin…
D4kooo Jun 1, 2026
38c8928
feat(tabular): ré-extraction ciblée (ligne/colonne) + ajout de docume…
D4kooo Jun 1, 2026
991b13d
feat(settings): connecteurs honnêtes + prix par modèle (P5 R4/H23)
D4kooo Jun 1, 2026
077d66c
feat(onboarding): checklist de readiness + test connexion providers s…
D4kooo Jun 1, 2026
3ae96ef
feat(connectors): test de connexion PISTE/Pappers (P5 R5)
D4kooo Jun 1, 2026
31cd0d6
feat(settings): OVH liste curée + MCP auto-sync à la création (P5 H26…
D4kooo Jun 1, 2026
f454728
feat(shell): filets loading/error/not-found/global-error + fix a11y p…
D4kooo Jun 1, 2026
ec84bac
feat(ui): renommer « Bureau »→« Board » et « Workflows »→« Trames » +…
D4kooo Jun 1, 2026
87941d7
feat(board): implémenter les agents Rédacteur + Légifrance (P6 H12b/H12)
D4kooo Jun 1, 2026
87c5248
fix(board): canvas honnête — handles masqués, drag-réordonnancement s…
D4kooo Jun 1, 2026
532ec0e
feat(admin): journal d'audit exploitable — filtres, pagination, meta,…
D4kooo Jun 1, 2026
3b2bdfb
fix(a11y): focus-ring harmonisé (ring-3) + feedback admin annoncé (ro…
D4kooo Jun 1, 2026
7eae23e
feat(board): allowlist d'outils en multi-select (P6 H11)
D4kooo Jun 1, 2026
c35af0d
refactor(ui): unify relative-time + empty-state into shared primitives
D4kooo Jun 1, 2026
37f8513
fix(a11y): lift compounded low-contrast micro-labels off the 9px floor
D4kooo Jun 1, 2026
5e2ff18
fix(settings): surface toggle failures instead of swallowing them (H25)
D4kooo Jun 1, 2026
4c67b33
refactor(nav): single source of truth for primary navigation (H29)
D4kooo Jun 1, 2026
1272df7
feat(documents): compare two versions of a document (H19)
D4kooo Jun 1, 2026
e17ed4b
feat(board): council round-awareness + synthesis-failure fallback (H10)
D4kooo Jun 1, 2026
9ce88e9
feat(board): vue-liste verticale du board sur mobile (H7)
D4kooo Jun 1, 2026
bfd9781
feat(board): RAG par agent — backbone hérite/aucun (Lot 1a)
D4kooo Jun 2, 2026
73ac0bd
feat(board): RAG par agent — portées dossiers / documents (Lot 1b)
D4kooo Jun 2, 2026
1022baa
feat(board): RAG par agent — badge de transparence sur le nœud (Lot 1c)
D4kooo Jun 2, 2026
354f336
feat(board): changement de rôle in-place d'un agent (Lot 2a)
D4kooo Jun 2, 2026
175beb6
feat(board): température par agent (Lot 2b)
D4kooo Jun 2, 2026
4d7376c
feat(board): panneau d'ordre d'exécution explicite (Lot 3)
D4kooo Jun 2, 2026
be0383b
fix(chat): accès permanent à la Salle de délibération depuis chaque m…
D4kooo Jun 2, 2026
ff1f6d6
merge: réconcilie dataring/main (squashes #4/#12) dans feat/board-cus…
D4kooo Jun 2, 2026
764d4d4
feat(security): isole documents/skills/sorties d'agents comme context…
D4kooo Jun 3, 2026
6ae3bd7
feat(auth): déprovisionnement immédiat des comptes désactivés/supprimés
D4kooo Jun 3, 2026
fc10541
feat(crypto): déchiffrement fail-soft (DecryptError typée + tryDecrypt)
D4kooo Jun 3, 2026
c0d78d8
feat(security): garde SSRF sur les URL utilisateur (provider baseUrl,…
D4kooo Jun 3, 2026
7961e8e
feat(orchestrator): budgétisation du contexte + sanitization des pair…
D4kooo Jun 3, 2026
72a6c09
feat(orchestrator): prompt caching Anthropic sur le préfixe outils+sy…
D4kooo Jun 3, 2026
415ef5c
feat(chat): signale au modèle qu'un document joint a été tronqué
D4kooo Jun 3, 2026
a2d481a
feat(rag): backend d'embedding self-hostable (souveraineté)
D4kooo Jun 3, 2026
dff8aaf
feat(rag): overlap de chunk par phrase entière (plus de coupe en plei…
D4kooo Jun 3, 2026
7e3aacc
feat(rag): recherche hybride vecteur+mot-clé (FTS français) + dégrada…
D4kooo Jun 3, 2026
4e99b49
feat(rgpd): cron de rétention — purge auditée des conversations inact…
D4kooo Jun 3, 2026
041bf20
feat(documents): OCR des PDF scannés (pièces) au lieu de les rejeter
D4kooo Jun 3, 2026
8734d33
feat(memory): mémoire persistante par dossier avec validation humaine
D4kooo Jun 3, 2026
fd63b65
feat(auth): 2FA TOTP (RFC 6238) avec codes de secours, sans dépendance
D4kooo Jun 3, 2026
fee3257
feat(orchestrator): vérification déterministe des livrables (anti-hal…
D4kooo Jun 3, 2026
fb05cc6
feat(orchestrator): mode « itératif » — recherche par approfondisseme…
D4kooo Jun 3, 2026
9f050e8
feat(chat): timeline consolidée des actions du modèle
D4kooo Jun 3, 2026
97d3126
style(chat): timeline d'actions minimaliste (sans cadre, aérée)
D4kooo Jun 3, 2026
dcb2864
feat(chat): ajoute Skills, Connecteurs et Serveurs MCP au menu « + »
D4kooo Jun 3, 2026
3ff24f0
fix(chat): trombone dans la barre d'input + menu joindre (upload / RA…
D4kooo Jun 3, 2026
45e03b7
feat(chat): picker de documents en arborescence réelle (dossiers + so…
D4kooo Jun 3, 2026
e59e5ab
feat(chat): hero d'accueil à jour avec suggestions cliquables
D4kooo Jun 3, 2026
27f5c43
fix(usage): coûts affichés pour les modèles récents (gpt-5.5 etc.)
D4kooo Jun 3, 2026
4f276ac
fix(settings): layout des pages Sécurité et Mémoire (conteneur manquant)
D4kooo Jun 4, 2026
475a992
feat(security): QR code pour l'enrôlement 2FA (scan app authenticator)
D4kooo Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,30 @@ RATE_LIMIT_UPLOAD_PER_HOUR=60

# Tentatives login / 15 min / IP. 0 = désactivé.
RATE_LIMIT_LOGIN_PER_15MIN=10

# ─── Durcissement & souveraineté (optionnel) ────────────────────────────────

# Secret partagé protégeant /api/cron/retention (purge RGPD des conversations
# inactives, déclenchée par un planificateur externe). Vide = route inerte.
CRON_SECRET=

# Garde SSRF stricte : bloque AUSSI localhost/LAN sur les baseUrl provider et
# URLs MCP (déploiement mutualisé). Laisser vide en auto-hébergement
# (Ollama/vLLM locaux). Mettre 1 pour activer.
LOUIS_SSRF_STRICT=

# Backend d'embedding SOUVERAIN : endpoint OpenAI-compatible auto-hébergé
# (Ollama/vLLM/TEI) pour que les chunks confidentiels ne partent pas chez Mistral.
# Le modèle doit produire des vecteurs de dimension EMBEDDING_DIM (1024).
LOUIS_EMBEDDING_BASE_URL=
LOUIS_EMBEDDING_MODEL=
LOUIS_EMBEDDING_API_KEY=

# Budget de contexte (tokens) de l'historique envoyé au modèle. Défaut 100000.
# À baisser sous la fenêtre d'un petit modèle local pour éviter un dépassement.
LOUIS_CONTEXT_BUDGET_TOKENS=

# Extraction automatique de la mémoire des dossiers (faits durables → écran
# /settings/memory, statut « à valider »). Coûte un appel LLM par tour de
# dossier. Désactivée par défaut. Mettre 1 pour activer.
LOUIS_MEMORY_EXTRACTION=
11 changes: 11 additions & 0 deletions drizzle/migrations/0007_hybrid_fts.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-- Recherche hybride vecteur + mot-clé (rag/search.ts, rag/message-search.ts).
-- Index GIN d'EXPRESSION sur to_tsvector('french', content) : permet le rappel
-- des tokens exacts (n° d'article, n° de pourvoi, nom de partie, terme défini)
-- que la recherche purement vectorielle manque. Sert aussi de repli mot-clé
-- quand aucun backend d'embedding n'est disponible (déploiement air-gapped).

CREATE INDEX IF NOT EXISTS "document_chunks_fts_idx"
ON "document_chunks" USING gin (to_tsvector('french', "content"));

CREATE INDEX IF NOT EXISTS "message_chunks_fts_idx"
ON "message_chunks" USING gin (to_tsvector('french', "content"));
5 changes: 5 additions & 0 deletions drizzle/migrations/0008_retention.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- Rétention RGPD : purge auto des conversations inactives via /api/cron/retention.
-- null = désactivé (défaut). Cf. src/app/api/cron/retention/route.ts.

ALTER TABLE "cabinet_settings"
ADD COLUMN IF NOT EXISTS "retention_days" integer;
18 changes: 18 additions & 0 deletions drizzle/migrations/0009_project_memories.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- Mémoire persistante PAR DOSSIER (matter-scoped). Chaque fait porte sa
-- provenance (source_message_id) et nécessite une validation humaine
-- (status='approved') avant d'influencer une réponse. Cf. lib/memory-extract.ts
-- et l'écran /settings/memory.

CREATE TABLE IF NOT EXISTS "project_memories" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"user_id" uuid NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
"project_id" uuid NOT NULL REFERENCES "projects"("id") ON DELETE CASCADE,
"category" text NOT NULL,
"text" text NOT NULL,
"source_message_id" uuid REFERENCES "messages"("id") ON DELETE SET NULL,
"status" text NOT NULL DEFAULT 'pending',
"created_at" timestamp NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS "project_memories_project_idx"
ON "project_memories" ("project_id", "status");
8 changes: 8 additions & 0 deletions drizzle/migrations/0010_totp_2fa.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- 2FA TOTP (RFC 6238). totp_secret_pending détient le secret le temps de
-- l'enrôlement, promu vers totp_secret + totp_enabled une fois un code confirmé.
-- backup_codes = codes de secours à usage unique, HACHÉS (bcrypt). Cf. lib/totp.ts.

ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "totp_secret" text;
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "totp_secret_pending" text;
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "totp_enabled" boolean NOT NULL DEFAULT false;
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "backup_codes" jsonb;
52 changes: 19 additions & 33 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
"pdf-parse": "^1.1.1",
"pdfkit": "^0.18.0",
"postgres": "^3.4.9",
"qrcode.react": "^4.2.0",
"radix-ui": "^1.4.3",
"react": "19.2.4",
"react-dom": "19.2.4",
Expand Down
Loading