From 9a231dae9e5b72bb53da2e73dc95a8600af9ceb0 Mon Sep 17 00:00:00 2001 From: qzl Date: Tue, 31 Mar 2026 18:26:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=8E=E6=8F=90=E9=86=92=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/res/raw/reminder_1.wav | Bin 0 -> 196686 bytes apps/assets/reminder_sound/1.WAV | Bin 0 -> 196686 bytes apps/assets/reminder_sound/2.WAV | Bin 0 -> 282702 bytes apps/ios/Runner.xcodeproj/project.pbxproj | 4 + apps/ios/Runner/reminder_1.wav | Bin 0 -> 196686 bytes apps/lib/app/app.dart | 56 +++++--- apps/lib/app/di/injection.dart | 4 + apps/lib/app/router/app_router.dart | 7 +- .../app/services/session_scope_manager.dart | 42 ++++++ .../services/reminder_scheduler_service.dart | 102 +++++++++++++- apps/lib/data/cache/cache_scope.dart | 10 +- apps/lib/data/cache/cache_store.dart | 5 +- apps/lib/data/cache/cached_repository.dart | 33 ++++- .../presentation/screens/home_screen.dart | 21 ++- .../screens/todo_quadrants_screen.dart | 45 +++++++ apps/lib/l10n/app_en.arb | 2 +- apps/lib/l10n/app_localizations.dart | 2 +- apps/lib/l10n/app_localizations_en.dart | 2 +- apps/lib/l10n/app_localizations_zh.dart | 2 +- apps/lib/l10n/app_zh.arb | 2 +- apps/pubspec.yaml | 3 +- .../app/router/app_router_redirect_test.dart | 6 +- .../services/session_scope_manager_test.dart | 63 +++++++++ .../reminder_reconcile_service_test.dart | 124 ++++++++++++++++++ .../data/cache/cached_repository_test.dart | 26 ++++ .../data/cache/hybrid_cache_store_test.dart | 16 +++ .../chat_history_repository_test.dart | 2 +- deploy/static/releases/manifest.json | 11 ++ docs/bugs/architecture-cache-scope-bugs.md | 103 +++++++++++++++ docs/bugs/路由守卫逻辑分散.md | 106 --------------- ...26-03-30-agent-calendar-inbox-stability.md | 74 ----------- 31 files changed, 650 insertions(+), 223 deletions(-) create mode 100644 apps/android/app/src/main/res/raw/reminder_1.wav create mode 100644 apps/assets/reminder_sound/1.WAV create mode 100644 apps/assets/reminder_sound/2.WAV create mode 100644 apps/ios/Runner/reminder_1.wav create mode 100644 apps/lib/app/services/session_scope_manager.dart create mode 100644 apps/test/app/services/session_scope_manager_test.dart create mode 100644 docs/bugs/architecture-cache-scope-bugs.md delete mode 100644 docs/bugs/路由守卫逻辑分散.md delete mode 100644 docs/plans/2026-03-30-agent-calendar-inbox-stability.md diff --git a/apps/android/app/src/main/res/raw/reminder_1.wav b/apps/android/app/src/main/res/raw/reminder_1.wav new file mode 100644 index 0000000000000000000000000000000000000000..8f2fab5d0e62bb20443d9574ca2b220ec42379c7 GIT binary patch literal 196686 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Π+tE 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