From 76fa8790dc548e20ff510a1af19bb0ccee686283 Mon Sep 17 00:00:00 2001 From: flobo3 Date: Tue, 17 Mar 2026 15:43:17 +0300 Subject: [PATCH] feat: hide absolute workspace paths in tool hints --- nanobot/agent/loop.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/nanobot/agent/loop.py b/nanobot/agent/loop.py index 7c1af3add..4d6be3547 100644 --- a/nanobot/agent/loop.py +++ b/nanobot/agent/loop.py @@ -175,15 +175,33 @@ class AgentLoop: return None return re.sub(r"[\s\S]*?", "", text).strip() or None - @staticmethod - def _tool_hint(tool_calls: list) -> str: + def _tool_hint(self, tool_calls: list) -> str: """Format tool calls as concise hint, e.g. 'web_search("query")'.""" + workspace_str = str(self.workspace) + def _fmt(tc): args = (tc.arguments[0] if isinstance(tc.arguments, list) else tc.arguments) or {} - val = next(iter(args.values()), None) if isinstance(args, dict) else None + + val = None + if isinstance(args, dict): + if "path" in args and isinstance(args["path"], str): + val = args["path"] + elif "query" in args and isinstance(args["query"], str): + val = args["query"] + else: + for v in args.values(): + if isinstance(v, str): + val = v + break + if not isinstance(val, str): return tc.name + + if self.restrict_to_workspace and workspace_str in val: + val = val.replace(workspace_str, "").lstrip("\\/") + return f'{tc.name}("{val[:40]}…")' if len(val) > 40 else f'{tc.name}("{val}")' + return ", ".join(_fmt(tc) for tc in tool_calls) def _status_response(self, msg: InboundMessage, session: Session) -> OutboundMessage: