- Replace fixed 3s reconnect with exponential backoff
(1s/2s/4s/8s/16s/30s, capped). Reduces console noise when
upstream WebSocket is blocked (e.g. DSM reverse proxy without
WS upgrade headers).
- ws.onerror swallowed (onclose still schedules reconnect) so the
browser stops printing an unhandled-error pair per attempt.
- Expose reconnectAttempt in hook; TopBar shows 'Connecting…'
pre-first-attempt and 'Disconnected · 재연결 시도 #N' after.
Root cause of WS failure is upstream (curl proves the endpoint
itself is fine — see DSM reverse proxy WebSocket headers).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Pathfinder.setBlocked: remove blocked.clear() to preserve wall tiles set by setWalls()
- Pathfinder.findPath: fix dead-code goal exception — remove redundant isBlocked check, keep goal-tile exception in single guard
- OfficeRenderer: track mouseDownPos/_wasDragging; expose wasDragging() method for click-after-drag suppression
- OfficeRenderer._render: track _lastDpr to detect monitor DPR changes; use setTransform instead of scale to avoid accumulation
- TileMap.render: use clientWidth/clientHeight for viewport culling (CSS space, not buffer pixels)
- TaskTab: wrap JSON.parse in try/catch to prevent crash on malformed result_data
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add notification state management with badge counts in useAgentManager
- Render exclamation badge on agent sprites (separate from status icons)
- Add CEO desk document icon with click-to-open activity panel
- Create DocumentPanel with unified activity feed + per-agent detail tabs
- Add telegram test button to stock agent ChatPanel
- Remove TaskHistory + bottom toolbar (replaced by DocumentPanel)
- Add getActivityFeed API helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>