docs: update all docs for notifications, tab alerts, and systemd service

CLAUDE.md:
- Expanded HTTPS & Browser Notifications section with new behavior
  (default on, auto-permission, tab visibility rules, data forwarding)
- Added Tab Alert Blinking documentation (red/yellow, timing, clear triggers)
- Added Hook Event Data Forwarding section
- Added systemd service commands to Commands section
- Added scripts/claudeman-web.service to Key Files table
- Fixed switchToSession → selectSession in Frontend docs
- Added notification/tab alert timing constants
- Updated hook-event API route description
- Updated SSE events to mention data forwarding

README.md:
- Expanded notifications section with tab blinking and click-to-navigate
- Added systemd service install commands to Quick Start
- Updated hook-event API description

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
arkon
2026-01-24 04:06:35 +01:00
co-authored by Claude Opus 4.5
parent 6393e00e95
commit f95b02311c
2 changed files with 66 additions and 15 deletions
+43 -7
View File
@@ -101,6 +101,14 @@ curl localhost:3000/api/status | jq . # Full app state including respawn
cat ~/.claudeman/state.json | jq . # View main state cat ~/.claudeman/state.json | jq . # View main state
cat ~/.claudeman/state-inner.json | jq . # View Ralph loop state cat ~/.claudeman/state-inner.json | jq . # View Ralph loop state
# Systemd service (respawning, survives logout):
systemctl --user status claudeman-web # Check status
systemctl --user restart claudeman-web # Restart
systemctl --user stop claudeman-web # Stop
journalctl --user -u claudeman-web -f # Stream logs
# Install: ln -sf scripts/claudeman-web.service ~/.config/systemd/user/
# Enable: systemctl --user enable claudeman-web && loginctl enable-linger $USER
# Kill stuck screen sessions # Kill stuck screen sessions
screen -X -S <name> quit # Graceful quit screen -X -S <name> quit # Graceful quit
pkill -f "SCREEN.*claudeman" # Force kill all claudeman screens pkill -f "SCREEN.*claudeman" # Force kill all claudeman screens
@@ -162,6 +170,7 @@ claudeman reset # Reset all state
| `src/spawn-claude-md.ts` | Generates CLAUDE.md for spawned agent sessions | | `src/spawn-claude-md.ts` | Generates CLAUDE.md for spawned agent sessions |
| `src/mcp-server.ts` | MCP server binary (`claudeman-mcp`) exposing spawn tools to Claude Code | | `src/mcp-server.ts` | MCP server binary (`claudeman-mcp`) exposing spawn tools to Claude Code |
| `src/tui/DirectAttach.ts` | Full-screen console attach with tab switching between sessions | | `src/tui/DirectAttach.ts` | Full-screen console attach with tab switching between sessions |
| `scripts/claudeman-web.service` | Systemd user service for `claudeman web --https` (Restart=always) |
### Data Flow ### Data Flow
@@ -474,14 +483,15 @@ Key events for frontend handling (see `app.js:handleSSEEvent()`):
- `respawn:detectionUpdate` - Multi-layer idle detection status (confidence level, waiting state) - `respawn:detectionUpdate` - Multi-layer idle detection status (confidence level, waiting state)
- `spawn:queued`, `spawn:started`, `spawn:completed`, `spawn:failed`, `spawn:timeout`, `spawn:cancelled` - Agent lifecycle - `spawn:queued`, `spawn:started`, `spawn:completed`, `spawn:failed`, `spawn:timeout`, `spawn:cancelled` - Agent lifecycle
- `spawn:progress`, `spawn:message`, `spawn:budgetWarning`, `spawn:stateUpdate` - Agent monitoring - `spawn:progress`, `spawn:message`, `spawn:budgetWarning`, `spawn:stateUpdate` - Agent monitoring
- `hook:idle_prompt`, `hook:permission_prompt`, `hook:elicitation_dialog`, `hook:stop` - Claude Code hooks (desktop notifications) - `hook:idle_prompt`, `hook:permission_prompt`, `hook:elicitation_dialog`, `hook:stop` - Claude Code hooks (notifications + tab alerts, includes forwarded data fields)
### Frontend (app.js) ### Frontend (app.js)
Vanilla JS + xterm.js. Key functions: Vanilla JS + xterm.js. Key functions:
- `handleSSEEvent()` - Dispatches events to appropriate handlers - `handleSSEEvent()` - Dispatches events to appropriate handlers
- `switchToSession()` - Tab management and terminal focus - `selectSession()` - Tab switching, terminal buffer load, and focus
- `createSessionTab()` - Tab creation and xterm setup - `NotificationManager` - Multi-layer notifications with click-to-navigate
- `tabAlerts` Map - Tracks blinking state per session (`'action'` | `'idle'`)
**60fps Rendering Pipeline**: **60fps Rendering Pipeline**:
- Server batches terminal data every 16ms before broadcasting via SSE - Server batches terminal data every 16ms before broadcasting via SSE
@@ -493,12 +503,34 @@ Vanilla JS + xterm.js. Key functions:
**HTTPS**: The `--https` flag generates/reuses self-signed certificates in `~/.claudeman/certs/` (`server.key`, `server.crt`). Required for the Web Notification API in browsers. **HTTPS**: The `--https` flag generates/reuses self-signed certificates in `~/.claudeman/certs/` (`server.key`, `server.crt`). Required for the Web Notification API in browsers.
**Notification Layers** (in `app.js`, `NotificationManager` class): **Notification Layers** (in `app.js`, `NotificationManager` class):
1. In-app drawer with notification list 1. In-app drawer with notification list (click to navigate to session)
2. Tab title flashing with unread count (when tab unfocused) 2. Tab title flashing with unread count (when tab unfocused)
3. Web Notification API (browser push notifications) 3. Web Notification API (browser push notifications, click navigates to session)
4. Audio alerts (critical level only) 4. Audio alerts (critical level only)
5. Tab blinking alerts (red for action-required, yellow for idle)
Notifications triggered for: session events, respawn updates, spawn agent lifecycle. Preferences persist to server-side `state.json` per session. **Browser Notification Behavior:**
- Enabled by default (`browserNotifications: true`, prefs version 2)
- Auto-requests permission on first notification attempt
- Critical/warning notifications fire regardless of tab visibility
- Info notifications only fire when tab is hidden
- Rate limited: max 1 browser notification per 3 seconds
- Click navigates to the affected session
**Tab Alert Blinking:**
- `hook:permission_prompt` / `hook:elicitation_dialog` → red blink (2.5s cycle, `tab-alert-action`)
- `hook:idle_prompt` → yellow blink (3.5s cycle, `tab-alert-idle`)
- Only blinks non-active tabs (active tab is already visible)
- Clears when: user clicks the tab, or `session:working` event fires
**Hook Event Data Forwarding:**
The `/api/hook-event` endpoint forwards the `data` field from the request body into the SSE broadcast. Notifications display actual details:
- permission_prompt: tool name + command/file (e.g., "Bash: docker push prod:latest")
- elicitation_dialog: question text (e.g., "Merge PR #42 to main?")
- idle_prompt: custom message if provided
- stop: reason if provided
Notifications triggered for: session events, respawn updates, spawn agent lifecycle, hook events. Preferences persist to server-side `state.json` per session.
### State Store ### State Store
@@ -552,6 +584,10 @@ Writes debounced (500ms) to `~/.claudeman/state.json`. The web server persists f
| Spawn max depth | 3 levels | `spawn-orchestrator.ts` | | Spawn max depth | 3 levels | `spawn-orchestrator.ts` |
| Spawn budget warning | 80% | `spawn-orchestrator.ts` | | Spawn budget warning | 80% | `spawn-orchestrator.ts` |
| Spawn budget grace | 60s | `spawn-orchestrator.ts` | | Spawn budget grace | 60s | `spawn-orchestrator.ts` |
| Browser notif rate limit | 3s | `app.js` (NotificationManager) |
| Tab blink red (action) | 2.5s cycle | `styles.css` (tab-alert-action) |
| Tab blink yellow (idle) | 3.5s cycle | `styles.css` (tab-alert-idle) |
| Systemd restart delay | 5s | `claudeman-web.service` |
### TypeScript Config ### TypeScript Config
@@ -678,7 +714,7 @@ Long-running sessions are supported with automatic trimming:
| GET | `/api/spawn/status` | Orchestrator status (counts, config) | | GET | `/api/spawn/status` | Orchestrator status (counts, config) |
| PUT | `/api/spawn/config` | Update orchestrator config | | PUT | `/api/spawn/config` | Update orchestrator config |
| POST | `/api/spawn/trigger` | Programmatic spawn (bypass terminal detection) | | POST | `/api/spawn/trigger` | Programmatic spawn (bypass terminal detection) |
| POST | `/api/hook-event` | Receive Claude Code hook callbacks (idle_prompt, permission_prompt, elicitation_dialog, stop) | | POST | `/api/hook-event` | Receive Claude Code hook callbacks. Body: `{event, sessionId, data?}`. Data fields forwarded to SSE broadcast |
## Keyboard Shortcuts (Web UI) ## Keyboard Shortcuts (Web UI)
+23 -8
View File
@@ -163,14 +163,20 @@ curl -X POST localhost:3000/api/sessions/:id/auto-compact \
Automatic desktop notifications when sessions need attention — powered by Claude Code's hooks system: Automatic desktop notifications when sessions need attention — powered by Claude Code's hooks system:
| Hook Event | Urgency | Meaning | | Hook Event | Urgency | Tab Alert | Meaning |
|------------|---------|---------| |------------|---------|-----------|---------|
| `permission_prompt` | Critical | Claude needs tool approval | | `permission_prompt` | Critical | Red blink | Claude needs tool approval |
| `elicitation_dialog` | Critical | Claude is asking a question | | `elicitation_dialog` | Critical | Red blink | Claude is asking a question |
| `idle_prompt` | Warning | Session idle, waiting for input | | `idle_prompt` | Warning | Yellow blink | Session idle, waiting for input |
| `stop` | Info | Response complete | | `stop` | Info | — | Response complete |
Hooks are auto-configured per case directory (`.claude/settings.local.json`). Requires `--https` flag for browser notification API support. **Features:**
- Browser notifications enabled by default (auto-requests permission)
- Click any notification to jump directly to the affected session
- Tab blinking alerts: red for action-required, yellow for idle
- Notifications include actual context (tool name, command, question text)
- Hooks are auto-configured per case directory (`.claude/settings.local.json`)
- Requires `--https` flag for browser notification API support
--- ---
@@ -218,6 +224,15 @@ claudeman web -p 8080
# Development mode (no build needed) # Development mode (no build needed)
npx tsx src/index.ts web npx tsx src/index.ts web
# HTTPS (required for browser notifications)
claudeman web --https
# Run as systemd service (auto-restarts, survives logout)
ln -sf $(pwd)/scripts/claudeman-web.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now claudeman-web
loginctl enable-linger $USER
``` ```
**Requirements:** **Requirements:**
@@ -275,7 +290,7 @@ npx tsx src/index.ts web
### Hooks & Notifications ### Hooks & Notifications
| Method | Endpoint | Description | | Method | Endpoint | Description |
|--------|----------|-------------| |--------|----------|-------------|
| `POST` | `/api/hook-event` | Claude Code hook callbacks | | `POST` | `/api/hook-event` | Hook callbacks `{event, sessionId, data?}` → notifications + tab alerts |
### Real-Time ### Real-Time
| Method | Endpoint | Description | | Method | Endpoint | Description |