ワールドと要求の所有
参加ごとに一つのSession
モジュールのルートからWorldLifecycleを一度登録します。返されたWorldBindingで、ツール呼出しに対応するSessionを取得します。AI会話の接続・再接続ではゲーム側のSessionを作り直しません。次元移動では同じSessionのrelocatedを呼びます。
open、tick、relocated、closeの開始はclientスレッドです。そこでファイル・通信・サーバー所有データを待たないでください。openが返したSessionが非同期読込と終了を所有します。返す前に例外を出す場合は、open自身が確保した資源を解放します。
退出時は本体が新規受付を閉じてからcloseを呼びます。返すのは終了要求の受領ではなく、保存・資源解放の実際の完了です。完了を次のtickに依存させないでください。前の参加の保存中に次の参加が始まる場合もあるため、状態を分け、同じファイルへの操作順序を管理します。共有workerの終了はWorldLifecycle.shutdownが担当します。
呼出しごとのContext
非同期処理後の小さなclient操作にはCallContext.onClientを使います。本体が要求・タスク・参加の有効性を再検査してから実行します。isActiveを読んで後から別スレッドで操作するだけでは、検査と操作を一体にはできません。サーバーへのアクセスには、別途サーバー側の実行規則が必要です。
I/Oの前に元のSessionと不変の入力を保持してください。古い結果をWorldBinding.current()で取得した新しいワールドへ反映してはいけません。ended()で受取待ちを終えても、受理済みI/Oやnative資源の回収は実行元が引き続き所有します。
queryはすべて観測した場所のrevisionに属します。toolは次元移動をまたげるWORLDと、同じ場所に限るLOCATIONを選べます。どちらも退出後まで要求を有効に保つものではありません。
再送と結果
TASK_OPERATIONは同じtool・task・有効範囲・操作IDの実行をまとめます。同じ引数なら実行を共有し、異なる引数は拒否します。失敗も保持します。タイムアウトだけでは副作用が取り消されたと分からないため、意図的に新しい操作IDを使う前に機能側の状態を確認してください。再接続をまたぐ永続的な一度だけの実行を保証するものではありません。
callbackや副作用の前に状態を確定します。拒否・取消・後着の際には、誰が回収を所有し、次の受理済み処理を誰が進めるかを決めてください。古い結果を拒否する検査だけでは進行を保証できません。
inputContextは一つの入力に添える小さな観測です。指示を送る経路や常時購読ではありません。参照がなければ空のOptionalを返します。本体は以前の値を使い回しません。