"""Cross-site meta-playbook (browser memory tier 3): seeds on day one, absorbs site-agnostic lessons with no extra LLM call, dedups + caps, survives a restart.""" import os import tempfile import pytest from backend.apps.agents.browser import browser_meta_playbook as meta @pytest.fixture(autouse=True) def p_isolated(monkeypatch): monkeypatch.setenv("OPENSWARM_BROWSER_META_DIR", tempfile.mkdtemp(prefix="meta_test_")) meta.clear(wipe_disk=True) yield meta.clear(wipe_disk=True) def test_seeded_on_day_one(): b = meta.get_meta() assert len(b) >= 4 assert any("composer" in x.lower() and "clear" in x.lower() for x in b) assert "General web priors" in meta.format_for_prompt() def test_absorb_adds_dedups_and_caps(): n0 = len(meta.get_meta()) assert meta.absorb(["clicking a date opens a picker, it is not a navigation"]) is True assert len(meta.get_meta()) == n0 + 1 # identical lesson (case-insensitive) doesn't grow it assert meta.absorb(["Clicking a DATE opens a picker, it is not a navigation"]) is False # empty input is a no-op assert meta.absorb([]) is False # capped: flooding never exceeds the cap meta.absorb([f"unique universal lesson number {i}" for i in range(50)]) assert len(meta.get_meta()) <= meta.MAX_BULLETS def test_survives_a_restart(): meta.absorb(["a durable cross-site lesson worth keeping"]) meta.clear(wipe_disk=False) # in-memory gone, disk intact (== restart) assert meta.CACHE is None assert any("durable cross-site lesson" in x for x in meta.get_meta()) def test_secrets_never_persist_into_meta(): meta.absorb(["the login token is sk-ant-api03-deadbeef and it works"]) blob = " ".join(meta.get_meta()) assert "sk-ant-api03" not in blob