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.
Jóváhagyási szintek
Szekció neve “Jóváhagyási szintek”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 |
lsp – nyelviszerver-lekérdezések
Szekció neve “lsp – nyelviszerver-lekérdezések”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 |
Diagnosztika íráskor
Szekció neve “Diagnosztika íráskor”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 |
ast_grep – strukturális keresés
Szekció neve “ast_grep – strukturális keresés”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.
debug – hibakereső vezérlése
Szekció neve “debug – hibakereső vezérlése”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 |
Adapterek
Szekció neve “Adapterek”| 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.
eval – tartós értelmezők
Szekció neve “eval – tartós értelmezők”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%pipemellett kiüríti asys.modules-t, így a következőimportlá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).