Features:
- Add cloud sync retry service for failed report uploads
- Automatic retry loop that runs every 30 seconds
- Exponential backoff: 1 attempt per 30s with max 5 retries per report
- Reports always saved locally (IndexedDB) - cloud sync failures don't block user
- SyncInitializer component starts retry loop on app startup
Changes:
- frontend/lib/sync-retry.ts: New service for managing cloud sync retries
- retryPendingSyncs(): Attempt to sync all pending reports
- markForRetry(): Mark a report for retry
- startRetryLoop(): Start automatic retry background task
- stopRetryLoop(): Clean up retry loop on app shutdown
- getPendingSyncCount(): Get number of reports awaiting sync
- frontend/components/providers/SyncInitializer.tsx: Client component that:
- Initializes retry loop only when user is authenticated
- Cleans up on component unmount
- Logs retry service startup/shutdown
- frontend/app/layout.tsx: Add SyncInitializer to root layout
- Ensure retry loop starts automatically for authenticated users
- frontend/app/analysis/page.tsx: Improve error handling
- Log warning when cloud sync fails
- Report remains safely in IndexedDB even if cloud save fails
Impact:
- Reports never get lost even if cloud save fails temporarily
- Automatic retry ensures eventual consistency with cloud
- User experience improved: no more "report deleted" after 1 hour
- Network issues no longer result in data loss
- Addresses original issue: reports now persists locally indefinitely
Technical Design:
- Retry tracking uses in-memory Map (resets on page refresh)
- Future enhancement: could persist retry state to localStorage
- Cloud sync becomes eventual consistency rather than immediate
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Pass max_debate_rounds and max_risk_discuss_rounds from config to ConditionalLogic
- Pass max_recur_limit from config to Propagator
- Increase default recursion_limit from 100 to 200 in default_config.py
- Increase Propagator default max_recur_limit from 100 to 200
Also includes earlier fixes:
- Add 365-day minimum date range validation to get_stock_data tool
- Update market analyst prompt to specify 1-year data requirement
- Initialize all debate state fields (bull_history, bear_history, judge_decision, etc.)
- Add report completeness logging in trading_service.py
- Add debug logging in frontend results page
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
1. Auto-save reports when page closes:
- Added beforeunload handler to auto-save analysis to history
- Saves to local IndexedDB and cloud (if authenticated)
- Prevents data loss if user accidentally closes the page
2. Fix PDF download from history page:
- Made taskId optional in DownloadReports component
- Added direct mode: can pass reports data directly
- Updated backend to support both task-based and direct-data modes
- History reports now have download PDF option available