feat: deliver multi-asset analytics, OCR exchange selection, and heatmap UX

Add asset-type aware market/overview flows, portfolio OCR reverse-engineering with exchange overrides, and interactive index heatmap features. Update README with recent updates and wire backend/frontend APIs for FX matrix, exchange options, and improved portfolio editing flows.

Made-with: Cursor
This commit is contained in:
shawnkim1997
2026-03-21 17:08:00 +00:00
parent e225c05cc8
commit 38c56a5a43
35 changed files with 3224 additions and 287 deletions
@@ -0,0 +1,24 @@
"""Build compact copilot context with asset-type aware fields."""
from __future__ import annotations
def build_copilot_context(asset_type: str, data: dict) -> str:
parts: list[str] = []
if asset_type == "etf":
parts.append(f"[Asset Type] ETF — {data.get('category')}")
parts.append(f"[ETF] AUM: {data.get('aum')}, Expense: {data.get('expense_ratio')}")
r = data.get("returns") or {}
parts.append(f"[Performance] YTD: {r.get('ytd')}%, 1Y: {r.get('1y')}%")
elif asset_type == "commodity_future":
parts.append(f"[Asset Type] Commodity Future — {data.get('name')}")
parts.append(f"[Commodity] Open Interest: {data.get('open_interest')}")
seasonal = data.get("seasonal_pattern") or {}
if seasonal:
best_month = max(seasonal, key=lambda k: seasonal[k])
worst_month = min(seasonal, key=lambda k: seasonal[k])
parts.append(f"[Seasonal] Best month: {best_month}, Worst: {worst_month}")
else:
parts.append("[Asset Type] Equity")
parts.append(f"[Sector] {data.get('sector')}")
return "\n".join(parts)