- Resolve decisions.md merge conflict (keep both Codex boundary + Ezra/Bezalel entries) - Update .gitignore: protect bare secret files, exclude venvs and nexus-localhost - Add uniwizard tools (mention watcher, adaptive prompt router, self-grader, classifiers) - Add briefings, good-morning reports, production reports - Add evennia world scaffold and training data - Add angband and morrowind MCP servers - Add diagrams, specs, test results, overnight loop scripts - Add twitter archive insights and media metadata - Add wizard workspaces (allegro, nahshon)
133 lines
3.9 KiB
Python
Executable File
133 lines
3.9 KiB
Python
Executable File
#!/Users/apayne/.hermes/hermes-agent/venv/bin/python3
|
|
import io
|
|
import json
|
|
import os
|
|
import sys
|
|
import time
|
|
import urllib.request
|
|
from contextlib import redirect_stdout
|
|
from pathlib import Path
|
|
|
|
LLAMA_HEALTH = "http://localhost:8081/health"
|
|
LLAMA_MODELS = "http://localhost:8081/v1/models"
|
|
HERMES_AGENT_ROOT = Path.home() / ".hermes" / "hermes-agent"
|
|
SESSION_DIR = Path.home() / ".hermes" / "sessions"
|
|
REPORT_DIR = Path.home() / ".timmy" / "test-results"
|
|
REPORT_DIR.mkdir(parents=True, exist_ok=True)
|
|
REPORT_PATH = REPORT_DIR / f"local_timmy_proof_{time.strftime('%Y%m%d_%H%M%S')}.md"
|
|
|
|
|
|
def fetch_json(url: str) -> dict:
|
|
with urllib.request.urlopen(url, timeout=20) as resp:
|
|
return json.loads(resp.read().decode("utf-8"))
|
|
|
|
|
|
def latest_session(before: set[Path]) -> Path | None:
|
|
after = set(SESSION_DIR.glob("session_*.json"))
|
|
new_files = [p for p in after if p not in before]
|
|
if new_files:
|
|
return max(new_files, key=lambda p: p.stat().st_mtime)
|
|
existing = list(after)
|
|
return max(existing, key=lambda p: p.stat().st_mtime) if existing else None
|
|
|
|
|
|
# 1. Local model server must be alive.
|
|
try:
|
|
fetch_json(LLAMA_HEALTH)
|
|
except Exception as e:
|
|
print(f"FAIL: llama-server health check failed: {e}")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
models = fetch_json(LLAMA_MODELS)
|
|
model_id = models["data"][0]["id"]
|
|
except Exception as e:
|
|
print(f"FAIL: could not detect local model id from /v1/models: {e}")
|
|
sys.exit(1)
|
|
|
|
# 2. Run Hermes locally with a harder, grounded Timmy-style task.
|
|
sys.path.insert(0, str(HERMES_AGENT_ROOT))
|
|
os.chdir(HERMES_AGENT_ROOT)
|
|
from cli import main as hermes_main # noqa: E402
|
|
|
|
prompt = f"""
|
|
You are running a local Timmy proof test.
|
|
|
|
You must use file tools. Do not answer from vibe or memory. Ground the answer in the live files.
|
|
|
|
Task:
|
|
1. Read these files:
|
|
- ~/.timmy/SOUL.md
|
|
- ~/.timmy/OPERATIONS.md
|
|
- ~/.timmy/decisions.md
|
|
- ~/.hermes/config.yaml
|
|
|
|
2. Search ~/.hermes/bin/*.sh for these remote/cloud markers:
|
|
- chatgpt.com/backend-api/codex
|
|
- generativelanguage.googleapis.com
|
|
- api.groq.com
|
|
- 143.198.27.163
|
|
|
|
3. Write a report to exactly this path:
|
|
{REPORT_PATH}
|
|
|
|
4. The report must contain exactly these sections:
|
|
# Local Timmy Proof Report
|
|
## Verdict
|
|
## Evidence from files
|
|
## Evidence from script scan
|
|
## Source distinction
|
|
## Next action
|
|
|
|
Rules:
|
|
- Every factual claim must cite the file path it came from.
|
|
- If something is your inference, label it as inference.
|
|
- Do not guess.
|
|
- The verdict must answer: Is the active harness already local-only? Why or why not?
|
|
- The Next action section must name the single highest-leverage fix.
|
|
- Include at least one quote from ~/.timmy/SOUL.md that explains why a hidden cloud fallback matters.
|
|
|
|
5. After writing the report, respond with exactly two lines:
|
|
REPORT_WRITTEN: {REPORT_PATH}
|
|
VERDICT: <one sentence>
|
|
""".strip()
|
|
|
|
before = set(SESSION_DIR.glob("session_*.json"))
|
|
captured = io.StringIO()
|
|
with redirect_stdout(captured):
|
|
hermes_main(
|
|
query=prompt,
|
|
toolsets="file",
|
|
model=model_id,
|
|
provider="local-llama.cpp",
|
|
quiet=True,
|
|
max_turns=12,
|
|
pass_session_id=True,
|
|
)
|
|
output = captured.getvalue().strip()
|
|
|
|
if not REPORT_PATH.exists():
|
|
print("FAIL: Hermes session completed but proof report was not written.")
|
|
print("--- Agent output ---")
|
|
print(output)
|
|
sys.exit(2)
|
|
|
|
sess = latest_session(before)
|
|
session_meta = {}
|
|
if sess and sess.exists():
|
|
try:
|
|
session_meta = json.loads(sess.read_text())
|
|
except Exception:
|
|
session_meta = {}
|
|
|
|
print("LOCAL_TIMMY_PROOF: PASS")
|
|
print(f"report_path: {REPORT_PATH}")
|
|
print(f"session_file: {sess if sess else 'unknown'}")
|
|
print(f"session_provider: {session_meta.get('provider', 'unknown')}")
|
|
print(f"session_base_url: {session_meta.get('base_url', 'unknown')}")
|
|
print(f"session_model: {session_meta.get('model', 'unknown')}")
|
|
print("--- Agent final output ---")
|
|
print(output)
|
|
print("--- Report preview ---")
|
|
print(REPORT_PATH.read_text()[:4000])
|