Innebygde agentverktøy
Dette er de serverbundne verktøyene den innebygde agentkjøretiden registrerer direkte — språkserver, strukturelt søk, feilsøker, kerneler, spørsmål og worker-kontroll — i motsetning til MCP-verktøyene den broer inn, og de generiske fil-, søke- og skallverktøyene fra harness-kjøretiden. De ligger ikke i MCP-registeret: en ekstern MCP-klient ser dem ikke, fordi hvert av dem er bundet til en levende ressurs på serversiden — en språkserverprosess, en feilsøkingsadapter, en tolk — som tilhører én kjøring.
Hvert verktøy her registreres bare når ressursen bak det er koblet opp for kjøringen — en supervisor for språkserveren eller feilsøkeren, en tree-sitter-parser, en kernelfabrikk, en spørsmålsport, en vibe-oversikt. Å oppdage en språkserver eller feilsøkingsadapter for denne utsjekkingen er en egen, senere sjekk (status / adapters): de verktøyene blir liggende på flaten, slik at agenten kan spørre hvorfor ingenting er brukbart, i stedet for å gjette.
Godkjenningsnivåer
Seksjon med tittelen «Godkjenningsnivåer»Hvert verktøy erklærer et nivå, og nivået avgjør hvilke flater som ser det — ikke bare om det spør først. Planmodus og skrivebeskyttede underagenter er begrenset til read, så et verktøy på write- eller exec-nivå er helt fraværende fra skjemaet deres.
| Nivå | Betydning | Verktøy her |
|---|---|---|
read |
Ingen bivirkninger | lsp, ast_grep, ask_user, de fem vibe_* |
write |
Endrer filer | lsp_rename, ast_edit, resolve |
exec |
Starter eller styrer en prosess | debug, eval |
lsp — spørringer mot språkserveren
Seksjon med tittelen «lsp — spørringer mot språkserveren»Registreres når kjøringen har en supervisor for språkserveren og en arbeidskatalog. Om en server faktisk kan svare, oppdages ved kallstid, som et snitt: en rotmarkør må finnes og serverbinærfila må kunne løses opp. Ett av dem alene betyr at ingen server starter — status sier det — i stedet for en stille gjetning.
Posisjoner adresseres med line pluss en symbol-delstreng, aldri med kolonne. En modell som blir bedt om en kolonne, gjetter, og en feil gjetning løses opp til et annet symbol på samme linje — et svar som ser riktig ut og handler om noe annet. Å utelate symbol på en navigasjonshandling er en feil, ikke en gjetning på første kolonne.
| Handling | Argumenter | Returnerer |
|---|---|---|
diagnostics |
file (eller "*") |
Feil og advarsler; "*" kjører prosjektkontrollen i stedet |
definition |
file, line, symbol |
Hvor symbolet er deklarert |
type_definition |
file, line, symbol |
Hvor typen er deklarert |
implementation |
file, line, symbol |
Konkrete implementasjoner |
references |
file, line, symbol |
Hver bruk, begrenset til 50 |
hover |
file, line, symbol |
Signatur og dokumentasjonskommentar |
symbols |
query eller file |
Arbeidsområdesøk med query (begrenset til 100); dokumentsymboler med file (begrenset til 200) |
code_actions |
file, line, symbol |
Hurtigfikser serveren tilbyr |
status |
— | Hvilke servere som kjører, og for hvilke røtter |
reload |
— | Starter serveren på nytt for denne roten |
Diagnostikk ved skriving
Seksjon med tittelen «Diagnostikk ved skriving»Gevinsten er ikke verktøyet. write, edit og apply_patch er pakket inn: etter skrivingen synkroniseres og lagres filen gjennom språkserveren, og bare nyinnført diagnostikk flettes inn i verktøyresultatet. En agent får vite at den ødela bygget i det øyeblikket den ødela det, uten å måtte huske å spørre.
Diagnostikk som allerede er rapportert, undertrykkes av en journal per kjøring, nøklet på alvorlighetsgrad, kode og melding — posisjon bevisst utelatt, så en diagnostisk melding som bare har flyttet seg fire linjer ned, ikke rapporteres på nytt som ny.
lsp_rename — omdøping i hele prosjektet
Seksjon med tittelen «lsp_rename — omdøping i hele prosjektet»Et eget verktøy på write-nivå, av nøyaktig én grunn: nivået avgjør synlighet. Å legge omdøping inn i lsp ville enten gi en skrivebeskyttet utforsker evnen til å skrive om repoet, eller legge hver hover bak en godkjenningsforespørsel.
| Argument | Betydning |
|---|---|
file |
Hvor symbolet er |
line |
1-indeksert linje |
symbol |
Delstreng som identifiserer det på den linjen |
new_name |
Hva det skal hete |
ast_grep — strukturelt søk
Seksjon med tittelen «ast_grep — strukturelt søk»Finner kode etter form i stedet for etter tekst. $NAME matcher hvilken som helst node, $$$NAME matcher en rekke av søsken, og $_ er et jokertegn som ikke binder noe.
Egenskapen som gjør det til en matcher og ikke et regex med ekstra trinn: en metavariabel som gjentas i ett mønster, må fange den samme teksten.
ast_grep(pattern: "if ($X != null) $X.dispose()", language: "dart")matcher en vakt som frigjør det den testet, og matcher ikke en som frigjør noe annet.
| Argument | Betydning |
|---|---|
pattern |
Et kodefragment med metavariabler |
path |
Fil eller mappe å søke i; standard er hele arbeidsområdet |
language |
En id for en medfølgende grammatikk (dart, python, rust, c, …). Utledes når path peker på en fil |
max_results |
Standard 50 |
ast_edit — strukturell omskriving, mellomlagret
Seksjon med tittelen «ast_edit — strukturell omskriving, mellomlagret»Samme matching, pluss en rewrite-mal med metavariablene satt inn igjen. Ingenting skrives. Endringen mellomlagres, og resultatet navngir en 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 | Betydning |
|---|---|
pattern |
Hva som skal matches |
rewrite |
Hva som skal stå der i stedet, med $NAME byttet ut |
path |
Omfang; standard er hele arbeidsområdet |
language |
Språk-id |
resolve — send inn eller forkast en mellomlagret endring
Seksjon med tittelen «resolve — send inn eller forkast en mellomlagret endring»| Argument | Betydning |
|---|---|
edit_id |
Fra (proposed)-resultatet |
action |
accept eller discard |
Hver fil sammenlignes med innholdet som ble fanget opp ved mellomlagringen, og ethvert avvik nekter hele endringen. En delvis anvendt strukturell omskriving etterlater et tre som ikke kompilerer i noen av formene.
debug — styr en feilsøker
Seksjon med tittelen «debug — styr en feilsøker»Registreres når kjøringen har en supervisor for feilsøkingsøkter, en arbeidskatalog og en samtale-id. Om en adapter faktisk kan starte, oppdages ved kallstid, etter samme snittsregel som språkserveren (rotmarkør og binærfil). exec-nivå; ikke parallelltrygt (en økt er tilstand på tvers av kall, så en continue som løper forbi en stack, ville lese en ramme som allerede har flyttet seg).
Én økt per samtale, med en hard TTL (30 minutter). En andre launch nektes i stedet for å stille erstatte den første.
| Operasjon | Argumenter | Merknader |
|---|---|---|
adapters |
— | Hvilke adaptere som er brukbare her, og hvorfor ikke |
status |
— | Om en økt kjører, og hvor den stoppet |
breakpoints |
file, lines[] |
Tom lines tømmer filen. Kan settes før oppstart |
launch |
program, args[] |
Starter programmet stoppet ved bruddpunktene dine |
attach |
port |
Kobler til en feilsøkt prosess som allerede kjører |
continue |
thread_id? |
Kjører til neste stopp |
pause |
thread_id? |
Stopper den der den er |
step_over / step_in / step_out |
thread_id? |
Flytter ett steg |
threads |
— | Tråd-id-er og navn |
stack |
thread_id? |
Rammer, begrenset til 30 |
scopes |
frame_id |
Omfang på en ramme, hvert med en reference |
variables |
reference |
Barn, begrenset til 50, verdier begrenset til 400 tegn |
evaluate |
expression, frame_id? |
Evalueres i rammens eget omfang |
output |
— | Den feilsøkte prosessens stdout/stderr, avgrenset |
terminate |
— | Avslutter økten og dreper adapteren |
Adaptere
Seksjon med tittelen «Adaptere»| 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 foretrekker en prosjektlokal .venv/bin eller venv/bin framfor $PATH: en python fra $PATH er et annet miljø, og å koble til fra det gale miljøet feiler på en måte som leses som ødelagt kode.
eval — vedvarende tolker
Seksjon med tittelen «eval — vedvarende tolker»En Python- eller JavaScript-celle der variabler, importer og innlastet data overlever mellom kall. exec-nivå; ikke parallelltrygt.
| Argument | Betydning |
|---|---|
code |
Cellen |
description |
Påkrevd. 5–10 ord til transkriptetiketten |
language |
python (standard) eller javascript |
reset |
Forkast tolken og start en ren en først |
- Det siste uttrykket ekkoes slik en notatbok gjør.
display()virker, et pandas-dataframe tegnes som en tabell, og en matplotlib-figur kommer tilbake som et bilde transkriptet viser.- IPython-idiomene folk skriver av refleks —
%pip,%cd,!cmd,%%bash,%%timeit— skrives om til ren kode.%piptømmer i tilleggsys.modules, så nesteimportser det som nettopp ble installert.
Kalle dine egne verktøy fra innsiden av en celle
Seksjon med tittelen «Kalle dine egne verktøy fra innsiden av en celle»contents = tool("read", {"path": "lib/auth.dart"})Broen går inn i harnessets verktøyregister på nytt, så tillatelsesregler, godkjenning og hver innpakning gjelder nøyaktig som for et kall fra modellen. Den rir på kernelens eget rør i stedet for en loopback-socket: ingen port, ingen hemmelighet, ingen regel for utgående trafikk.
Cellens tidsavbrudd er et inaktivitetsbudsjett (standard 5 minutter) og settes på pause mens et brokall pågår, så en celle som sprer seg ut til underagenter, ikke drepes midt i utsendelsen.
ask_user — still mennesket et spørsmål
Seksjon med tittelen «ask_user — still mennesket et spørsmål»read-nivå. Den eneste måten en kjøring spør operatøren om noe som helst. Den tegner et nummerert kort i samtalen og blokkerer til noen svarer, hopper over, eller spørsmålet får tidsavbrudd. Skriv aldri spørsmålet som en chatmelding — det avslutter turen.
| Argument | Betydning |
|---|---|
question |
Hva som skal spørres om |
context |
Valgfritt: hvorfor du spør, og hva som avhenger av svaret |
options[] |
Valg, hvert {label, description?} |
allow_free_text |
Om et skrevet svar godtas |
multi_select |
Om flere valg kan velges |
Et hopp over er suksess: gå videre på en uttalt antakelse og ikke spør igjen. Et tidsavbrudd er en feil med samme instruks. Tillatelsesforespørsler («kan jeg gjøre dette?») er en egen port og tegnes som det samme kortet i samtalen.
Registreres bare når både en spørsmålsport og et målområde finnes. Uten et menneske tilkoblet feiler kallet i stedet for å blokkere for alltid — den samme fail-closed-holdningen som en tillatelsesregel med prompt inntar når ingen godkjenner er tilkoblet.
vibe_* — styring av bakgrunnsworkere
Seksjon med tittelen «vibe_* — styring av bakgrunnsworkere»Registreres bare mens vibe-modus er på. Alle fem er på read-nivå: porten hører hjemme på workerens verktøy, der redigeringen faktisk skjer.
| Verktøy | Argumenter | Merknader |
|---|---|---|
vibe_spawn |
brief, label, tier? |
Returnerer umiddelbart; workeren kjører videre |
vibe_send |
worker_id, message |
Legger til i oppdragsbeskrivelsen og kjører på nytt |
vibe_wait |
worker_id, timeout_seconds? |
Blokkerer til den er ferdig |
vibe_kill |
worker_id |
Stopper den |
vibe_list |
— | Nivå, status, medgått tid og siste resultat |
tier er fast (mekanisk arbeid med en klar spesifikasjon) eller good (design, skjønn eller gjennomgang av utdataene til en fast-worker).