Ingebouwde agenttools
Dit zijn de aan de server gebonden tools die de ingebouwde agentruntime rechtstreeks registreert — taalserver, structureel zoeken, debugger, kernels, vragen en workerbesturing — in tegenstelling tot de MCP-tools die hij erin overbrugt en de generieke bestands-, zoek- en shelltools van de harnessruntime. Ze staan niet in het MCP-register: een externe MCP-client ziet ze niet, omdat elke tool gebonden is aan een levende resource aan de serverkant — een taalserverproces, een debugadapter, een interpreter — die bij één run hoort.
Elke tool hier wordt alleen geregistreerd wanneer de onderliggende resource voor de run is aangesloten — een taalserver- of debugsupervisor, een tree-sitter-parser, een factory voor kernels, een vraagpoort, een roster van vibewerkers. Detectie van een taalserver of debugadapter voor deze checkout is een aparte, latere controle (status / adapters): die tools blijven in het aanbod staan zodat de agent kan vragen waarom er niets bruikbaar is, in plaats van te gokken.
Goedkeuringsniveaus
Sectie getiteld “Goedkeuringsniveaus”Elke tool verklaart een niveau, en dat niveau bepaalt welke oppervlakken hem te zien krijgen — niet alleen of hij om goedkeuring vraagt. De planmodus en alleen-lezen subagenten zijn beperkt tot read, dus een tool van het niveau write of exec ontbreekt volledig in hun schema.
| Niveau | Betekenis | Tools hier |
|---|---|---|
read |
Geen neveneffecten | lsp, ast_grep, ask_user, de vijf vibe_* |
write |
Wijzigt bestanden | lsp_rename, ast_edit, resolve |
exec |
Start of bestuurt een proces | debug, eval |
lsp — query’s op de taalserver
Sectie getiteld “lsp — query’s op de taalserver”Wordt geregistreerd wanneer de run een taalserver-supervisor en een werkmap heeft. Of een server werkelijk kan antwoorden, wordt op het moment van de aanroep bepaald, als een doorsnede: er moet een marker in de root staan en de binary van de server moet te vinden zijn. Alleen een van beide betekent dat er geen server start — dat meldt status — in plaats van een stilzwijgende gok.
Posities worden aangeduid met line plus een substring van symbol, nooit met een kolom. Een model dat om een kolom wordt gevraagd, gokt, en een verkeerde gok komt uit op een ander symbool op dezelfde regel — een antwoord dat er goed uitziet maar ergens anders over gaat. Het weglaten van symbol bij een navigatieactie is een fout, geen gok op de eerste kolom.
| Actie | Argumenten | Retourneert |
|---|---|---|
diagnostics |
file (of "*") |
Fouten en waarschuwingen; "*" draait in plaats daarvan de projectchecker |
definition |
file, line, symbol |
Waar het symbool is gedeclareerd |
type_definition |
file, line, symbol |
Waar het type ervan is gedeclareerd |
implementation |
file, line, symbol |
Concrete implementaties |
references |
file, line, symbol |
Elk gebruik, gemaximeerd op 50 |
hover |
file, line, symbol |
Signatuur en doc-commentaar |
symbols |
query of file |
Zoeken in de werkruimte met query (gemaximeerd op 100); documentsymbolen met file (gemaximeerd op 200) |
code_actions |
file, line, symbol |
Snelle oplossingen die de server biedt |
status |
— | Welke servers draaien, en voor welke roots |
reload |
— | Herstart de server voor deze root |
Diagnostiek bij het schrijven
Sectie getiteld “Diagnostiek bij het schrijven”De winst zit niet in de tool. write, edit en apply_patch zijn omhuld: na de schrijfactie wordt het bestand gesynchroniseerd en via de taalserver opgeslagen, en alleen nieuw geïntroduceerde diagnostiek wordt in het resultaat van de tool verwerkt. Een agent merkt dat hij de build heeft gebroken op het moment dat hij hem breekt, zonder eraan te hoeven denken om ernaar te vragen.
Al gemelde diagnostiek wordt onderdrukt door een register per run, met ernst, code en bericht als sleutel — de positie is bewust uitgesloten, zodat een diagnose die alleen vier regels is opgeschoven niet opnieuw als nieuw wordt gemeld.
lsp_rename — hernoemen in het hele project
Sectie getiteld “lsp_rename — hernoemen in het hele project”Een aparte tool van het niveau write, om precies één reden: het niveau bepaalt de zichtbaarheid. Hernoemen onderbrengen in lsp zou een alleen-lezen verkenner ofwel de mogelijkheid geven de repo te herschrijven, ofwel elke hover achter een goedkeuringsprompt zetten.
| Argument | Betekenis |
|---|---|
file |
Waar het symbool staat |
line |
Regel, 1-geïndexeerd |
symbol |
Substring die het op die regel identificeert |
new_name |
Hoe het moet heten |
ast_grep — structureel zoeken
Sectie getiteld “ast_grep — structureel zoeken”Vindt code op vorm in plaats van op tekst. $NAME matcht elk knooppunt, $$$NAME matcht een reeks broers en zussen, en $_ is een jokerteken dat niets vastlegt.
De eigenschap die het een matcher maakt in plaats van een regex met extra stappen: een metavariabele die in één patroon wordt herhaald, moet dezelfde tekst vastleggen.
ast_grep(pattern: "if ($X != null) $X.dispose()", language: "dart")matcht een guard die opruimt wat hij heeft getest, en matcht niet een guard die iets anders opruimt.
| Argument | Betekenis |
|---|---|
pattern |
Een codefragment met metavariabelen |
path |
Bestand of map om in te zoeken; standaard de hele werkruimte |
language |
Een meegeleverd grammatica-id (dart, python, rust, c, …). Wordt afgeleid wanneer path naar een bestand wijst |
max_results |
Standaard 50 |
ast_edit — structurele herschrijving, klaargezet
Sectie getiteld “ast_edit — structurele herschrijving, klaargezet”Dezelfde matching, plus een rewrite-sjabloon waarin de metavariabelen weer worden ingevuld. Er wordt niets geschreven. De wijziging wordt klaargezet en het resultaat noemt een edit_id.
ast_edit(pattern: "dispose($X)", rewrite: "$X.dispose()", language: "dart")→ (proposed) 12 replacements in 4 files … call resolve with edit_id "edit_1"| Argument | Betekenis |
|---|---|
pattern |
Wat moet matchen |
rewrite |
Wat daarvoor in de plaats komt, met $NAME ingevuld |
path |
Bereik; standaard de hele werkruimte |
language |
Taal-id |
resolve — een klaargezette wijziging doorvoeren of weggooien
Sectie getiteld “resolve — een klaargezette wijziging doorvoeren of weggooien”| Argument | Betekenis |
|---|---|
edit_id |
Uit het resultaat van (proposed) |
action |
accept of discard |
Elk bestand wordt vergeleken met de inhoud die op het moment van klaarzetten is vastgelegd, en elke afwijking weigert de hele wijziging. Een gedeeltelijk toegepaste structurele herschrijving laat een boomstructuur achter die onder noch de oude noch de nieuwe vorm compileert.
debug — een debugger aansturen
Sectie getiteld “debug — een debugger aansturen”Wordt geregistreerd wanneer de run een debug-sessiesupervisor, een werkmap en een gespreks-id heeft. Of een adapter werkelijk kan starten, wordt op het moment van de aanroep bepaald, met dezelfde doorsnede-regel als bij de taalserver (marker en binary). Niveau exec; niet parallelveilig (een sessie is toestand over meerdere aanroepen, dus een continue die stack inhaalt, zou een frame lezen dat al is opgeschoven).
Eén sessie per gesprek, met een harde TTL (30 minuten). Een tweede launch wordt geweigerd in plaats van de eerste stil te vervangen.
| Bewerking | Argumenten | Opmerkingen |
|---|---|---|
adapters |
— | Welke adapters hier bruikbaar zijn, en waarom niet |
status |
— | Of er een sessie draait, en waar die is gestopt |
breakpoints |
file, lines[] |
Een lege lines wist het bestand. Mag vóór het starten worden ingesteld |
launch |
program, args[] |
Start het programma en stopt bij je breakpoints |
attach |
port |
Verbindt met een proces dat al onder de debugger draait |
continue |
thread_id? |
Draait tot het volgende stopmoment |
pause |
thread_id? |
Stopt het waar het is |
step_over / step_in / step_out |
thread_id? |
Gaat één stap verder |
threads |
— | Thread-id’s en namen |
stack |
thread_id? |
Frames, gemaximeerd op 30 |
scopes |
frame_id |
Scopes op een frame, elk met een reference |
variables |
reference |
Onderliggende waarden, gemaximeerd op 50; waarden gemaximeerd op 400 tekens |
evaluate |
expression, frame_id? |
Geëvalueerd in de eigen scope van het frame |
output |
— | De stdout/stderr van het debugdoel, begrensd |
terminate |
— | Beëindigt de sessie en stopt de adapter |
Adapters
Sectie getiteld “Adapters”| Id | Commando | Markers in de root |
|---|---|---|
dart |
dart debug_adapter |
pubspec.yaml |
debugpy |
python3 -m debugpy.adapter |
pyproject.toml, setup.py, requirements.txt |
lldb |
lldb-dap |
Cargo.toml, CMakeLists.txt |
delve |
dlv dap |
go.mod |
debugpy verkiest een projectlokale .venv/bin of venv/bin boven $PATH: een python uit $PATH is een andere omgeving, en verbinden vanuit de verkeerde mislukt op een manier die leest als kapotte code.
eval — persistente interpreters
Sectie getiteld “eval — persistente interpreters”Een Python- of JavaScript-cel waarvan variabelen, imports en geladen data tussen aanroepen behouden blijven. Niveau exec; niet parallelveilig.
| Argument | Betekenis |
|---|---|
code |
De cel |
description |
Vereist. 5–10 woorden voor het transcriptlabel |
language |
python (standaard) of javascript |
reset |
Gooi de interpreter weg en start eerst schoon |
- De laatste expressie wordt weergegeven zoals een notebook dat doet.
display()werkt, een pandas-frame wordt als tabel weergegeven, en een matplotlib-figuur komt terug als een afbeelding die het transcript weergeeft.- De IPython-idiomen die mensen reflexmatig typen —
%pip,%cd,!cmd,%%bash,%%timeit— worden herschreven naar gewone code.%pipleegt ooksys.modules, zodat de volgendeimportziet wat er net is geïnstalleerd.
Je eigen tools aanroepen vanuit een cel
Sectie getiteld “Je eigen tools aanroepen vanuit een cel”contents = tool("read", {"path": "lib/auth.dart"})De brug gaat weer het toolregister van de harness binnen, dus beveiligingen, goedkeuring en elke wrapper gelden precies zoals bij een aanroep die het model zelf doet. Hij loopt over de eigen pipe van de kernel in plaats van over een loopback-socket: geen poort, geen secret, geen egress-regel.
De time-out van de cel is een budget voor inactiviteit (standaard 5 minuten) en wordt opgeschort zolang er een aanroep via de brug openstaat, zodat een cel die uitwaaiert naar subagenten niet midden in die uitwaaiering wordt gedood.
ask_user — een mens een vraag stellen
Sectie getiteld “ask_user — een mens een vraag stellen”Niveau read. De enige manier waarop een run de operator iets vraagt. Hij toont een genummerde kaart in het gesprek en blokkeert tot iemand antwoordt, overslaat, of de vraag een time-out krijgt. Schrijf de vraag nooit als chatbericht — dat beëindigt de beurt.
| Argument | Betekenis |
|---|---|
question |
Wat je wilt vragen |
context |
Optioneel: waarom je het vraagt en wat er van het antwoord afhangt |
options[] |
Keuzes, elk {label, description?} |
allow_free_text |
Of een getypt antwoord wordt geaccepteerd |
multi_select |
Of meerdere opties mogen worden gekozen |
Overslaan is succes: ga verder op een uitgesproken aanname en vraag het niet nog eens. Een time-out is een fout met dezelfde instructie. Toestemmingsprompts (“mag ik dit doen?”) zijn een aparte poort en verschijnen als dezelfde kaart in het gesprek.
Wordt alleen geregistreerd wanneer zowel een vraagpoort als een doelruimte bestaat. Zonder aangesloten mens mislukt de aanroep in plaats van voor altijd te blokkeren — dezelfde fail-closed-houding die een prompt van een beveiliging aanneemt wanneer er geen goedkeurder is verbonden.
vibe_* — achtergrondworkers sturen
Sectie getiteld “vibe_* — achtergrondworkers sturen”Wordt alleen geregistreerd zolang de vibe-modus aanstaat. Alle vijf zijn van het niveau read: de poort hoort op de tools van de worker, waar de bewerking werkelijk plaatsvindt.
| Tool | Argumenten | Opmerkingen |
|---|---|---|
vibe_spawn |
brief, label, tier? |
Keert onmiddellijk terug; de worker draait verder |
vibe_send |
worker_id, message |
Vult de briefing aan en draait opnieuw |
vibe_wait |
worker_id, timeout_seconds? |
Blokkeert tot hij is afgerond |
vibe_kill |
worker_id |
Stopt hem |
vibe_list |
— | Niveau, status, verstreken tijd en laatste resultaat |
tier is fast (mechanisch werk met een duidelijke specificatie) of good (ontwerp, beoordeling, of het reviewen van de output van een fast-worker).