Skip to content

Commit 717a617

Browse files
authored
Merge pull request #493 from webbrain-one/docs/simplify-readmes
docs: simplify the three READMEs and split reference material into docs
2 parents d6f3e87 + 4aca293 commit 717a617

15 files changed

Lines changed: 1638 additions & 945 deletions

README.fr.md

Lines changed: 187 additions & 276 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 166 additions & 395 deletions
Large diffs are not rendered by default.

README.zh-CN.md

Lines changed: 155 additions & 274 deletions
Large diffs are not rendered by default.

docs/agent-tools.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# Agent Tools
2+
3+
WebBrain separates **model tier** from **conversation mode**.
4+
5+
- **Tier** (`compact`, `mid`, `full`) is a per-provider setting. It controls how
6+
many normal browser-agent tools a model sees.
7+
- **Mode** (`ask`, `act`, `dev`) is chosen per conversation. It controls what
8+
kind of task the user is allowing.
9+
10+
| Mode | What it allows |
11+
|---|---|
12+
| **Ask** | Read-only. No clicking, typing, navigating, or downloading. |
13+
| **Act** | The selected tier's normal browser tools. |
14+
| **Dev** | Requires a Mid or Full provider. Adds a source/style/debug appendix, including deeper DOM/frame inspection for Mid-tier Dev runs. Compact Dev is blocked before an LLM request is sent. |
15+
16+
| Tier | Intended model class | Normal tool surface |
17+
|---|---|---|
18+
| `compact` | very small local models | Shortest prompt and a small normal Act tool set. No scheduling, iframe, download-resource, or advanced DOM/UI fallbacks. |
19+
| `mid` | capable local models | Common task tools: downloads, scheduling, iframe tools, form verification. No Full-only advanced fallbacks. |
20+
| `full` | frontier/cloud or large local models | Everything, including hover, drag-drop, frames, and shadow DOM. |
21+
22+
Tier defaults and resolution rules are documented in
23+
[providers and models](providers-and-models.md#prompttool-tiers-and-modes).
24+
25+
## Tool matrix
26+
27+
Legend: **Yes** = available · **-** = not available · **C** = Chrome only ·
28+
**Dev** = Dev-mode add-on (Mid/Full providers; not Compact).
29+
30+
| Tool | Ask | Compact | Mid | Full | Dev |
31+
|------|:---:|:-------:|:---:|:----:|:---:|
32+
| `get_accessibility_tree` | Yes | Yes | Yes | Yes | - |
33+
| `read_page` | Yes | Yes | Yes | Yes | - |
34+
| `read_pdf` | Yes | No | Yes | Yes | - |
35+
| `list_webmcp_tools` | C | No | C | C | - |
36+
| `execute_webmcp_tool` | No | No | C | C | - |
37+
| `read_page_source` | No | No | No | No | Yes |
38+
| `get_window_info` | Yes | Yes | Yes | Yes | - |
39+
| `get_interactive_elements` | Yes | No | Yes | Yes | - |
40+
| `scroll` | Yes | Yes | Yes | Yes | - |
41+
| `extract_data` | Yes | Yes | Yes | Yes | - |
42+
| `inspect_element_styles` | No | No | No | No | Yes |
43+
| `wait_for_stable` | Yes | No | Yes | Yes | - |
44+
| `get_selection` | Yes | Yes | Yes | Yes | - |
45+
| `done` | Yes | Yes | Yes | Yes | - |
46+
| `clarify` | No | Yes | Yes | Yes | - |
47+
| `fetch_url` | Yes | Yes | Yes | Yes | - |
48+
| `research_url` | Yes | No | Yes | Yes | - |
49+
| `list_downloads` | Yes | No | Yes | Yes | - |
50+
| `click_ax` | No | Yes | Yes | Yes | - |
51+
| `type_ax` | No | Yes | Yes | Yes | - |
52+
| `set_field` | No | Yes | Yes | Yes | - |
53+
| `resize_window` | No | No | No | Yes | - |
54+
| `click` | No | Yes | Yes | Yes | - |
55+
| `type_text` | No | Yes | Yes | Yes | - |
56+
| `press_keys` | No | Yes | Yes | Yes | - |
57+
| `navigate` | No | Yes | Yes | Yes | - |
58+
| `wait_for_element` | No | Yes | Yes | Yes | - |
59+
| `new_tab` | No | Yes | Yes | Yes | - |
60+
| `scratchpad_write` | No | Yes | Yes | Yes | - |
61+
| `progress_update` | No | Yes | Yes | Yes | - |
62+
| `progress_read` | No | Yes | Yes | Yes | - |
63+
| `download_social_media` | No | No | Yes | Yes | - |
64+
| `solve_captcha` | No | No | Yes | Yes | - |
65+
| `go_back` | No | No | Yes | Yes | - |
66+
| `go_forward` | No | No | Yes | Yes | - |
67+
| `schedule_resume` | No | No | Yes | Yes | - |
68+
| `schedule_task` | No | No | Yes | Yes | - |
69+
| `iframe_read` | No | No | Yes | Yes | - |
70+
| `iframe_click` | No | No | Yes | Yes | - |
71+
| `iframe_type` | No | No | Yes | Yes | - |
72+
| `read_downloaded_file` | No | No | Yes | Yes | - |
73+
| `download_files` | No | No | Yes | Yes | - |
74+
| `download_resource_from_page` | No | No | Yes | Yes | - |
75+
| `upload_file` | No | No | C | C | - |
76+
| `verify_form` | No | No | Yes | Yes | - |
77+
| `hover` | No | No | No | Yes | - |
78+
| `drag_drop` | No | No | No | Yes | - |
79+
| `get_shadow_dom` | No | No | No | Yes | Yes |
80+
| `shadow_dom_query` | No | No | No | C | C |
81+
| `get_frames` | No | No | No | Yes | Yes |
82+
| `inject_css` | No | No | No | No | C |
83+
| `remove_injected_css` | No | No | No | No | C |
84+
| `patch_element` | No | No | No | No | C |
85+
| `revert_patch` | No | No | No | No | C |
86+
| `execute_js` | No | No | No | No | Yes |
87+
| `read_console` | No | No | No | No | C |
88+
| `inspect_network_requests` | No | No | No | No | C |
89+
| `inspect_event_listeners` | No | No | No | No | C |
90+
| `highlight_element` | No | No | No | No | C |
91+
92+
> **Shadow DOM note:** The accessibility tree only traverses light DOM. On Web
93+
> Component-heavy pages (Stripe, Salesforce, Shopify), use
94+
> `get_interactive_elements` first; in Full Act or Dev mode, use
95+
> `get_shadow_dom` / `shadow_dom_query` for targeted reads.
96+
97+
## Tools that are not in the table
98+
99+
**Skill tools.** Loaded skills can append tool schemas for the current run. The
100+
bundled FreeSkillz.xyz skill, for example, can expose `read_youtube_transcript`
101+
plus `resolve_public_media` / `download_public_media`. These are not hard-coded:
102+
before the skill is loaded (or if it is removed), the tools are absent. Ask mode
103+
still filters out mutating and download tools even when their owning skill is
104+
loaded. See [skills](skills.md).
105+
106+
**WebMCP (experimental, opt-in).** The `list_webmcp_tools` /
107+
`execute_webmcp_tool` rows apply only when **Experimental WebMCP** is enabled
108+
under Settings → General → Advanced. The setting is off by default; while off,
109+
the tools and their prompt guidance are omitted from model requests. WebMCP
110+
annotations such as `readOnly` are page-authored hints, not a security boundary.
111+
Every invocation requires Act or Dev, fresh per-call confirmation, and the
112+
normal capability × registration-frame-origin permission. WebMCP currently
113+
requires a supporting Chrome build/page configuration; Firefox does not expose
114+
these tools.
115+
116+
## Dev-mode page editing and diagnostics
117+
118+
Dev tools are only exposed in Dev mode, and Dev mode is blocked for
119+
Compact-tier providers. Chrome's reversible editing tools return patch IDs:
120+
`inject_css` pairs with `remove_injected_css`, and `patch_element` pairs with
121+
`revert_patch`.
122+
123+
- **`inject_css` / `remove_injected_css`** apply and undo temporary CSS by
124+
`patchId`. Each patch is unique and bound to the exact page document, and its
125+
metadata is kept in session storage so a service-worker restart does not lose
126+
the undo handle. Navigating invalidates the old handle instead of letting it
127+
affect a replacement page.
128+
- **`patch_element` / `revert_patch`** make structured inline-style, class, and
129+
attribute changes with exact before/after values. Browser-equivalent style and
130+
HTML attribute names are canonicalized before the undo record is created,
131+
contradictory set/remove operations are rejected, and executable URL
132+
attributes reject `javascript:` values (including form `action`).
133+
`highlight_element` provides a temporary pointer-transparent target overlay;
134+
because it inserts live DOM, it uses the temporary Dev-patch permission.
135+
- **`execute_js`** runs an async JavaScript function body in the page main
136+
world. Chrome uses CDP `Runtime.evaluate` with a 15-second execution limit;
137+
Firefox uses its MV2 content-script evaluator. The tool is host-permission
138+
gated and receives a fresh submit confirmation.
139+
- **`read_console`, `inspect_network_requests`, `inspect_event_listeners`**
140+
provide bounded diagnostics on Chrome. Capture starts before either streaming
141+
or non-streaming Dev runs and stops when the tab leaves Dev mode or its
142+
conversation is cleared; leaving Dev drains every tab with active capture even
143+
if the panel switched tabs, removes handlers and buffers, and disables the
144+
matching CDP domains. Listener inspection briefly adds and restores an
145+
internal target attribute, follows open-shadow hosts when collecting
146+
ancestors, and therefore uses the same host permission as temporary Dev
147+
patches. Network headers and bodies are omitted by default, sensitive header
148+
names (including common API/subscription-key variants) are redacted before
149+
buffering, and page-derived diagnostic output is treated as untrusted content.
150+
151+
## See also
152+
153+
- [Adding a tool](adding-a-tool.md) — the checklist for new or changed tools
154+
- [Accessibility tree and refs](accessibility-tree-and-refs.md)
155+
- [Security model](security-model.md) and
156+
[prompt-injection defense](prompt-injection-defense.md)

docs/fr/agent-tools.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# Outils de l'agent
2+
3+
WebBrain sépare le **niveau du modèle** du **mode de conversation**.
4+
5+
- **Niveau** (`compact`, `mid`, `full`) est un réglage par fournisseur. Il
6+
contrôle le nombre d'outils navigateur normaux que le modèle voit.
7+
- **Mode** (`ask`, `act`, `dev`) est choisi par conversation. Il contrôle le type
8+
de tâche que l'utilisateur autorise.
9+
10+
| Mode | Ce qu'il autorise |
11+
|---|---|
12+
| **Ask** | Lecture seule. Pas de clic, de saisie, de navigation ni de téléchargement. |
13+
| **Act** | Les outils navigateur normaux du niveau sélectionné. |
14+
| **Dev** | Exige un fournisseur Mid ou Full. Ajoute une annexe source/style/debug, y compris une inspection DOM/frame plus profonde pour les exécutions Dev en Mid. Le mode Dev en Compact est bloqué avant l'envoi d'une requête au LLM. |
15+
16+
| Niveau | Classe de modèle visée | Surface d'outils normaux |
17+
|---|---|---|
18+
| `compact` | très petits modèles locaux | Prompt le plus court et petit ensemble d'outils Act normaux. Pas de planification, d'iframe, de téléchargement de ressource ni de repli DOM/UI avancé. |
19+
| `mid` | modèles locaux capables | Outils de tâche courants : téléchargements, planification, outils iframe, vérification de formulaires. Sans les replis avancés réservés à Full. |
20+
| `full` | modèles frontière/cloud ou grands modèles locaux | Tout, y compris hover, drag-drop, frames et shadow DOM. |
21+
22+
Les valeurs par défaut et les règles de résolution des niveaux sont documentées
23+
dans [fournisseurs et modèles](providers-and-models.md#niveaux-de-promptoutils-et-modes).
24+
25+
## Matrice des outils
26+
27+
Légende : **Oui** = disponible · **-** = indisponible · **C** = Chrome
28+
uniquement · **Dev** = module Dev (fournisseurs Mid/Full ; pas Compact).
29+
30+
| Outil | Ask | Compact | Mid | Full | Dev |
31+
|-------|:---:|:-------:|:---:|:----:|:---:|
32+
| `get_accessibility_tree` | Oui | Oui | Oui | Oui | - |
33+
| `read_page` | Oui | Oui | Oui | Oui | - |
34+
| `read_pdf` | Oui | Non | Oui | Oui | - |
35+
| `list_webmcp_tools` | C | Non | C | C | - |
36+
| `execute_webmcp_tool` | Non | Non | C | C | - |
37+
| `read_page_source` | Non | Non | Non | Non | Oui |
38+
| `get_window_info` | Oui | Oui | Oui | Oui | - |
39+
| `get_interactive_elements` | Oui | Non | Oui | Oui | - |
40+
| `scroll` | Oui | Oui | Oui | Oui | - |
41+
| `extract_data` | Oui | Oui | Oui | Oui | - |
42+
| `inspect_element_styles` | Non | Non | Non | Non | Oui |
43+
| `wait_for_stable` | Oui | Non | Oui | Oui | - |
44+
| `get_selection` | Oui | Oui | Oui | Oui | - |
45+
| `done` | Oui | Oui | Oui | Oui | - |
46+
| `clarify` | Non | Oui | Oui | Oui | - |
47+
| `fetch_url` | Oui | Oui | Oui | Oui | - |
48+
| `research_url` | Oui | Non | Oui | Oui | - |
49+
| `list_downloads` | Oui | Non | Oui | Oui | - |
50+
| `click_ax` | Non | Oui | Oui | Oui | - |
51+
| `type_ax` | Non | Oui | Oui | Oui | - |
52+
| `set_field` | Non | Oui | Oui | Oui | - |
53+
| `resize_window` | Non | Non | Non | Oui | - |
54+
| `click` | Non | Oui | Oui | Oui | - |
55+
| `type_text` | Non | Oui | Oui | Oui | - |
56+
| `press_keys` | Non | Oui | Oui | Oui | - |
57+
| `navigate` | Non | Oui | Oui | Oui | - |
58+
| `wait_for_element` | Non | Oui | Oui | Oui | - |
59+
| `new_tab` | Non | Oui | Oui | Oui | - |
60+
| `scratchpad_write` | Non | Oui | Oui | Oui | - |
61+
| `progress_update` | Non | Oui | Oui | Oui | - |
62+
| `progress_read` | Non | Oui | Oui | Oui | - |
63+
| `download_social_media` | Non | Non | Oui | Oui | - |
64+
| `solve_captcha` | Non | Non | Oui | Oui | - |
65+
| `go_back` | Non | Non | Oui | Oui | - |
66+
| `go_forward` | Non | Non | Oui | Oui | - |
67+
| `schedule_resume` | Non | Non | Oui | Oui | - |
68+
| `schedule_task` | Non | Non | Oui | Oui | - |
69+
| `iframe_read` | Non | Non | Oui | Oui | - |
70+
| `iframe_click` | Non | Non | Oui | Oui | - |
71+
| `iframe_type` | Non | Non | Oui | Oui | - |
72+
| `read_downloaded_file` | Non | Non | Oui | Oui | - |
73+
| `download_files` | Non | Non | Oui | Oui | - |
74+
| `download_resource_from_page` | Non | Non | Oui | Oui | - |
75+
| `upload_file` | Non | Non | C | C | - |
76+
| `verify_form` | Non | Non | Oui | Oui | - |
77+
| `hover` | Non | Non | Non | Oui | - |
78+
| `drag_drop` | Non | Non | Non | Oui | - |
79+
| `get_shadow_dom` | Non | Non | Non | Oui | Oui |
80+
| `shadow_dom_query` | Non | Non | Non | C | C |
81+
| `get_frames` | Non | Non | Non | Oui | Oui |
82+
| `inject_css` | Non | Non | Non | Non | C |
83+
| `remove_injected_css` | Non | Non | Non | Non | C |
84+
| `patch_element` | Non | Non | Non | Non | C |
85+
| `revert_patch` | Non | Non | Non | Non | C |
86+
| `execute_js` | Non | Non | Non | Non | Oui |
87+
| `read_console` | Non | Non | Non | Non | C |
88+
| `inspect_network_requests` | Non | Non | Non | Non | C |
89+
| `inspect_event_listeners` | Non | Non | Non | Non | C |
90+
| `highlight_element` | Non | Non | Non | Non | C |
91+
92+
> **Note Shadow DOM :** L'arbre d'accessibilité ne traverse que le light DOM.
93+
> Sur les pages riches en Web Components (Stripe, Salesforce, Shopify), utilisez
94+
> d'abord `get_interactive_elements` ; en Full Act ou Dev, utilisez
95+
> `get_shadow_dom` / `shadow_dom_query` pour des lectures ciblées.
96+
97+
## Outils absents du tableau
98+
99+
**Outils de compétence.** Les compétences chargées peuvent ajouter des schémas
100+
d'outils pour l'exécution en cours. La compétence FreeSkillz.xyz intégrée, par
101+
exemple, peut exposer `read_youtube_transcript` ainsi que
102+
`resolve_public_media` / `download_public_media`. Ces outils ne sont pas codés en
103+
dur : avant le chargement de la compétence (ou si elle est retirée), ils sont
104+
absents. Le mode Ask filtre toujours les outils de mutation et de téléchargement,
105+
même lorsque la compétence propriétaire est chargée. Voir
106+
[compétences](skills.md).
107+
108+
**WebMCP (expérimental, sur activation).** Les lignes `list_webmcp_tools` /
109+
`execute_webmcp_tool` ne s'appliquent que lorsque **WebMCP expérimental** est
110+
activé dans Paramètres → Général → Avancé. Le réglage est désactivé par défaut ;
111+
tant qu'il l'est, les outils et leurs consignes de prompt sont omis des requêtes
112+
au modèle. Les annotations WebMCP telles que `readOnly` sont des indications
113+
écrites par la page, pas une frontière de sécurité. Chaque invocation exige Act
114+
ou Dev, une confirmation fraîche à chaque appel, et la permission normale
115+
capacité × origine de la frame d'enregistrement. WebMCP nécessite actuellement
116+
un build/une configuration de page Chrome compatible ; Firefox n'expose pas ces
117+
outils.
118+
119+
## Édition et diagnostics en mode Dev
120+
121+
Les outils Dev ne sont exposés qu'en mode Dev, et le mode Dev est bloqué pour les
122+
fournisseurs de niveau Compact. Les outils d'édition réversible de Chrome
123+
renvoient des patch IDs : `inject_css` va avec `remove_injected_css`, et
124+
`patch_element` avec `revert_patch`.
125+
126+
- **`inject_css` / `remove_injected_css`** appliquent et annulent du CSS
127+
temporaire par `patchId`. Chaque patch est unique et lié au document exact de
128+
la page, et ses métadonnées sont conservées en session storage pour qu'un
129+
redémarrage du service worker ne perde pas la poignée d'annulation. La
130+
navigation invalide l'ancienne poignée au lieu de la laisser affecter une page
131+
de remplacement.
132+
- **`patch_element` / `revert_patch`** effectuent des modifications structurées
133+
de styles inline, de classes et d'attributs avec des valeurs avant/après
134+
exactes. Les noms de styles et d'attributs HTML équivalents sont canonicalisés
135+
avant la création de l'enregistrement d'annulation, les opérations
136+
set/remove contradictoires sont rejetées, et les attributs d'URL exécutables
137+
rejettent les valeurs `javascript:` (y compris `action` de formulaire).
138+
`highlight_element` fournit une surcouche de cible temporaire transparente aux
139+
pointeurs ; comme elle insère du DOM vivant, elle utilise la permission de
140+
patch Dev temporaire.
141+
- **`execute_js`** exécute un corps de fonction JavaScript asynchrone dans le
142+
monde principal de la page. Chrome utilise CDP `Runtime.evaluate` avec une
143+
limite d'exécution de 15 secondes ; Firefox utilise son évaluateur de script de
144+
contenu MV2. L'outil est soumis à une permission d'hôte et reçoit une
145+
confirmation de soumission fraîche.
146+
- **`read_console`, `inspect_network_requests`, `inspect_event_listeners`**
147+
fournissent des diagnostics bornés sur Chrome. La capture démarre avant les
148+
exécutions Dev streamées ou non, et s'arrête quand l'onglet quitte le mode Dev
149+
ou que sa conversation est effacée ; quitter Dev vide tous les onglets ayant
150+
une capture active même si le panneau a changé d'onglet, retire les
151+
gestionnaires et les tampons, et désactive les domaines CDP correspondants.
152+
L'inspection des écouteurs ajoute et restaure brièvement un attribut de cible
153+
interne, suit les hôtes shadow ouverts lors de la collecte des ancêtres, et
154+
utilise donc la même permission d'hôte que les patchs Dev temporaires. Les
155+
en-têtes et corps réseau sont omis par défaut, les noms d'en-têtes sensibles
156+
(y compris les variantes courantes de clés d'API/d'abonnement) sont caviardés
157+
avant la mise en tampon, et la sortie de diagnostic issue de la page est
158+
traitée comme du contenu non fiable.
159+
160+
## Voir aussi
161+
162+
- [Ajouter un outil](adding-a-tool.md) — la checklist pour les outils nouveaux ou
163+
modifiés
164+
- [Arbre d'accessibilité et refs](accessibility-tree-and-refs.md)
165+
- [Modèle de sécurité](security-model.md) et
166+
[défense contre l'injection de prompt](prompt-injection-defense.md)

docs/fr/providers-and-models.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,31 @@ serveur local a été démarré avec authentification :
126126

127127
Les sept ont `supportsVision: true` par défaut car la plupart des modèles chargés localement en 2026 sont multimodaux.
128128

129+
#### Relais de lancement Ollama (préversion)
130+
131+
<p align="center">
132+
<img src="../../web/assets/webbrain-ollama-heart.png" alt="WebBrain adore le relais de lancement Ollama" width="720">
133+
</p>
134+
135+
WebBrain prend aujourd'hui en charge Ollama via le fournisseur local compatible
136+
OpenAI. Un nouveau relais `ollama launch webbrain --model <model>` peut aussi
137+
configurer WebBrain automatiquement, mais il n'est pas encore intégré à Ollama
138+
en amont. Pour l'instant, essayez-le depuis la [branche
139+
`codex/ollama-webbrain-launch-handoff` de
140+
`esokullu/ollama`](https://github.com/esokullu/ollama/tree/codex/ollama-webbrain-launch-handoff) ;
141+
nous espérons qu'Ollama l'intégrera en amont.
142+
143+
```bash
144+
git clone https://github.com/esokullu/ollama.git
145+
cd ollama
146+
git switch codex/ollama-webbrain-launch-handoff
147+
cmake -S . -B build -G Ninja -DOLLAMA_MLX_BACKENDS=
148+
cmake --build build --parallel 8
149+
150+
OLLAMA_ORIGINS="chrome-extension://*,moz-extension://*" ./ollama serve
151+
./ollama launch webbrain --model <model>
152+
```
153+
129154
**Fenêtre de contexte.** Chargez les modèles locaux avec **au moins une fenêtre de contexte de 16k tokens** pour des exécutions d'agent fiables — c'est le minimum utilisable. 8k peut fonctionner avec le niveau Compact sélectionné ; 4k est trop petit pour contenir le prompt système + les schémas d'outils. L'agent lit la fenêtre depuis `provider.contextWindow` (`providers/base.js`) pour piloter l'auto-compaction ; quand une configuration de fournisseur ne définit pas `contextWindow`, les fournisseurs locaux utilisent par défaut une valeur prudente de **16k** (cloud/routeur par défaut à 128k). **Tester la connexion** / **Charger les modèles** détectent pour **llama.cpp**, **Ollama** et **LM Studio** quand c'est rapporté (llama.cpp `GET /props` `n_ctx`, Ollama `GET /api/ps` puis `/api/show` `num_ctx`, LM Studio `/api/v0/models` `loaded_context_length`). La détection rafraîchit le 16k par défaut ; elle réduit une surcharge manuelle plus grande seulement depuis le contexte live/runtime (pas depuis Ollama `/api/show` seul). Jan / vLLM / SGLang / LocalAI ne détectent pas encore. Vous pouvez toujours définir `config.contextWindow` explicitement, et le serveur de modèle doit effectivement être démarré avec cette taille de contexte (par exemple `llama-server -c 16384`).
130155

131156
### Niveaux de prompt/outils et modes

0 commit comments

Comments
 (0)