Hoppa till innehåll

Inbyggda agentverktyg

De här är de serverbundna verktyg som den inbyggda agentköraren registrerar direkt – språkserver, strukturell sökning, felsökare, kernlar, frågor och workerstyrning – till skillnad från de MCP-verktyg den bryggar in och de generiska fil-, sök- och shellverktygen från harnessens körare. De finns inte i MCP-registret: en extern MCP-klient ser dem inte, eftersom var och en är bunden till en levande resurs på serversidan – en språkserverprocess, en felsökningsadapter, en tolk – som hör till en enda körning.

Varje verktyg här registreras bara när dess underliggande resurs är inkopplad för körningen – en språkserver- eller felsökningsövervakare, en tree-sitter-parser, en kernelfabrik, en frågeport, en vibe-trupp. Detekteringen av en språkserver eller felsökningsadapter för den här utcheckningen är en separat, senare kontroll (status / adapters): de verktygen ligger kvar på ytan så att agenten kan fråga varför inget går att använda, i stället för att gissa.

Varje verktyg deklarerar en nivå, och nivån avgör vilka ytor som ser det – inte bara om det frågar först. Planläget och skrivskyddade subagenter begränsas till read, så ett verktyg på write- eller exec-nivån saknas helt i deras schema.

Nivå Innebörd Verktyg här
read Inga sidoeffekter lsp, ast_grep, ask_user, de fem vibe_*
write Ändrar filer lsp_rename, ast_edit, resolve
exec Startar eller styr en process debug, eval

Registreras när körningen har en språkserverövervakare och en arbetskatalog. Huruvida en server faktiskt kan svara upptäcks vid anropstillfället, som en skärning: en rotmarkör måste finnas och serverns binärfil måste gå att slå upp. Bara en av dem betyder att ingen server startar – det säger status – i stället för en tyst gissning.

Positioner anges med line plus en delsträng i symbol, aldrig med kolumn. En modell som ombeds ange en kolumn gissar, och en felaktig gissning pekar ut en annan symbol på samma rad – ett svar som ser rätt ut men handlar om något annat. Att utelämna symbol i en navigeringsåtgärd är ett fel, inte en gissning på första kolumnen.

Åtgärd Argument Returnerar
diagnostics file (eller "*") Fel och varningar; "*" kör projektkontrollen i stället
definition file, line, symbol Var symbolen är deklarerad
type_definition file, line, symbol Var dess typ är deklarerad
implementation file, line, symbol Konkreta implementationer
references file, line, symbol Varje användning, högst 50
hover file, line, symbol Signatur och dokumentationskommentar
symbols query eller file Sökning i arbetsytan med query (högst 100); dokumentsymboler med file (högst 200)
code_actions file, line, symbol Snabbkorrigeringar som servern erbjuder
status — Vilka servrar som körs, och för vilka rötter
reload — Startar om servern för den här roten

Vinsten är inte verktyget. write, edit och apply_patch är omslutna: efter skrivningen synkas och sparas filen genom språkservern, och bara nyintroducerad diagnostik vävs in i verktygets resultat. En agent får veta att den bröt bygget i samma stund som den bröt det, utan att behöva komma ihåg att fråga.

Diagnostik som redan har rapporterats dämpas av en liggare per körning, nycklad på allvarlighetsgrad, kod och meddelande – positionen medvetet utesluten, så en diagnostik som bara flyttade ned fyra rader rapporteras inte om som ny.

Ett separat verktyg på write-nivån, av exakt en anledning: nivån avgör synligheten. Att lägga in namnbyte i lsp skulle antingen ge en skrivskyddad utforskare förmågan att skriva om repot, eller sätta varje hover bakom en godkännandeförfrågan.

Argument Innebörd
file Var symbolen finns
line 1-indexerad rad
symbol Delsträng som identifierar den på raden
new_name Vad den ska heta

Hittar kod efter form i stället för efter text. $NAME matchar vilken nod som helst, $$$NAME matchar en följd av syskon, och $_ är ett jokertecken som inte binder något.

Egenskapen som gör det till en matchare i stället för ett regex med extra steg: en metavariabel som upprepas i ett mönster måste fånga samma text.

ast_grep(pattern: "if ($X != null) $X.dispose()", language: "dart")

matchar ett skydd som frigör det det testade, och matchar inte ett som frigör något annat.

Argument Innebörd
pattern Ett kodfragment med metavariabler
path Fil eller katalog att söka i; standard är hela arbetsytan
language Ett medföljande grammatik-id (dart, python, rust, c, …). Härleds när path anger en fil
max_results Standard 50

Samma matchning, plus en rewrite-mall där metavariablerna sätts tillbaka. Ingenting skrivs. Ändringen mellanlagras och resultatet namnger ett 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 Innebörd
pattern Vad som ska matchas
rewrite Vad som ska stå där i stället, med $NAME substituerat
path Omfång; standard är hela arbetsytan
language Språk-id

resolve — committa eller kasta en mellanlagrad ändring

