feat(assistant): #91 steps humains en direct + outils web_search/fetch_url (labels backend, SSE step, garde SSRF)
CI / lint (push) Successful in 1m22s
CI / security (push) Successful in 55s
CI / test (push) Successful in 3m0s
CI / build (push) Successful in 51s
CI / e2e (push) Successful in 10m41s

This commit is contained in:
2026-09-15 17:46:51 -04:00
parent 18b7dee2f6
commit 19d5b931c4
14 changed files with 745 additions and 32 deletions
+37 -1
View File
@@ -80,4 +80,40 @@
- L'ancien épinglage flex `order: -1` (première itération de #91) est **remplacé** :
l'ordre est redevenu chronologique, l'ancrage est fait par défilement explicite.
- Les pouces haut/bas Notion ne sont **pas** repris : aucun signal n'existe
côté backend ; « Ajouter » (insertion éditeur réelle) les remplace utilement.
côté backend ; « Ajouter » (insertion éditeur réelle) les remplace utilement.
## G. Section « steps » enrichie + outils web (complément #91) — ✅ livré
- [x] **G1.** Chaque étape est décrite par le **backend** (`backend/tools/labels.py`) :
événement SSE `tool` avec `step {key, params}` ; le frontend résout
`ai.step.<key>` (FR/EN) → phrases humaines : « Recherche dans le vault : pizza »,
« Fichier lu : notes/a.md », etc. Outil inconnu → libellé générique (jamais cassé).
- [x] **G2.** Événements en **direct** : les steps sont poussés sur une file
`asyncio.Queue` par la boucle agent et émis dès leur exécution — le bloc
« N étapes » grandit pendant que l'assistant travaille (plus de liste fin de run).
- [x] **G3.** Ligne « Réflexion » (`ai.step.thought`) : quand le modèle émet un
texte intermédiaire avec ses appels d'outils, il est publié comme event SSE
`step` et affiché dans la liste (`. thought` Notion).
- [x] **G4.** Nouveaux outils principaux côté **web** (`backend/tools/web.py`,
risques READ, scope IN_APP, SSRF-guard + limite de taille) :
`web_search` (SearXNG auto-hébergé, configurable via `OBSIGATE_SEARXNG_URL`)
et `fetch_url` (lecture d'une page publique, HTML → texte).
Steps affichés : « Recherche sur le web : … » / « Page web consultée : … ».
### Outils restants — documentés pour le futur (hors #91)
La catégorie Notion « étapes » peut s'étendre ; chaque futur outil devra être un
tool du registre (`@tool`) + un libellé dans `labels.py` + deux clés i18n.
Priorités proposées (à transformer en items `#NN` quand implémentés) :
- **Créer/supprimer un fichier depuis une réponse** : déjà couvert par les cartes
d'action `create_file` / l'outil `create_file` — exposer une action « Créer la
note » dans la barre d'actions (post-traitement du texte copié).
- **Insérer dans le document courant** : l'équivalent « Ajouter » côté assistant
est livré (G) ; l'export vers une sélection précise de l'éditeur reste possible.
- **Convertir un format / tableur / document** : outils `convert_format`,
`create_spreadsheet` (csv/xlsx via backend) — risque WRITE (confirmation).
- **Calendrier / tâches** : intégrer l'API existante `n8n-automation` ou un
serveur MCP externe (la porte MCP est déjà ouverte côté ObsiGate).
- **Courriel / messagerie** : via le serveur MCP externe (Gmail/IMPT SMTP) —
jamais de clé en dur : passer par Infisical.
- **Sources connectées (Slack, GitHub, Drive)** : uniquement par **MCP externe**
(`docs/features/ai-tools-mcp.md`), pas d'outils natifs — l'attaque surface
reste dans le registre + rate-limit + audit.