Tovább a tartalomhoz

Beépített ügynökeszközök

Ezek azok a szerverhez kötött eszközök, amelyeket a beépített ügynök-futtatókörnyezet közvetlenül regisztrál – nyelvi szerver, strukturális keresés, hibakereső, kernelek, kérdések és worker-vezérlés –, szemben az általa behidalazott MCP-eszközökkel és a harness futtatókörnyezetéből származó általános fájl-, kereső- és shelleszközökkel. Ezek nincsenek benne az MCP-jegyzékben: egy külső MCP-kliens nem látja őket, mert mindegyik egy élő szerveroldali erőforráshoz van kötve – egy nyelviszerver-folyamathoz, egy hibakereső adapterhez, egy értelmezőhöz –, amely egyetlen futtatáshoz tartozik.

Az itteni eszközök csak akkor kerülnek regisztrálásra, ha a mögöttes erőforrásuk be van kötve a futtatáshoz – egy nyelviszerver- vagy hibakereső-felügyelő, egy tree-sitter-parser, egy kernelgyár, egy kérdésport, egy vibe-névsor. Az, hogy ebben a checkoutban észlelhető-e nyelvi szerver vagy hibakereső adapter, külön, későbbi ellenőrzés (status / adapters): ezek az eszközök a felületen maradnak, hogy az ügynök megkérdezhesse, miért nem használható semmi, ahelyett hogy találgatna.

Minden eszköz deklarál egy szintet, és a szint dönti el, mely felületek látják – nem csupán azt, hogy kér-e jóváhagyást. A tervmód és a csak olvasható alügynökök a read szintre vannak korlátozva, így egy write vagy exec szintű eszköz teljesen hiányzik a sémájukból.

Szint Jelentés Eszközök itt
read Nincs mellékhatás lsp, ast_grep, ask_user, az öt vibe_*
write Fájlokat módosít lsp_rename, ast_edit, resolve
exec Elindít vagy vezérel egy folyamatot debug, eval

Akkor kerül regisztrálásra, ha a futtatásnak van nyelviszerver-felügyelője és munkakönyvtára. Az, hogy egy szerver valóban tud-e válaszolni, híváskor derül ki, metszetként: lennie kell gyökérjelölőnek, és fel kell oldódnia a szerver binárisának. Bármelyik önmagában azt jelenti, hogy nem indul szerver – a status ezt megmondja –, ahelyett hogy csendben találgatna.

A pozíciókat line és egy symbol részstring címzi meg, soha nem oszlop. Egy oszlopra kért modell találgat, és egy rossz találgatás ugyanazon a soron egy másik szimbólumra oldódik fel – egy válasz, amely helyesnek látszik, és valami másról szól. A symbol elhagyása egy navigációs műveletnél hiba, nem pedig az első oszlopra vonatkozó tipp.

Művelet Argumentumok Visszatérés
diagnostics file (vagy "*") Hibák és figyelmeztetések; a "*" helyette a projektellenőrzőt futtatja
definition file, line, symbol Hol van deklarálva a szimbólum
type_definition file, line, symbol Hol van deklarálva a típusa
implementation file, line, symbol Konkrét implementációk
references file, line, symbol Minden használat, 50-re korlátozva
hover file, line, symbol Szignatúra és dokumentációs megjegyzés
symbols query vagy file Munkaterületi keresés query-vel (100-ra korlátozva); dokumentumszimbólumok file-lal (200-ra korlátozva)
code_actions file, line, symbol A szerver által felkínált gyorsjavítások
status — Mely szerverek futnak, és mely gyökerekhez
reload — Újraindítja a szervert ehhez a gyökérhez

A haszon nem maga az eszköz. A write, az edit és az apply_patch be van csomagolva: az írás után a fájl szinkronizálódik és mentődik a nyelvi szerveren keresztül, és csak az újonnan bevezetett diagnosztikák kerülnek be az eszköz eredményébe. Az ügynök abban a pillanatban megtudja, hogy eltörte a buildet, amikor eltörte, anélkül hogy emlékeznie kellene rá, hogy megkérdezze.

A már jelentett diagnosztikákat egy futásonkénti nyilvántartás nyomja el, amely súlyosság, kód és üzenet szerint indexelt – a pozíció szándékosan kimarad, így az a diagnosztika, amely csak négy sorral lejjebb került, nem jelenik meg újként.

lsp_rename – projekt szintű átnevezés