Avsnitt med rubriken “resolve — committa eller kasta en mellanlagrad ändring”
Argument Innebörd
edit_id Från resultatet (proposed)
action accept eller discard

Varje fil jämförs mot innehållet som fångades vid mellanlagringen, och varje avvikelse avvisar hela ändringen. En delvis tillämpad strukturell omskrivning lämnar ett träd som inte kompilerar i någon av formerna, varken den gamla eller den nya.


Registreras när körningen har en övervakare för felsökningssessioner, en arbetskatalog och ett samtals-id. Huruvida en adapter faktiskt kan starta upptäcks vid anropstillfället, enligt samma skärningsregel som för språkservern (rotmarkör och binärfil). Nivån exec; inte parallellsäker (en session är tillstånd mellan anrop, så om continue kör om stack läses en ram som redan har flyttat sig).

En session per samtal, med en hård TTL (30 minuter). En andra launch avvisas i stället för att tyst ersätta den första.

Op Argument Anmärkningar
adapters — Vilka adaptrar som går att använda här, och varför inte
status — Om en session körs, och var den stoppade
breakpoints file, lines[] Tomma lines rensar filen. Kan sättas före start
launch program, args[] Startar programmet stoppat vid dina brytpunkter
attach port Ansluter till ett redan körande felsökningsobjekt
continue thread_id? Kör tills nästa stopp
pause thread_id? Stoppar det där det är
step_over / step_in / step_out thread_id? Flyttar ett steg
threads — Tråd-id och namn
stack thread_id? Ramar, högst 30
scopes frame_id Omfång på en ram, varje med en reference
variables reference Barn, högst 50, värden högst 400 tecken
evaluate expression, frame_id? Utvärderas i ramens eget omfång
output — Felsökningsobjektets stdout/stderr, begränsad
terminate — Avslutar sessionen och dödar adaptern
Id Kommando Rotmarkörer
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 föredrar ett projektlokalt .venv/bin eller venv/bin framför $PATH: en python från $PATH är en annan miljö, och att ansluta från fel miljö misslyckas på ett sätt som läses som trasig kod.


En Python- eller JavaScript-cell vars variabler, importer och inlästa data överlever mellan anrop. Nivån exec; inte parallellsäker.

Argument Innebörd
code Cellen
description Obligatorisk. 5–10 ord för transkriptets etikett
language python (standard) eller javascript
reset Kasta tolken och börja med en ren först
  • Det sista uttrycket skrivs ut på samma sätt som i en notebook.
  • display() fungerar, en pandas-DataFrame renderas som en tabell, och en matplotlib-figur kommer tillbaka som en bild som transkriptet visar.
  • IPython-idiomen som folk skriver per reflex – %pip, %cd, !cmd, %%bash, %%timeit – skrivs om till vanlig kod. %pip rensar också sys.modules, så nästa import ser det som just installerades.
contents = tool("read", {"path": "lib/auth.dart"})

Bryggan går in i harnessens verktygsregister igen, så räcken, godkännande och varje wrapper gäller precis som för ett anrop som modellen utfärdar. Den går över kernens egen pipe i stället för en loopback-socket: ingen port, ingen hemlighet, ingen utgångsregel.

Cellens tidsgräns är en inaktivitetsbudget (standard 5 minuter) och den pausas medan ett bryggat anrop pågår, så en cell som sprider ut arbetet till subagenter dödas inte mitt i utspridningen.


Nivån read. Det enda sättet en körning frågar operatören något. Det visar ett numrerat kort i samtalet och blockerar tills någon svarar, hoppar över eller frågan når sin tidsgräns. Skriv aldrig frågan som ett chattmeddelande – det avslutar turen.

Argument Innebörd
question Vad du frågar
context Valfritt: varför du frågar och vad som hänger på svaret
options[] Alternativ, varje {label, description?}
allow_free_text Om ett skrivet svar accepteras
multi_select Om flera alternativ får väljas

En överhoppning är framgång: fortsätt på ett uttalat antagande och fråga inte igen. En tidsgräns är ett fel med samma instruktion. Behörighetsförfrågningar (”får jag göra det här?”) är en egen grind och visas som samma kort i samtalet.

Registreras bara när både en frågeport och en målyta finns. Utan en ansluten människa misslyckas anropet i stället för att blockera för evigt – samma hållning med stängning vid fel som en räckes-prompt intar när ingen godkännare är ansluten.


Registreras bara medan vibe-läget är på. Alla fem har nivån read: grinden hör hemma på workerns verktyg, där redigeringen faktiskt sker.

Verktyg Argument Anmärkningar
vibe_spawn brief, label, tier? Återvänder omedelbart; workern fortsätter
vibe_send worker_id, message Lägger till i briefen och kör igen
vibe_wait worker_id, timeout_seconds? Blockerar tills den är klar
vibe_kill worker_id Stoppar den
vibe_list — Nivå, status, förfluten tid och senaste resultat

tier är fast (mekaniskt arbete med en tydlig specifikation) eller good (design, omdöme eller granskning av en fast-workers utdata).