feat: Add Gitea MCP integration and project cleanup
## New Features - **Gitea MCP Tools** (zero API cost): - gitea_read_file: Read files from homelab repo - gitea_list_files: Browse directories - gitea_search_code: Search by filename - gitea_get_tree: Get directory tree - **Gitea Client** (gitea_tools/client.py): REST API wrapper with OAuth - **Proxmox SSH Scripts** (scripts/): Homelab data collection utilities - **Obsidian MCP Support** (obsidian_mcp.py): Advanced vault operations - **Voice Integration Plan** (JARVIS_VOICE_INTEGRATION_PLAN.md) ## Improvements - **Increased timeout**: 5min → 10min for complex tasks (llm_interface.py) - **Removed Direct API fallback**: Gitea tools are MCP-only (zero cost) - **Updated .env.example**: Added Obsidian MCP configuration - **Enhanced .gitignore**: Protect personal memory files (SOUL.md, MEMORY.md) ## Cleanup - Deleted 24 obsolete files (temp/test/experimental scripts, outdated docs) - Untracked personal memory files (SOUL.md, MEMORY.md now in .gitignore) - Removed: AGENT_SDK_IMPLEMENTATION.md, HYBRID_SEARCH_SUMMARY.md, IMPLEMENTATION_SUMMARY.md, MIGRATION.md, test_agent_sdk.py, etc. ## Configuration - Added config/gitea_config.example.yaml (Gitea setup template) - Added config/obsidian_mcp.example.yaml (Obsidian MCP template) - Updated scheduled_tasks.yaml with new task examples Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -540,6 +540,44 @@ class MemorySystem:
|
||||
|
||||
return sorted_results[:max_results]
|
||||
|
||||
def compact_conversation(self, user_message: str, assistant_response: str, tools_used: list = None) -> str:
|
||||
"""Create a compact summary of a conversation for memory storage.
|
||||
|
||||
Args:
|
||||
user_message: The user's input
|
||||
assistant_response: The assistant's full response
|
||||
tools_used: Optional list of tool names used (e.g., ['read_file', 'edit_file'])
|
||||
|
||||
Returns:
|
||||
Compact summary string
|
||||
"""
|
||||
# Extract file paths mentioned
|
||||
import re
|
||||
file_paths = re.findall(r'[a-zA-Z]:[\\\/][\w\\\/\-\.]+\.\w+|[\w\/\-\.]+\.(?:py|md|yaml|yml|json|txt|js|ts)', assistant_response)
|
||||
file_paths = list(set(file_paths))[:5] # Limit to 5 unique paths
|
||||
|
||||
# Truncate long responses
|
||||
if len(assistant_response) > 300:
|
||||
# Try to get first complete sentence or paragraph
|
||||
sentences = assistant_response.split('. ')
|
||||
if sentences and len(sentences[0]) < 200:
|
||||
summary = sentences[0] + '.'
|
||||
else:
|
||||
summary = assistant_response[:200] + '...'
|
||||
else:
|
||||
summary = assistant_response
|
||||
|
||||
# Build compact entry
|
||||
compact = f"**User**: {user_message}\n**Action**: {summary}"
|
||||
|
||||
if tools_used:
|
||||
compact += f"\n**Tools**: {', '.join(tools_used)}"
|
||||
|
||||
if file_paths:
|
||||
compact += f"\n**Files**: {', '.join(file_paths[:3])}" # Max 3 file paths
|
||||
|
||||
return compact
|
||||
|
||||
def write_memory(self, content: str, daily: bool = True) -> None:
|
||||
"""Write to memory file."""
|
||||
if daily:
|
||||
|
||||
Reference in New Issue
Block a user