#!/usr/bin/env bash set -euo pipefail PATTERN="${1:-gemini-3-flash}" STATE_FILE="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/openclaw.json" if [[ ! -f "$STATE_FILE" ]]; then for alt in \ "${OPENCLAW_STATE_DIR:-$HOME/.openclaw/state}/openclaw.json" \ "${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw/config}/openclaw.json" \ "/opt/openclaw/state/openclaw.json"; do if [[ -f "$alt" ]]; then STATE_FILE="$alt" break fi done fi if [[ ! -f "$STATE_FILE" ]]; then echo "ERROR: openclaw.json not found" >&2 exit 1 fi echo "Config: $STATE_FILE" echo "Match pattern: $PATTERN" echo "\n== Config references ==" rg -n "$PATTERN" "$STATE_FILE" || true echo "\n== Cron payload model/message references ==" openclaw cron list --json 2>/dev/null | jq -r --arg pat "$PATTERN" ' .jobs[] | { id, name, agentId, payloadModel: (.payload.model // ""), message: (.payload.message // "") } | select((.payloadModel|test($pat;"i")) or (.message|test($pat;"i"))) ' || true echo "\n== Session model pins ==" for agent_dir in /home/node/.openclaw/agents/*; do [[ -d "$agent_dir" ]] || continue agent_id="$(basename "$agent_dir")" sess_file="$agent_dir/sessions/sessions.json" [[ -f "$sess_file" ]] || continue jq -r --arg aid "$agent_id" --arg pat "$PATTERN" ' to_entries[] | select((.value.model // "" | tostring | test($pat;"i"))) | "agent=" + $aid + " session=" + .key + " model=" + (.value.model|tostring) ' "$sess_file" || true done echo "\n== Invalid llm-proxy refs against local catalog ==" node - <<'NODE' "$STATE_FILE" const fs=require('fs'); const p=process.argv[2]; const j=JSON.parse(fs.readFileSync(p,'utf8')); const catalog=new Set((j.models?.providers?.['llm-proxy']?.models||[]).map(m=>'llm-proxy/'+m.id)); const refs=[]; const push=(where,val)=>{ if(!val) return; if(Array.isArray(val)){val.forEach((v,i)=>refs.push([`${where}[${i}]`,v]));} else refs.push([where,val]); }; push('agents.defaults.model.primary', j.agents?.defaults?.model?.primary); push('agents.defaults.model.fallbacks', j.agents?.defaults?.model?.fallbacks); for (const a of (j.agents?.list||[])) { push(`agents.list[${a.id}].model.primary`, a.model?.primary); push(`agents.list[${a.id}].model.fallbacks`, a.model?.fallbacks); } let bad=0; for (const [where,val] of refs){ if (typeof val==='string' && val.startsWith('llm-proxy/') && !catalog.has(val)) { bad++; console.log(`INVALID ${where} -> ${val}`); } } if(!bad) console.log('none'); NODE