Lewati ke konten

Alat agen bawaan

Berikut adalah alat terikat server yang didaftarkan langsung oleh runtime agen bawaan — server bahasa, pencarian struktural, debugger, kernel, pertanyaan, dan kontrol pekerja — berbeda dengan alat MCP yang dijembatani ke dalamnya serta alat berkas, pencarian, dan shell generik dari runtime harness. Alat-alat ini tidak ada di registri MCP: klien MCP eksternal tidak akan melihatnya, karena masing-masing terikat pada sumber daya sisi server yang hidup — proses server bahasa, adapter debug, interpreter — yang menjadi milik satu run.

Setiap alat di sini hanya didaftarkan ketika sumber daya pendukungnya tersambung untuk run tersebut — supervisor server bahasa atau debug, parser tree-sitter, pabrik kernel, port pertanyaan, roster vibe. Deteksi server bahasa atau adapter debug untuk checkout ini adalah pemeriksaan terpisah yang berlangsung belakangan (status / adapters): alat-alat itu tetap ada di permukaan agar agen dapat menanyakan mengapa tidak ada yang bisa dipakai, alih-alih menebak.

Setiap alat mendeklarasikan sebuah tingkat, dan tingkat itulah yang menentukan permukaan mana yang melihatnya — bukan sekadar apakah alat itu memunculkan prompt. Mode rencana dan subagen hanya-baca dibatasi pada read, sehingga alat bertingkat write atau exec sama sekali tidak ada dalam skema mereka.

Tingkat Arti Alat di sini
read Tanpa efek samping lsp, ast_grep, ask_user, kelima vibe_*
write Mengubah berkas lsp_rename, ast_edit, resolve
exec Memulai atau mengendalikan proses debug, eval

Didaftarkan ketika run memiliki supervisor server bahasa dan direktori kerja. Apakah sebuah server benar-benar dapat menjawab dideteksi pada saat pemanggilan, sebagai sebuah irisan: penanda root harus ada dan biner server harus dapat di-resolve. Salah satu saja berarti tidak ada server yang dimulai — status yang mengatakannya — alih-alih tebakan diam-diam.

Posisi dialamatkan dengan line ditambah substring symbol, tidak pernah dengan kolom. Model yang diminta memakai kolom akan menebak, dan tebakan yang salah me-resolve ke simbol lain pada baris yang sama — jawaban yang tampak benar padahal membahas hal lain. Menghilangkan symbol pada aksi navigasi adalah galat, bukan tebakan kolom pertama.

Aksi Argumen Mengembalikan
diagnostics file (atau "*") Galat dan peringatan; "*" menjalankan pemeriksa proyek sebagai gantinya
definition file, line, symbol Di mana simbol itu dideklarasikan
type_definition file, line, symbol Di mana tipenya dideklarasikan
implementation file, line, symbol Implementasi konkret
references file, line, symbol Setiap pemakaian, dibatasi 50
hover file, line, symbol Signature dan komentar dokumentasi
symbols query atau file Pencarian ruang kerja dengan query (dibatasi 100); simbol dokumen dengan file (dibatasi 200)
code_actions file, line, symbol Perbaikan cepat yang ditawarkan server
status — Server mana yang berjalan, dan untuk root mana
reload — Memulai ulang server untuk root ini

Manfaat utamanya bukan alat ini. write, edit, dan apply_patch dibungkus: setelah penulisan, berkas disinkronkan dan disimpan melalui server bahasa, dan hanya diagnostik yang baru muncul yang dilipat ke dalam hasil alat. Agen mengetahui bahwa ia merusak build pada saat ia merusaknya, tanpa harus ingat untuk bertanya.

Diagnostik yang sudah dilaporkan ditekan oleh catatan per run dengan kunci berupa tingkat keparahan, kode, dan pesan — posisi sengaja dikecualikan, sehingga diagnostik yang hanya bergeser empat baris ke bawah tidak dilaporkan ulang sebagai baru.

lsp_rename — penggantian nama seluruh proyek

Bagian berjudul “lsp_rename — penggantian nama seluruh proyek”

