File size: 4,391 Bytes
2592ab2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from fakes import seed_agent, seed_message


def test_raw_post_fans_out_to_mentions_and_humans(env):
    seed_agent(env.hub, "agent-1")
    seed_agent(env.hub, "agent-2")
    r = env.client.post(
        "/v1/messages",
        json={"agent_id": "agent-1", "body": "hi @agent-2, @human-cmpatino and @nobody"},
    )
    assert r.status_code == 201
    data = r.json()
    assert data["mentions_delivered"] == ["agent-2", "human-cmpatino"]

    central = env.hub.buckets[env.settings.central_bucket]
    filename = data["filename"]
    board = central[f"message_board/{filename}"]
    assert central[f"inbox/agent-2/{filename}"] == board  # byte-identical
    assert central[f"inbox/human-cmpatino/{filename}"] == board
    assert f"inbox/nobody/{filename}" not in central
    # board + both copies landed in ONE batch write
    assert env.hub.batch_writes[-1] == [
        f"message_board/{filename}",
        f"inbox/agent-2/{filename}",
        f"inbox/human-cmpatino/{filename}",
    ]


def test_inbox_read_after_write_and_expand(env):
    seed_agent(env.hub, "agent-1")
    seed_agent(env.hub, "agent-2")
    r = env.client.post(
        "/v1/messages", json={"agent_id": "agent-1", "body": "ping @agent-2"}
    )
    filename = r.json()["filename"]
    data = env.client.get("/v1/inbox/agent-2?expand=true").json()
    assert data["count"] == 1 and data["matched"] == 1
    assert data["items"][0]["filename"] == filename
    assert data["items"][0]["frontmatter"]["agent"] == "agent-1"
    # author filter uses the copied message's author
    assert env.client.get("/v1/inbox/agent-2?agent=agent-1").json()["matched"] == 1
    assert env.client.get("/v1/inbox/agent-2?agent=agent-2").json()["matched"] == 0


def test_refs_authors_get_a_copy(env):
    seed_agent(env.hub, "agent-1")
    seed_agent(env.hub, "agent-2")
    seed_message(env.hub, "20260601-100000-000", "agent-2", "earlier work")
    r = env.client.post(
        "/v1/messages",
        json={
            "agent_id": "agent-1",
            "body": "building on this",
            "refs": "20260601-100000-000_agent-2.md",
        },
    )
    assert r.json()["mentions_delivered"] == ["agent-2"]
    assert env.client.get("/v1/inbox/agent-2").json()["count"] == 1


def test_self_mention_is_not_delivered(env):
    seed_agent(env.hub, "agent-1")
    r = env.client.post(
        "/v1/messages", json={"agent_id": "agent-1", "body": "note to @agent-1"}
    )
    assert r.json()["mentions_delivered"] == []


def test_fanout_cap(make_env):
    env = make_env(MENTION_FANOUT_CAP=2)
    seed_agent(env.hub, "agent-1")
    for i in range(2, 6):
        seed_agent(env.hub, f"agent-{i}")
    r = env.client.post(
        "/v1/messages",
        json={"agent_id": "agent-1", "body": "@agent-2 @agent-3 @agent-4 @agent-5"},
    )
    assert r.json()["mentions_delivered"] == ["agent-2", "agent-3"]


def test_bucket_source_variant_fans_out(env):
    seed_agent(env.hub, "agent-1")
    seed_agent(env.hub, "agent-2")
    env.hub.seed(
        "drafts/plan.md",
        "---\ntype: agent\n---\nlong-form plan, cc @agent-2\n",
        bucket="test-org/test-agent-1",
    )
    r = env.client.post(
        "/v1/messages",
        json={"source": "hf://buckets/test-org/test-agent-1/drafts/plan.md"},
    )
    assert r.status_code == 201
    assert r.json()["via"] == "bucket"
    assert r.json()["mentions_delivered"] == ["agent-2"]


def test_human_inbox_is_readable_without_registration(env):
    assert env.client.get("/v1/inbox/human-cmpatino").json()["count"] == 0


def test_unregistered_agent_inbox_404s(env):
    r = env.client.get("/v1/inbox/ghost")
    assert r.status_code == 404
    assert r.json()["error"]["code"] == "NOT_REGISTERED"


def test_inbox_since_high_water_mark_polling(env):
    seed_agent(env.hub, "agent-1")
    seed_agent(env.hub, "agent-2")
    env.client.post("/v1/messages", json={"agent_id": "agent-1", "body": "old @agent-2"})
    first = env.client.get("/v1/inbox/agent-2?limit=1").json()
    high_water = first["items"][0]
    env.client.post("/v1/messages", json={"agent_id": "agent-1", "body": "new @agent-2"})
    fresh = env.client.get(
        f"/v1/inbox/agent-2?expand=true&after={high_water}"
    ).json()
    assert [m["body"].strip() for m in fresh["items"]] == ["new @agent-2"]
    # `matched` counts filter matches; the cursor only trims the page
    assert fresh["matched"] == 2