fix: resolve builtin skill reads

This commit is contained in:
hamb1y
2026-07-06 12:11:20 +08:00
committed by Xubin Ren
parent 5d034dc79c
commit 10b52cfb3a
2 changed files with 26 additions and 0 deletions
+19
View File
@@ -194,6 +194,23 @@ def _is_blocked_device(path: str | Path) -> bool:
return False
def _builtin_skill_read_path(path: str) -> Path | None:
"""Map workspace-relative skills/<name>/... reads onto bundled skills."""
from nanobot.agent.skills import BUILTIN_SKILLS_DIR
requested = Path(path)
if requested.is_absolute():
return None
parts = requested.parts
if len(parts) < 2 or parts[0] != "skills":
return None
root = BUILTIN_SKILLS_DIR.resolve()
candidate = (root / Path(*parts[1:])).resolve()
if candidate != root and root not in candidate.parents:
return None
return candidate if candidate.is_file() else None
def _parse_page_range(pages: str, total: int) -> tuple[int, int]:
"""Parse a page range like '2-5' into 0-based (start, end) inclusive."""
parts = pages.strip().split("-")
@@ -275,6 +292,8 @@ class ReadFileTool(_FsTool):
return ToolResult.error(f"Error: Reading {path} is blocked (device path that could hang or produce infinite output).")
fp = self._resolve_read(path)
if not fp.exists():
fp = _builtin_skill_read_path(path) or fp
if _is_blocked_device(fp):
return ToolResult.error(f"Error: Reading {fp} is blocked (device path that could hang or produce infinite output).")
if not fp.exists():
+7
View File
@@ -77,6 +77,13 @@ class TestReadFileTool:
assert "Error" in result
assert "not found" in result
@pytest.mark.asyncio
async def test_workspace_relative_builtin_skill_read_falls_back_to_packaged_skill(self, tool):
result = await tool.execute(path="skills/long-goal/SKILL.md", limit=5)
assert "Error" not in result
assert "long-goal" in result.lower()
@pytest.mark.asyncio
async def test_missing_path_returns_clear_error(self, tool):
result = await tool.execute()