"""Exact Claude tokens for every saved Phase A output, plus a block flag per tool and page."""
import json, re, pathlib, time, anthropic
c = anthropic.Anthropic()  # reads ANTHROPIC_API_KEY
PAGES = [l.strip() for l in open("pages.txt") if l.strip()]
BLOCK = re.compile(r"just a moment|access to this page has been denied|press & hold|verify you are (a )?human|are you a robot|captcha|access denied|request blocked|security check", re.I)
def tok(s):
    if not s.strip(): return 0
    for _ in range(5):
        try: return c.messages.count_tokens(model="claude-opus-5-5", messages=[{"role": "user", "content": s}]).input_tokens - 7
        except anthropic.RateLimitError: time.sleep(5)
rows = []
for i, url in enumerate(PAGES):
    r = {"i": i, "url": url}
    for tool, parts in (("agent-browser", ("nav", "snap", "snapi")), ("playwright-mcp", ("nav", "snap")), ("devtools-mcp", ("nav", "snap"))):
        texts = {p: (pathlib.Path("phase_a") / f"{tool}_{i:02d}_{p}.txt").read_text() if (pathlib.Path("phase_a") / f"{tool}_{i:02d}_{p}.txt").exists() else "" for p in parts}
        for p, t in texts.items(): r[f"{tool}.{p}"] = tok(t)
        r[f"{tool}.blocked"] = bool(BLOCK.search(" ".join(texts.values())[:4000]))
    rows.append(r); print(i, url.split('/')[2], {k: v for k, v in r.items() if k.endswith(("snap", "snapi", "blocked"))}, flush=True)
json.dump(rows, open("phase_a_tokens.json", "w"), indent=1)