Alat terpisah bertingkat write karena tepat satu alasan: tingkat itulah yang menentukan visibilitas. Melipat penggantian nama ke dalam lsp akan menyerahkan kemampuan menulis ulang repo kepada penjelajah hanya-baca, atau menempatkan setiap hover di balik prompt persetujuan.

Argumen Arti
file Di mana simbol itu berada
line Baris dengan indeks mulai 1
symbol Substring yang mengidentifikasinya pada baris itu
new_name Nama barunya

Menemukan kode berdasarkan bentuk, bukan teks. $NAME mencocokkan node mana pun, $$$NAME mencocokkan rangkaian saudara, dan $_ adalah wildcard yang tidak mengikat apa pun.

Sifat yang menjadikannya pencocok, bukan regex dengan langkah tambahan: metavariabel yang diulang dalam satu pola harus menangkap teks yang sama.

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

mencocokkan penjaga yang membuang apa yang diujinya, dan tidak mencocokkan penjaga yang membuang hal lain.

Argumen Arti
pattern Fragmen kode dengan metavariabel
path Berkas atau direktori yang dicari; default-nya seluruh ruang kerja
language Id grammar yang disertakan (dart, python, rust, c, …). Disimpulkan saat path menunjuk sebuah berkas
max_results Default 50

ast_edit — penulisan ulang struktural, di-staging

Bagian berjudul “ast_edit — penulisan ulang struktural, di-staging”

Pencocokan yang sama, ditambah templat rewrite dengan metavariabelnya disubstitusikan kembali. Tidak ada yang ditulis. Perubahan itu di-staging dan hasilnya menyebut sebuah 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"
Argumen Arti
pattern Apa yang dicocokkan
rewrite Apa yang diletakkan di sana, dengan $NAME disubstitusikan
path Cakupan; default-nya seluruh ruang kerja
language Id bahasa

resolve — commit atau buang perubahan yang di-staging

Bagian berjudul “resolve — commit atau buang perubahan yang di-staging”
Argumen Arti
edit_id Dari hasil (proposed)
action accept atau discard

Setiap berkas dibandingkan dengan konten yang ditangkap pada saat staging, dan ketidakcocokan apa pun menolak seluruh perubahan. Penulisan ulang struktural yang diterapkan sebagian meninggalkan pohon yang tidak dapat dikompilasi, baik dalam bentuk lama maupun bentuk baru.


Didaftarkan ketika run memiliki supervisor sesi debug, direktori kerja, dan id percakapan. Apakah sebuah adapter benar-benar dapat dimulai dideteksi pada saat pemanggilan, dengan aturan irisan yang sama seperti server bahasa (penanda root dan biner). Bertingkat exec; tidak aman untuk paralel (sebuah sesi adalah status yang bertahan antar panggilan, sehingga continue yang menyalip stack akan membaca frame yang sudah bergeser).

Satu sesi per percakapan, dengan TTL yang tegas (30 menit). launch kedua ditolak alih-alih diam-diam menggantikan yang pertama.

Operasi Argumen Catatan
adapters — Adapter mana yang dapat dipakai di sini, dan mengapa tidak
status — Apakah ada sesi yang berjalan, dan di mana ia berhenti
breakpoints file, lines[] lines kosong menghapus breakpoint di berkas itu. Dapat ditetapkan sebelum peluncuran
launch program, args[] Menjalankan program dalam keadaan berhenti di breakpoint Anda
attach port Menyambung ke debuggee yang sudah berjalan
continue thread_id? Menjalankan sampai titik henti berikutnya
pause thread_id? Menghentikannya di tempatnya sekarang
step_over / step_in / step_out thread_id? Bergerak satu langkah
threads — Id dan nama thread
stack thread_id? Frame, dibatasi 30
scopes frame_id Scope pada sebuah frame, masing-masing dengan reference
variables reference Anak, dibatasi 50, nilai dibatasi 400 karakter
evaluate expression, frame_id? Dievaluasi dalam scope milik frame itu sendiri
output — stdout/stderr debuggee, dibatasi
terminate — Mengakhiri sesi dan mematikan adapter
Id Perintah Penanda root
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 lebih memilih .venv/bin atau venv/bin milik proyek daripada $PATH: python dari $PATH adalah lingkungan yang berbeda, dan menyambung dari lingkungan yang salah gagal dengan cara yang terbaca sebagai kode rusak.


