feat: add platform issue reporting tool (#1685)

Adapted from upstream langchain-ai/open-swe #1685 to the fork's
direct-import tool registry. Adds the report_platform_issue tool
(stdlib-only: returns a locally generated UUIDv7 report id, no external
network call) and wires it into get_agent's curated tool list.

Dropped upstream's test_task_retry_wraps_inside_tool_error_middleware
assertion, which references ToolRetryMiddleware that this fork does not
wire into the middleware stack.

(cherry picked from commit 88b62322b44103335773002d0745704cd96e9160)
This commit is contained in:
Ramon Nogueira 2026-07-07 19:47:24 -04:00 • committed by Adam Moussa
parent 9d3600ad8f
commit 9e86dec579
No known key found for this signature in database
5 changed files with 50 additions and 0 deletions

View file

@ -83,6 +83,7 @@ from .tools import (
linear_list_teams,
linear_update_issue,
open_pull_request,
report_platform_issue,
request_pr_review,
save_plan,
schedule_thread_wakeup,
@ -957,6 +958,7 @@ async def get_agent(config: RunnableConfig) -> Pregel:
linear_update_issue,
open_pull_request,
request_pr_review,
report_platform_issue,
schedule_thread_wakeup,
slack_read_thread_messages,
slack_thread_reply,

View file

@ -15,6 +15,7 @@ from .open_pull_request import open_pull_request
from .publish_review import publish_review
from .read_repo_file import read_repo_file
from .reply_to_finding_thread import reply_to_finding_thread
from .report_platform_issue import report_platform_issue
from .request_pr_review import request_pr_review
from .resolve_finding_thread import resolve_finding_thread
from .save_plan import save_plan
@ -42,6 +43,7 @@ __all__ = [
"open_pull_request",
"publish_review",
"read_repo_file",
"report_platform_issue",
"request_pr_review",
"reply_to_finding_thread",
"resolve_finding_thread",

View file

@ -0,0 +1,16 @@
import secrets
import time
import uuid
def _uuid7() -> str:
timestamp_ms = (time.time_ns() // 1_000_000) & ((1 << 48) - 1)
rand_a = secrets.randbits(12)
rand_b = secrets.randbits(62)
uuid_int = (timestamp_ms << 80) | (0x7 << 76) | (rand_a << 64) | (0b10 << 62) | rand_b
return str(uuid.UUID(int=uuid_int))
async def report_platform_issue() -> dict[str, str]:
"""Report an issue with the sandbox or execution environment."""
return {"report_id": _uuid7()}

View file

@ -111,3 +111,13 @@ async def test_agent_keeps_message_queue_and_step_limit_middleware() -> None:
present = {type(m).__name__ for m in middleware}
assert "check_message_queue_before_model" in present
assert "notify_step_limit_reached" in present
@pytest.mark.asyncio
async def test_agent_includes_report_platform_issue_tool() -> None:
from agent.tools import report_platform_issue
captured = await _capture_create_deep_agent_kwargs()
tools = captured["tools"]
assert isinstance(tools, list)
assert report_platform_issue in tools

View file

@ -0,0 +1,20 @@
from __future__ import annotations
import uuid
async def test_report_platform_issue_returns_uuid7_report_id() -> None:
from agent.tools.report_platform_issue import report_platform_issue
result = await report_platform_issue()
assert set(result) == {"report_id"}
report_id = uuid.UUID(result["report_id"])
assert report_id.version == 7
assert report_id.variant == uuid.RFC_4122
def test_report_platform_issue_exported() -> None:
from agent.tools import report_platform_issue
assert callable(report_platform_issue)