**Problem**: Debug logs weren't appearing because DEBUG level not enabled
in logger configuration.
**Solution**: Changed logger.debug() to logger.info() for:
- Message type logging (every 20th message)
- ResultMessage tracking (captured data summary)
- Tool usage listing
**Impact**: Can now see what message types are being received and why
tool tracking isn't working (important for diagnosing empty results).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
**Problem**: Task "create a gitea repo" completed 86 messages but returned
generic fallback "Task completed (86 messages, $0.71)" with no actual work
done. Zero tool calls tracked, zero assistant messages captured.
**Debug additions**:
1. Log message type for first 5 messages and every 20th message to see what
message types we're receiving from Agent SDK
2. Log ResultMessage contents: has_result, assistant_msgs count, tool_calls
count to understand what was captured
3. Log tools used (if any) to verify tool tracking is working
**Next**: Restart bot and retry failing task. Check logs to see:
- What message types are actually being received (expecting AssistantMessage)
- Whether tool_use blocks are present in content
- Why tool_names list is empty despite work being done
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
**Problem**: User frustrated that 10-minute timeout returned unhelpful
generic message "task may be too complex" when task "create a repo for
the dhcp course" timed out after 80 messages.
**Solution**: Enhanced timeout error to provide:
- Progress info (message count, last tool used)
- Complexity indicator (# of different tools)
- Actionable suggestions (break into sub-tasks, use delegate_task)
**Changes**:
- Track _last_message_count and _last_tool_names as instance vars
(survive timeout unlike local vars in canceled async function)
- Update tracking variables in message loop
- Build multi-line error message with progress summary and suggestions
- Use chr(10) for newlines to avoid string literal corruption
**Impact**: Users now get helpful guidance instead of generic error when
complex tasks timeout, including suggestion to use new delegate_task tool
for parallel work.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Moved obsidian_mcp.py into mcp_servers/obsidian/ to align with other
MCP server organization (SSH, Cloudflare, Loki). This improves code
discoverability and maintains consistent package structure.
Changes:
- Moved obsidian_mcp.py → mcp_servers/obsidian/obsidian_mcp.py
- Updated lazy import in llm_interface.py (line 396)
- Updated lazy import in tools.py (line 550)
- Deleted empty scripts/ directory
All imports verified with runtime tests. Zero functional changes.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Features:
- SSH MCP server with two tools:
* ssh_execute: Run commands on remote hosts via SSH
* ssh_file_upload: Upload files via SFTP
- Support for both password and SSH key authentication
- Auto-accept SSH host keys (AutoAddPolicy) for homelab use
- Gmail attachment download functionality
- Added download_attachment tool for Gmail API
Technical changes:
- Created mcp_servers/mcp_ssh.py with MCP-compliant text output
- Updated llm_interface.py to load SSH MCP server
- Added paramiko>=3.4.0 to requirements.txt
- Updated .env.example with SSH configuration template
- Enhanced gmail_client.py with download_attachment() method
- Added download_attachment tool handler in tools.py
SSH credentials configured via environment variables:
- PROXMOX_SSH_HOST, PROXMOX_SSH_USER, PROXMOX_SSH_PORT
- PROXMOX_SSH_PASSWORD (or) PROXMOX_SSH_KEY_FILE
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Scaffold mcp_servers/loki/ with config and async HTTP client
- Fix Slack/Telegram adapters to use non-blocking connections
- Upgrade default model to claude-sonnet-4-6
- Improve Agent SDK message collection for empty ResultMessage cases
- Add Message-ID to email summaries, increase body truncation limit
- Fix .gitignore inline comments that broke sensitive file exclusions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>