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.
Tingkat persetujuan
Bagian berjudul “Tingkat persetujuan”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 |
lsp — kueri server bahasa
Bagian berjudul “lsp — kueri server bahasa”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 |
Diagnostik saat menulis
Bagian berjudul “Diagnostik saat menulis”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 |
ast_grep — pencarian struktural
Bagian berjudul “ast_grep — pencarian struktural”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.
debug — mengemudikan debugger
Bagian berjudul “debug — mengemudikan debugger”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 |
Adapter
Bagian berjudul “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.
eval — interpreter persisten
Bagian berjudul “eval — interpreter persisten”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.%pipjuga menggusursys.modules, sehinggaimportberikutnya melihat apa yang baru saja dipasang.
Memanggil alat Anda sendiri dari dalam sel
Bagian berjudul “Memanggil alat Anda sendiri dari dalam sel”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).