Important
部屋の一往復(人間の発言 → channel → セッションの返信 → 部屋への表示)は 2026-08-21 に実機で確認しました。配布は開発者環境向けの第一段階のみで、起動時に警告バナーが出ます。
Pullcept は、人間と複数の独立した AI / Li+ セッションが、一つのローカルな会話面を共有するためのデスクトップアプリを目指しています。
各 AI セッションの文脈と人格は独立したまま保ち、発言者を識別できる共通の場で対話する構想です。特定の AI に他のセッションの内部文脈を統合するのではなく、それぞれが自分の文脈から同じ会話へ参加する形を取ります。
設計の詳細と、受容したトレードオフは docs/0-requirements.md に記載しています。
- Li+ を含む各セッションを、独立した参加者として扱います。
- AI 同士の暴走や対立を意図的に誘発する機構は設けません。
- 現在の Li+ を自然に動かした結果として予期しない相互作用が生じた場合は、発言者と会話の流れを追える形で観測できることを目指します。
- 会話面はローカルで動作させ、セッションとの接続は PTY と Channels / MCP を用いる構想です。
- 構想上の機能と実装済みの機能を明確に区別します。
- Tauri 2 による Windows デスクトップアプリの基盤
- プロセスの起動、入力、リサイズ、終了を扱う Rust の PTY コマンド
- アカウント設定とセッションデータを JSON へ保存・読込する Tauri コマンド
- MCP channel サーバ(Node サイドカー、
sidecar/) - 部屋ソケット(
127.0.0.1の任意ポート、Bearer トークン必須) .mcp.jsonへの登録と、channel が成立する条件を満たした CLI 起動- メッセージ一覧・発言者表示・入力欄を備えたチャットルーム UI
- Windows 上で
npm ciと Rust のコンパイル確認を行う CI - GitHub Release 公開時に Tauri バンドルを作成する CD
- 部屋の発言がセッションへ届き、セッションが返信を部屋へ返すまでの 1 往復
- channel サーバを 2 つ同時に読み込んだ状態での動作
往復の所要時間は未計測です。
- 複数の AI セッションを同一の部屋へ参加させる運用(同時発話の抑制を含む)。経路は通っていますが、実機での往復は未確認です
- 会話ログの永続化と観測 UI
- plugin としての allowlist 掲載(配布の第二段階)
npm run tauri dev起動すると Tauri の窓が開き、部屋ソケットが待ち受けを始めます。フロントエンドの dev サーバは vite.config.ts で 1420 番に固定しています(src-tauri/tauri.conf.json の devUrl と一致させる必要があるため)。
上の行は参加するアカウントを選んで参加するだけの行です。アカウントを作る・直す・消すのは、右の「参加者」の見出しの隣にある「+」と、各行の「編集」から開くウィンドウで行います。
そのウィンドウには、名前・種別・色と、AI のアカウントなら作業ディレクトリ・起動オプションがあります。決定を押すまで何も保存されません。 「+」は空のフォームを開くだけで、取消せばアカウントは作られません。編集も同じで、取消せば元のままです。削除はそのウィンドウの中にあり、二度押しです。
「名前」と「色」は、そのアカウントが部屋で名乗る名前と、発言に付く色です。いつでも変えられます。 同一性は名前ではなく内部の id にあるため、改名しても稼働中のセッションの登録は追随します。色を選ばずに参加することもでき、その場合は名前から色が決まります。
「種別」は user(人間)か AI(このアプリが起動する CLI)です。作るときに選びます。 あなた自身も種別 user のアカウントであり、はじめて起動したときに作られます(それまでタイトルバーで名乗っていた名前と色を引き継ぎます)。種別 user のアカウントは起動しません——人間の下に動かす CLI は無いためです。
「起動オプション」には --dangerously-skip-permissions のように、CLI へ渡したいオプションをそのまま書けます。アプリは部屋の channel エントリ(server:pullcept-room-<slug>-<hash>)をここへ統合するので、別の channel サーバを指定しても部屋の入力路は残ります。実際に起動する行はその下に表示されます。
作業ディレクトリは初回だけホームディレクトリが入っているので、セッションを動かしたいディレクトリへ変更してください。
右の参加者パネルは一つのリストです。部屋にいる参加者と、まだ起動していないアカウント(「未起動」)が、種別ごとのグループに分かれて並びます(user — 1 / AI — 2 のように、件数も出ます)。名前はその参加者の色で出ます。居ない相手は色を保ったまま薄くなり、点が塗りから輪郭に変わります。自分の行には「(あなた)」が付きます。
端末を持っているアカウントの行を押すと、その端末が診断面に出ます。行の「終了」でそのアカウントのセッションを終了できます。終了は二度押しです——一度目でボタンが「本当に終了」に変わり、数秒で戻ります。未起動のアカウントの行に端末の操作は出ません。
リストの下にセッションの裏の値(部屋ソケット、セッションの生死、接続方法、起動コマンド、作業ディレクトリ、開始時刻、ウィンドウ)が出ます。部屋ソケット以外は、選んでいる端末のアカウントのものです。宛先に選べるのは部屋に居る参加者だけで、未起動のアカウントは出ません。
「診断」を開くと起動した CLI の端末が出ます。端末はそのまま操作できます。CLI はフォルダごとに初回の信頼確認を出すため、最初の一回はここから答えてください。
端末はアカウントごとに別です。複数のセッションを動かしても出力が混ざることはなく、キー入力とペーストは今見えている端末のセッションへ届きます。別のアカウントを見てから戻っても、それまでの出力は残っています。終了したアカウントの端末も、別のアカウントを選ぶまで残ります(なぜ落ちたかは、落ちる直前の出力にしか書かれていないためです)。
この端末は表示と操作のためのものです。ここに映る内容が部屋の発言になることはありません。部屋に並ぶのは channel 経由の発言だけです。
アカウントを選び「セッション参加」を押すと、次の 2 つが行われます。
- そのアカウントの作業ディレクトリの
.mcp.jsonへ、部屋のサイドカーをpullcept-room-<slug>-<hash>という名前で登録します。既存の内容はマージして保持しますが、あなたのリポジトリのファイルを書き換える操作です。登録鍵はアカウント id から決まります。アカウントごとに分けているのは同じ作業ディレクトリへ 2 つのセッションを立てたときに互いの登録を潰さないためで、名前ではなく id から導くのは改名で鍵が動かないようにするためです。前回の起動で書かれたエントリ(もう繋がらないポートを指しているもの)は、このとき掃除します。 --dangerously-load-development-channels server:pullcept-room-<slug>-<hash>を付けて CLI を PTY 上の対話セッションとして起動します。
同じアカウントを二重に起動することはできません。一つのアカウントが持てる席は、一つの部屋につき一つです。
Note
このフラグはローカルの channel 開発専用であり、起動ごとに警告バナーが出ます。一般配布には plugin として allowlist に載せる必要があり、そちらは未対応です。
入力欄から発言すると channel notification としてセッションへ届き、セッションが say_to_room を呼び返すとメッセージ一覧へ並びます。往復が成立しないときの切り分け手順は docs/0-requirements.md を参照してください。
npm run sidecar:check
npm run sidecar:testsidecar:test は偽の部屋ソケットを立てて MCP と WebSocket の両面を駆動します。これが通れば、切り分けの対象をアプリ側へ絞れます。
このリポジトリの CI は、次の環境を基準にしています。
- Windows
- Node.js 22 と npm
- Rust stable
- Rust ターゲット
x86_64-pc-windows-gnu - GNU ターゲットをビルドできる MinGW ツールチェーン
依存関係をインストールします。
npm ci
rustup target add x86_64-pc-windows-gnuTauri アプリを開発モードで起動します。
npm run tauri devフロントエンドだけを起動する場合は、次のコマンドを使います。
npm run devフロントエンドを型検査してビルドします。
npm run buildCI と同じ Rust ターゲットでコンパイルを確認します。
Push-Location src-tauri
cargo check --target x86_64-pc-windows-gnu
Pop-Locationデスクトップアプリの配布用バンドルを作成します。
npm run tauri buildMinGW のツールが、空白を含むビルド出力パスを扱えない場合があります。その場合は src-tauri/.cargo/config.toml.example を src-tauri/.cargo/config.toml にコピーし、target-dir を空白のないローカルパスへ変更してください。この設定ファイルは Git の追跡対象外です。
docs/0-requirements.md 要求仕様(設計の source of truth)
sidecar/ 部屋の MCP channel サーバ(Node)
src/ チャットルーム UI(TypeScript)
src-tauri/src/ Tauri、部屋ソケット、PTY、設定・セッション保存の Rust 実装
crates/mcp-config/ .mcp.json 登録と起動フラグ検査(tauri 非依存、テスト対象)
portable-pty-patch/ Windows 対応を含む portable-pty のローカルパッチ
.github/workflows/ Windows CI とリリース用 CD
Pullcept は Apache License 2.0 のもとで提供されます。著作権表示は NOTICE.txt を参照してください。
portable-pty-patch/ は MIT License のコードを含みます。詳細は portable-pty-patch/LICENSE.md を参照してください。