forked from Rockachopa/Timmy-time-dashboard
* test: remove hardcoded sleeps, add pytest-timeout
- Replace fixed time.sleep() calls with intelligent polling or WebDriverWait
- Add pytest-timeout dependency and --timeout=30 to prevent hangs
- Fixes test flakiness and improves test suite speed
* feat: add Aider AI tool to Forge's toolkit
- Add Aider tool that calls local Ollama (qwen2.5:14b) for AI coding assist
- Register tool in Forge's code toolkit
- Add functional tests for the Aider tool
* config: add opencode.json with local Ollama provider for sovereign AI
* feat: Timmy fixes and improvements
## Bug Fixes
- Fix read_file path resolution: add ~ expansion, proper relative path handling
- Add repo_root to config.py with auto-detection from .git location
- Fix hardcoded llama3.2 - now dynamic from settings.ollama_model
## Timmy's Requests
- Add communication protocol to AGENTS.md (read context first, explain changes)
- Create DECISIONS.md for architectural decision documentation
- Add reasoning guidance to system prompts (step-by-step, state uncertainty)
- Update tests to reflect correct model name (llama3.1:8b-instruct)
## Testing
- All 177 dashboard tests pass
- All 32 prompt/tool tests pass
* feat: Timmy system introspection, delegation, and session logging
## System Introspection (Sovereign Self-Knowledge)
- Add get_system_info() tool - Timmy can now query his runtime environment
- Add check_ollama_health() - verify Ollama status
- Add get_memory_status() - check memory tier status
- True introspection vs hardcoded prompts
## Path Resolution Fix
- Fix all toolkits to use settings.repo_root consistently
- Now uses Path(settings.repo_root) instead of Path.cwd()
## Inter-Agent Delegation
- Add delegate_task() tool - Timmy can dispatch to Seer, Forge, Echo, etc.
- Add list_swarm_agents() - query available agents
## Session Logging
- Add SessionLogger for comprehensive interaction logging
- Records messages, tool calls, errors, decisions
- Writes to /logs/session_{date}.jsonl
## Tests
- Add tests for introspection tools
- Add tests for delegation tools
- Add tests for session logging
- Add tests for path resolution
- All 18 new tests pass
- All 177 dashboard tests pass
---------
Co-authored-by: Alexander Payne <apayne@MM.local>
96 lines
2.6 KiB
Python
96 lines
2.6 KiB
Python
"""Tests for session logging."""
|
|
|
|
import pytest
|
|
import tempfile
|
|
import json
|
|
from pathlib import Path
|
|
|
|
|
|
def test_session_logger_records_message():
|
|
"""Should record a user message."""
|
|
from timmy.session_logger import SessionLogger
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
logger = SessionLogger(logs_dir=tmpdir)
|
|
|
|
logger.record_message("user", "Hello Timmy")
|
|
logger.record_message("timmy", "Hello user")
|
|
|
|
log_file = logger.flush()
|
|
|
|
assert log_file.exists()
|
|
content = log_file.read_text()
|
|
assert "Hello Timmy" in content
|
|
assert "message" in content
|
|
|
|
|
|
def test_session_logger_records_tool_call():
|
|
"""Should record a tool call."""
|
|
from timmy.session_logger import SessionLogger
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
logger = SessionLogger(logs_dir=tmpdir)
|
|
|
|
logger.record_tool_call("read_file", {"path": "test.py"}, "file content")
|
|
|
|
log_file = logger.flush()
|
|
|
|
assert log_file.exists()
|
|
content = log_file.read_text()
|
|
assert "read_file" in content
|
|
assert "tool_call" in content
|
|
|
|
|
|
def test_session_logger_records_error():
|
|
"""Should record an error."""
|
|
from timmy.session_logger import SessionLogger
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
logger = SessionLogger(logs_dir=tmpdir)
|
|
|
|
logger.record_error("File not found", "Reading config")
|
|
|
|
log_file = logger.flush()
|
|
|
|
assert log_file.exists()
|
|
content = log_file.read_text()
|
|
assert "File not found" in content
|
|
assert "error" in content
|
|
|
|
|
|
def test_session_logger_records_decision():
|
|
"""Should record a decision."""
|
|
from timmy.session_logger import SessionLogger
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
logger = SessionLogger(logs_dir=tmpdir)
|
|
|
|
logger.record_decision("Use OOP pattern", "More maintainable")
|
|
|
|
log_file = logger.flush()
|
|
|
|
assert log_file.exists()
|
|
content = log_file.read_text()
|
|
assert "Use OOP pattern" in content
|
|
assert "decision" in content
|
|
|
|
|
|
def test_session_summary():
|
|
"""Should provide session summary."""
|
|
from timmy.session_logger import SessionLogger
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
logger = SessionLogger(logs_dir=tmpdir)
|
|
|
|
logger.record_message("user", "Hello")
|
|
logger.record_message("timmy", "Hi")
|
|
logger.record_error("Test error")
|
|
|
|
# Flush to create the session file
|
|
logger.flush()
|
|
|
|
summary = logger.get_session_summary()
|
|
|
|
assert summary["exists"] is True
|
|
assert summary["entries"] >= 3
|