Add authenticated global economic calendar with Jin10 fallback

Collect macroeconomic releases, events and holidays through the official browser SDK with resumable history from 2025. Preserve evidence, revisions and observation times, and merge verified series with official fields taking priority.

Add category filters, field provenance, coverage and connection status. Verify calendar persistence and deployment recovery in isolated acceptance checks.
This commit is contained in:
eezd committed 2026-10-31 12:57:14 +08:00
1 parent 57424fd661
commit e840557d22
35 files changed
+6828 -94

No files matched your search

+21 -3
View File
@@ -9,10 +9,10 @@ export interface CalendarItem {
period: string | null
stage: string | null
source: string
unit: string
unit: string | null
importance: number
scheduled_at: string
status: "scheduled" | "waiting" | "delayed" | "released" | "withdrawn" | "error" | "historical" | "unavailable"
status: "scheduled" | "waiting" | "delayed" | "released" | "withdrawn" | "error" | "historical" | "unavailable" | "recorded"
actual: string | null
previous: string | null
forecast: string | null
@@ -26,6 +26,18 @@ export interface CalendarItem {
last_checked_at: string | null
error: string | null
revision_no: number
kind: "data" | "event" | "holiday"
calendar_date: string
time_precision: "minute" | "day" | "tentative"
period_label: string | null
importance_source: "project" | "jin10"
previous_original: string | null
previous_revised: string | null
forecast_before_release: boolean
forecast_observed_at: string | null
field_sources: Record<string, { source: string, observed_at: string | null, url: string }>
related_release_id: number | null
related_revision_no: number | null
}
export interface CalendarData {
@@ -33,15 +45,21 @@ export interface CalendarData {
countries: { code: string, name: string }[]
worker: { at: string, sources: Record<string, { source: string, checked_at: string, error: string | null }> } | null
server_time: string
jin10: { at: string, state: string, error: string | null, history_next?: string | null, last_success_at: string | null } | null
coverage: { date: string, captured_at: string, counts: Record<"data" | "event" | "holiday", number> }[]
}
export interface CalendarRevision {
source: string
revision_no: number
captured_at: string
payload: { title: string, scheduled_at: string, schedule_status: string, values: Record<string, { actual: string | null, previous: string | null }> }
payload: { title: string, scheduled_at: string, schedule_status: string, values: Record<string, { actual?: string | null, previous?: string | null, forecast?: string | null, previous_revised?: string | null, precision?: string, description?: string | null, indicator?: string }> }
}
export interface CalendarHistory {
period_label?: string | null
forecast_before_release?: boolean
forecast_observed_at?: string | null
release_id: number
scheduled_at: string
title: string
+3 -1
View File
@@ -2,7 +2,9 @@ export interface Jin10Status {
connected: boolean
connected_at: string | null
error: string | null
sync_state: "awaiting_validation" | "disconnected"
sync_state: "awaiting_validation" | "disconnected" | "connecting" | "syncing" | "ready" | "error"
last_success_at: string | null
history_next: string | null
}
export interface Jin10Qr {
task_id: string