Add sub-agent orchestration, MCP tools, and critical bug fixes
Major Features: - Sub-agent orchestration system with dynamic specialist spawning * spawn_sub_agent(): Create specialists with custom prompts * delegate(): Convenience method for task delegation * Cached specialists for reuse * Separate conversation histories and focused context - MCP (Model Context Protocol) tool integration * Zettelkasten: fleeting_note, daily_note, permanent_note, literature_note * Search: search_vault (hybrid search), search_by_tags * Web: web_fetch for real-time data * Zero-cost file/system operations on Pro subscription Critical Bug Fixes: - Fixed max tool iterations (15 → 30, configurable) - Fixed max_tokens error in Agent SDK query() call - Fixed MCP tool routing in execute_tool() * Routes zettelkasten + web tools to async handlers * Prevents "Unknown tool" errors Documentation: - SUB_AGENTS.md: Complete guide to sub-agent system - MCP_MIGRATION.md: Agent SDK migration details - SOUL.example.md: Sanitized bot identity template - scheduled_tasks.example.yaml: Sanitized task config template Security: - Added obsidian vault to .gitignore - Protected SOUL.md and MEMORY.md (personal configs) - Sanitized example configs with placeholders Dependencies: - Added beautifulsoup4, httpx, lxml for web scraping - Updated requirements.txt Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
42
tools.py
42
tools.py
@@ -342,7 +342,47 @@ TOOL_DEFINITIONS = [
|
||||
def execute_tool(tool_name: str, tool_input: Dict[str, Any], healing_system: Any = None) -> str:
|
||||
"""Execute a tool and return the result as a string."""
|
||||
try:
|
||||
# File tools
|
||||
# MCP tools (zettelkasten + web_fetch) - route to mcp_tools.py
|
||||
MCP_TOOLS = {
|
||||
"web_fetch", "fleeting_note", "daily_note", "literature_note",
|
||||
"permanent_note", "search_vault", "search_by_tags"
|
||||
}
|
||||
|
||||
if tool_name in MCP_TOOLS:
|
||||
# Route to MCP tool handlers
|
||||
import anyio
|
||||
from mcp_tools import (
|
||||
web_fetch_tool, fleeting_note_tool, daily_note_tool,
|
||||
literature_note_tool, permanent_note_tool,
|
||||
search_vault_tool, search_by_tags_tool
|
||||
)
|
||||
|
||||
# Map tool names to their handlers
|
||||
mcp_handlers = {
|
||||
"web_fetch": web_fetch_tool,
|
||||
"fleeting_note": fleeting_note_tool,
|
||||
"daily_note": daily_note_tool,
|
||||
"literature_note": literature_note_tool,
|
||||
"permanent_note": permanent_note_tool,
|
||||
"search_vault": search_vault_tool,
|
||||
"search_by_tags": search_by_tags_tool,
|
||||
}
|
||||
|
||||
# Execute MCP tool asynchronously
|
||||
handler = mcp_handlers[tool_name]
|
||||
result = anyio.run(handler, tool_input)
|
||||
|
||||
# Convert result to string if needed
|
||||
if isinstance(result, dict):
|
||||
if "error" in result:
|
||||
return f"Error: {result['error']}"
|
||||
elif "content" in result:
|
||||
return result["content"]
|
||||
else:
|
||||
return str(result)
|
||||
return str(result)
|
||||
|
||||
# File tools (traditional handlers - kept for backward compatibility)
|
||||
if tool_name == "read_file":
|
||||
return _read_file(tool_input["file_path"])
|
||||
elif tool_name == "write_file":
|
||||
|
||||
Reference in New Issue
Block a user