Add infrastructure for running swarm agents as isolated Docker
containers with HTTP-based coordination, startup recovery, and
enhanced dashboard UI for agent management.
- Dockerfile and docker-compose.yml for multi-service orchestration
- DockerAgentRunner for programmatic container lifecycle management
- Internal HTTP API for container agents to poll tasks and submit bids
- Startup recovery system to reconcile orphaned tasks and stale agents
- Enhanced UI partials for agent panels, chat, and task assignment
- Timmy docker entry point with heartbeat and task polling
- New Makefile targets for Docker workflows
- Tests for swarm recovery
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add dashboard/store.py: MessageLog dataclass singleton tracking
user/agent/error messages for the lifetime of the server process
- agents.py: write each chat turn to MessageLog; add GET and DELETE
/agents/timmy/history routes returning the history.html partial
- partials/history.html: render stored messages by role (YOU / TIMMY /
SYSTEM); falls back to the Mission Control init message when empty
- index.html: chat-log loads history via hx-get on page start; new
CLEAR button in panel header sends hx-delete to reset the log
- style.css: add .mc-btn-clear (muted, red-on-hover for the header)
- tests: autouse reset_message_log fixture in conftest; 5 new history
tests covering empty state, recording, offline errors, clear, and
post-clear state → 32 tests total, all passing
https://claude.ai/code/session_01KZMfwBpLuiv6x9GbzTqbys
- Add Bootstrap 5.3.3 CSS/JS via CDN to base.html with dark theme (data-bs-theme="dark")
- Rework index.html to use Bootstrap grid (container-fluid, row, col-md-3/9), card components, and form utilities
- Update health_status partial to use Bootstrap card-header/card-body structure
- Rewrite style.css to override Bootstrap CSS variables for the dark mission-control palette; replace .badge.up/down/ready with .mc-badge-* modifiers; adapt layout and mobile breakpoints to Bootstrap grid
All 27 tests pass.
https://claude.ai/code/session_01KZMfwBpLuiv6x9GbzTqbys
- after-request → after-settle: scrollChat() was firing before HTMX
swapped the new message into the DOM, so the chat log didn't scroll
to the new message. after-settle fires post-swap, post-settle.
- hx-sync="this:drop": prevents duplicate submissions if the user taps
SEND a second time while a slow Ollama response is in flight.
- hx-disabled-elt="find button": disables SEND button visually during
a pending request; paired with hx-sync for belt-and-suspenders.
- autocorrect="off" autocapitalize="none" spellcheck="false": iOS
autocorrect mangles model names (llama3.2 etc.) and autocapitalize
uppercases every message's first word. Both are wrong for a terminal-
style chat interface.
- enterkeyhint="send": tells the iOS/Android soft keyboard to label
the Return key "Send" instead of the generic return arrow.
https://claude.ai/code/session_01M4L3R98N5fgXFZRvV8X9b6