Commit Graph

100 Commits

Author SHA1 Message Date
Nicolas Varrot
1465ae1887 style: move model badge from header to token progress bar area 2026-02-12 12:25:17 +00:00
Nicolas Varrot
e24378aa75 feat: add session pinning to sidebar
- Pin icon appears on hover for each session, filled when pinned
- Pinned sessions sort to top of list (preserved across page reloads via localStorage)
- Subtle divider separates pinned from unpinned sessions
- i18n support for pin/unpin labels (EN + FR)
2026-02-12 12:19:18 +00:00
Nicolas Varrot
8640585426 docs: mark feedback #24 as done 2026-02-12 12:06:21 +00:00
Nicolas Varrot
96f28836cd feat: display model name badge in header for active session
Shows the model (e.g. claude-opus-4-6) as a subtle chip next to the
session label in the header. Hovering reveals agent ID if available.
Model and agentId are now extracted from sessions.list response.
2026-02-12 12:06:12 +00:00
Nicolas Varrot
4312a71bc9 docs: release v1.3.0 — changelog update and version bump 2026-02-12 11:56:20 +00:00
Nicolas Varrot
7a55940cc9 docs: add troubleshooting section to README 2026-02-12 11:45:44 +00:00
Nicolas Varrot
c0d27a7754 feat: add unread message indicators on sidebar sessions
Show a cyan dot on sessions that received new messages while
viewing a different session. The dot clears when switching to
that session.
2026-02-12 11:36:31 +00:00
Nicolas Varrot
6734b54389 fix: resolve CI lint errors in Sidebar, TypingIndicator, and useGateway
- Sidebar: replace useEffect setState with callback pattern for filter reset
- TypingIndicator: initialize useRef with 0 instead of impure Date.now()
- TypingIndicator: remove redundant setElapsed(0) from mount effect
- useGateway: remove unused eslint-disable directive
2026-02-12 11:27:42 +00:00
Nicolas Varrot
908dbb4a60 feat: add copy buttons to expanded tool call parameters and results 2026-02-12 11:16:34 +00:00
Nicolas Varrot
756287c380 docs: release v1.2.2 — changelog update and version bump 2026-02-12 10:55:18 +00:00
Nicolas Varrot
ae3f6839bc feat: show language label on fenced code blocks
Display a header bar above code blocks with the detected language
name (e.g. TypeScript, Python, Shell). Pretty-prints common language
identifiers. The copy button remains in the top-right corner.
2026-02-12 10:46:18 +00:00
Nicolas Varrot
0c95150635 feat: add elapsed time counter to thinking indicator
Shows how long the agent has been thinking (e.g. '5s', '1m 23s').
Timer appears after 2 seconds to avoid flicker on fast responses.
Helps users gauge if a request is still processing or stuck.
2026-02-12 10:37:07 +00:00
Nicolas Varrot
635f0120b6 docs: release v1.2.1 — changelog update and version bump 2026-02-12 10:26:10 +00:00
Nicolas Varrot
f2038a2022 feat: auto-focus chat input on session switch and connection 2026-02-12 10:17:05 +00:00
Nicolas Varrot
f55a24cb06 feat: add keyboard navigation for session list in sidebar
Arrow Up/Down to navigate sessions, Enter to select, Escape to close.
Sessions use role='option' with aria-selected for screen reader support.
Mouse hover syncs with keyboard focus index for smooth interaction.
2026-02-12 09:56:13 +00:00
Nicolas Varrot
f827307765 docs: add i18n guide for contributing new languages to README 2026-02-12 09:45:47 +00:00
Nicolas Varrot
3c5fcdfc73 fix: inject app version from package.json instead of hardcoded 1.0.0
- Add Vite define for __APP_VERSION__ from package.json
- Use dynamic version in gateway connect handshake and userAgent
- Show version number in sidebar footer
- Add globals.d.ts type declaration
2026-02-12 09:37:28 +00:00
Nicolas Varrot
7905f64f37 docs: release v1.2.0 — bump version and update changelog 2026-02-12 09:26:12 +00:00
Nicolas Varrot
e53ef36715 feat: show active session name in browser tab title
Updates document.title dynamically to show the current session label
(e.g. 'main — PinchChat'). Integrates with the existing notification
system so unread badges still work correctly (e.g. '(3) main — PinchChat').
Resets to plain 'PinchChat' when no session is selected.
2026-02-12 09:17:15 +00:00
Nicolas Varrot
b5eafdeed8 perf: lazy-load Chat component to reduce initial bundle size
The Chat component (and its heavy markdown dependencies ~476KB) are now
loaded via React.lazy() + Suspense. Users see the login screen faster
since only ~245KB is needed initially instead of ~750KB.
2026-02-12 09:05:51 +00:00
Nicolas Varrot
b8cbc75cf2 feat: add PWA manifest, apple-touch-icon, and proper favicon sizes
- Generate 192x192, 512x512, 180x180, 32x32, and 16x16 icons from logo
- Add manifest.json for PWA install support (standalone display)
- Add apple-touch-icon for iOS home screen
- Use sized favicons instead of full 1024x1024 logo.png
2026-02-12 09:02:07 +00:00
Nicolas Varrot
8301cba339 fix: guard Notification API for unsupported browsers
Check typeof Notification before accessing .permission or
requestPermission(). Fixes crash on browsers/contexts where
the Notification API is unavailable (e.g. some WebViews).
2026-02-12 07:58:23 +00:00
Nicolas Varrot
5c69ef193a docs: update changelog with recent additions 2026-02-12 06:55:34 +00:00
Nicolas Varrot
dc49734819 feat: validate WebSocket URL on login screen
Show inline hint when the gateway URL doesn't start with ws:// or wss://
and disable the connect button until it's valid. Prevents confusing
connection errors from malformed URLs.
2026-02-12 06:55:19 +00:00
Nicolas Varrot
cb882f5ead feat: add loading indicator when switching sessions
Show a spinner with 'Loading messages…' text while chat history
is being fetched during session switches, instead of briefly
flashing the empty welcome screen. Includes EN/FR i18n.
2026-02-12 05:52:06 +00:00
Nicolas Varrot
4b923a1ec2 docs: add homepage, bugs URL, and keywords to package.json 2026-02-12 04:48:21 +00:00
Nicolas Varrot
bd25517d6e docs: update changelog with unreleased changes since v1.1.0 2026-02-12 03:47:15 +00:00
Nicolas Varrot
1c4700d142 docs: mark feedback #23 as done 2026-02-12 02:46:00 +00:00
Nicolas Varrot
73d9e5f6f2 feat: add channel/type icons to session list in sidebar
Show Discord, Telegram, WhatsApp, Signal, Slack brand icons,
clock icon for cron sessions, bot icon for sub-agents, and
globe icon for webchat sessions. Falls back to message bubble
for unknown channels.

