Commit Graph
26 Commits
Author SHA1 Message Date
2569718930@qq.com b122e7cbae Stabilize the decision workspace data boundaries
The scan terminal had grown into overlapping CSS, request-state, AI-provider, and city-card data responsibilities. This refactor separates those boundaries without changing product behavior: CSS modules are split by surface, city AI prompt/provider/fallback logic is isolated, and scan terminal request state now has reusable RemoteData adapters plus business-state tests.

Constraint: Preserve existing global scan-terminal class names and API responses during the refactor

Constraint: No new dependencies; keep this as a file-boundary cleanup

Rejected: Introduce React Query now | higher migration risk than the requested lightweight query-client path

Rejected: Rewrite AI stream behavior | progressive/fallback states are product-sensitive and were only adapter-split

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Keep AI stream state changes covered by business snapshots before changing fallback/cache wording

Tested: npm run test:business; npx tsc --noEmit; npm run build; python pytest -q; ruff check; py_compile targeted city AI modules

Not-tested: Live DeepSeek provider network replay and browser visual QA
2026-04-28 14:45:34 +08:00
2569718930@qq.com d2699ce17a Represent market scan loading with RemoteData
Market scan state was still tracked as separate nullable payload and status strings. This moves the hook internals to RemoteData<MarketScan> so loading and error paths can preserve previous data while keeping the existing marketScan and marketStatus return values for current card consumers.

Constraint: Preserve the existing useCityMarketScan public compatibility fields.

Rejected: Update all card UI to consume marketRemote immediately | keeping the compatibility bridge avoids a broad rendering diff while the request state model lands.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Tested: npm run build

Not-tested: Forced live market-scan failure with stale previous quote.
2026-04-28 11:00:22 +08:00
2569718930@qq.com 82a736850b Separate scan terminal storage cache helpers
The city-card data hook still contained localStorage serialization and TTL eviction helpers alongside AI fallback and UI state transitions. Moving those helpers into scan-terminal-cache creates a reusable cache boundary for the scan terminal request layer without changing cache keys, TTLs, or payload shapes.

Constraint: Preserve existing localStorage keys and expiry behavior.

Rejected: Migrate all caches to RemoteData in this commit | cache-helper extraction is a safer intermediate step before query policy changes.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Tested: npm run build

Not-tested: Browser private-mode quota edge cases beyond existing guarded behavior.
2026-04-28 10:50:57 +08:00
2569718930@qq.com 6fe0e5dfc5 Move AI city stream concurrency into the scan client
The AI city forecast hook still owned stream queueing and in-flight request dedupe after the first request-client pass. Moving that policy into scanTerminalClient keeps network concurrency, queued progress, and requestKey reuse in the request layer while leaving the hook responsible only for cached UI state and progress rendering.

Constraint: Preserve existing two-stream concurrency limit and queued user-facing progress copy.

Rejected: Move localStorage cache at the same time | cache policy should be separated from stream transport policy to keep this refactor reviewable.

Confidence: high

Scope-risk: narrow

Reversibility: clean

Tested: npm run build

Not-tested: Live multi-city SSE under production latency.
2026-04-28 10:37:04 +08:00
2569718930@qq.com 9ca3ee5a8e Centralize scan terminal requests behind a lightweight client
The scan terminal hooks were each carrying their own fetch, SSE parsing, error normalization, previous-data handling, and market request behavior. This adds a small scanTerminalClient plus RemoteData helpers so terminal data, city detail, market scans, and AI city streams share one request boundary without introducing React Query.

Constraint: Do not add dependencies or change backend API contracts.

Rejected: Introduce React Query immediately | too broad for this release and would force larger UI state rewrites.

Rejected: Move localStorage caches in the same pass | safer to first isolate network and stream IO before cache policy migration.

Confidence: high

Scope-risk: moderate

Reversibility: clean

Tested: npm run build

Not-tested: Live SSE cancellation against production latency.
2026-04-28 10:24:40 +08:00
2569718930@qq.com 0eab2fe628 Treat stale observations as weak evidence
City-card fallback reads now stop using stale METAR or official observations as strong live anchors. A stale observation no longer forces high/low revisions, and both backend and browser AI cache keys include the observation fingerprint so updated report times, receipt times, temperatures, or stale status invalidate old AI text.

