feat(assistant): #91 steps humains en direct + outils web_search/fetch_url (labels backend, SSE step, garde SSRF)
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user