Sel Python atau JavaScript yang variabel, impor, dan data termuatnya bertahan di antara panggilan. Bertingkat exec; tidak aman untuk paralel.

Argumen Arti
code Sel
description Wajib. 5–10 kata untuk label transkrip
language python (default) atau javascript
reset Buang interpreter dan mulai dari keadaan bersih lebih dahulu
  • Ekspresi terakhir ditampilkan kembali seperti yang dilakukan notebook.
  • display() berfungsi, frame pandas dirender sebagai tabel, dan gambar matplotlib kembali sebagai gambar yang ditampilkan transkrip.
  • Idiom IPython yang refleksif diketik orang — %pip, %cd, !cmd, %%bash, %%timeit — ditulis ulang menjadi kode biasa. %pip juga menggusur sys.modules, sehingga import berikutnya melihat apa yang baru saja dipasang.
contents = tool("read", {"path": "lib/auth.dart"})

Jembatan itu masuk kembali ke registri alat harness, sehingga pagar pengaman, persetujuan, dan setiap wrapper berlaku persis seperti pada panggilan yang dikeluarkan model. Jembatan ini menumpang pipa milik kernel sendiri alih-alih soket loopback: tanpa port, tanpa rahasia, tanpa aturan egress.

Batas waktu sel adalah anggaran ketidakaktifan (default 5 menit) dan ditangguhkan selama panggilan yang dijembatani belum selesai, sehingga sel yang menyebar ke subagen tidak dimatikan di tengah penyebaran.


ask_user — mengajukan pertanyaan kepada manusia

Bagian berjudul “ask_user — mengajukan pertanyaan kepada manusia”

Bertingkat read. Satu-satunya cara sebuah run menanyakan apa pun kepada operator. Alat ini merender kartu bernomor di percakapan dan memblokir sampai seseorang menjawab, melewatinya, atau pertanyaannya kehabisan waktu. Jangan pernah menuliskan pertanyaannya sebagai pesan chat — itu mengakhiri giliran.

Argumen Arti
question Apa yang ditanyakan
context Opsional: mengapa Anda bertanya dan apa yang bergantung pada jawabannya
options[] Pilihan, masing-masing {label, description?}
allow_free_text Apakah jawaban yang diketik diterima
multi_select Apakah beberapa pilihan boleh dipilih

Melewati pertanyaan adalah keberhasilan: lanjutkan dengan asumsi yang dinyatakan dan jangan bertanya lagi. Kehabisan waktu adalah galat dengan instruksi yang sama. Prompt izin (“bolehkah saya melakukan ini?”) adalah gerbang terpisah dan dirender sebagai kartu yang sama di percakapan.

Didaftarkan hanya ketika port pertanyaan dan space tujuan keduanya ada. Tanpa manusia yang terpasang, panggilan itu gagal alih-alih memblokir selamanya — postur fail-closed yang sama seperti yang diambil prompt pagar pengaman saat tidak ada penyetuju yang terhubung.


vibe_* — mengarahkan pekerja latar belakang

Bagian berjudul “vibe_* — mengarahkan pekerja latar belakang”

Didaftarkan hanya selama mode vibe aktif. Kelimanya bertingkat read: gerbangnya seharusnya ada pada alat milik pekerja, tempat penyuntingan benar-benar terjadi.

Alat Argumen Catatan
vibe_spawn brief, label, tier? Langsung kembali; pekerja terus berjalan
vibe_send worker_id, message Menambahkan ke instruksi dan menjalankan ulang
vibe_wait worker_id, timeout_seconds? Memblokir sampai pekerja itu selesai
vibe_kill worker_id Menghentikannya
vibe_list — Tingkat, status, waktu berlalu, dan hasil terakhir

tier adalah fast (pekerjaan mekanis dengan spesifikasi yang jelas) atau good (desain, pertimbangan, atau peninjauan atas keluaran pekerja fast).