かなチャットの技術アーキテクチャ
![]()
AIエージェントを日常的に使いたいが、ブラウザ自動操作系のツールはアカウントBANのリスクが付きまとう。APIキーの窃取やOAuthトークンの横流しも論外。じゃあ各社が公式に出しているCLIをそのまま使えばいいのでは、というのがかなチャットの出発点だった。
Claude Code、Codex、Gemini CLIなど、正規CLIの認証フローをそのまま利用する。ユーザーの既存サブスクリプションで動くので、利用規約違反のリスクがない。やっていることはCLIのフロントエンドラッパーで、認証には一切関与しない。
想定する使い方
「これやっといて」と投げて放置し、終わったら通知が来る。ファイア・アンド・フォーゲット型。デバイスの前に常時いることを前提としない。
CodexとClaudeのやり取りで継続的にタスクを回すことは技術的に可能だが、自律実行で延々と動かし続ける運用は想定していない。自律的に問題を解決させるにはシェル権限、APIトークン、パスワード等を渡す必要があり、個人情報漏洩やPCの乗っ取りに直結する。技術としては面白いが、自分の環境に適用するには精神的ハードルが高い。そのためタスク単位で完結させ、ツール承認ゲートで破壊的操作を制限する設計にしている。
CLIを直接使うのと何が違うか
Claude CodeやCodexを直接叩いてオーケストレーションすれば、ほぼ同じことはできる。かなチャットが分けているのは以下の2点。
- タスクごとのセッション分離: ジョブごとに専用のtmuxウィンドウでCLIを起動する。あるタスクのコンテキストが別のタスクに漏れない
- コンテキスト汚染の排除: 雑談、調べ物、ステータス確認といった会話ノイズを除外し、実行計画に必要な情報だけをCLIに渡す。Claude CodeのPlanモードはコンテキストクリアできるが履歴が完全に消えるため、必要な文脈まで失われる。かなチャットは会話履歴を外部のSQLiteに保持しつつ、タスク投入時にクリーンなプロンプトを生成することでこの問題を回避している
システム構成
flowchart TB
A["iPhone ブラウザ<br/>WebSocket + HTTP"]
B["FastAPI (:8000)<br/>タスク管理 / WS / 静的ファイル配信"]
C1["Claude Code"]
C2["Codex"]
C3["Gemini CLI"]
A -- "Tailscale VPN" --> B
B -- "tmux セッション制御" --> C1
B -- "tmux セッション制御" --> C2
B -- "tmux セッション制御" --> C3
iPhoneとMacはTailscaleで直結。インターネットにポートを公開せず、VPN内でFastAPIに直接アクセスする。各CLIの認証はユーザーが事前に済ませたものをそのまま使う。
各レイヤーの役割
フロントエンド (HTML SPA)

チャットUIとジョブダッシュボード。WebSocketでストリーミング受信する。
FastAPIバックエンド
メッセージの送受信、ジョブのCRUD、WebSocketストリーム配信を担当する。SQLiteでセッション・ジョブ・TODOを永続化。インテント分類にHaikuを使い、チャットとステータス問い合わせを振り分ける。
tmuxブリッジ
ここがかなチャットの核。CLIのTUI出力をtmuxペインキャプチャで読み取り、ANSIエスケープ除去・ソフトラップ展開してテキスト化する。ユーザーメッセージは tmux send-keys で注入。CLIをAPI化せず、ターミナルの表示をそのまま中継するアプローチを取っている。
つまり各CLIのプロトコルや出力形式に依存せず、ターミナルに表示されるものをそのまま読む。CLIのバージョンアップで内部APIが変わっても影響を受けない。
CLIワーカー
Claude Code、Codex、Gemini CLIをtmuxウィンドウで直接起動する。
- Fullモード: Codexでタスク分解し、複数Claudeワーカーが並列実行、最後にレビュー
- Simpleモード: 単一Claudeワーカーが直接実行
ジョブごとに専用ウィンドウを生成し、指示ファイル読み込み、実行、結果書き出しという流れで処理する。
会話履歴の管理
会話履歴はCLIのコンテキストとは独立して管理する。永続ログとは別に、すぐ引ける形でファイルに書き出している。
- SQLite (
conversations): 全メッセージをセッションID付きで永続保存するマスターログ state/recent.md: 直近の会話ログ。セッション横断で最新40件を保持し、メッセージ送受信のたびに更新state/summary.md: 会話トピックのサマリー。一定ターンごとにユーザー発言からトピックを抽出してリスト化
Heartbeatやジョブ生成、CLIセッション復帰時はこれらのファイルを直接読むだけで済む。毎回SQLiteを引く必要はない。
Heartbeat (自動タスク提案)
会話履歴を定期スキャンし、Haikuで「やりたそうなこと・困っていること」を抽出してタスク候補として提案する仕組み。
- 直近の会話メッセージを取得
- Haikuに投げてタスク候補を抽出 (最大3件)
- 実行中・完了済みジョブと重複チェック (Haikuで判定)
- 新規タスクのみpendingジョブとして登録し、WebSocketでフロントに通知
ユーザーが承認するとジョブパイプラインに流れる。あくまで提案であり、勝手に実行はしない。
ツール承認ゲート
CLIが実行許可を求めるツールに対して自動でapprove/rejectを返す。
- 許可: web_search、curlなど読み取り系
- 拒否: rm、mkdir、git、bash実行など破壊的操作
自律実行の怖さはここに集約される。読み取りは自動で通し、書き込み・実行系はゲートで止める。これでファイア・アンド・フォーゲットでも致命的な事故は防げる。
そもそもみんなOpenClawすげーと言ってあらゆる権限を与えて動作させているが、いったいなにをやっているのか疑問が尽きない。専門家ですらそれをやって大変なことになっている人がいるのに、安易に全部渡してなにかあったらどうするんだろうか。特にAntigravityのトークンをパクるのなんか論外すぎる。そりゃBANされる。AIに限らず、OAuth認証を乗っ取ってトークンを取って非公開APIを回すとか泥棒みたいなもんでしょ。

※ このページで使用している画像はすべて自作のかなちゃんLoRA (Illustrious系) で生成したものです。