| """Tool dispatcher. Maps tool_name → implementation. Offline-safe.""" | |
| from ..schema import ToolCall | |
| from . import (duckduckgo_tool, email_tool, reminder_tool, calendar_tool, | |
| file_tool, weather_tool, calculator_tool, fetch_url_tool, | |
| transit_lookup_tool) | |
| REGISTRY = { | |
| "duckduckgo_search": duckduckgo_tool.run, | |
| "web_search": duckduckgo_tool.run, | |
| "send_email": email_tool.run, | |
| "set_reminder": reminder_tool.run, | |
| "calendar_lookup": calendar_tool.run, | |
| "read_file": file_tool.read, | |
| "write_file": file_tool.write, | |
| "weather_lookup": weather_tool.run, | |
| "run_calculator": calculator_tool.run, | |
| "fetch_url": fetch_url_tool.run, | |
| "transit_lookup": transit_lookup_tool.run, | |
| "read_discord": lambda p: {"status": "offline", "note": "no_token"}, | |
| "read_telegram": lambda p: {"status": "offline", "note": "no_token"}, | |
| "create_notion_page": lambda p: file_tool.write( | |
| {"path": f"notion_{p.get('title','page')}.md", "content": p.get("content","")}), | |
| } | |
| def execute_all(tool_calls): | |
| results = [] | |
| for tc in tool_calls: | |
| fn = REGISTRY.get(tc.tool_name) | |
| try: | |
| out = fn(tc.parameters) if fn else {"error": f"Unknown tool: {tc.tool_name}"} | |
| except Exception as e: | |
| out = {"error": str(e), "fallback": tc.offline_fallback} | |
| results.append({"call_id": tc.call_id, "tool_name": tc.tool_name, | |
| "calling_agent": tc.calling_agent, "result": out}) | |
| return results | |