← 記事一覧

ターミナルの逆襲:Rust と Go でエージェントループをクロスプラットフォームへ

Agent! は Mac アプリですが、コーディングエージェントは開発者が働くあらゆる場所にあるべきです。エージェントループが Rust 版と Go 版の 2 つの CLI となり、macOS・Windows・Linux でフルスクリーン TUI を備えるまでの道のりを紹介します。

これまでの大半の期間、Agent! は誇り高き Mac アプリでした。ネイティブの Swift と SwiftUI、AppleScript やアクセシビリティ(Accessibility)との深い連携、そして root 権限のための Launch Daemon。それは今も変わらずフラッグシップです。しかしここ数日で、コーディングエージェントに対する私たちの考え方に変化が起き、今日それをリリースします。

エージェントループが、macOS・Windows・Linux のターミナルで動くようになりました。同じ機能を持つ 2 つのエディションがあります。Rust で書かれた AgentiLoopCLI と、Go で書かれた AgentiLoopGo です。そう、この小さな弟たちのコードの多くは、Mac 版 Agent! 自身が書きました。

パラダイムシフト:ターミナルへの回帰

AI コーディングツールの第一波は、エディタやチャットウィンドウの中にありました。今勝ちつつある波は、ターミナルの中にあります。それには十分な理由があります。

  • ターミナルはもともと作業の現場です。ビルド、テスト、git、パッケージマネージャ、SSH セッションはすべてそこにあります。ターミナルのエージェントは、それぞれに個別の連携を用意する必要がありません。bash があるのですから。
  • どこでも動きます。CLI は Linux のビルドマシンでも、コンテナの中でも、SSH 越しの Raspberry Pi でも、Windows の開発用 VM でも動きます。Mac アプリが動くのは Mac の上だけです。
  • 組み合わせられます。ワンショットモード(agentiloop "explain this project")は、そのままスクリプトや CI に組み込めます。
  • やっていることに正直です。すべてのツール呼び出し、diff、権限の確認がプレーンテキストで流れていきます。

アクセシビリティ経由で Photo Booth を操作したり、ScriptingBridge で Mail をスクリプト化したりといった Mac アプリの超能力は、本当に Mac 専用です。しかしエージェントループはそうではありません。推論し、ツールを呼び出し、実際の結果を読み、修正し、繰り返す。これはシェルとファイルシステムがあればどの OS でも機能します。だから私たちはループを切り出しました。

なぜ 2 つの言語なのか?

1 つに絞ることもできました。しかし私たちは、あえて同じ設計を 2 回移植しました。

Rust (AgentiLoopCLI) が先でした。ワークスペースは 9 月 20 日に、コアループ、Anthropic プロバイダ、組み込みツール、CLI とともに立ち上げられました。5 つの crate に分かれています。agentiloop-core(ループ、メッセージ、セッション、権限)、agentiloop-provider、agentiloop-tools、agentiloop-mcp、agentiloop-cli です。tokio 上で動作し、rustls を使った reqwest を採用しているため Windows で OpenSSL と格闘する必要がなく、TUI は ratatui で描画します。Markdown は pulldown-cmark で処理し、コードのシンタックスハイライトは syntect が担います。

Go (AgentiLoopGo) は 9 月 23 日、怒涛のコミットで登場しました。まずテスト付きのコア(メッセージ、エージェントループ、コンパクション、セッション、権限)、次にプロバイダ、続いて MCP クライアント、そして REPL、TUI、Markdown、シンタックスハイライト、セッション、スラッシュコマンドを備えた CLI です。TUI は tcell で描画し、Markdown は goldmark でレンダリングし、ハイライトは chroma、行編集は liner で処理します。リリースワークフローは Rust 版と同じ 5 つのプラットフォームを対象としています。

2 回実装することは、最高の設計レビューです。本当は Rust 特有、あるいは Go 特有だったものはすぐに浮かび上がり、残ったものこそが本当のアーキテクチャです。実用的なメリットもあります。チームがすでに信頼しているツールチェーンを選べばいいのです。そして、どちらが優れているか教えてください。🦀 vs 🐹

同じループ、より小さな表面

どちらの CLI も、意図的に小さく鋭いツールセットから始めています。

ツール機能事前に確認?
read_file行番号付きでファイルを読み込むいいえ
list_dirフォルダの一覧を表示するいいえ
write_fileファイルを作成または上書きするはい
edit_file完全一致するテキストを置換するはい
bashコマンドを実行する(Mac と Linux では sh -c、Windows では cmd /C)はい

もっと欲しいですか?どちらのエディションにも、Agent! 自身の AgentMCP から移植した MCP クライアントが含まれており、stdio、Streamable HTTP、従来の HTTP+SSE に対応しているので、どんな MCP サーバーのツールもそのまま接続できます。

権限はコアの一部であり、UI に後付けされたものではありません。Rust では、PermissionPolicy トレイトが、ツール名、変更を伴うかどうか、そして入力に基づいて、各呼び出しを実行してよいかを判断します。答えは Allow、Deny、Cancel のいずれかです。3 つ目の選択肢は、実際の不満から生まれました。権限の確認で Esc を押したときは、タスク全体を終了するのではなく、その 1 回の呼び出しだけをスキップすべきです。CLI は対話型のポリシーを提供し、テストと CI では AllowAll を使います。

クロスプラットフォームは細部に宿る

「Windows で動く」と言うのは簡単ですが、本当にそうするのは大変です。そのために必要だったことをいくつか紹介します。

  • 暴走したコマンドを確実に止める。bash がタイムアウトしたとき、シェルが子プロセスを生成していれば、シェルを終了するだけでは不十分です。Go 版はプロセスツリー全体を終了します。Unix ではプロセスグループ、Windows では taskkill /T を使います。コードは proc_unix.go と proc_windows.go に分かれています。
  • 3 つの OS すべてで CI。Go リポジトリは macOS、Linux、Windows で CI を実行し、Rust のリリースワークフローは 5 つのバイナリをビルドします。macOS arm64 と x86_64、Linux x86_64 と arm64、そして Windows x86_64 です。
  • 署名済みの Mac バイナリ。リリースワークフローで macOS ビルドの署名と公証ができるため、Gatekeeper にブロックされません。
  • 設定ファイルの発掘作業は不要。CLI は起動方法を覚えています。プロバイダ、モデル、TUI モード、セッションです。初回実行以降は、agentiloop とだけ打てば、前回中断したところから正確に再開できます。

アプリのような使い心地の TUI

実行方法は 3 つあります。フルスクリーンの TUI(agentiloop --tui)、シンプルなターミナル向けの 1 行ずつのチャットモード、そしてスクリプト向けのワンショットモードです。TUI はここ数日で大忙しでした。

  • プロンプトボックス内のアニメーション付きビジーインジケーター(スピナー、現在のアクティビティ、経過時間を表示)
  • 1 秒あたりのトークン数の計測
  • クリック可能なリンク
  • 起動をまたいで保持されるプロンプト履歴
  • 再開したセッションで以前の会話を表示し、真っ白な画面を見つめずに済む
  • プロバイダのライブなモデル一覧に基づく /model

そして API キーがない、または間違っているときは、401 をそのまま吐き出すのではなく、平易な言葉でそう伝え、実際のプロバイダ名を示します。

プロバイダ

初日から、Claude(API キーまたは Claude Code の OAuth トークンを同じ認証情報に入れられ、認証方式は自動判別)、OpenAI および OpenAI 互換の任意のサーバー、Ollama や LM Studio 経由のローカルモデル、そして Apple Silicon 上の oMLX に対応しています。oMLX のアドレスとキーは ~/.omlx/settings.json から自動的に読み込みます。

リリースを試す

本日、v0.0.4 を正式リリースとして公開しました。まだ初期段階で動きも速いので、変更のコストが低い今のうちにフィードバックをいただきたいと考えています。Rust releases からバイナリを入手するか、ソースから Go 版をビルドしてください。

Mac アプリがなくなることはありません。Mac をお使いなら、Agent! はどんなターミナルにもできないことを今もやってのけます。しかし、Linux サーバーでも、Windows ノートでも、Raspberry Pi でも同じエージェントを使いたいと思ったことがあるなら、それがここにあります。