truthound-dashboard 1.4.3__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. truthound_dashboard/api/alerts.py +75 -86
  2. truthound_dashboard/api/anomaly.py +7 -13
  3. truthound_dashboard/api/cross_alerts.py +38 -52
  4. truthound_dashboard/api/drift.py +49 -59
  5. truthound_dashboard/api/drift_monitor.py +234 -79
  6. truthound_dashboard/api/enterprise_sampling.py +498 -0
  7. truthound_dashboard/api/history.py +57 -5
  8. truthound_dashboard/api/lineage.py +3 -48
  9. truthound_dashboard/api/maintenance.py +104 -49
  10. truthound_dashboard/api/mask.py +1 -2
  11. truthound_dashboard/api/middleware.py +2 -1
  12. truthound_dashboard/api/model_monitoring.py +435 -311
  13. truthound_dashboard/api/notifications.py +227 -191
  14. truthound_dashboard/api/notifications_advanced.py +21 -20
  15. truthound_dashboard/api/observability.py +586 -0
  16. truthound_dashboard/api/plugins.py +2 -433
  17. truthound_dashboard/api/profile.py +199 -37
  18. truthound_dashboard/api/quality_reporter.py +701 -0
  19. truthound_dashboard/api/reports.py +7 -16
  20. truthound_dashboard/api/router.py +66 -0
  21. truthound_dashboard/api/rule_suggestions.py +5 -5
  22. truthound_dashboard/api/scan.py +17 -19
  23. truthound_dashboard/api/schedules.py +85 -50
  24. truthound_dashboard/api/schema_evolution.py +6 -6
  25. truthound_dashboard/api/schema_watcher.py +667 -0
  26. truthound_dashboard/api/sources.py +98 -27
  27. truthound_dashboard/api/tiering.py +1323 -0
  28. truthound_dashboard/api/triggers.py +14 -11
  29. truthound_dashboard/api/validations.py +12 -11
  30. truthound_dashboard/api/versioning.py +1 -6
  31. truthound_dashboard/core/__init__.py +129 -3
  32. truthound_dashboard/core/actions/__init__.py +62 -0
  33. truthound_dashboard/core/actions/custom.py +426 -0
  34. truthound_dashboard/core/actions/notifications.py +910 -0
  35. truthound_dashboard/core/actions/storage.py +472 -0
  36. truthound_dashboard/core/actions/webhook.py +281 -0
  37. truthound_dashboard/core/anomaly.py +262 -67
  38. truthound_dashboard/core/anomaly_explainer.py +4 -3
  39. truthound_dashboard/core/backends/__init__.py +67 -0
  40. truthound_dashboard/core/backends/base.py +299 -0
  41. truthound_dashboard/core/backends/errors.py +191 -0
  42. truthound_dashboard/core/backends/factory.py +423 -0
  43. truthound_dashboard/core/backends/mock_backend.py +451 -0
  44. truthound_dashboard/core/backends/truthound_backend.py +718 -0
  45. truthound_dashboard/core/checkpoint/__init__.py +87 -0
  46. truthound_dashboard/core/checkpoint/adapters.py +814 -0
  47. truthound_dashboard/core/checkpoint/checkpoint.py +491 -0
  48. truthound_dashboard/core/checkpoint/runner.py +270 -0
  49. truthound_dashboard/core/connections.py +437 -10
  50. truthound_dashboard/core/converters/__init__.py +14 -0
  51. truthound_dashboard/core/converters/truthound.py +620 -0
  52. truthound_dashboard/core/cross_alerts.py +540 -320
  53. truthound_dashboard/core/datasource_factory.py +1672 -0
  54. truthound_dashboard/core/drift_monitor.py +216 -20
  55. truthound_dashboard/core/enterprise_sampling.py +1291 -0
  56. truthound_dashboard/core/interfaces/__init__.py +225 -0
  57. truthound_dashboard/core/interfaces/actions.py +652 -0
  58. truthound_dashboard/core/interfaces/base.py +247 -0
  59. truthound_dashboard/core/interfaces/checkpoint.py +676 -0
  60. truthound_dashboard/core/interfaces/protocols.py +664 -0
  61. truthound_dashboard/core/interfaces/reporters.py +650 -0
  62. truthound_dashboard/core/interfaces/routing.py +646 -0
  63. truthound_dashboard/core/interfaces/triggers.py +619 -0
  64. truthound_dashboard/core/lineage.py +407 -71
  65. truthound_dashboard/core/model_monitoring.py +431 -3
  66. truthound_dashboard/core/notifications/base.py +4 -0
  67. truthound_dashboard/core/notifications/channels.py +501 -1203
  68. truthound_dashboard/core/notifications/deduplication/__init__.py +81 -115
  69. truthound_dashboard/core/notifications/deduplication/service.py +131 -348
  70. truthound_dashboard/core/notifications/dispatcher.py +202 -11
  71. truthound_dashboard/core/notifications/escalation/__init__.py +119 -106
  72. truthound_dashboard/core/notifications/escalation/engine.py +168 -358
  73. truthound_dashboard/core/notifications/routing/__init__.py +88 -128
  74. truthound_dashboard/core/notifications/routing/engine.py +90 -317
  75. truthound_dashboard/core/notifications/stats_aggregator.py +246 -1
  76. truthound_dashboard/core/notifications/throttling/__init__.py +67 -50
  77. truthound_dashboard/core/notifications/throttling/builder.py +117 -255
  78. truthound_dashboard/core/notifications/truthound_adapter.py +842 -0
  79. truthound_dashboard/core/phase5/collaboration.py +1 -1
  80. truthound_dashboard/core/plugins/lifecycle/__init__.py +0 -13
  81. truthound_dashboard/core/quality_reporter.py +1359 -0
  82. truthound_dashboard/core/report_history.py +0 -6
  83. truthound_dashboard/core/reporters/__init__.py +175 -14
  84. truthound_dashboard/core/reporters/adapters.py +943 -0
  85. truthound_dashboard/core/reporters/base.py +0 -3
  86. truthound_dashboard/core/reporters/builtin/__init__.py +18 -0
  87. truthound_dashboard/core/reporters/builtin/csv_reporter.py +111 -0
  88. truthound_dashboard/core/reporters/builtin/html_reporter.py +270 -0
  89. truthound_dashboard/core/reporters/builtin/json_reporter.py +127 -0
  90. truthound_dashboard/core/reporters/compat.py +266 -0
  91. truthound_dashboard/core/reporters/csv_reporter.py +2 -35
  92. truthound_dashboard/core/reporters/factory.py +526 -0
  93. truthound_dashboard/core/reporters/interfaces.py +745 -0
  94. truthound_dashboard/core/reporters/registry.py +1 -10
  95. truthound_dashboard/core/scheduler.py +165 -0
  96. truthound_dashboard/core/schema_evolution.py +3 -3
  97. truthound_dashboard/core/schema_watcher.py +1528 -0
  98. truthound_dashboard/core/services.py +595 -76
  99. truthound_dashboard/core/store_manager.py +810 -0
  100. truthound_dashboard/core/streaming_anomaly.py +169 -4
  101. truthound_dashboard/core/tiering.py +1309 -0
  102. truthound_dashboard/core/triggers/evaluators.py +178 -8
  103. truthound_dashboard/core/truthound_adapter.py +2620 -197
  104. truthound_dashboard/core/unified_alerts.py +23 -20
  105. truthound_dashboard/db/__init__.py +8 -0
  106. truthound_dashboard/db/database.py +8 -2
  107. truthound_dashboard/db/models.py +944 -25
  108. truthound_dashboard/db/repository.py +2 -0
  109. truthound_dashboard/main.py +11 -0
  110. truthound_dashboard/schemas/__init__.py +177 -16
  111. truthound_dashboard/schemas/base.py +44 -23
  112. truthound_dashboard/schemas/collaboration.py +19 -6
  113. truthound_dashboard/schemas/cross_alerts.py +19 -3
  114. truthound_dashboard/schemas/drift.py +61 -55
  115. truthound_dashboard/schemas/drift_monitor.py +67 -23
  116. truthound_dashboard/schemas/enterprise_sampling.py +653 -0
  117. truthound_dashboard/schemas/lineage.py +0 -33
  118. truthound_dashboard/schemas/mask.py +10 -8
  119. truthound_dashboard/schemas/model_monitoring.py +89 -10
  120. truthound_dashboard/schemas/notifications_advanced.py +13 -0
  121. truthound_dashboard/schemas/observability.py +453 -0
  122. truthound_dashboard/schemas/plugins.py +0 -280
  123. truthound_dashboard/schemas/profile.py +154 -247
  124. truthound_dashboard/schemas/quality_reporter.py +403 -0
  125. truthound_dashboard/schemas/reports.py +2 -2
  126. truthound_dashboard/schemas/rule_suggestion.py +8 -1
  127. truthound_dashboard/schemas/scan.py +4 -24
  128. truthound_dashboard/schemas/schedule.py +11 -3
  129. truthound_dashboard/schemas/schema_watcher.py +727 -0
  130. truthound_dashboard/schemas/source.py +17 -2
  131. truthound_dashboard/schemas/tiering.py +822 -0
  132. truthound_dashboard/schemas/triggers.py +16 -0
  133. truthound_dashboard/schemas/unified_alerts.py +7 -0
  134. truthound_dashboard/schemas/validation.py +0 -13
  135. truthound_dashboard/schemas/validators/base.py +41 -21
  136. truthound_dashboard/schemas/validators/business_rule_validators.py +244 -0
  137. truthound_dashboard/schemas/validators/localization_validators.py +273 -0
  138. truthound_dashboard/schemas/validators/ml_feature_validators.py +308 -0
  139. truthound_dashboard/schemas/validators/profiling_validators.py +275 -0
  140. truthound_dashboard/schemas/validators/referential_validators.py +312 -0
  141. truthound_dashboard/schemas/validators/registry.py +93 -8
  142. truthound_dashboard/schemas/validators/timeseries_validators.py +389 -0
  143. truthound_dashboard/schemas/versioning.py +1 -6
  144. truthound_dashboard/static/index.html +2 -2
  145. truthound_dashboard-1.5.0.dist-info/METADATA +309 -0
  146. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/RECORD +149 -148
  147. truthound_dashboard/core/plugins/hooks/__init__.py +0 -63
  148. truthound_dashboard/core/plugins/hooks/decorators.py +0 -367
  149. truthound_dashboard/core/plugins/hooks/manager.py +0 -403
  150. truthound_dashboard/core/plugins/hooks/protocols.py +0 -265
  151. truthound_dashboard/core/plugins/lifecycle/hot_reload.py +0 -584
  152. truthound_dashboard/core/reporters/junit_reporter.py +0 -233
  153. truthound_dashboard/core/reporters/markdown_reporter.py +0 -207
  154. truthound_dashboard/core/reporters/pdf_reporter.py +0 -209
  155. truthound_dashboard/static/assets/_baseUniq-BcrSP13d.js +0 -1
  156. truthound_dashboard/static/assets/arc-DlYjKwIL.js +0 -1
  157. truthound_dashboard/static/assets/architectureDiagram-VXUJARFQ-Bb2drbQM.js +0 -36
  158. truthound_dashboard/static/assets/blockDiagram-VD42YOAC-BlsPG1CH.js +0 -122
  159. truthound_dashboard/static/assets/c4Diagram-YG6GDRKO-B9JdUoaC.js +0 -10
  160. truthound_dashboard/static/assets/channel-Q6mHF1Hd.js +0 -1
  161. truthound_dashboard/static/assets/chunk-4BX2VUAB-DmyoPVuJ.js +0 -1
  162. truthound_dashboard/static/assets/chunk-55IACEB6-Bcz6Siv8.js +0 -1
  163. truthound_dashboard/static/assets/chunk-B4BG7PRW-Br3G5Rum.js +0 -165
  164. truthound_dashboard/static/assets/chunk-DI55MBZ5-DuM9c23u.js +0 -220
  165. truthound_dashboard/static/assets/chunk-FMBD7UC4-DNU-5mvT.js +0 -15
  166. truthound_dashboard/static/assets/chunk-QN33PNHL-Im2yNcmS.js +0 -1
  167. truthound_dashboard/static/assets/chunk-QZHKN3VN-kZr8XFm1.js +0 -1
  168. truthound_dashboard/static/assets/chunk-TZMSLE5B-Q__360q_.js +0 -1
  169. truthound_dashboard/static/assets/classDiagram-2ON5EDUG-vtixxUyK.js +0 -1
  170. truthound_dashboard/static/assets/classDiagram-v2-WZHVMYZB-vtixxUyK.js +0 -1
  171. truthound_dashboard/static/assets/clone-BOt2LwD0.js +0 -1
  172. truthound_dashboard/static/assets/cose-bilkent-S5V4N54A-CBDw6iac.js +0 -1
  173. truthound_dashboard/static/assets/dagre-6UL2VRFP-XdKqmmY9.js +0 -4
  174. truthound_dashboard/static/assets/diagram-PSM6KHXK-DAZ8nx9V.js +0 -24
  175. truthound_dashboard/static/assets/diagram-QEK2KX5R-BRvDTbGD.js +0 -43
  176. truthound_dashboard/static/assets/diagram-S2PKOQOG-bQcczUkl.js +0 -24
  177. truthound_dashboard/static/assets/erDiagram-Q2GNP2WA-DPje7VMN.js +0 -60
  178. truthound_dashboard/static/assets/flowDiagram-NV44I4VS-B7BVtFVS.js +0 -162
  179. truthound_dashboard/static/assets/ganttDiagram-JELNMOA3-D6WKSS7U.js +0 -267
  180. truthound_dashboard/static/assets/gitGraphDiagram-NY62KEGX-D3vtVd3y.js +0 -65
  181. truthound_dashboard/static/assets/graph-BKgNKZVp.js +0 -1
  182. truthound_dashboard/static/assets/index-C6JSrkHo.css +0 -1
  183. truthound_dashboard/static/assets/index-DkU82VsU.js +0 -1800
  184. truthound_dashboard/static/assets/infoDiagram-WHAUD3N6-DnNCT429.js +0 -2
  185. truthound_dashboard/static/assets/journeyDiagram-XKPGCS4Q-DGiMozqS.js +0 -139
  186. truthound_dashboard/static/assets/kanban-definition-3W4ZIXB7-BV2gUgli.js +0 -89
  187. truthound_dashboard/static/assets/katex-Cu_Erd72.js +0 -261
  188. truthound_dashboard/static/assets/layout-DI2MfQ5G.js +0 -1
  189. truthound_dashboard/static/assets/min-DYdgXVcT.js +0 -1
  190. truthound_dashboard/static/assets/mindmap-definition-VGOIOE7T-C7x4ruxz.js +0 -68
  191. truthound_dashboard/static/assets/pieDiagram-ADFJNKIX-CAJaAB9f.js +0 -30
  192. truthound_dashboard/static/assets/quadrantDiagram-AYHSOK5B-DeqwDI46.js +0 -7
  193. truthound_dashboard/static/assets/requirementDiagram-UZGBJVZJ-e3XDpZIM.js +0 -64
  194. truthound_dashboard/static/assets/sankeyDiagram-TZEHDZUN-CNnAv5Ux.js +0 -10
  195. truthound_dashboard/static/assets/sequenceDiagram-WL72ISMW-Dsne-Of3.js +0 -145
  196. truthound_dashboard/static/assets/stateDiagram-FKZM4ZOC-Ee0sQXyb.js +0 -1
  197. truthound_dashboard/static/assets/stateDiagram-v2-4FDKWEC3-B26KqW_W.js +0 -1
  198. truthound_dashboard/static/assets/timeline-definition-IT6M3QCI-DZYi2yl3.js +0 -61
  199. truthound_dashboard/static/assets/treemap-KMMF4GRG-CY3f8In2.js +0 -128
  200. truthound_dashboard/static/assets/unmerged_dictionaries-Dd7xcPWG.js +0 -1
  201. truthound_dashboard/static/assets/xychartDiagram-PRI3JC2R-CS7fydZZ.js +0 -7
  202. truthound_dashboard-1.4.3.dist-info/METADATA +0 -505
  203. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/WHEEL +0 -0
  204. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/entry_points.txt +0 -0
  205. {truthound_dashboard-1.4.3.dist-info → truthound_dashboard-1.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,143 +1,109 @@
1
- """Notification deduplication system.
1
+ """Notification deduplication using truthound.checkpoint.deduplication.
2
2
 
3
- This module provides a flexible deduplication system to prevent
4
- sending duplicate notifications within configurable time windows.
3
+ This module provides deduplication functionality to prevent sending
4
+ duplicate notifications, using truthound's deduplication infrastructure.
5
5
 
6
- Features:
7
- - 4 window strategies (sliding, tumbling, session, adaptive)
8
- - 6 deduplication policies (none, basic, severity, issue_based, strict, custom)
9
- - Pluggable storage backends (in-memory, SQLite, Redis, Redis Streams)
10
- - Fingerprint-based duplicate detection
11
- - Factory function for easy store creation
6
+ Key Components from truthound.checkpoint.deduplication:
7
+ - NotificationDeduplicator: Main deduplication service
8
+ - DeduplicationConfig: Configuration for deduplication
9
+ - DeduplicationPolicy: Policy types (NONE, BASIC, SEVERITY, ISSUE_BASED, STRICT, CUSTOM)
10
+ - TimeWindow: Time window configuration
11
+ - WindowUnit: Time unit enumeration
12
+
13
+ Window Strategies from truthound:
14
+ - SlidingWindowStrategy: Fixed time window
15
+ - TumblingWindowStrategy: Non-overlapping fixed buckets
16
+ - SessionWindowStrategy: Event-based sessions
17
+
18
+ Storage Backends from truthound:
19
+ - InMemoryDeduplicationStore: Single-process storage
20
+ - RedisStreamsDeduplicationStore: Distributed storage
12
21
 
13
22
  Example:
14
- from truthound_dashboard.core.notifications.deduplication import (
23
+ from truthound.checkpoint.deduplication import (
15
24
  NotificationDeduplicator,
25
+ DeduplicationConfig,
16
26
  InMemoryDeduplicationStore,
17
- DeduplicationPolicy,
18
27
  TimeWindow,
28
+ DeduplicationPolicy,
19
29
  )
20
30
 
21
- # Create deduplicator
22
- deduplicator = NotificationDeduplicator(
23
- store=InMemoryDeduplicationStore(),
24
- default_window=TimeWindow(seconds=300),
31
+ # Configure deduplication
32
+ config = DeduplicationConfig(
25
33
  policy=DeduplicationPolicy.SEVERITY,
34
+ default_window=TimeWindow(minutes=5),
35
+ action_windows={
36
+ "pagerduty": TimeWindow(hours=1),
37
+ "slack": TimeWindow(minutes=5),
38
+ },
26
39
  )
27
40
 
28
- # Generate fingerprint and check
29
- fingerprint = deduplicator.generate_fingerprint(
30
- checkpoint_name="daily_check",
31
- action_type="slack",
32
- severity="high",
33
- )
34
-
35
- if not deduplicator.is_duplicate(fingerprint):
36
- await send_notification()
37
- deduplicator.mark_sent(fingerprint)
38
-
39
- Redis Store Example:
40
- from truthound_dashboard.core.notifications.deduplication import (
41
- RedisDeduplicationStore,
42
- REDIS_AVAILABLE,
43
- )
44
-
45
- if REDIS_AVAILABLE:
46
- store = RedisDeduplicationStore(
47
- redis_url="redis://localhost:6379/0",
48
- key_prefix="myapp:dedup:",
49
- default_ttl=3600,
50
- )
51
- # Use store with NotificationDeduplicator
52
-
53
- Redis Streams Store Example (Production):
54
- from truthound_dashboard.core.notifications.deduplication import (
55
- RedisStreamsDeduplicationStore,
56
- create_deduplication_store,
57
- DeduplicationStoreType,
58
- REDIS_AVAILABLE,
59
- )
60
-
61
- # Using factory function (recommended)
62
- store = create_deduplication_store("redis_streams")
63
-
64
- # Or direct instantiation with full configuration
65
- if REDIS_AVAILABLE:
66
- store = RedisStreamsDeduplicationStore(
67
- redis_url="redis://myredis:6379/1",
68
- default_ttl=7200,
69
- max_connections=20,
70
- enable_fallback=True, # Falls back to InMemory on Redis failure
71
- )
72
-
73
- # Health check
74
- health = await store.health_check_async()
75
- print(f"Healthy: {health['healthy']}, Mode: {health.get('mode')}")
76
-
77
- # Get metrics
78
- metrics = store.get_metrics()
79
- print(f"Hit rate: {metrics['hit_rate']}%")
80
-
81
- Factory Function Example:
82
- from truthound_dashboard.core.notifications.deduplication import (
83
- create_deduplication_store,
41
+ # Create deduplicator
42
+ deduplicator = NotificationDeduplicator(
43
+ store=InMemoryDeduplicationStore(),
44
+ config=config,
84
45
  )
85
46
 
86
- # Auto-detect from environment variables
87
- store = create_deduplication_store()
88
-
89
- # Explicit type with configuration
90
- store = create_deduplication_store(
91
- "redis_streams",
92
- default_ttl=3600,
93
- enable_fallback=True,
94
- )
47
+ # Check for duplicates
48
+ result = deduplicator.check(checkpoint_result, "slack", severity="high")
49
+ if result.should_send:
50
+ await action.execute(checkpoint_result)
51
+ deduplicator.mark_sent(result.fingerprint)
95
52
  """
96
53
 
97
- from .policies import DeduplicationPolicy, FingerprintGenerator
98
- from .service import NotificationDeduplicator, TimeWindow
99
- from .stores import (
100
- REDIS_AVAILABLE,
101
- BaseDeduplicationStore,
102
- DeduplicationMetrics,
103
- DeduplicationStoreType,
54
+ # Re-export from truthound.checkpoint.deduplication
55
+ from truthound.checkpoint.deduplication import (
56
+ NotificationDeduplicator,
57
+ DeduplicationConfig,
104
58
  InMemoryDeduplicationStore,
105
- RedisDeduplicationStore,
106
- RedisStreamsDeduplicationStore,
107
- SQLiteDeduplicationStore,
108
- create_deduplication_store,
59
+ TimeWindow,
60
+ WindowUnit,
61
+ DeduplicationPolicy,
62
+ NotificationFingerprint,
63
+ DeduplicationMiddleware,
64
+ deduplicated,
109
65
  )
110
- from .strategies import (
111
- AdaptiveWindowStrategy,
112
- BaseWindowStrategy,
113
- SessionWindowStrategy,
66
+
67
+ # Window strategies
68
+ from truthound.checkpoint.deduplication import (
114
69
  SlidingWindowStrategy,
115
- StrategyRegistry,
116
70
  TumblingWindowStrategy,
71
+ SessionWindowStrategy,
72
+ )
73
+
74
+ # Redis store (optional)
75
+ try:
76
+ from truthound.checkpoint.deduplication import RedisStreamsDeduplicationStore
77
+ REDIS_AVAILABLE = True
78
+ except ImportError:
79
+ RedisStreamsDeduplicationStore = None # type: ignore
80
+ REDIS_AVAILABLE = False
81
+
82
+ # Dashboard-specific adapters
83
+ from .service import (
84
+ DashboardDeduplicationService,
85
+ create_deduplication_config_from_db,
117
86
  )
118
87
 
119
88
  __all__ = [
120
- # Stores
121
- "BaseDeduplicationStore",
89
+ # truthound core
90
+ "NotificationDeduplicator",
91
+ "DeduplicationConfig",
122
92
  "InMemoryDeduplicationStore",
123
- "SQLiteDeduplicationStore",
124
- "RedisDeduplicationStore",
125
- "RedisStreamsDeduplicationStore",
126
- "DeduplicationMetrics",
127
- "DeduplicationStoreType",
128
- "create_deduplication_store",
129
- "REDIS_AVAILABLE",
130
- # Strategies
131
- "BaseWindowStrategy",
93
+ "TimeWindow",
94
+ "WindowUnit",
95
+ "DeduplicationPolicy",
96
+ "NotificationFingerprint",
97
+ "DeduplicationMiddleware",
98
+ "deduplicated",
99
+ # Window strategies
132
100
  "SlidingWindowStrategy",
133
101
  "TumblingWindowStrategy",
134
102
  "SessionWindowStrategy",
135
- "AdaptiveWindowStrategy",
136
- "StrategyRegistry",
137
- # Policies
138
- "DeduplicationPolicy",
139
- "FingerprintGenerator",
140
- # Service
141
- "NotificationDeduplicator",
142
- "TimeWindow",
103
+ # Redis (optional)
104
+ "RedisStreamsDeduplicationStore",
105
+ "REDIS_AVAILABLE",
106
+ # Dashboard adapters
107
+ "DashboardDeduplicationService",
108
+ "create_deduplication_config_from_db",
143
109
  ]