Szekció neve “lsp_rename – projekt szintű átnevezés”

Külön, write szintű eszköz, pontosan egy okból: a szint dönti el a láthatóságot. Ha az átnevezést az lsp-be olvasztanánk, az vagy egy csak olvasható felfedezőnek adná a repó átírásának képességét, vagy minden hover mögé jóváhagyási kérést tenne.

Argumentum Jelentés
file Hol van a szimbólum
line 1-től indexelt sor
symbol Az adott soron azonosító részstring
new_name Minek nevezzük

Alak alapján talál meg kódot, nem szöveg alapján. A $NAME bármely csomópontra illeszkedik, a $$$NAME testvérek egy sorozatára, a $_ pedig egy helyettesítő, amely semmit sem köt meg.

Az a tulajdonság, amely illesztővé teszi, és nem csupán egy plusz lépésekkel felcicomázott regexszé: egy mintában megismételt metaváltozónak ugyanazt a szöveget kell elkapnia.

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

egy olyan őrfeltételre illeszkedik, amely azt szabadítja fel, amit vizsgált, és nem illeszkedik arra, amely valami mást szabadít fel.

Argumentum Jelentés
pattern Metaváltozókat tartalmazó kódrészlet
path Keresendő fájl vagy könyvtár; alapértelmezésben a teljes munkaterület
language Egy szállított nyelvtan azonosítója (dart, python, rust, c, …). Kikövetkeztetve, amikor a path fájlt nevez meg
max_results Alapértelmezés: 50

ast_edit – strukturális átírás, előkészítve

Szekció neve “ast_edit – strukturális átírás, előkészítve”

Ugyanaz az illesztés, plusz egy rewrite sablon, amelybe a metaváltozók visszahelyettesítődnek. Semmi sem íródik ki. A változtatás előkészítésre kerül, és az eredmény megnevez egy edit_id-t.

ast_edit(pattern: "dispose($X)", rewrite: "$X.dispose()", language: "dart")
→ (proposed) 12 replacements in 4 files … call resolve with edit_id "edit_1"
Argumentum Jelentés
pattern Mit kell illeszteni
rewrite Mit tegyen a helyére, $NAME behelyettesítve
path Hatókör; alapértelmezésben a teljes munkaterület
language Nyelvazonosító

resolve – egy előkészített változtatás véglegesítése vagy elvetése

Szekció neve “resolve – egy előkészített változtatás véglegesítése vagy elvetése”
Argumentum Jelentés
edit_id A (proposed) eredményből
action accept vagy discard

Minden fájlt az előkészítéskor rögzített tartalomhoz hasonlítanak össze, és bármilyen eltérés visszautasítja a teljes változtatást. A részben alkalmazott strukturális átírás olyan fát hagy maga után, amely sem a régi, sem az új alak szerint nem fordul le.


Akkor kerül regisztrálásra, ha a futtatásnak van hibakeresési munkamenet-felügyelője, munkakönyvtára és beszélgetésazonosítója. Az, hogy egy adapter valóban el tud-e indulni, híváskor derül ki, ugyanazzal a metszetszabállyal, mint a nyelvi szervernél (gyökérjelölő és bináris). exec szint; párhuzamosan nem biztonságos (a munkamenet hívásokon átívelő állapot, így a continue, amely megelőzné a stack-et, egy már elmozdult keretet olvasna).

Beszélgetésenként egy munkamenet, kemény TTL-lel (30 perc). Egy második launch visszautasításra kerül, ahelyett hogy csendben lecserélné az elsőt.

Művelet Argumentumok Megjegyzések
adapters — Mely adapterek használhatók itt, és miért nem
status — Fut-e munkamenet, és hol állt meg
breakpoints file, lines[] Az üres lines törli a fájlt. Indítás előtt is beállítható
launch program, args[] Elindítja a programot, a töréspontjainál megállva
attach port Csatlakozik egy már futó, hibakeresett folyamathoz
continue thread_id? A következő megállásig fut
pause thread_id? Megállítja ott, ahol éppen van
step_over / step_in / step_out thread_id? Egy lépéssel mozdít
threads — Szálazonosítók és -nevek
stack thread_id? Keretek, 30-ra korlátozva
scopes frame_id Hatókörök egy kereten, mindegyikhez egy reference
variables reference Gyermekek, 50-re korlátozva, az értékek 400 karakterre korlátozva
evaluate expression, frame_id? A keret saját hatókörében kiértékelve
output — A hibakeresett folyamat stdout/stderr kimenete, korlátozott
terminate — Lezárja a munkamenetet, és leállítja az adaptert
Id Parancs Gyökérjelölők
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

