- Add agent/user/ directory with inbox/outbox/completed
- User is first-class participant (not a session)
- Bot->user: bot writes to outbox with to="user"
- User->bot: user writes to user/outbox with to="{session-id}"
- User inbox messages written to sender's log file
- Read-only access to ~/.jenkins and ~/.netrc for credentials
- Network access for ports 443 (HTTPS) and 8080 (Jenkins default)
- Environment variables JENKINS_USER_ID and JENKINS_API_TOKEN
- Add mailbox manager with inbox/outbox/completed structure
- Expose mailboxes via 9P filesystem (agent/{id}/inbox, outbox, completed)
- Mail processor runs every 5s to deliver messages from outbox to inbox
- Messages delivered when recipient is idle, formatted and sent via in file
- Retry logic: 3 attempts max, then discard with notification to sender
- Race condition fixes: messages moved to completed before sending
- Auto-generate message ID and timestamp if missing from bot's JSON
- Update peer-bot skill to use mailbox system with JSON format
- Update all workflows (DevReview, DevReviewQA, Planning) with:
- Explicit shell command examples for sending messages
- plan9 task for all agents
- Mailbox instructions without markdown code blocks
- Fix idle signaling: bots must write summary to out BEFORE signaling idle
- All messages archived in completed/ with proper metadata
- Add global.yaml base config (renamed from sandbox.yaml)
- Add backend-specific configs (claude.yaml, kiro-cli.yaml)
- Add role configs (developer, reviewer, tester, architect, etc.)
- Add task configs (git, docker, go, rust, python, nodejs, etc.)
- Implement config merging: global + backend + role + tasks
- Update workflows to use roles and tasks
- Create tester role with read-only source, execute-only bins
- Fix reviewer role to use rox for bin directories
- Auto-create RW directories that don't exist
- Make backend configs required (fail if missing)
- Update mkfile to install cfg files to ~/.config/anvillm
- Remove Role-Based Sessions from IDEAS.md (now implemented)
Opens streaming log window that displays session chat history.
Window is named /AnviLLM/Log.{session-id-or-alias} and streams
log data continuously, marking window as clean after each write.
The Restart button was incorrectly disabled for non-stopped sessions.
Since restart performs both stop and start actions, it should work
for any session state, similar to the Kill button.
Removed the conditional disabled state from the Restart button.
- Added /api/log/{sessionId} endpoint for SSE streaming
- Backend streams log file via 9P with proper SSE formatting
- Each log line sent as separate SSE message for protocol compliance
- Frontend displays log in terminal-like pane (black bg, white text)
- Log button added to each session in the table
- Auto-scrolls to bottom as new data arrives
- Stream automatically closes when log pane is closed
- Context cancellation properly closes 9P file handle
All three interfaces (Acme, Emacs, TUI, Web) now support log viewing
with appropriate streaming/refresh strategies for their execution models.
Previously, pressing 'q' in the Emacs log viewer would close the window
but might leave the streaming 9p read process running. Now explicitly
kills the process before closing the window.
- Added anvillm-log-quit function that kills process then closes window
- Changed 'q' keybinding from quit-window to anvillm-log-quit
- Process is now reliably terminated on both 'q' and buffer kill
TUI changes:
- Press 'l' to view session log in scrollable pane
- Manual refresh with 'r' key
- Non-blocking read prevents hang on streaming log file
- Log window scales to 80% of terminal width
- Auto-scrolls to bottom on open
Emacs changes:
- Press 'l' to view session log in dedicated buffer
- Streams log continuously in real-time
- Auto-scrolls when at bottom of buffer
- Process automatically killed when buffer closed
- Refresh with 'r' restarts stream from beginning
- Fixed pre-existing bug in anvillm-compose-prompt
Both interfaces now support log viewing with appropriate
streaming/refresh strategies for their execution models.
- Press 'l' to view session log in scrollable pane
- Press 'r' within log viewer to refresh
- Press 'q' or ESC to close
- Log window scales to 80% of terminal width
- Automatically scrolls to bottom on open
- Non-blocking read prevents hang on streaming log file
- Add chat log support with new 'log' file (read) and 'out' file (write)
- Fix deadlock: create appendToChatLogLocked for callers holding mutex
- Improve prompts to request comprehensive summaries with actual response text
- Enforce 2MB chat log size limit with smart truncation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Role-Based Sessions: leverage existing context system with sandbox enforcement
- Persistent Work Tracking (Beads): git-backed work units inspired by Gas Town
- Approval Gates: human-in-the-loop for critical decisions
- Structured Messaging (Mailboxes): typed message passing with history
- Convoy: grouped work with shared context and coordination
Philosophy: precision over throughput, deliberate orchestration, traceability
- Add vertical space above search box
- Style header as colored bar with white text
- Reduce header size and spacing for cleaner look
- Remove redundant subtitle text
- Add session ID column (2nd position) with monospace styling
- Add color-coded state badges for all states (idle=green, running=blue, starting=orange, stopped=gray, error=red, exited=light gray)
- Convert New Session form to compact modal dialog
- Fix XSS vulnerability by replacing inline onclick handlers with data attributes and event delegation
- Sort sessions alphabetically by alias/name (case-insensitive)
- Move New Session form below sessions table (view then act)
- Fix dialog buttons: right-aligned, [Send/Save] [Cancel] order (desktop convention)
- All changes client-side only, no API modifications
- Minimal Go web server with REST API for session management
- Single-page UI using Pico CSS (12KB, classless framework)
- Features: create sessions, send prompts, edit context/alias, control sessions
- Security: input validation, XSS prevention, path validation
- Auto-refresh every 5 seconds
- Documented security model (no authentication, localhost/SSH tunneling recommended)
Enhancements to anvillm TUI:
- Unified backend selection: 's' key shows menu (claude/kiro-cli)
- Changed stop from 's' to 't' to avoid conflict
- Added vim navigation (j/k) and emacs navigation (C-n/C-p)
- Responsive table layout with proper column expansion
- Blue header with white bold text and column spacing
- Improved dialog styling with blue borders
- Black text on white background for input fields
- Updated help text and status bar with new keybindings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add terminal UI as an alternative to the Acme interface. Both UIs
interact with anvilsrv via the same 9P filesystem interface.
Implementation:
- cmd/anvillm/main.go: Full-featured TUI using tview/tcell
- Session list with color-coded states
- Keyboard-driven interface (no mouse required)
- Auto-refresh every 2 seconds
- Modal dialogs for creating sessions, sending prompts, setting aliases
Features:
- Create Kiro/Claude sessions (k/c keys)
- Send prompts to selected session (p key)
- Stop/Restart/Kill sessions (s/R/K keys)
- Set session aliases (a key)
- Refresh session list (r key)
- Help dialog (? key)
- Quit (q key)
UI Components:
- Session table with columns: ID, Alias, Backend, State, PID, Cwd
- Status bar showing keyboard shortcuts
- Modal forms for user input
- Color-coded session states (green=running, aqua=idle, etc.)
Dependencies:
- github.com/rivo/tview: TUI framework
- github.com/gdamore/tcell/v2: Terminal cell library
Build:
- Updated mkfile to build anvillm binary
- Fixed .gitignore to allow cmd/anvillm/ directory
Documentation:
- Added Terminal UI section to README
- Lists all keyboard shortcuts
- Notes that TUI uses same 9P interface as Assist
This provides a lightweight alternative for users without Acme.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
anvilsrv already supports running multiple independent instances via
the $NAMESPACE environment variable (provided by plan9port). This
enables separate AnviLLM environments for different Acme workspaces.
Documentation:
- Added "Multiple Namespaces" section after "Starting the Server"
- Explains default namespace: /tmp/ns.$USER.:0
- Example usage for running parallel :0 and :1 instances
- Notes isolation: PID file, 9P socket, session list
- Example: connecting Assist to specific instance
Use case: Similar to `acme -a` for multiple Acme instances, users can
run separate anvilsrv daemons for different projects/workspaces.
Verified behavior:
- Started anvilsrv in :0 and :1 namespaces simultaneously
- Each has independent PID file, socket, and sessions
- Stop/status commands work per-namespace
- No code changes needed - already works via client.Namespace()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Assist now continues working even if anvilsrv fails to start, and
provides a Daemon management window for server control.
Changes:
- Assist no longer fails fatally if anvilsrv won't start
- Logs ERROR and continues with disconnected state
- Add Daemon command to open /AnviLLM/Daemon window
- Daemon window shows server status with Start/Stop/Restart buttons
- Add isConnected() checks to all 9P operations
- Display friendly "not connected" message in main window
- Auto-reconnect when starting daemon from Daemon window
Daemon Window Features:
- Shows current daemon status (RUNNING/NOT RUNNING)
- Displays 9P socket path and existence
- Shows connection state
- Start button: runs `anvilsrv start` and reconnects
- Stop button: runs `anvilsrv stop` and disconnects
- Restart button: stops then starts
- Get button: refreshes status display
User Experience:
- Can still use Assist UI features (Sandbox, etc.) without daemon
- Session-related features show "not connected" errors
- Daemon command provides easy server management
- No more hard failures on startup
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The Sandbox command was accidentally omitted during the architectural
split. This restores the UI convenience feature for managing sandbox
configuration.
Changes:
- Add Sandbox to main window tag and command handlers
- Port sandbox UI functions from old internal/ui/sandbox.go
- Open /AnviLLM/Sandbox window with Get/Edit/Reload/Status commands
- Edit opens config in Acme or $EDITOR
- Status shows landrun availability and version
README:
- Update Architecture section explaining daemon/client split
- Add Service Integration section (systemd/runit)
- Add anvilsrv commands (start/fgstart/stop/status)
- Update Commands table with Stop/Restart/Refresh/Sandbox
- Add path validation and security notes
- Expand troubleshooting section
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>