Show HN: Panel – エージェントが独自のペインを構築できるリサーチワークスペース
Show HN: Panel – A research workspace where the agent can build its own panes (github.com)
要約
Panelは、エージェントがユーザーの隣で作業するリサーチワークスペースです。チャット、ファイル、PDF、ノートブックを1つのドックにまとめ、必要に応じてエージェントがカスタムビューアやアプリを作成できます。Claude Codeとの連携を前提としており、ファイル操作やコード実行が可能です。現在、Claude Codeに最適化されていますが、OpenAI APIのサポートも追加中です。
全文翻訳
Folders and files
エージェントがあなたの隣で作業するリサーチワークスペース:チャット、ファイル、PDF、ノートブックが1つのドックにあり、必要に応じてエージェントがカスタムビューアやアプリケーションを作成することもできます。
これはテスター向けの初期ビルドです。粗削りな部分があることを想定し、問題があれば遠慮なく報告してください。
Masala は 2026年9月まで Panel と呼ばれていました。その名前で実行していた場合は、Panelからのアップグレード を参照してください。
開始する前に
-
Node 22.18 以降(または 24.12 以降)
-
uv(必要な Python 3.12 以降を自身で取得します)
-
エージェント CLI、以下のいずれか1つ以上:
- Claude Code(インストール済みでサインイン済み):
claudeを一度実行してログインしてください。 - Codex(
npm install -g @openai/codexでインストール済み)、および OpenAI API キー(OpenAI キー を参照)。Masala は Codex の設定を~/Masala/codexに保存します。これはあなたの通常の~/.codexとは別なので、他の場所で Codex にサインインしても Masala はサインインされません。
チャットエージェントと、文献レビューなどのモジュールは、これらのいずれかを通じて実行されます。
- Claude Code(インストール済みでサインイン済み):
インストールと開始
pnpm install
uv sync
pnpm start
その後、http://localhost:4173 を開きます。pnpm start は最初にアプリをビルドするため、最初の起動には1分ほどかかります。Ctrl-C で起動したすべてを停止できます。
あなたのものがどこにあるか
~/Masala/masala.dbには、会話とエージェントが行ったすべての操作が保存されます。~/Masala/workspacesは、別のフォルダを選択しない限り、新しいワークスペースが作成される場所です。
どちらもこのフォルダの外にあるため、リポジトリを削除または再クローンしても保持されます。
動作するもの
- ファイルを読み書きでき、ツールを実行する前に確認を求めるエージェントとのチャット。
- ワークスペース:エージェントが作業するフォルダで、独自のチャットと保存されたレイアウトを持ちます。
- ファイル、PDF、Markdown、Jupyter Notebook を表示するペイン。Notebook は実際のカーネルで実行され、あなたとエージェントは同じものを編集できます。
- バックグラウンドでの長時間実行コマンド。監視および停止が可能です。
- 内蔵ペインでは表示できないものを表示したいときに、エージェントが作成してくれるペイン。
- そのペインを独自のタブから変更すること:鉛筆アイコンをクリックして、何をどのように変更したいかを伝えます。
- 文献レビュー:チャットで依頼するか、新しいタブの「またはモジュールを実行」から開始します。
まだ動作しないもの
- ほとんどのモジュールはプレーンな JSON 形式から開始されます。ペインを作成するモジュールだけが独自のフォームを持っています。
- モジュールの最終結果はまだペインに表示されず、報告された進捗状況と1行の概要のみが表示されます。
- 仮説モジュールには独自のビューがないため、結果を読むのが難しい場合があります。
- Windows では、Codex は「ワークスペースでの自動実行」でも、実行するすべてのコマンドの前に確認を求めます。これは Masala が Codex のサンドボックスを設定しないためです。「すべて許可」は質問を停止し、Codex がすべてを実行できるようにします。
OpenAI キー(オプション)
apps/server/.env.example を apps/server/.env にコピーし、OPENAI_API_KEY を設定してください。このキーは2つの機能を提供します:
- エージェントピッカーに「OpenAI API」を追加し、チャットとツールに使用できます。
- Codex がインストールされている場合、Codex にサインインします。Codex はチャットとすべてのモジュールを実行できます。
「OpenAI API」エージェントは文献レビューや仮説モジュールを実行しません。これらには Web を検索できるエージェントが必要であり、Claude Code と Codex のみが可能です。キーがない場合、ピッカーには OpenAI API と Codex がセットアップされていないと表示されますが、これは正常です。
独自の СTAgent からモジュールを使用する(オプション)
Masala のモジュール(文献レビュー、仮説モジュール、ペインを作成・管理するモジュール)は MCP サーバーとしても提供されます。stdio を介して MCP を話すことができるエージェント(ターミナルで実行中の Claude Code や Codex など)は、これらを呼び出すことができます。
各呼び出しは Masala 内で実行されるため、Masala は実行されている必要があります(pnpm start)。呼び出しはアプリ内でモジュール実行として表示され、その出力はワークスペースに保存されます。
/path/to/masala をリポジトリをクローンしたパスに置き換えてください。
Claude Code:
claude mcp add masala -- uv run --directory /path/to/masala/apps/server python -m masala_server.modules.mcp_main
Codex、~/.codex/config.toml で:
[mcp_servers.masala]
command = "uv"
args = ["run", "--directory", "/path/to/masala/apps/server", "python", "-m", "masala_server.modules.mcp_main"]
- どのワークスペースか。 呼び出しは
Defaultという名前のワークスペースに送信されます。別のワークスペースを選択するには、コマンドの末尾に--workspace "My project"(名前またはID)を追加してください。名前が見つからない場合、サーバーは認識しているワークスペースを一覧表示します。 - どのエージェントが作業するか。 モジュールは、呼び出し元のエージェントではなく、Masala 自身の СTAgent(開始できる Claude Code または Codex)で実行されます。モジュールのコストはそこで請求されます。
- 数分かかることがあります。 文献レビューや新しいペインの作成には数分かかり、呼び出しはその完了を待ちます。エージェントがツール呼び出しを途中でタイムアウトさせた場合は、その MCP ツールタイムアウトを長くしてください。
Panel からのアップグレード
会話、ワークスペース、ペインは引き継がれますが、一度手動で移動する必要があります。まず Masala を停止し、~/Panel/panel.db をバックアップしてください。
macOS および Linux、このフォルダから:
mv ~/Panel ~/Masala
mv ~/Masala/panel.db ~/Masala/masala.db
rm -f ~/Masala/panel.db.lock
for d in ~/Masala/workspaces/*/.panel; do mv "$d" "${d%.panel}.masala"; done
find ~/Masala/workspaces/*/.masala/panes ~/Masala/panes \( -name node_modules -prune \) -o -type f \( -name '*.vue' -o -name '*.ts' -o -name '*.js' \) \
-exec perl -pi -e 's/from ([\\x27"])panel\\1/from $1masala$1/g; s/\\busePanel\\b/useHost/g' {} + 2>/dev/null
uv run --directory apps/server python -c "import sqlite3, pathlib; sqlite3.connect(pathlib.Path.home() / 'Masala' / 'masala.db').executescript(open('../../scripts/upgrade-from-panel.sql').read())"
Windows、PowerShell で、このフォルダから:
Move-Item ~\[Panel] ~\[Masala]
Rename-Item ~\[Masala]\panel.db masala.db
Remove-Item ~\[Masala]\panel.db.lock -ErrorAction SilentlyContinue
Get-ChildItem ~\[Masala]\workspaces -Directory | ForEach-Object {
$old = Join-Path $_.FullName '.panel'
if (Test-Path $old) { Rename-Item $old '.masala' }
}
Get-ChildItem ~\[Masala]\workspaces -Directory | ForEach-Object { Join-Path $_.FullName '.masala\panes' } |
Where-Object { Test-Path $_ } | Get-ChildItem -Recurse -File -Include *.vue,*.ts,*.js |
Where-Object { $_.FullName -notmatch '\\node_modules\\' } | ForEach-Object {
$text = Get-Content $_.FullName -Raw
$new = $text -replace "from (['"])\[panel\]\1", 'from $1masala$1' -replace '\busePanel\b', 'useHost'
if ($new -ne $text) { [IO.File]::WriteAllText($_.FullName, $new) }
}
uv run --directory apps/server python -c "import sqlite3, pathlib; sqlite3.connect(pathlib.Path.home() / 'Masala' / 'masala.db').executescript(open('../../scripts/upgrade-from-panel.sql').read())"
各ステップの解説:
- フォルダ:データベース、独自のペイン、ペインキャッシュ、Codex のサインイン情報が格納されます。
.panelが.masalaになる:各ワークスペース内で。ワークスペースを~/Masala/workspaces外に作成した場合、その.panelをリネームし、ペインを同様の方法で書き換えてください。- あなたのペイン:現在は
'masala'からインポートされ、usePanel()はuseHost()になっています。それぞれ最初に開くときに再ビルドされます。 - データベース:各ワークスペースのフルパスと古い結果のパスを保存します。
scripts/upgrade-from-panel.sqlはそれらを新しいフォルダにポインティングするため、ワークスペースが開かれ、古い画像も表示されます。
その他:
apps/server/.envで、PANEL_で始まる設定はすべてMASALA_にリネームしてください。PANEL_DB_PATHを設定していた場合は、代わりにそのファイルに対して SQL を実行してください。- 独自の СTAgent に MCP サーバーを追加した場合、上記のコマンドで再度追加し、古い
panelのものを削除してください。 - Windows で Codex のサンドボックスを設定した場合、
~/Masalaおよび~/Masala/workspacesへの読み取り権限を再度付与してください。 - ブラウザはレイアウトとテーマを一度忘れます。
問題が発生した場合
- 「Masala がサーバーに接続できませんでした。」:サーバー側が実行されていません。
pnpm startを実行しているターミナルを確認し、「再試行」を押してください。 - エージェントがセットアップされていないと表示される:メッセージボックスの下に理由が書かれています。
- ポートが既に使用されている、またはアプリが応答するがロードされない:
pnpm dev:doctorを実行してください。どのポートが何によって使用されているか、およびそれをクリアする方法が表示されます。
ライセンス
アイデア
UI
UI は、画像ファイル、データファイル、コード、チャットセッションなど、さまざまなものを表示できる複数の設定可能なウィンドウ(ペインと呼ばれます)を備えています。これは、さまざまな種類のファイル間で頻繁にコンテキストスイッチを必要とする研究者にとって非常に重要です。
一般的なユースケースのために、デフォルトのペインセットが提供されています。しかし、PDB ビューアや SQLite ビジュアライザーのようなカスタムペインを人間やエージェントが追加することも可能です。
モジュールプロトコル
モジュールはスキルに似ていますが、モジュール間のワークフローやワークスペースとの統合をサポートするための追加の定義があります。
具体的には、モジュールは入力、出力、および中間データに対して型定義を持ちます。入力と出力は直接的です。中間データは、エージェントモジュールの思考連鎖(Chain-of-Thought)やスクラッチパッドのようなオブザーバビリティを提供するオブジェクト、またはマルチステージモジュールの中間出力を指します。これらは、透明性が必要なプロセスや進捗状況を示す必要がある長時間実行ジョブにとって特に重要です。
これらに対する型定義を持つことで、実行時の検証が可能になり、人間やエージェントが下流タスク用のカスタムモジュールや視覚化用のペインを開発しやすくなります。
データ抽象化レイヤー
データ抽象化レイヤー(DAL)は、インメモリオブジェクトとファイルシステムオブジェクトをブリッジします。DAL は URI をインメモリストアまたはローカルファイルにマッピングするのに役立ちます。これにより、モジュールはオブジェクトの操作のみを気にすればよくなります。