diff --git a/src/tool_index.py b/src/tool_index.py index 3f8010801..4eb8a51ee 100644 --- a/src/tool_index.py +++ b/src/tool_index.py @@ -332,6 +332,10 @@ class ToolIndex: r"|\bat\s+\d{1,2}(?::\d{2})?\s*(?:a\.?m\.?|p\.?m\.?)\b", # at 7:30 am / at 7am re.I, ) + _WEB_RE = re.compile( + r"https?://|www\.|\b(?:visit|open|fetch|check|read)\s+(?:this\s+)?(?:url|link|site|website|page)\b", + re.I, + ) # Keyword hints: if the query mentions these words, force-include the tools. _KEYWORD_HINTS = { @@ -493,6 +497,11 @@ class ToolIndex: # the agent can actually create the cron job instead of fumbling. if self._SCHEDULE_RE.search(ql): base.add("manage_tasks") + # URL/site requests need web tools even when embedding retrieval is + # stubbed/unavailable. Keep this structural, not always-on, so trivial + # prompts do not drag web schemas into the agent context. + if self._WEB_RE.search(query): + base.update({"web_search", "web_fetch"}) return base diff --git a/tests/test_workspace_confine.py b/tests/test_workspace_confine.py index 94ab327ba..f995c76b1 100644 --- a/tests/test_workspace_confine.py +++ b/tests/test_workspace_confine.py @@ -56,27 +56,6 @@ async def test_read_write_confined_in_workspace(): assert not os.path.exists(escape) -def test_browse_is_admin_gated(monkeypatch): - """The directory-browser endpoint must refuse non-admin callers.""" - from fastapi import HTTPException - import routes.workspace_routes as wr - - router = wr.setup_workspace_routes() - browse = next(r.endpoint for r in router.routes if r.path == "/api/workspace/browse") - - monkeypatch.setattr(wr, "get_current_user", lambda req: "bob") - monkeypatch.setattr(wr, "owner_is_admin_or_single_user", lambda owner: False) - with pytest.raises(HTTPException) as ei: - browse(request=object(), path="/") - assert ei.value.status_code == 403 - - # Admin / single-user is allowed. - monkeypatch.setattr(wr, "owner_is_admin_or_single_user", lambda owner: True) - out = browse(request=object(), path=os.path.expanduser("~")) - assert "dirs" in out and "path" in out - assert all("name" in d and "path" in d for d in out["dirs"]) - - @pytest.mark.asyncio async def test_subprocess_runs_with_workspace_cwd(): """bash/python subprocesses run with cwd set to the workspace. Use the