#!/usr/bin/env bash set -euo pipefail REG_JSON="/home/node/.openclaw/memory/channel-registry.json" CONF_JSON="/home/node/.openclaw/openclaw.json" CRON_JSON="/home/node/.openclaw/cron/jobs.json" python3 - <<'PY' import json, sys from pathlib import Path reg = json.loads(Path('/home/node/.openclaw/memory/channel-registry.json').read_text()) conf = json.loads(Path('/home/node/.openclaw/openclaw.json').read_text()) jobs = json.loads(Path('/home/node/.openclaw/cron/jobs.json').read_text())['jobs'] index={(e['platform'],e['kind'],e['id']):e for e in reg.get('entries',[])} errors=[] # check bindings for b in conf.get('bindings',[]): m=b.get('match',{}) if m.get('channel')!='discord': continue gid=m.get('guildId') if gid: k=('discord','guild',gid) if k not in index: errors.append(f"Missing registry entry for binding guild:{gid}") peer=m.get('peer') or {} pid=peer.get('id'); kind=peer.get('kind') if pid and kind in ('channel','group'): k=('discord',kind,pid) if k not in index: errors.append(f"Missing registry entry for binding {kind}:{pid}") # check cron delivery targets for j in jobs: d=j.get('delivery',{}) to=d.get('to') if not isinstance(to,str): continue cid=None if to.startswith('channel:'): cid=to.split(':',1)[1]; kind='channel' elif to.isdigit(): cid=to; kind='channel' else: continue k=('discord',kind,cid) if k not in index: errors.append(f"Missing registry entry for cron {j['id']} target {kind}:{cid}") # unresolved check for referenced entries referenced=set() for b in conf.get('bindings',[]): m=b.get('match',{}) if m.get('channel')!='discord': continue gid=m.get('guildId') if gid: referenced.add(('discord','guild',gid)) peer=m.get('peer') or {} pid=peer.get('id'); kind=peer.get('kind') if pid and kind in ('channel','group'): referenced.add(('discord',kind,pid)) for j in jobs: d=j.get('delivery',{}) to=d.get('to') if not isinstance(to,str): continue if to.startswith('channel:'): referenced.add(('discord','channel',to.split(':',1)[1])) elif to.isdigit(): referenced.add(('discord','channel',to)) for k in sorted(referenced): e=index.get(k) if e and e.get('status')=='unresolved': errors.append(f"Unresolved referenced ID: {k[1]}:{k[2]}") if errors: print('CHANNEL REGISTRY VALIDATION: FAIL') for err in errors: print('-', err) sys.exit(1) print('CHANNEL REGISTRY VALIDATION: OK') PY