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.
Godkännandenivåer
Avsnitt med rubriken “Godkännandenivåer”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 |
lsp — språkserverfrågor
Avsnitt med rubriken “lsp — språkserverfrågor”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 |
Diagnostik vid skrivning
Avsnitt med rubriken “Diagnostik vid skrivning”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.
lsp_rename — namnbyte i hela projektet
Avsnitt med rubriken “lsp_rename — namnbyte i hela projektet”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 |
ast_grep — strukturell sökning
Avsnitt med rubriken “ast_grep — strukturell sökning”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 |
ast_edit — strukturell omskrivning, mellanlagrad
Avsnitt med rubriken “ast_edit — strukturell omskrivning, mellanlagrad”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.
debug — styr en felsökare
Avsnitt med rubriken “debug — styr en felsökare”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 |
Adaptrar
Avsnitt med rubriken “Adaptrar”| 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.
eval — persistenta tolkar
Avsnitt med rubriken “eval — persistenta tolkar”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.%piprensar ocksåsys.modules, så nästaimportser det som just installerades.
Anropa dina egna verktyg inifrån en cell
Avsnitt med rubriken “Anropa dina egna verktyg inifrån en cell”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.
ask_user — ställ en fråga till människan
Avsnitt med rubriken “ask_user — ställ en fråga till människan”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.
vibe_* — styra bakgrundsworkers
Avsnitt med rubriken “vibe_* — styra bakgrundsworkers”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).