[notifyActiveTaskWaitersのTypeErrorでDiscordゲートウェイがクラッシュ] - OpenClaw 4.5 notifyActiveTaskWaiters TypeError crashes Discord gateway
command-queue.tsのnotifyActiveTaskWaitersでTypeErrorが発生し、Discordゲートウェイハンドラがクラッシュします。着信メッセージの処理中にエラーが発生し、すべてのメッセージが通知なくドロップされます。
🔍 症状
主要な症状
Discordゲートウェイが、受信したメッセージの処理時にTypeErrorを発生させてクラッシュします。ボットは完全に反応しなくなり、返信が送信されなくなります。
エラー出力
TypeError: undefined is not iterable (cannot read property 'length' of undefined)
at notifyActiveTaskWaiters (command-queue.ts)
→ Gateway handler crashes before any reply can be sent
→ All Discord messages silently dropped
動作上の症状
- ボットはWebSocket接続を正常に確立する
- 受信メッセージのログへの記録が行われない
- Discordでユーザーメッセージに対するボットの応答が表示されない
- ゲートウェイ接続はアクティブなままアイドル状態になる
- コマンドキューの使用状況に応じて、他のプラグイン機能にも影響が出る可能性がある
環境
- OpenClawバージョン: 2026.4.5
- Node.js: v22.22.1
- OS: Linux (Ubuntu)
- チャンネル: Discord
🧠 原因
直接的な原因
command-queue.ts内のnotifyActiveTaskWaiters関数が、期待される反復可能な配列の代わりにundefinedを受け取ります。関数はガード節なしでこの値の.lengthプロパティにアクセスするか、反復処理を行おうとし、TypeErrorをトリガーします。
障害発生の順序
- ユーザーがDiscordボットにメッセージを送信する
- ゲートウェイがWebSocket経由でメッセージペイロードを受信する
- ゲートウェイハンドラーが
notifyActiveTaskWaitersを呼び出す notifyActiveTaskWaitersが配列の代わりにundefinedを受け取る- 内部の反復処理または長さチェックが
undefinedで失敗する - TypeErrorがコールスタックを伝播する
- ゲートウェイハンドラーがメッセージを処理せずにクラッシュする
複合的な設定の問題
診断中に、この問題を複雑化する二次的な設定問題が特定されました:
- 不正な設定のネスト: 設定が内部にネスト/重複しており、不正な
"cha"キーが含まれている。config.ymlが破損していることを示しています - 削除されたレガシーキー:
channels.discord.guilds.<id>.channels.<id>.allowはOpenClaw 4.5で削除されましたが、設定文件中にも残っています - 缺失插件声明:
discordとanthropicプラグインがplugins.allowに存在しません - 古いプラグイン参照:
plugins.allowにbrowserが存在しますが、以前のバージョンで削除されたプラグインを参照しています
アーキテクチャの背景
コマンドキューシステムは、ゲートウェイとプラグイン実行間の非同期タスク調整を管理します。バージョン4.5では、特定の設定状态下、特にプラグイン宣言が不完整거나 레거시 키가 새 스키마와 충돌할 때、常にデータが投入されない可能性がある配列への依存関係を導入するコード変更がありました。
🛠️ 解決手順
即時の回避策:ロールバック(本番環境推奨)
即座にDiscord機能が必要な場合:
# 最後の安定バージョンにロールバック
npm install openclaw@2026.4.2
# ゲートウェイを再起動
openclaw restart恒久的な修正:設定の修復
組み込みの診断・修復ツールを実行します:
openclaw doctor --fixこのコマンドは以下の問題を自動的に処理します:
- 破損またはネストされた設定構造
- バージョン4.5で削除されたレガシーキー
- 缺失插件声明
- 古いプラグイン参照
手動による設定修復(doctorツールが失敗した場合)
ステップ1:現在の設定をバックアップ
cp config.yml config.yml.backup-$(date +%Y%m%d)ステップ2:レガシーのチャンネル許可キーを削除
以下をすべて見つけて削除します:
channels:
discord:
guilds:
<guild-id>:
channels:
<channel-id>:
allow: [...] # このキーを完全に削除ステップ3:plugins.allowセクションを修正
plugins.allowブロックを正しいプラグインリストに置き換えます:
# 修正前(壊れている)
plugins:
allow:
- browser # 古いため削除
# discord、anthropicが缺失
# 修正後(正しい)
plugins:
allow:
- discord
- anthropic
# 必要に応じて他のアクティブなプラグインを追加ステップ4:設定構造を検証
openclaw config validateステップ5:ゲートウェイを再起動
openclaw restart修正後の確認:プラグイン宣言の検証
openclaw plugins list --enableddiscordが有効なプラグインリストに表示されていることを確認します。
🧪 検証
ステップ1:設定の有効性を確認
openclaw config validate期待される出力:
✓ Configuration schema validated
✓ No legacy keys detected
✓ Plugin declarations completeステップ2:診断ツールを実行
openclaw doctor期待される出力(エラーなし):
Checking configuration... OK
Checking plugin declarations... OK
Checking Discord gateway connectivity... OK
No issues found.ステップ3:ゲートウェイ接続を検証
openclaw status --channel discord期待される出力:
Discord Gateway: CONNECTED
Bot User: <your-bot-name>
Latency: <value>msステップ4:機能テスト
Discordでボットにテストメッセージを送信します。以下を確認します:
- メッセージが受信され、ゲートウェイ出力にログ記録される
- ボットが想定されるレイテンシー内で応答する
- ゲートウェイログにTypeErrorが表示されない
ステップ5:ログでエラーを確認
openclaw logs --tail 100 --level error期待される結果:TypeError: undefined is not iterableのエントリがないこと。
ステップ6:コマンドキューの安定性を検証
複数の連続メッセージを送信して、コマンドキューが同時リクエストを処理することを確認します:
# 5つのメッセージを連続して送信
for i in {1..5}; do
echo "Test message $i" | openclaw send --channel test-channel
doneすべてのメッセージがクラッシュ없이処理される必要があります。
⚠️ よくある落とし穴
設定の破損
- 重複/ネストされた設定:
config.ymlの手動編集により、ネストされたコピーが導入される場合があります。プログラムによる更新には常にopenclaw config setを使用してください。 - YAMLのインデント: 不適切なインデントは解析を壊します。インデントにはスペース(タブではなく)を使用してください。
- 特殊文字:
:, #, {, }を含む引用符のない文字列は、解析エラーを引き起こす可能性があります。
プラグイン管理
- 許可リストにないプラグイン: インストールされていても、プラグインは
plugins.allowに明示的にリストされていないと読み込まれません。 - 削除されたプラグイン: 以前のバージョンで削除されたプラグイン(
browserなど)は設定に残り、検証失敗を引き起こす可能性があります。 - 順序の依存性: 一部のプラグインには依存関係があります。依存プラグインがその後で宣言されていることを確認してください。
バージョン固有のトラップ
- バージョンのスキップ: 4.3から4.5に直接アップグレードすると移行手順を逃がす場合があります。複雑なバージョンの飛躍には段階的なアップグレードを使用してください。
- ロックファイルの不一致:
package-lock.jsonが壊れたバージョンをキャッシュしている可能性があります。再インストール前にロックファイルを削除してください。
環境固有の問題
- Docker: ボリュームマウントがコンテナの再起動間で設定を持続させることを確認してください。
openclaw doctor --fixが正しいマウントされたボリュームに書き込んでいることを確認してください。 - pm2/systemd: サービスマネージャーは古いプロセス状態をキャッシュする可能性があります。プロセスの再起動ではなく、サービスを再起動してください。
- Windows: 改行の違い(
\r\n対\n)がYAMLを破損させる可能性があります。config.ymlの一貫した改行を確保してください。
移行時の落とし穴
- チャンネルの許可キー: バージョン4.5ではチャンネルごとの許可ルールが削除されました。アップグレード前に既存のルールを新しい許可システムに移行してください。
- プラグイン設定キー: 一部のプラグイン固有キーが名前変更されました。推奨されないキーマッピングについては4.5の changelogを確認してください。
🔗 関連するエラー
TypeError: undefined is not iterable (cannot read property ’length’ of undefined)
- 場所:
command-queue.tsのnotifyActiveTaskWaiters - トリガー: ゲートウェイが受信Discordメッセージを処理する
- 関連: Issue #4521 - コマンドキューは常に配列入力を想定している
設定スキーマ検証の失敗
- エラー:
ConfigValidationError: Unknown key 'channels.*.channels.*.allow' - トリガー: レガシーチャンネルの許可キーを持つ設定の読み込み
- 関連: OpenClaw 4.5プラグインシステムのBreaking Changes
プラグインの読み込み失敗
- エラー:
PluginNotFoundError: Plugin 'browser' not found in registry - トリガー:
plugins.allow内の古いプラグイン参照 - 関連: v4.4+でのプラグインレジストリのクリーンアップ
ゲートウェイWebSocket切断
- エラー:
GatewayError: WebSocket closed with code 1006 - トリガー: ゲートウェイハンドラー内の未処理例外
- 関連: メッセージ処理中のTypeErrorからの連鎖的な障害
設定のネスト破損
- エラー:
YAMLSyntaxError: Nested mappings are not allowed - トリガー: 重複キーまたは不適切なネストを持つ不正なYAML
- 関連: 手動設定編集エラー、プログラム更新の失敗