デバッグプロトコル
リモートデバッグプロトコルは、debug モジュールをリンクするすべての Turian ゲームビルドに組み込まれた軽量な JSON-RPC 2.0 サーバーです。ランタイムイントロスペクションレイヤーを TCP 経由で公開し、CLI、MCP サーバー、カスタムスクリプトなどの外部ツールがライブのエンジン状態をクエリしたり(オプションで)変更したりできるようにします。
ワイヤフォーマット
1 行に 1 つの JSON オブジェクト(\n で終端)。Content-Length ヘッダーはありません。
リクエスト:
{"jsonrpc":"2.0","id":1,"method":"entity.inspect","params":{"name":"Player"}}
成功レスポンス:
{"jsonrpc":"2.0","id":1,"result":{...}}
エラーレスポンス:
{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"Entity not found"}}
メソッド
シーン
| メソッド | パラメータ | 説明 |
|---|---|---|
scene.list |
— | 読み込まれているすべてのシーン |
scene.inspect |
name? |
シーン内のエンティティ(省略時はアクティブシーン) |
エンティティ
| メソッド | パラメータ | 説明 |
|---|---|---|
entity.find |
name?、component? |
名前またはコンポーネントタイプでエンティティをフィルタリング |
entity.inspect |
name または index |
Transform + コンポーネント詳細 |
コンポーネント
| メソッド | パラメータ | 説明 |
|---|---|---|
component.get |
entity、component |
コンポーネントのフィールド値 |
アセット
| メソッド | パラメータ | 説明 |
|---|---|---|
asset.list |
— | すべてのプロジェクトアセット(guid、path、type) |
asset.inspect |
guid |
1 つのアセットの guid / path / type |
診断
| メソッド | パラメータ | 説明 |
|---|---|---|
snapshot |
— | 完全なシーンスナップショット(全エンティティ + メトリクス) |
schema |
— | 組み込みコンポーネントタイプのカタログ |
metrics |
— | ランタイムパフォーマンスカウンター |
profiler.capture |
— | 最新のプロファイラフレーム(カウンター + ゾーン) |
memory |
— | memory_bytes + allocation_count |
errors |
— | 最近の std.log 警告/エラーエントリ(新しい順) |
ping |
— | ヘルスチェック;"pong" を返す |
auth |
token |
認証(サーバーにトークンが設定されている場合に必要) |
変更(読み書きモードのみ)
変更メソッドは { "ok": bool, "message": string } を返します。サーバーが読み書きモード(allow_write / CLI --rw)で起動されている必要があります。そうでない場合は READONLY を返します。Studio では、すべての変更はエディターのアンドゥスタックを通じてルーティングされるため、AI/CLI による編集は元に戻すことができ、UI と一貫性が保たれます。
| メソッド | パラメータ | 説明 |
|---|---|---|
component.set |
entity、component、field、value |
コンポーネントフィールドを設定 |
transform.set |
entity、channel、value([x,y,z]) |
位置/回転/スケールを設定 |
entity.spawn |
name |
新しい空のエンティティを作成 |
entity.destroy |
entity |
エンティティを削除 |
asset.reload |
guid |
アセットをホットリロード |
セッションとイベント
| メソッド | パラメータ | 説明 |
|---|---|---|
session.readonly |
— | この接続の書き込み権限を破棄(再付与不可) |
subscribe |
event(または "*") |
ランタイムイベントを購読 |
unsubscribe |
event(または "*") |
イベントの受信を停止 |
購読中のクライアントは、イベント発火時に JSON-RPC 通知(id なし)を受信します:
| イベント | 発火タイミング |
|---|---|
entity.created |
エンティティが生成されたとき |
entity.destroyed |
エンティティが削除されたとき |
scene.loaded |
シーンがアクティブになる/読み込み完了したとき |
scene.unloaded |
シーンがアンロードされたとき |
resource.reloaded |
アセットがホットリロードされたとき |
fps.changed |
整数 FPS バケットが変化したとき |
Turian Studio では、シーンタブを開く、切り替える、閉じる際に scene.loaded / scene.unloaded が発火し、fps.changed はエディター自身のフレームタイミングに基づいて駆動されます。そのため、Play モードだけでなく編集中にも刻みます。
エラーコード
| コード | 名前 | 意味 |
|---|---|---|
-32700 |
PARSE_ERROR |
無効な JSON |
-32600 |
INVALID_REQUEST |
必須フィールドが不足 |
-32601 |
METHOD_NOT_FOUND |
不明なメソッド |
-32602 |
INVALID_PARAMS |
パラメータが不足または誤り |
-32603 |
INTERNAL_ERROR |
シリアライズまたは内部エラー |
-32000 |
NOT_FOUND |
エンティティ/シーン/コンポーネントが見つからない |
-32001 |
READONLY |
読み取り専用セッションで変更を試行 |
-32002 |
RATE_LIMITED |
接続ごとのレート制限超過 |
デバッグサーバーの起動
const debug = @import("debug");
var srv = debug.Server.init(allocator, .{
.port = 7777,
.localhost_only = true,
.auth_token = "", // 空 = 認証なし
.allow_write = false, // true で変更を許可
.max_clients = 8,
.rate_limit_per_sec = 0, // 0 = 無制限
.max_outbound_queue = 2048, // クライアントごとのイベントバックログ上限
.max_outbound_bytes = 16 << 20,
.max_inbound_queue = 4096, // 全クライアントの保留中リクエスト
});
defer srv.deinit(io);
try srv.start(io); // 受け入れループのみを起動
// メインスレッドで毎フレーム:
srv.pump(world, applier); // ライブ状態に対してキューされた読み取り/書き込みを実行
受け入れループはバックグラウンドスレッドで実行されますが、すべてのリクエストはメインスレッドの pump 内で実行されます。そのため、読み取りは競合がなく、書き込みはロックなしでライブのエンジン状態を操作できます。複数のクライアントを同時にサポートします。変更はホスト提供の MutationApplier を通じて適用されます。イベントは srv.emit(...) で発行されます。srv.stop(io) を呼び出してクリーンにシャットダウンします。
大きなレスポンスとバックプレッシャー
大規模なシーンの完全な snapshot は 64 KiB をはるかに超えてシリアライズされます。メッセージは改行区切りですが、64 KiB に制限されていません。クライアントとサーバーの両方が読み取りバッファをヒープ上で 16 MiB のハード上限まで拡張するため、大きなレスポンスも失敗せずに完全に到着します。
各接続の送信イベントキューには上限があります(max_outbound_queue / max_outbound_bytes)。読み取りを停止した購読者の最も古いイベントはドロップされます(イベントは本質的に非保証です)。これにより、サーバーメモリが無制限に増加するのを防ぎます。保留中のレスポンスを受信できないほど遅れているクライアントは切断されます。共有の受信キューは max_inbound_queue で制限されています。満杯になると、新しいリクエストは明確な「サーバー繁忙」エラーで拒否されます。
ネットワーク露出。
localhost_only = falseを設定すると0.0.0.0にバインドされ、TLS はありません。auth_token(およびすべてのトラフィック)は平文で送信され、それが唯一のゲートです。ファイアウォール/VPN の背後にある信頼できる LAN 上でのみ使用し、デバッグサーバーをパブリックインターネットに公開しないでください。
turian-cli からの使用
turian-cli debug connect
turian-cli debug scenes
turian-cli debug inspect Player
turian-cli debug snapshot
turian-cli debug schema
turian-cli debug metrics
turian-cli debug assets
turian-cli debug errors
# 変更(サーバーは読み書きモードである必要があります):
turian-cli debug set Player Light intensity 2.5
turian-cli debug spawn Crate
turian-cli debug destroy Crate
# イベントとセッション:
turian-cli debug watch entity.created fps.changed
turian-cli debug record session.jsonl
turian-cli debug replay session.jsonl
完全なサブコマンド一覧については turian-cli debug --help を参照してください。
デフォルトポート
7777。サーバー側とクライアント側の両方で --port で上書きできます。