Commit Graph

89 Commits

Author SHA1 Message Date
MarkLo127 5724cb612c 2026-03-13 15:48:37 +08:00
MarkLo127 1a409796d1 2026-03-12 23:07:36 +08:00
MarkLo127 8fa86ef6c0 Fix: Remove schema default from analysis_mode, rely on form defaultValues
- Removed .default('deep') from Zod schema to fix type inference
- The field is now purely required with no optional inference
- The default value is provided by useForm's defaultValues
- This cleanly separates schema validation from form defaults
2026-03-12 22:06:05 +08:00
MarkLo127 cad2889024 Fix: Remove .optional() from analysis_mode schema to fix type inference
- Changed from .optional().default() to just .default()
- This resolves the type mismatch with zodResolver and react-hook-form
- The field still defaults to 'deep' when not provided
2026-03-12 22:03:42 +08:00
MarkLo127 271175bb4d Fix: Resolve TypeScript error with analysis_mode field in AnalysisForm
- Changed analysis_mode schema from .default() to .optional().default()
- This fixes the type mismatch error in the resolver with zodResolver
- Allows the form to properly infer the field as optional with a default value
2026-03-12 21:54:34 +08:00
MarkLo127 42b5b8dab8 Implement Plan C3: Cloud Sync Retry with Local Caching
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>
2026-03-12 21:35:29 +08:00
MarkLo127 9c0a9819e6 Implement Plan A1: Fast Mode Analysis
Features:
- Add analysis_mode parameter (fast/deep) to AnalysisRequest
- Fast mode (15-25 min): Disables investment and risk debates (max_debate_rounds=0)
- Deep mode (60 min): Default mode with debates enabled
- Update backend TradingService to handle analysis_mode
- Add analysis_mode form field to frontend with dropdown selector
- Update TypeScript interfaces to include analysis_mode

Changes:
- backend/app/models/schemas.py: Add analysis_mode field to AnalysisRequest
- backend/app/services/trading_service.py: Handle analysis_mode in create_config()
- backend/app/api/routes.py: Pass analysis_mode parameter to run_analysis()
- frontend/components/analysis/AnalysisForm.tsx: Add analysis_mode dropdown (fast/deep)
- frontend/lib/types.ts: Add analysis_mode to AnalysisRequest interface

When users select "fast mode", the system will:
1. Skip investment debate (max_debate_rounds = 0)
2. Skip risk debate (max_risk_discuss_rounds = 0)
3. Reduce analysis time from ~60 minutes to ~15-25 minutes
4. Still run all analyst reports with proper 500-1000 word counts
5. Provide initial decision without debate refinement

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-12 21:33:23 +08:00
MarkLo127 1f5d59ac7a 2026-03-11 15:32:10 +08:00
MarkLo127 071c4bf5cf 2026-03-10 17:58:38 +08:00
MarkLo127 92c2a84b83 2026-03-10 17:00:32 +08:00
MarkLo127 d95af6a64c 刪除claude被棄用的模型 2026-03-05 23:42:58 +08:00
MarkLo127 d58e80a962 2026-01-27 13:22:52 +08:00
MarkLo 3145d08c30 2025-12-28 01:22:45 +08:00
MarkLo 6e48ac3f7a 2025-12-24 04:49:04 +08:00
MarkLo 8272138da0 2025-12-24 01:40:36 +08:00
MarkLo 16e513a921 新增英文語系支援 2025-12-24 01:20:33 +08:00
MarkLo 0f434546aa 2025-12-21 02:00:38 +08:00
MarkLo c673c52dda 2025-12-20 09:03:32 +08:00
MarkLo 95b456faf7 fix: TypeScript error in PriceChart Tooltip formatter 2025-12-20 08:00:14 +08:00
MarkLo c4fc8904eb 2025-12-20 07:41:05 +08:00
MarkLo 47f04a6ff7 2025-12-16 00:45:07 +08:00
MarkLo 3568ff5b33 2025-12-15 03:38:56 +08:00
MarkLo 22f57a8674 feat: recover pending analysis tasks after page close
Added task recovery system that allows users to recover and save
analysis results even if they accidentally close the page:

1. New pending-task.ts utility:
   - Saves task info to localStorage when analysis starts
   - Clears after task completes/fails
   - 24-hour expiry for old tasks

2. PendingTaskRecovery component:
   - Shows on history page if pending task found
   - Polls API for task status
   - Saves result to IndexedDB + cloud upon completion

3. Updated useAnalysis hook:
   - Tracks pending tasks in localStorage
   - Clears on completion/failure

Now users visiting /history after closing the page during analysis
will see a prompt to recover and save their completed report.
2025-12-14 03:55:12 +08:00
MarkLo cf4aaa09b1 feat: auto-save reports + fix PDF download from history
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
2025-12-14 03:21:59 +08:00
MarkLo bddcca3ebb 2025-12-13 16:19:46 +08:00
MarkLo c9f6e6a8d1 2025-12-13 07:14:45 +08:00
MarkLo 2a65c7f44d 2025-12-13 06:34:48 +08:00
MarkLo bcfa6dab06 2025-12-13 06:13:15 +08:00
MarkLo 5d3751602e 2025-12-13 06:00:19 +08:00
MarkLo eed052abe9 2025-12-13 03:15:29 +08:00
MarkLo 8204aff28b 2025-12-13 01:54:47 +08:00
MarkLo 5e48737ab8 2025-12-12 19:42:31 +08:00
MarkLo 5fa0ea027a 2025-12-12 19:32:11 +08:00
MarkLo 4269fdec26 2025-12-12 19:01:49 +08:00
MarkLo 144f5793aa 2025-12-12 06:10:20 +08:00
MarkLo da7d05ecc9 2025-12-12 05:30:04 +08:00
MarkLo 71fb9844ee 2025-12-11 01:18:46 +08:00
MarkLo a51b31dc21 2025-12-11 00:37:19 +08:00
MarkLo 886694b62f 2025-12-10 23:51:07 +08:00
MarkLo 6c453ead59 2025-12-07 22:35:18 +08:00
MarkLo 79c1f103e1 2025-12-07 22:02:20 +08:00
MarkLo 33e58ff389 2025-12-07 21:40:58 +08:00
MarkLo c2b8706bf2 2025-12-07 17:13:57 +08:00
MarkLo 0792830c3d 2025-12-07 16:51:11 +08:00
MarkLo 9ce8fcdcb3 2025-12-07 04:12:25 +08:00
MarkLo 915ee9915c 2025-12-07 03:54:52 +08:00
MarkLo 43658df2a0 2025-12-06 02:28:43 +08:00
MarkLo a0e4365fc3 2025-12-06 01:50:41 +08:00
MarkLo 6ffe348ac0 2025-12-03 02:59:12 +08:00
MarkLo 4f2327f5c2 2025-12-03 00:09:09 +08:00