Přeskočit na obsah

Vestavěné nástroje agentů

Tohle jsou nástroje vázané na server, které vestavěný runtime agenta registruje přímo — jazykový server, strukturální hledání, debugger, kernely, otázky a řízení workerů — na rozdíl od nástrojů MCP, které si přemosťuje, a od obecných nástrojů na soubory, hledání a shell z runtime harnessu. Na registru MCP nejsou: externí klient MCP je neuvidí, protože každý je vázaný na živý prostředek na straně serveru — proces jazykového serveru, ladicí adaptér, interpret — a ten patří jednomu běhu.

Každý nástroj se tu registruje jen tehdy, když je pro běh zapojený prostředek, na kterém stojí — dohled jazykového serveru nebo debuggeru, parser tree-sitter, továrna kernelů, port pro otázky, sestava režimu vibe. Zjištění, jestli pro tenhle checkout existuje jazykový server nebo ladicí adaptér, je samostatná pozdější kontrola (status / adapters): ty nástroje na ploše zůstanou, aby se agent mohl zeptat, proč nejde nic použít, místo aby hádal.

Každý nástroj deklaruje úroveň a ta rozhoduje, které plochy ho vidí — nejen jestli se ptá na schválení. Režim Plan a podagenti jen pro čtení jsou zastropovaní na read, takže nástroj úrovně write nebo exec v jejich schématu vůbec není.

Úroveň Význam Nástroje tady
read Bez vedlejších účinků lsp, ast_grep, ask_user, pětice vibe_*
write Mění soubory lsp_rename, ast_edit, resolve
exec Spouští nebo řídí proces debug, eval

lsp — dotazy na jazykový server

Sekce “lsp — dotazy na jazykový server”

Registruje se, když má běh dohled jazykového serveru a pracovní adresář. Jestli server opravdu umí odpovědět, se zjistí až při volání, jako průnik: musí existovat kořenová značka a zároveň se musí najít binárka serveru. Jedno z toho samo znamená, že se server nespustí — řekne to status — místo tichého odhadu.

Pozice se adresují řádkem line a podřetězcem symbol, nikdy sloupcem. Model, který má uvést sloupec, hádá, a špatný odhad trefí jiný symbol na stejném řádku — odpověď, která vypadá správně a je o něčem jiném. Vynechat symbol u navigační akce je chyba, ne odhad prvního sloupce.

Akce Argumenty Vrací
diagnostics file (nebo "*") Chyby a varování; "*" místo toho spustí kontrolu projektu
definition file, line, symbol Kde je symbol deklarovaný
type_definition file, line, symbol Kde je deklarovaný jeho typ
implementation file, line, symbol Konkrétní implementace
references file, line, symbol Každé použití, strop 50
hover file, line, symbol Signatura a dokumentační komentář
symbols query nebo file Hledání v pracovním prostoru přes query (strop 100); symboly dokumentu přes file (strop 200)
code_actions file, line, symbol Rychlé opravy, které server nabízí
status — Které servery běží a pro které kořeny
reload — Restartuje server pro tenhle kořen

Diagnostiky při zápisu

Sekce “Diagnostiky při zápisu”

Přínos není samotný nástroj. write, edit a apply_patch jsou obalené: po zápisu se soubor přes jazykový server synchronizuje a uloží a do výsledku nástroje se složí jen nově zavedené diagnostiky. Agent se dozví, že rozbil sestavení, v okamžiku, kdy ho rozbil, a nemusí si vzpomenout, že se má zeptat.

Už nahlášené diagnostiky potlačuje evidence daného běhu, klíčovaná závažností, kódem a textem zprávy — pozice je schválně vynechaná, takže diagnostika, která jen sjela o čtyři řádky níž, se znovu nehlásí jako nová.

lsp_rename — přejmenování napříč projektem

Sekce “lsp_rename — přejmenování napříč projektem”

Samostatný nástroj úrovně write z jediného důvodu: úroveň rozhoduje o viditelnosti. Složit přejmenování do lsp by buď dalo průzkumníkovi jen pro čtení možnost přepsat repozitář, nebo by každé hover schovalo za výzvu ke schválení.

Argument Význam
file Kde symbol je
line Řádek číslovaný od 1
symbol Podřetězec, který ho na tom řádku identifikuje
new_name Jak se má jmenovat

ast_grep — strukturální hledání

Sekce “ast_grep — strukturální hledání”

Hledá kód podle tvaru, ne podle textu. $NAME sedí na libovolný uzel, $$$NAME na řadu sourozenců a $_ je zástupný znak, který nic nezachytí.

Vlastnost, která z něj dělá porovnávač, a ne regulární výraz s pár kroky navíc: metaproměnná zopakovaná v jednom vzoru musí zachytit tentýž text.

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

sedí na guard, který zavolá dispose na to, co právě otestoval, a nesedí na ten, který dispose zavolá na něco jiného.

Argument Význam
pattern Fragment kódu s metaproměnnými
path Soubor nebo adresář k prohledání; výchozí je celý pracovní prostor
language Identifikátor dodávané gramatiky (dart, python, rust, c, …). Odvozený, když path pojmenuje soubor
max_results Výchozí 50

ast_edit — strukturální přepis, připravený

Sekce “ast_edit — strukturální přepis, připravený”

Stejné párování a k tomu šablona rewrite, do které se metaproměnné dosadí zpátky. Nic se nezapíše. Změna se připraví a výsledek pojmenuje 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 Význam
pattern Co se má shodovat
rewrite Co tam přijde, s dosazeným $NAME
path Rozsah; výchozí je celý pracovní prostor
language Identifikátor jazyka

resolve — potvrď nebo zahoď připravenou změnu

