Files
MoFin/scripts/check_missing_scripts.py
T
hmo 57377e9dd3 feat(auto_heal): multi-profile key switching + fix two error classes
Error investigation (from restored monitoring) found 2 root causes:

1. 'Blocked: script path resolves outside scripts dir' (5+ cron jobs):
   Jul 17 symlink refactor replaced real scripts with symlinks; the hermes
   cron scheduler's security check (Path.resolve + relative_to) rejects
   symlink escape. ALL no_agent script jobs blocked since Jul 17 23:12.
   FIX: converted 102 symlinks to hardlinks (same inode, resolve() stays
   inside scripts_dir, single-source still works). Permanent structural fix.

2. HTTP 429 on default profile (知识研究/梦境循环/wiki-self-growth/
   evolution-pulse/大脑任务执行): default gateway used ocg-key1 (weekly
   100%). FIX: switched default profile to ocg-key6 + added missing
   provider block. LLM verified working (3.1s).

auto_heal extended to actually cover these automatically next time:
- PROFILES registry: zhiwei (8643, system svc) + default (8642, user svc)
- current_provider/switch_key/_scan_agent_log parameterized by profile
- health() now reports llm_provider_default (agent.log scan)
- auto_heal: per-profile 429 detection -> best_key -> switch_key(profile)
- _ensure_provider_block: injects missing provider credentials from
  zhiwei config (single source of truth) into target config
2026-07-20 01:12:38 +08:00

31 lines
1.2 KiB
Python

import os
files = ['meta_growth.py', 'macro_context_collector.py', 'divergence_detector.py',
'memory_guardian.py', 'fix_gateway_port.py']
d = '/home/hmo/.hermes/profiles/position-analyst/scripts/'
for f in files:
p = os.path.join(d, f)
if os.path.islink(p):
target = os.readlink(p)
ok = os.path.exists(p)
print(f"{f} -> symlink -> {target} [{'OK' if ok else 'BROKEN'}]")
elif os.path.exists(p):
print(f"{f} -> real file")
else:
print(f"{f} -> MISSING")
print()
print('=== deploy/profile-scripts candidates ===')
deploy = '/home/hmo/MoFin/deploy/profile-scripts/'
for f in os.listdir(deploy):
if any(k in f for k in ['meta_growth', 'macro_context', 'divergence', 'memory_guardian', 'fix_gateway']):
print(' ', f)
print()
print('=== search whole MoFin for the 5 scripts ===')
import subprocess
for f in files:
r = subprocess.run(['find', '/home/hmo/MoFin', '/home/hmo/projects', '-name', f,
'-not', '-path', '*/venv/*'], capture_output=True, text=True, timeout=30)
found = [l for l in r.stdout.splitlines() if l.strip()]
print(f"{f}: {found if found else 'NOT FOUND'}")