Ga naar inhoud

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.

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

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

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

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.


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
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.


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. %pip leegt ook sys.modules, zodat de volgende import ziet wat er net is geïnstalleerd.
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.


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.


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).