Sekce “resolve — potvrď nebo zahoď připravenou změnu”
Argument Význam
edit_id Z výsledku (proposed)
action accept nebo discard

Každý soubor se porovná s obsahem zachyceným při přípravě a jakýkoli nesoulad odmítne celou změnu. Částečně provedený strukturální přepis nechá strom, který se nepřeloží ani ve starém tvaru, ani v novém.


debug — řízení debuggeru

Sekce “debug — řízení debuggeru”

Registruje se, když má běh dohled ladicí relace, pracovní adresář a identifikátor konverzace. Jestli adaptér opravdu umí nastartovat, se zjistí až při volání, stejným pravidlem průniku jako u jazykového serveru (kořenová značka a zároveň binárka). Úroveň exec; není bezpečný pro paralelní volání (relace je stav napříč voláními, takže continue, které předběhne stack, by četlo rámec, který se už posunul).

Jedna relace na konverzaci, s tvrdou TTL (30 minut). Druhý launch se odmítne, místo aby první tiše nahradil.

Operace Argumenty Poznámky
adapters — Které adaptéry se tu dají použít a proč ne
status — Jestli relace běží a kde se zastavila
breakpoints file, lines[] Prázdné lines soubor vyčistí. Lze nastavit před spuštěním
launch program, args[] Spustí program zastavený na tvých zarážkách
attach port Připojí se k už běžícímu laděnému procesu
continue thread_id? Běží do dalšího zastavení
pause thread_id? Zastaví ho tam, kde právě je
step_over / step_in / step_out thread_id? Posune o jeden krok
threads — Identifikátory a názvy vláken
stack thread_id? Rámce, strop 30
scopes frame_id Rozsahy na rámci, každý s reference
variables reference Potomci, strop 50, hodnoty strop 400 znaků
evaluate expression, frame_id? Vyhodnoceno ve vlastním rozsahu rámce
output — stdout/stderr laděného procesu, ohraničené
terminate — Ukončí relaci a zabije adaptér
Id Příkaz Kořenové značky
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 dává přednost projektovému .venv/bin nebo venv/bin před $PATH: python z $PATH je jiné prostředí a připojení ze špatného selže tak, že to vypadá jako rozbitý kód.


eval — persistentní interprety

Sekce “eval — persistentní interprety”

Buňka Pythonu nebo JavaScriptu, jejíž proměnné, importy a načtená data mezi voláními přežijí. Úroveň exec; není bezpečný pro paralelní volání.

Argument Význam
code Buňka
description Povinné. 5–10 slov pro popisek v přepisu
language python (výchozí) nebo javascript
reset Zahodí interpret a nejdřív spustí čistý
  • Poslední výraz se vypíše jako v notebooku.
  • display() funguje, frame z pandas se vykreslí jako tabulka a figura z matplotlib se vrátí jako obrázek, který ukáže přepis.
  • Idiomy IPython, které se píšou reflexivně — %pip, %cd, !cmd, %%bash, %%timeit — se přepíšou na obyčejný kód. %pip navíc vyklidí sys.modules, takže další import uvidí právě nainstalované.

Volání vlastních nástrojů z buňky

Sekce “Volání vlastních nástrojů z buňky”
contents = tool("read", {"path": "lib/auth.dart"})

Most znovu vstoupí do registru nástrojů harnessu, takže guardraily, schválení i každý obal platí přesně jako u volání, které vydal model. Jede po vlastní rouře kernelu, ne po loopback socketu: žádný port, žádné tajemství, žádné pravidlo odchozího provozu.

Časový limit buňky je rozpočet nečinnosti (výchozí 5 minut) a po dobu nevyřízeného volání přes most je pozastavený, takže buňka, která se rozvětví na podagenty, se uprostřed rozvětvení nezabije.


ask_user — zeptej se člověka

Sekce “ask_user — zeptej se člověka”

Úroveň read. Jediný způsob, jak se běh na cokoli zeptá operátora. V konverzaci vykreslí očíslovanou kartu a blokuje, dokud někdo neodpoví, nepřeskočí, nebo dokud otázka nevyprší. Otázku nikdy nepiš jako zprávu do chatu — to ukončí tah.

Argument Význam
question Na co se zeptat
context Volitelné: proč se ptáš a co na odpovědi visí
options[] Volby, každá {label, description?}
allow_free_text Jestli se přijme napsaná odpověď
multi_select Jestli lze zvolit několik možností

Přeskočení je úspěch: pokračuj na vysloveném předpokladu a neptej se znovu. Vypršení je chyba se stejným pokynem. Výzvy k oprávnění („smím to udělat?“) jsou samostatná brána a vykreslí se jako stejná karta v konverzaci.

Registruje se jen tehdy, když existuje port pro otázky i cílový prostor. Bez připojeného člověka volání selže, místo aby blokovalo navždy — stejný uzavřený postoj, jaký zaujme prompt guardrailu, když není připojený schvalovatel.


vibe_* — řízení workerů na pozadí

Sekce “vibe_* — řízení workerů na pozadí”

Registruje se jen tehdy, když je zapnutý režim vibe. Všech pět je na úrovni read: brána patří na nástroje workera, tam, kde se úprava opravdu děje.

Nástroj Argumenty Poznámky
vibe_spawn brief, label, tier? Vrátí se hned; worker běží dál
vibe_send worker_id, message Připojí k zadání a spustí znovu
vibe_wait worker_id, timeout_seconds? Blokuje, dokud se neusadí
vibe_kill worker_id Zastaví ho
vibe_list — Úroveň, stav, uplynulý čas a poslední výsledek

tier je fast (mechanická práce s jasnou specifikací) nebo good (návrh, úsudek, nebo revize výstupu workera fast).