From bd9683f18982f8a479e22540de3ef48edbd6c79e Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Wed, 28 Jan 2026 15:37:34 -0800 Subject: [PATCH] Fix facet generation: add logging, retries, trailing punctuation handling, bare URL detection --- data/published_messages.txt | 29 +++++++++++++++++ tools/agent.py | 65 +++++++++++++++++++++++++++++-------- 2 files changed, 81 insertions(+), 13 deletions(-) diff --git a/data/published_messages.txt b/data/published_messages.txt index 42fa4b3..8d73eec 100644 --- a/data/published_messages.txt +++ b/data/published_messages.txt @@ -821,3 +821,32 @@ message-c7a6b801-de31-459c-b854-e276093ffcf7 message-3e8fe874-9ccd-4b42-9aaa-3b586c619bc4 message-8e13ec7e-68df-4a56-a1f5-9be848223b0f message-2db422f0-fadf-4081-b3ca-cf558fe00adf +message-1588a251-8759-4652-ad4a-16cc7a3ff7d3 +message-1588a251-8759-4652-ad4a-16cc7a3ff7d3 +message-fd53a195-7c96-4600-aa50-8515712cc2d0 +message-73f1088a-5a33-4dbd-b92d-1d25af3d3003 +message-29e7bc75-6a37-48de-8d4d-cdb672997062 +message-f505e8f3-3b3c-40bc-a4e4-849d8dead5f0 +message-08d1b9d3-3aed-45e8-beb4-dbeaef16f36a +message-cbdfacc0-49b8-4830-87a8-17c53fc8ebc0 +message-83eaef46-ba89-4350-a07b-8a905cf4c4af +message-97fc9af8-d6c2-4f87-8298-ef13e3141d75 +message-55507c9c-c6b8-4d0c-b433-db2ee89eb5d0 +message-a9b5c360-733f-4c3e-8bbc-f61924bc5466 +message-a1e8d496-ab1a-46e8-afb7-ab05daa4e4c2 +message-62ce0a8e-a8d2-4224-91b7-c47afb14996b +message-f36fbfe0-1cd2-4102-8451-13b7166e7938 +message-f36fbfe0-1cd2-4102-8451-13b7166e7938 +message-554d102e-1a15-4559-9511-d4b6046224c0 +message-ea0eddac-b60e-4303-b47c-027c65a69b78 +message-15b8e5a0-f1a5-47e5-a24c-efbd8269ecfe +message-15b8e5a0-f1a5-47e5-a24c-efbd8269ecfe +message-15b8e5a0-f1a5-47e5-a24c-efbd8269ecfe +message-43e7eac8-36b0-426e-90d6-59883bb66485 +message-5bff991d-255e-4794-b599-901551ac800b +message-84b281c8-315c-4514-844a-c3878a601921 +message-c4616b1f-900d-4ea9-8158-8f8074ddd5bc +message-aa847d16-06e6-4494-b6ae-97d662de4ad6 +message-3f6149bc-a7e2-4e5b-868a-eb69de18529e +message-f5e6b3a0-1177-4655-9aae-6568a0e4b29a +message-3608bf83-c59f-449f-9dda-f1277044a792 diff --git a/tools/agent.py b/tools/agent.py index bfa7689..c412558 100644 --- a/tools/agent.py +++ b/tools/agent.py @@ -47,19 +47,33 @@ def check_write_permission(): ) -async def resolve_handle_to_did(handle: str) -> str | None: - """Resolve a handle to a DID.""" - handle = handle.lstrip("@") +async def resolve_handle_to_did(handle: str, retries: int = 2) -> str | None: + """Resolve a handle to a DID with retry logic.""" + handle = handle.lstrip("@").rstrip(".,;:!?") # Strip @ prefix and trailing punctuation + if not handle: + return None + async with httpx.AsyncClient() as client: - try: - response = await client.get( - "https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle", - params={"handle": handle} - ) - if response.status_code == 200: - return response.json().get("did") - except: - pass + for attempt in range(retries): + try: + response = await client.get( + "https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle", + params={"handle": handle}, + timeout=5.0 + ) + if response.status_code == 200: + return response.json().get("did") + else: + console.print(f"[yellow]Warning: Could not resolve @{handle} (status {response.status_code})[/yellow]") + return None + except httpx.TimeoutException: + if attempt < retries - 1: + await asyncio.sleep(0.5) + continue + console.print(f"[yellow]Warning: Timeout resolving @{handle}[/yellow]") + except Exception as e: + console.print(f"[yellow]Warning: Error resolving @{handle}: {e}[/yellow]") + return None return None @@ -74,7 +88,9 @@ async def parse_facets(text: str) -> list: # Find mentions (@handle) for match in re.finditer(r'@([\w.-]+)', text): - handle = match.group(1) + handle = match.group(1).rstrip(".,;:!?") # Strip trailing punctuation + if not handle: + continue did = await resolve_handle_to_did(handle) if did: # Calculate byte positions @@ -124,6 +140,29 @@ async def parse_facets(text: str) -> list: }] }) + # Find URLs without protocol (common TLDs) + bare_url_pattern = r'(?\[\]()\'\"]*)' + for match in re.finditer(bare_url_pattern, text): + bare_url = match.group(1).rstrip(".,;:!?") + if not bare_url: + continue + start_char = match.start(1) + end_char = match.start(1) + len(bare_url) + byte_start = len(text[:start_char].encode("utf-8")) + byte_end = len(text[:end_char].encode("utf-8")) + + # Skip if overlaps with existing facet + if any(f["index"]["byteStart"] <= byte_start < f["index"]["byteEnd"] for f in facets): + continue + + facets.append({ + "index": {"byteStart": byte_start, "byteEnd": byte_end}, + "features": [{ + "$type": "app.bsky.richtext.facet#link", + "uri": "https://" + bare_url + }] + }) + return facets -- 2.51.2