Files
openclaw-ops/scripts/verify-discord-routing.sh

74 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
CONF="/home/node/.openclaw/openclaw.json"
CONTRACT="/home/node/.openclaw/workspace/memory/discord-routing-contract.json"
python3 - <<'PY'
import json,sys
from pathlib import Path
conf=json.loads(Path('/home/node/.openclaw/openclaw.json').read_text())
contract=json.loads(Path('/home/node/.openclaw/workspace/memory/discord-routing-contract.json').read_text())
errors=[]
warn=[]
bindings=conf.get('bindings',[])
discord_cfg=((conf.get('channels') or {}).get('discord') or {})
guilds=(discord_cfg.get('guilds') or {})
gid=contract.get('guildId')
guild_cfg=(guilds.get(gid) or {})
guild_channels=(guild_cfg.get('channels') or {})
# index bindings by (agent, kind, id)
def has_binding(agent,kind,cid):
for b in bindings:
if b.get('agentId')!=agent: continue
m=b.get('match') or {}
if m.get('channel')!='discord': continue
p=m.get('peer') or {}
if p.get('kind')==kind and p.get('id')==cid:
return True
return False
# validate channel contracts
for cid,meta in (contract.get('channels') or {}).items():
agent=meta.get('expectedAgent')
kinds=meta.get('peerKinds') or []
for k in kinds:
if not has_binding(agent,k,cid):
errors.append(f"Missing binding: agent={agent} peer={k}:{cid}")
# allowlist presence
if cid not in guild_channels:
errors.append(f"Channel {cid} missing from channels.discord.guilds.{gid}.channels allowlist")
else:
req=(guild_channels.get(cid) or {}).get('requireMention')
exp=meta.get('requireMention')
if exp is not None and req!=exp:
errors.append(f"requireMention mismatch for {cid}: expected {exp}, got {req}")
# validate guild fallback
fb=((contract.get('guildFallback') or {}).get('expectedAgent'))
if fb:
ok=False
for b in bindings:
if b.get('agentId')!=fb: continue
m=b.get('match') or {}
if m.get('channel')=='discord' and m.get('guildId')==gid:
ok=True
break
if not ok:
errors.append(f"Missing guild fallback binding for guild {gid} -> {fb}")
# Note: binding index order does not override match-tier precedence (peer beats guild).
# So we intentionally do not fail on peer-after-guild placement.
if errors:
print('DISCORD ROUTING VERIFICATION: FAIL')
for e in errors:
print('-',e)
sys.exit(1)
print('DISCORD ROUTING VERIFICATION: OK')
PY