Constraint: Cached city AI reads must not survive a material observation update

Rejected: Let stale METAR trigger observed-break revisions | stale reports can be older than the active temperature path

Confidence: high

Scope-risk: moderate

Tested: pytest tests/test_web_observability.py -q

Tested: npm run build
2026-04-28 06:28:29 +08:00
2569718930@qq.com 4eb50ce880 Prevent dangling TAF fragments in city AI reads
City AI can return a partially streamed JSON string when the provider truncates output. The fallback previously kept an unfinished clause such as '但TAF显示', which made the forecast explanation look broken even though earlier evidence was usable.

Constraint: Provider JSON can be truncated after useful fields have already streamed

Rejected: Drop all partial AI text | would lose valid METAR interpretation already returned before truncation

Confidence: high

Scope-risk: narrow

Tested: pytest city AI truncation regression tests

Tested: npm run build

Not-tested: Live DeepSeek provider response
2026-04-27 08:28:00 +08:00
2569718930@qq.com 9ded30b125 feat: implement AI-driven weather scan terminal with decision utilities and forecast visualization 2026-04-27 02:18:34 +08:00
2569718930@qq.com e2ad51ee65 feat: implement AI city forecast streaming service and documentation 2026-04-27 01:38:37 +08:00
2569718930@qq.com 8fe25d06a5 feat: implement AiPinnedForecastView component with associated data hooks and decision utilities for AI-driven weather analysis 2026-04-27 01:14:31 +08:00
2569718930@qq.com 7e66b026b9 feat: implement AI city forecast streaming hook and utility functions for scan terminal 2026-04-27 00:54:24 +08:00
2569718930@qq.com 97719a7ff0 feat: implement market scan data utilities and service for city weather card decisioning 2026-04-27 00:50:14 +08:00
2569718930@qq.com d46e0c2e81 feat: implement AI-powered pinned city forecast dashboard with real-time METAR and market analysis integration 2026-04-27 00:19:52 +08:00
2569718930@qq.com ef8ef833b9 feat: implement AI-driven METAR summary service and dashboard UI components 2026-04-26 14:03:13 +08:00
2569718930@qq.com f9ad34d7c0 feat: implement scan terminal service with AI-powered city analysis and caching support 2026-04-26 13:50:46 +08:00
2569718930@qq.com d42cdf6b51 feat: implement AI city forecast streaming service and UI components for scan terminal 2026-04-26 13:43:55 +08:00
2569718930@qq.com 5344779e32 feat: implement streaming AI city forecast service and frontend hook for real-time terminal updates 2026-04-26 13:12:03 +08:00
2569718930@qq.com dacefec39d feat: implement AI city forecast streaming service and UI component for scan terminal 2026-04-26 12:58:33 +08:00
2569718930@qq.com 03eca3f93b feat: implement AiPinnedForecastView component with associated decision utilities and data hooks 2026-04-26 12:39:16 +08:00
2569718930@qq.com f39f59f47a feat: implement AI city forecasting and market scan hooks with backend API integration for the scan terminal dashboard 2026-04-26 11:28:36 +08:00
2569718930@qq.com 9b77a3a0e2 feat: implement AI city forecast and market scan integration for terminal dashboard 2026-04-26 11:08:58 +08:00
2569718930@qq.com e374ad4bf0 feat: add AI city forecast terminal and integration components 2026-04-26 10:43:14 +08:00
2569718930@qq.com 1ee8408b1f feat: implement Leaflet map hook and AI-assisted city card forecast view for dashboard 2026-04-26 10:13:44 +08:00
2569718930@qq.com d54050ceb0 feat: implement AI-driven city weather analysis and market decision dashboard components 2026-04-26 10:02:54 +08:00
2569718930@qq.com 0f23d8af9d feat: implement dashboard types, Polymarket data collection, and decision utilities for AI-driven city weather analysis 2026-04-26 09:40:02 +08:00
2569718930@qq.com da2126e33e feat: implement ScanTerminalDashboard with AI-driven city streaming and analysis features 2026-04-26 09:13:18 +08:00