コンテンツにスキップ

内蔵エージェントツール

これらは、組み込みエージェントランタイムが直接登録するサーバーにバインドされたツールです — 言語サーバー、構造検索、デバッガー、カーネル、質問、ワーカー制御 — ブリッジして取り込む MCP ツールや、ハーネスランタイムの汎用のファイル・検索・シェルツールとは対照的です。これらは MCP レジストリには載りません。外部の MCP クライアントには見えません。それぞれが、1 回の実行に属する生きたサーバー側のリソース — 言語サーバープロセス、デバッグアダプター、インタープリター — にバインドされているからです。

ここにあるすべてのツールは、その背後にあるリソースがその実行向けに配線されている場合にのみ登録されます — 言語サーバーまたはデバッグのスーパーバイザー、tree-sitter パーサー、カーネルファクトリー、質問ポート、vibe のロスターです。このチェックアウトに対する言語サーバーやデバッグアダプターの検出は、別の、より後に行われるチェック(status / adapters)です。それらのツールがサーフェスに残るのは、推測するのではなく、なぜ何も使えないのかをエージェントが尋ねられるようにするためです。

各ツールはティアを宣言し、そのティアがどのサーフェスから見えるかを決めます — 単にプロンプトを出すかどうかではありません。プランモードと読み取り専用のサブエージェントは read が上限であるため、write または exec ティアのツールはそのスキーマにそもそも存在しません。

ティア 意味 ここにあるツール
read 副作用なし lsp、ast_grep、ask_user、5 つの vibe_*
write ファイルを変更する lsp_rename、ast_edit、resolve
exec プロセスを起動または制御する debug、eval

実行に言語サーバーのスーパーバイザーと作業ディレクトリがある場合に登録されます。サーバーが実際に応答できるかどうかは、呼び出し時に積集合として検出されます。ルートマーカーが存在し、かつサーバーバイナリが解決できなければなりません。どちらか片方だけではサーバーは起動しません — そう status が告げます — 黙って推測することはありません。

位置は line と symbol の部分文字列で指定し、列番号は決して使いません。列番号を求められたモデルは推測し、その推測が外れると同じ行の別のシンボルに解決されます — 正しく見えるのに、別のものについての答えです。ナビゲーションアクションで symbol を省略することはエラーであり、先頭列の推測ではありません。

アクション 引数 戻り値
diagnostics file(または "*") エラーと警告。"*" は代わりにプロジェクトチェッカーを実行します
definition file、line、symbol シンボルが宣言されている場所
type_definition file、line、symbol その型が宣言されている場所
implementation file、line、symbol 具体的な実装
references file、line、symbol すべての使用箇所。上限は 50
hover file、line、symbol シグネチャとドキュメントコメント
symbols query または file query でワークスペース検索(上限 100)。file でドキュメントシンボル(上限 200)
code_actions file、line、symbol サーバーが提示するクイックフィックス
status — どのサーバーが、どのルートに対して実行中か
reload — このルートのサーバーを再起動します

見返りはツールそのものではありません。write、edit、apply_patch がラップされています。書き込みの後、ファイルは言語サーバーを通して同期・保存され、新たに導入された診断だけがツールの結果に折り込まれます。エージェントは、ビルドを壊したまさにその瞬間に、壊したことを知ります。尋ねるのを覚えておく必要はありません。

すでに報告済みの診断は、重要度・コード・メッセージをキーとする実行ごとの台帳によって抑制されます — 位置は意図的に除外されているため、4 行下にずれただけの診断が新しいものとして再報告されることはありません。

別個の write ティアのツールである理由は、ただ 1 つです。ティアが可視性を決めるからです。リネームを lsp に畳み込むと、読み取り専用の探索者にリポジトリを書き換える能力を与えるか、すべての hover を承認プロンプトの背後に置くかのどちらかになります。

引数 意味
file シンボルがある場所
line 1 始まりの行番号
symbol その行でシンボルを特定する部分文字列
new_name 新しい名前

コードをテキストではなく形で見つけます。$NAME は任意のノードにマッチし、$$$NAME は連続する兄弟にマッチし、$_ は何も捕捉しないワイルドカードです。

これを「ひと手間多い正規表現」ではなくマッチャーにしている性質は、ひとつのパターンの中で繰り返されるメタ変数が同じテキストを捕捉しなければならないことです。

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

これは、検査したものを破棄するガードにマッチし、別のものを破棄するガードにはマッチしません。

引数 意味
pattern メタ変数を含むコードの断片
path 検索するファイルまたはディレクトリ。デフォルトはワークスペース全体
language 出荷されている文法 ID(dart、python、rust、c、…)。path がファイルを指すときは推論されます
max_results デフォルトは 50

同じマッチングに加えて、メタ変数を戻し入れる rewrite テンプレートを使います。何も書き込まれません。 変更はステージングされ、結果が 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"
引数 意味
pattern マッチするもの
rewrite そこに置くもの。$NAME が置換されます
path スコープ。デフォルトはワークスペース全体
language 言語 ID

resolve — ステージングされた変更のコミットまたは破棄

「resolve — ステージングされた変更のコミットまたは破棄」というセクション
引数 意味
edit_id (proposed) の結果から
action accept または discard

すべてのファイルは、ステージング時に捕捉した内容と照合され、少しでも食い違えば変更全体が拒否されます。部分的に適用された構造的書き換えは、古い形でも新しい形でもコンパイルできないツリーを残します。


実行にデバッグセッションのスーパーバイザー、作業ディレクトリ、会話 ID がある場合に登録されます。アダプターが実際に起動できるかどうかは、言語サーバーと同じ積集合のルール(ルートマーカーかつバイナリ)で、呼び出し時に検出されます。exec ティアで、並列安全ではありません(セッションは呼び出しをまたぐ状態なので、continue が stack を追い越すと、すでに動いてしまったフレームを読むことになります)。

会話ごとにセッションは 1 つで、厳密な TTL(30 分)があります。2 回目の launch は、最初のものを黙って置き換えるのではなく拒否されます。

操作 引数 備考
adapters — ここでどのアダプターが使えるか、使えないならなぜか
status — セッションが実行中かどうか、どこで停止したか
breakpoints file、lines[] lines が空だとそのファイルのブレークポイントを消去します。起動の前に設定できます
launch program、args[] ブレークポイントで停止した状態でプログラムを開始します
attach port すでに実行中のデバッグ対象に接続します
continue thread_id? 次の停止まで実行します
pause thread_id? その場で停止します
step_over / step_in / step_out thread_id? 1 ステップ動かします
threads — スレッド ID と名前
stack thread_id? フレーム。上限は 30
scopes frame_id フレーム上のスコープ。それぞれ reference を持ちます
variables reference 子。上限は 50、値は 400 文字まで
evaluate expression、frame_id? フレーム自身のスコープで評価されます
output — デバッグ対象の stdout/stderr。上限あり
terminate — セッションを終了し、アダプターを停止します
ID コマンド ルートマーカー
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 はプロジェクトローカルの .venv/bin または venv/bin を $PATH より優先します。$PATH 上の python は別の環境であり、誤ったほうからアタッチすると、壊れたコードのように見える形で失敗します。


変数、インポート、読み込んだデータが呼び出しをまたいで残る Python または JavaScript のセルです。exec ティアで、並列安全ではありません。

引数 意味
code セル
description 必須。トランスクリプトのラベル用の 5〜10 語
language python(デフォルト)または javascript
reset インタープリターを破棄し、先にまっさらな状態から始めます
  • 最後の式は、ノートブックと同じようにエコーされます。
  • display() は機能し、pandas のフレームは表としてレンダリングされ、matplotlib の図はトランスクリプトが表示する画像として返ります。
  • 人が反射的に入力する IPython のイディオム — %pip、%cd、!cmd、%%bash、%%timeit — は素のコードに書き換えられます。%pip は sys.modules からも追い出すため、次の import はたった今インストールされたものを認識します。
contents = tool("read", {"path": "lib/auth.dart"})

このブリッジはハーネスのツールレジストリに再入するため、ガードレール、承認、あらゆるラッパーが、モデルが発行した呼び出しとまったく同じように適用されます。ループバックソケットではなくカーネル自身のパイプを使います。ポートも、シークレットも、外向き通信のルールも不要です。

セルのタイムアウトは非アクティブの予算(デフォルト 5 分)であり、ブリッジされた呼び出しが未完了の間は一時停止されます。そのため、サブエージェントにファンアウトするセルがファンアウトの途中で停止させられることはありません。


read ティアです。実行がオペレーターに何かを尋ねる唯一の方法です。会話内に番号付きのカードをレンダリングし、誰かが回答するか、スキップするか、質問がタイムアウトするまでブロックします。質問をチャットメッセージとして書かないでください — それはターンを終わらせてしまいます。

引数 意味
question 尋ねる内容
context 任意: なぜ尋ねているのか、回答次第で何が変わるのか
options[] 選択肢。それぞれ {label, description?}
allow_free_text 入力された回答を受け付けるかどうか
multi_select 複数の選択肢を選べるかどうか

スキップは成功です。明示した前提の上で進め、二度尋ねないでください。タイムアウトは、同じ指示を伴うエラーです。許可プロンプト(「これをやってもいいですか」)は別のゲートであり、会話内に同じカードとして表示されます。

質問ポートと対象スペースの両方が存在する場合にのみ登録されます。人間が接続されていない場合、その呼び出しは永遠にブロックするのではなく失敗します — 承認者が接続されていないときにガードレールの prompt が取るのと同じフェイルクローズの姿勢です。


vibe モードがオンの間だけ登録されます。5 つとも read ティアです。ゲートは、編集が実際に起こるワーカーのツール側にあるべきです。

ツール 引数 備考
vibe_spawn brief、label、tier? すぐに戻ります。ワーカーは動き続けます
vibe_send worker_id、message ブリーフに追記して再実行します
vibe_wait worker_id、timeout_seconds? 決着するまでブロックします
vibe_kill worker_id 停止します
vibe_list — ティア、ステータス、経過時間、最後の結果

tier は fast(明確な仕様がある機械的な作業)または good(設計、判断、または fast ワーカーの出力のレビュー)です。