📡

VS Code のエージェントチャットに、ターミナルの処理結果がユーザーメッセージとして送られていた

に公開

最近、Windows 環境の VS Code で、GitHub Copilot を使っています。
右サイドバーのエージェントチャットから、GPT 5.6 Luna や Terra を選択して、フロントエンド開発を行っています。自分でコードを書くより、エージェントチャットへの指示で実装するスタイルです。

この2週間ほど、エージェントチャットで似た挙動に2度遭遇しました。ターミナルで実行していた処理の通知や出力が、以前使っていたエージェントチャットに送られ、その内容を受けてエージェントが再び動き始めました。もちろん私から、そのエージェントチャットに新しい指示は送っていません。

現象は Windows で確認しています。後述する仕組みの話は VS Code 側のもので、他の OS でも同様の設計がある可能性はありますが、ここでは未確認です。

1度目は、レビューで気づいた

1度目は、npm run build-storybook を実行したときでした。開発中の UI 部品を Storybook で表示するための build コマンドです。

エージェントが動いていたことに気づかず、build 後の差分も build による変更だけだと思い込み、そのままコミットしました。異変に気づいたのは、その後のレビューです。

build による変更だけだったはずなのに、なぜか環境設定ファイルまで変更されている。

確認すると、vite.config.js と main.js が変わっていました。以前使っていたエージェントチャットを見ると、エージェントは storybook-static の監視を原因として、この2つのファイルの監視除外を「対応済み」と出力していました。

私は「npm run build-storybook がきっかけで、あなたの直前の出力があったのですか?」と確認しました。そのコミットには、build による差分とエージェントによる変更が混在していました。

普段は主に Mac で Cursor を使い、一日の作業で複数のエージェントチャットを作って、使い捨てのように並行して作業しています。ターミナルで build を走らせているあいだに、別のエージェントチャットへ入力が入り、ファイルまで変わることは、これまでの経験では起きていませんでした。VS Code でも起きないはずだと思い、想定もしていませんでした。

2度目は、その場で気づいた

2度目は、Web アプリの開発用サーバーを立ち上げる npm run dev を実行したときです。横で開いていたエージェントチャットが動き出すのを、その場で見ました。自分からは何も送っていません。

npm run dev を実行すると、エージェントチャットに

`npm run dev` が完了しました

と小さな文字が出て、その下に Completed 7 steps in 36s > と表示されました。開発サーバーは通常、終了せずに動き続けるので、この「完了」表示自体も違和感がありました。その直後、エージェントが動き始めました。

私は指示を送っておらず、ターミナルで npm run dev を実行しただけで、手元では特に問題も起きていませんでした。それでもエージェントは「Vite 終了原因を修正しました」と報告し、vite.config.js の修正や監視対象の除外などを進めました。過去の会話のコンテキストと、今ターミナルで起きていたことのずれを、バグのように扱った印象でした。

ここで、1度目に起きたこととつながりました。

チャット履歴を書き出して確認した

VS Code では、エージェントチャットの履歴を JSON として書き出せます。

Ctrl + Shift + P
> Chat: Export Chat...

今回の記事は、この方法 で書き出したデータをもとに執筆しています。書き出したデータには、会話だけでなく、ターミナル操作やツール実行、ファイル編集に関する情報も含まれていました。

(この記事では、クライアントコード、リポジトリ名、ローカルパス、実際の指示など、プロジェクトを特定できる情報を取り除いています。)

書き出したデータから、ターミナル由来の内容がどう記録され、そのあとエージェントが何をしたかを確認しました。

観察結果と、VS Code 側の仕組み

書き出したデータでは、ターミナルの完了通知や出力が、新しいユーザーメッセージとして記録されていました。その後、エージェントが動き、ファイル編集やターミナル操作を実行していました。

VS Code には、エージェントが実行したバックグラウンドのターミナル処理が完了したとき、その結果をエージェントへ通知する仕組みがあるようです。実装上は steering message と呼ばれてきたもので、バックグラウンドのコマンドが完了すると、その結果を受けて、既存の会話のコンテキストで新しいエージェント処理が始まります。この仕組み自体は、意図された動作として存在するようです。

ただし、公式に説明されているのは、エージェントが run_in_terminal などで動かしたバックグラウンド処理です。今回遭遇したのは、私がタイピングしてターミナルから実行した npm run build-storybook や npm run dev の情報が、以前のエージェントチャットに入ったケースです。同じ経路だったのかは、まだ確認できていません。また、セキュリティ管理の厳しい環境下での発見だったため、外部へ持ち出してすべてを公開することはできません。

同じことが起きたら

何も送っていないのに、以前のエージェントチャットが動き始めた場合は、問題があったエージェントチャットをエクスポートして確認すると手掛かりになります。VS Code のバージョン、実行していたコマンド、終了状態、ターミナルに出ていた内容、開いていたエージェントチャット、そのあと変わっていたファイルを残しておくと、あとから追いやすいです。

想定していないファイルが差分に含まれていた場合は、その変更が直前の build によるものだと決めず、エージェントチャットの履歴も確認した方がよさそうです。

今回気になったのは、自分が打ったコマンドの情報が以前のエージェントチャットへの新しい入力となり、その会話のままファイル編集まで進んだことです。何が入力として扱われ、何をきっかけにエージェントが再び動くのかが、使っている側から見えていませんでした。

参考

Discussion