A debugpy a projekt helyi .venv/bin vagy venv/bin könyvtárát előnyben részesíti a $PATH-tal szemben: egy $PATH-beli python más környezet, és a rosszból való csatlakozás úgy hibázik, mintha a kód lenne hibás.


Egy Python- vagy JavaScript-cella, amelynek változói, importjai és betöltött adatai megmaradnak a hívások között. exec szint; párhuzamosan nem biztonságos.

Argumentum Jelentés
code A cella
description Kötelező. 5–10 szó az átirat címkéjéhez
language python (alapértelmezés) vagy javascript
reset Eldobja az értelmezőt, és először tisztán indít
  • Az utolsó kifejezés ugyanúgy visszhangzik, ahogy egy notebook teszi.
  • A display() működik, a pandas frame táblázatként renderelődik, és egy matplotlib ábra egy képként jön vissza, amelyet az átirat megjelenít.
  • Azokat az IPython-idómákat, amelyeket az ember reflexből beír – %pip, %cd, !cmd, %%bash, %%timeit –, egyszerű kódra írják át. A %pip emellett kiüríti a sys.modules-t, így a következő import látja, mit telepítettek éppen.

Saját eszközök hívása a cellán belülről

Szekció neve “Saját eszközök hívása a cellán belülről”
contents = tool("read", {"path": "lib/auth.dart"})

A híd visszalép a harness eszközregiszterébe, így a korlátok, a jóváhagyás és minden burkoló pontosan úgy érvényesül, ahogy egy modell által kiadott hívásnál. A kernel saját csövén utazik, nem egy loopback-socketen: nincs port, nincs titok, nincs kimenőforgalmi szabály.

A cella időtúllépése egy tétlenségi keret (alapértelmezés: 5 perc), és felfüggesztésre kerül, amíg egy hídon átmenő hívás függőben van, így az a cella, amely alügynökökre ágazik szét, nem kerül leállításra a szétágazás közben.


ask_user – kérdés feltevése egy embernek

Szekció neve “ask_user – kérdés feltevése egy embernek”

read szint. A futtatás egyetlen módja arra, hogy bármit kérdezzen az üzemeltetőtől. Számozott kártyát jelenít meg a beszélgetésben, és blokkol, amíg valaki nem válaszol, nem hagyja ki, vagy a kérdés le nem jár. Soha ne írja a kérdést csevegőüzenetként – az lezárja a kört.

Argumentum Jelentés
question Mit kérdezzen
context Opcionális: miért kérdez, és mi függ a választól
options[] Választási lehetőségek, mindegyik {label, description?}
allow_free_text Elfogadható-e beírt válasz
multi_select Több lehetőség is kiválasztható-e

A kihagyás siker: haladjon tovább egy kimondott feltevéssel, és ne kérdezzen újra. Az időtúllépés hiba, ugyanezzel az utasítással. Az engedélykérések („megtehetem ezt?”) külön kapu, és ugyanolyan kártyaként jelennek meg a beszélgetésben.

Csak akkor kerül regisztrálásra, ha egyszerre létezik kérdésport és cél-tér. Ha nincs ember csatlakoztatva, a hívás meghiúsul, ahelyett hogy örökre blokkolna – ugyanaz a zárt hibamódú tartás, amelyet egy korlát prompt vesz fel, ha nincs jóváhagyó csatlakoztatva.


vibe_* – háttér-workerek irányítása

Szekció neve “vibe_* – háttér-workerek irányítása”

Csak akkor kerül regisztrálásra, amíg a vibe mód be van kapcsolva. Mind az öt read szintű: a kapu a worker eszközein van, ahol a szerkesztés valóban történik.

Eszköz Argumentumok Megjegyzések
vibe_spawn brief, label, tier? Azonnal visszatér; a worker tovább fut
vibe_send worker_id, message Hozzáfűz a feladatkiíráshoz, és újrafuttat
vibe_wait worker_id, timeout_seconds? Blokkol, amíg meg nem nyugszik
vibe_kill worker_id Leállítja
vibe_list — Szint, állapot, eltelt idő és utolsó eredmény

A tier értéke fast (mechanikus munka világos specifikációval) vagy good (tervezés, mérlegelés, vagy egy fast worker kimenetének átnézése).