Add full user management section (tab to Users):
- User list table with username, email, created date
- n: create user (username + email form)
- d: delete user with confirmation (cascades API keys)
- k: API key management for selected user
- n: create new key with name input; one-time reveal
showing key value and integer key ID prominently
- r: revoke by integer ID (no list endpoint on server)
- c: copy revealed key to clipboard (atotto/clipboard)
API key listing is unavailable server-side, so the reveal
screen displays the key ID prominently for future revocation.
Adds a 14-day schedule list accessible via the Schedule tab.
Keybindings in schedule section:
←/→ (or h/l) shift the 2-week window back/forward by one week
j/k navigate rows
+ open user picker — select a user to assign to the date
d delete the selected day's assignment (y/N confirmation)
r refresh schedule from server
The user picker fetches the user list from the server on first open
(cached for the session). Selecting a user assigns them to the
highlighted date (POST /api/schedule all-or-nothing; 409 conflicts
surface as a status bar error).
The on-call header shows today's scheduled person and the current
window date range. On-call data refreshes on schedule actions.
API additions: GetSchedule, GetCurrentOnCall, AssignSchedule,
DeleteScheduleEntry, ListUsers. ScheduleEntry and User types added.
Press enter on any alert to open a full-screen detail pane (viewport).
Keybindings in detail mode:
a/A acknowledge / unacknowledge (updates immediately)
c compose a comment (text input at bottom)
[/] cycle comment cursor up/down
d delete selected comment (y/N confirmation)
s assign placeholder — shows "not yet supported by server"
S open stats view: top alerts + by-hour/by-day ASCII bar charts
esc back to dashboard
API additions: GetAlert, AcknowledgeAlert, UnacknowledgeAlert,
GetComments, AddComment, DeleteComment, GetTopAlerts,
GetStatsByHour, GetStatsByDay.
Adds a bubbles/table alert list showing Name, Status, Started (relative
time), and Ack By columns. Stats bar shows total/firing/resolved counts.
Filter cycles firing → resolved → all with [f]. Auto-refresh fires on
the configured interval via tea.Tick. Table scrolls with j/k.