This repository has been archived on 2026-03-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Timmy-time-dashboard/tests/timmy/test_session_logging.py

93 lines
2.5 KiB
Python
Raw Normal View History

feat: Timmy system introspection, delegation, and session logging (#74) * 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>
2026-02-27 00:11:53 -05:00
"""Tests for session logging."""
import tempfile
feat: Timmy system introspection, delegation, and session logging (#74) * 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>
2026-02-27 00:11:53 -05:00
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