Skip to content

unified chat v1#55

Merged
southernmagilla merged 45 commits intomainfrom
unified-chat-v1
Feb 12, 2026
Merged

unified chat v1#55
southernmagilla merged 45 commits intomainfrom
unified-chat-v1

Conversation

@southernmagilla
Copy link
Collaborator

@southernmagilla southernmagilla commented Feb 9, 2026

Summary

  • merge main into unified-chat-v1 and keep per-profile settings, chat, and OAuth migration logic
  • fix theme parsing when JSONC files include UTF-8 BOM so theme list and tokens load correctly
  • clean up profile settings updates and legacy migration defaults so chat + oauth fields are preserved

Testing

  • pnpm -C apps/web typecheck
  • cargo check (server)

Notes

  • theme parsing previously failed with Invalid theme JSON in logs; BOM is now stripped before JSONC parsing

southernmagilla and others added 30 commits January 12, 2026 20:52
This commit implements profile-specific settings for theme, language,
and chat platform configurations, with fallback to global settings.

Changes:
- Profile model: Added optional theme, language, and chatConfigs fields
- Settings view: Refactored to read/write profile-specific settings
- App.tsx: Added global effect to apply settings when profile changes
- Type definitions: Added ChatConfig type for profile chat configuration

Key features:
- Each profile can have its own theme and language preference
- Chat platform connections are now profile-specific
- Automatic theme/language switching when changing profiles
- Backward compatible: existing profiles use global settings as fallback
- Settings are applied immediately on profile change, not just in Settings view

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
add rust invoke handlers for chat commands
frontend:
add chat api section with methods for chat commands
gui:
add chat panel to integrations tab
add youutbe and twitch cards to panel
add channel name and token/key inputs
add connect/disconnect buttons and status indicatiors
add error message display
add translation keys to en.json
Add Streamer.bot-style OAuth authentication where users can either:
- Click "Login with Twitch" / "Sign in with Google" (embedded OAuth)
- For YouTube: optionally use their own API key (uses their quota)

Backend changes:
- Add PKCE OAuth flow support (no client_secret needed)
- Add embedded client ID placeholders for Twitch and YouTube
- Add OAuth token storage in settings (access/refresh tokens, user info)
- Add new commands: oauth_complete_flow, oauth_get_account, oauth_disconnect, oauth_forget

Frontend changes:
- Redesign ChatPanel with account display and login/logout buttons
- Add YouTube hybrid mode (OAuth vs API key radio selection)
- Add OAuthAccount type and settings fields
- Update API methods for new OAuth flow

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add TwitchAuth and YouTubeAuth enums supporting both user tokens and app OAuth
- Update ChatCredentials to use new auth types
- Add OAuth service module export
- Improve backend connection error handling and retry logic
- Update Tauri desktop launcher for OAuth callback support
- Add chrono dependency for timestamp handling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Google Desktop apps require client_secret in token exchange even with
PKCE (non-standard). Added SPIRITSTREAM_YOUTUBE_CLIENT_SECRET env var.

Also: removed unused Utc import, added debug logging for OAuth flow.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, the chat pop-out button only worked in Tauri desktop mode.
Now it checks the environment and uses window.open() for browser mode,
making the pop-out work in both desktop and HTTP/browser contexts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, the chat pop-out button only worked in Tauri desktop mode.
Now it checks the environment and uses window.open() for browser mode,
making the pop-out work in both desktop and HTTP/browser contexts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The overlay now listens for the main window's close event and
closes itself automatically. This is more reliable than using
beforeunload from the main window.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The onCloseRequested event was blocking the main window from closing.
Now the overlay polls every 500ms to check if the main window still
exists, and closes itself when it detects the main window is gone.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@southernmagilla
Copy link
Collaborator Author

Updated localization

@southernmagilla southernmagilla merged commit 7a4d18e into main Feb 12, 2026
3 checks passed
@github-project-automation github-project-automation bot moved this from Todo to Done in SpiritStream Roadmap Feb 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant