- Sanitize user-facing error messages (no raw API/DB errors)
- Remove dead try/catch from Chat.tsx handleSendMessage
- Add onError callback for persistence errors in useChat
- Add console.error logging to loadConversation
- Guard minimize/toggleMinimize against closed overlay state
- Improve error dedup bucketing for non-DOMException errors
- Add tests: non-Error throws, updateConversation failure,
minimize/toggleMinimize guards
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Port high-value features from work/m4-llm branch into develop's
security-hardened codebase:
- Separate LLM vs persistence error handling in useChat (shows
assistant response even when save fails)
- Add structured error context logging with errorType, messagePreview,
messageCount fields for debugging
- Enforce state invariant in useChatOverlay: cannot be minimized when
closed
- Add onStorageError callback with user-friendly messages and
per-error-type deduplication
- Add error logging to Chat imperative handle methods
- Create Chat.test.tsx with loadConversation failure mode tests
Skipped from work/m4-llm (superseded by develop):
- AbortSignal timeout (develop has centralized client timeout)
- Custom toast system (duplicates @mosaic/ui)
- ErrorBoundary (develop has its own)
- WebSocket typed events (develop's ref-based pattern is superior)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add runtime type validation after all JSON.parse calls in the web app to
prevent runtime crashes from corrupted or tampered storage data. Creates a
shared safeJsonParse utility with type guard functions for each data shape
(Message[], ChatOverlayState, LayoutConfigRecord). All four affected
callsites now validate parsed data and fall back to safe defaults on
mismatch.
Files changed:
- apps/web/src/lib/utils/safe-json.ts (new utility)
- apps/web/src/lib/utils/safe-json.test.ts (25 tests)
- apps/web/src/hooks/useChat.ts (deserializeMessages)
- apps/web/src/hooks/useChat.test.ts (3 new corruption tests)
- apps/web/src/hooks/useChatOverlay.ts (loadState)
- apps/web/src/hooks/useChatOverlay.test.ts (3 new corruption tests)
- apps/web/src/components/chat/ConversationSidebar.tsx (ideaToConversation)
- apps/web/src/lib/hooks/useLayout.ts (layout loading)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add messagesRef to track current messages and prevent stale closures
- Use functional updates for all setMessages calls
- Remove messages from sendMessage dependency array
- Add comprehensive tests verifying rapid sends don't lose messages
Refs #338
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>