Closes feedback #23
2026-02-12 02:45:33 +00:00
Nicolas Varrot
2a7f3d9c88 docs: mark feedback #22 as done 2026-02-12 01:42:54 +00:00
Nicolas Varrot
29482e377a fix: resolve ESLint errors for React compiler rules
- Chat.tsx: replace mutable variable in render IIFE with useMemo+reduce
  to satisfy react-hooks/immutability rule
- ConnectionBanner.tsx: move setState calls into a useCallback to avoid
  synchronous setState in effect body (react-hooks/set-state-in-effect)
- useGateway.ts: suppress set-state-in-effect for legitimate mount init
2026-02-12 01:42:40 +00:00
Nicolas Varrot
375bd102d4 feat: add date separators between messages from different days
Shows a subtle horizontal line with the date label (Today, Yesterday, or
full date) when messages span multiple days. Helps orient users when
scrolling through long conversation histories.

Includes i18n support (EN/FR) for the date labels.
2026-02-12 00:40:03 +00:00
Nicolas Varrot
788909f0b3 docs: add screenshot to README 2026-02-11 23:43:29 +00:00
Nicolas Varrot
916910f5ce fix: resolve all ESLint errors and add lint step to CI
- Extract credential helpers to src/lib/credentials.ts (fixes react-refresh/only-export-components)
- Extract buildImageSrc to src/lib/image.ts (fixes react-refresh/only-export-components)
- Reorder useCallback declarations in useGateway to fix react-hooks/immutability
- Sync refs via useEffect instead of during render (fixes react-hooks/refs)
- Replace useState initializer effect with lazy initializer functions in LoginScreen
- Add comments to empty catch blocks (fixes no-empty)
- Remove unused variable (fixes @typescript-eslint/no-unused-vars)
- Downgrade react-hooks/set-state-in-effect to warning (valid init/status patterns)
- Add lint step to CI workflow (runs before type-check and build)
2026-02-11 23:37:37 +00:00
Nicolas Varrot
f8be728842 fix: use exponential backoff with jitter for WebSocket reconnection
Replace fixed 3s reconnect delay with exponential backoff (1s → 30s cap)
plus 30% jitter to prevent thundering herd. Resets on successful
connection or manual disconnect.
2026-02-11 22:33:02 +00:00
Nicolas Varrot
85c23b4e2d chore: release v1.1.0 — bump version and finalize changelog 2026-02-11 22:15:35 +00:00
Nicolas Varrot
88b6494523 feat: add OG card image + Twitter/OG meta tags for social sharing 2026-02-11 22:13:54 +00:00
Nicolas Varrot
5b2f3a340d feat: add retry/resend button on user messages
Hover over any user message to reveal a retry button (↻) that resends
the message text. Disabled while a response is generating.
Includes EN/FR i18n strings.
2026-02-11 21:56:48 +00:00
Nicolas Varrot
473d23c140 feat: add browser notifications and tab title badge for unread messages
When the tab is not focused:
- Tab title shows unread count: (3) PinchChat
- Browser notification with message preview (if permitted)
- Notifications collapse into one via tag
- Click notification to focus tab
- All clears when tab regains focus
- Permission requested on first user interaction
2026-02-11 21:45:59 +00:00
Nicolas Varrot
d02009475b docs: add PR template and security policy
- Add .github/PULL_REQUEST_TEMPLATE.md with checklist for contributors
- Add SECURITY.md with vulnerability reporting instructions
2026-02-11 21:35:29 +00:00
Nicolas Varrot
fd66fed96f fix(a11y): add prefers-reduced-motion support for all animations
Disables animations and reduces transition durations to near-zero
when the user has enabled reduced-motion in their OS settings.
Also replaces README screenshot placeholder with link to live demo.
2026-02-11 21:26:08 +00:00
Nicolas Varrot
693229c14e refactor: replace any types with proper TypeScript types across gateway client, hooks, and components
- Add GatewayMessage and JsonPayload interfaces to gateway.ts
- Type WebSocket message parsing with GatewayMessage instead of any
- Use ReturnType<typeof setTimeout> for timer refs
- Type chat event payload destructuring explicitly
- Add ChatPayloadMessage interface for extractText()
- Replace any casts in loadSessions/loadHistory with typed assertions
- Add str() helper in ToolCall.tsx for safe unknown→string extraction
- Use Extract<MessageBlock, ...> type guards instead of `as any` casts
- Type CodeBlock children prop properly
2026-02-11 21:17:44 +00:00
Nicolas Varrot
d724a8ca0b docs: update CHANGELOG with recent additions (ErrorBoundary, a11y, shortcuts, search, emoji badges) 2026-02-11 20:55:39 +00:00
Nicolas Varrot
b61a232948 feat: add ErrorBoundary for graceful crash recovery
- Catches render errors and shows a styled recovery UI instead of blank white screen
- Try Again button re-renders, Reload button refreshes the page
- Error details shown in a collapsible pre block
- Full i18n support (EN/FR)
- Wraps the entire app in main.tsx
2026-02-11 20:53:16 +00:00
Nicolas Varrot
78f82fd551 fix(a11y): add ARIA attributes to interactive elements
- ImageBlock: wrap clickable image in <button> with aria-label, add
  role=dialog and aria-modal to lightbox overlay
- KeyboardShortcuts: add role=dialog and aria-modal to modal overlay
- CodeBlock: add aria-label to copy button
- LanguageSelector: add aria-label with current language
2026-02-11 20:36:35 +00:00
Nicolas Varrot
c3824dd29f docs: mark feedback item #15 as done 2026-02-11 20:25:39 +00:00
Nicolas Varrot
72f7d76cc4 feat: add emoji icons to tool call badges
Replace Lucide icons with emojis on tool call badges for better visual
identification:  exec, 🔍 web_search, 📖 read, ✏️ write/edit,
🧠 memory,  cron, 🚀 sessions_spawn, and more.

Also reduces bundle by removing unused Lucide icon imports from ToolCall.

Closes feedback item #15.
2026-02-11 20:25:31 +00:00
Nicolas Varrot
59104b4217 feat: support line breaks in messages (remark-breaks plugin) 2026-02-11 20:22:17 +00:00
Nicolas Varrot
02e4bcf554 fix(landing): left-align demo chat messages (inherited text-align:center from hero) 2026-02-11 20:18:46 +00:00
Nicolas Varrot
538fb3a7bd docs: mark feedback item #14 as done 2026-02-11 20:15:41 +00:00