Gå til innholdet

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.

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

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

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.

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

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

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.


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


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. %pip tømmer i tillegg sys.modules, så neste import ser det som nettopp ble installert.
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.


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.


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