truthound-dashboard 1.4.4__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.4.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.4.dist-info/METADATA +0 -507
  203. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/WHEEL +0 -0
  204. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/entry_points.txt +0 -0
  205. {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,22 +1,35 @@
1
1
  """Maintenance API endpoints.
2
2
 
3
3
  This module provides endpoints for database maintenance, retention policies,
4
- and cache management.
4
+ and cache management using truthound's store features.
5
+
6
+ Migrated features (using truthound):
7
+ - Retention policies (truthound.stores.retention)
8
+ - Caching (truthound.stores.caching)
9
+
10
+ Dashboard-specific features (not in truthound):
11
+ - SQLite VACUUM (SQLite-specific optimization)
5
12
  """
6
13
 
7
14
  from __future__ import annotations
8
15
 
9
16
  import logging
10
17
  from datetime import datetime
11
- from typing import Annotated, Any
18
+ from typing import Any
12
19
 
13
- from fastapi import APIRouter, HTTPException, Query
20
+ from fastapi import APIRouter, HTTPException
14
21
 
15
- from truthound_dashboard.core.cache import get_cache, get_cache_manager
16
22
  from truthound_dashboard.core.maintenance import (
17
23
  MaintenanceConfig,
18
24
  get_maintenance_manager,
19
25
  )
26
+ from truthound_dashboard.core.store_manager import (
27
+ CacheType,
28
+ DashboardStoreConfig,
29
+ DashboardStoreManager,
30
+ RetentionPolicySettings,
31
+ get_store_manager,
32
+ )
20
33
  from truthound_dashboard.core.scheduler import get_scheduler
21
34
  from truthound_dashboard.schemas import (
22
35
  CacheClearRequest,
@@ -145,13 +158,16 @@ async def get_maintenance_status() -> MaintenanceStatusResponse:
145
158
  "/cleanup",
146
159
  response_model=MaintenanceReportResponse,
147
160
  summary="Trigger cleanup",
148
- description="Manually trigger database cleanup",
161
+ description="Manually trigger database cleanup using truthound retention policies",
149
162
  )
150
163
  async def trigger_cleanup(
151
164
  request: CleanupTriggerRequest,
152
165
  ) -> MaintenanceReportResponse:
153
166
  """Manually trigger database cleanup.
154
167
 
168
+ This endpoint now uses truthound's retention system for cleanup
169
+ while maintaining backward compatibility with the existing API.
170
+
155
171
  Args:
156
172
  request: Cleanup options.
157
173
 
@@ -163,7 +179,7 @@ async def trigger_cleanup(
163
179
  manager = get_maintenance_manager()
164
180
 
165
181
  if request.tasks:
166
- # Run specific tasks
182
+ # Run specific tasks (legacy behavior)
167
183
  started_at = datetime.utcnow()
168
184
  results = []
169
185
 
@@ -190,7 +206,7 @@ async def trigger_cleanup(
190
206
  )
191
207
  )
192
208
 
193
- # Run vacuum if requested
209
+ # Run vacuum if requested (SQLite-specific, not in truthound)
194
210
  vacuum_performed = False
195
211
  vacuum_error = None
196
212
  if request.run_vacuum:
@@ -254,11 +270,14 @@ async def trigger_cleanup(
254
270
  "/vacuum",
255
271
  response_model=MaintenanceReportResponse,
256
272
  summary="Run database vacuum",
257
- description="Run SQLite VACUUM to reclaim disk space",
273
+ description="Run SQLite VACUUM to reclaim disk space (SQLite-specific, not part of truthound)",
258
274
  )
259
275
  async def run_vacuum() -> MaintenanceReportResponse:
260
276
  """Run SQLite VACUUM to reclaim disk space.
261
277
 
278
+ Note: This is a dashboard-specific operation for SQLite.
279
+ truthound's store system is backend-agnostic and doesn't include VACUUM.
280
+
262
281
  Returns:
263
282
  Vacuum operation result.
264
283
  """
@@ -293,31 +312,50 @@ async def run_vacuum() -> MaintenanceReportResponse:
293
312
  "/cache/stats",
294
313
  response_model=CacheStatsResponse,
295
314
  summary="Get cache statistics",
296
- description="Get current cache usage statistics",
315
+ description="Get current cache usage statistics from truthound's caching system",
297
316
  )
298
317
  async def get_cache_stats() -> CacheStatsResponse:
299
- """Get cache statistics.
318
+ """Get cache statistics using truthound's cache metrics.
300
319
 
301
320
  Returns:
302
321
  Cache usage statistics.
303
322
  """
304
- cache = get_cache()
305
- stats = await cache.get_stats()
306
-
307
- return CacheStatsResponse(
308
- total_entries=stats.get("total_entries", 0),
309
- expired_entries=stats.get("expired_entries", 0),
310
- valid_entries=stats.get("valid_entries", 0),
311
- max_size=stats.get("max_size", 0),
312
- hit_rate=None, # Not tracked by default
313
- )
323
+ try:
324
+ store_manager = get_store_manager()
325
+ if not store_manager._initialized:
326
+ store_manager.initialize()
327
+
328
+ stats = store_manager.get_cache_stats()
329
+
330
+ return CacheStatsResponse(
331
+ total_entries=stats.get("total_entries", 0),
332
+ expired_entries=stats.get("expired_entries", 0),
333
+ valid_entries=stats.get("valid_entries", 0),
334
+ max_size=stats.get("max_size", 0),
335
+ hit_rate=stats.get("hit_rate"),
336
+ )
337
+ except Exception as e:
338
+ logger.warning(f"Failed to get cache stats from store manager: {e}")
339
+ # Fallback to legacy cache
340
+ from truthound_dashboard.core.cache import get_cache
341
+
342
+ cache = get_cache()
343
+ stats = await cache.get_stats()
344
+
345
+ return CacheStatsResponse(
346
+ total_entries=stats.get("total_entries", 0),
347
+ expired_entries=stats.get("expired_entries", 0),
348
+ valid_entries=stats.get("valid_entries", 0),
349
+ max_size=stats.get("max_size", 0),
350
+ hit_rate=stats.get("hit_rate"),
351
+ )
314
352
 
315
353
 
316
354
  @router.post(
317
355
  "/cache/clear",
318
356
  response_model=CacheStatsResponse,
319
357
  summary="Clear cache",
320
- description="Clear cached data",
358
+ description="Clear cached data using truthound's caching system",
321
359
  )
322
360
  async def clear_cache(request: CacheClearRequest) -> CacheStatsResponse:
323
361
  """Clear cache data.
@@ -328,36 +366,53 @@ async def clear_cache(request: CacheClearRequest) -> CacheStatsResponse:
328
366
  Returns:
329
367
  Updated cache statistics.
330
368
  """
331
- if request.namespace:
332
- # Clear specific namespace
333
- manager = get_cache_manager()
334
- cache = manager.get(request.namespace)
335
- if cache:
369
+ try:
370
+ store_manager = get_store_manager()
371
+ if not store_manager._initialized:
372
+ store_manager.initialize()
373
+
374
+ store_manager.clear_cache(pattern=request.pattern)
375
+ stats = store_manager.get_cache_stats()
376
+
377
+ return CacheStatsResponse(
378
+ total_entries=stats.get("total_entries", 0),
379
+ expired_entries=stats.get("expired_entries", 0),
380
+ valid_entries=stats.get("valid_entries", 0),
381
+ max_size=stats.get("max_size", 0),
382
+ hit_rate=stats.get("hit_rate"),
383
+ )
384
+ except Exception as e:
385
+ logger.warning(f"Failed to clear cache from store manager: {e}")
386
+ # Fallback to legacy cache
387
+ from truthound_dashboard.core.cache import get_cache, get_cache_manager
388
+
389
+ if request.namespace:
390
+ manager = get_cache_manager()
391
+ cache = manager.get(request.namespace)
392
+ if cache:
393
+ if request.pattern:
394
+ await cache.invalidate_pattern(request.pattern)
395
+ else:
396
+ await cache.clear()
397
+ else:
398
+ raise HTTPException(
399
+ status_code=404,
400
+ detail=f"Cache namespace not found: {request.namespace}",
401
+ )
402
+ else:
403
+ cache = get_cache()
336
404
  if request.pattern:
337
405
  await cache.invalidate_pattern(request.pattern)
338
406
  else:
339
407
  await cache.clear()
340
- else:
341
- raise HTTPException(
342
- status_code=404,
343
- detail=f"Cache namespace not found: {request.namespace}",
344
- )
345
- else:
346
- # Clear default cache
408
+
347
409
  cache = get_cache()
348
- if request.pattern:
349
- await cache.invalidate_pattern(request.pattern)
350
- else:
351
- await cache.clear()
352
-
353
- # Return updated stats
354
- cache = get_cache()
355
- stats = await cache.get_stats()
356
-
357
- return CacheStatsResponse(
358
- total_entries=stats.get("total_entries", 0),
359
- expired_entries=stats.get("expired_entries", 0),
360
- valid_entries=stats.get("valid_entries", 0),
361
- max_size=stats.get("max_size", 0),
362
- hit_rate=None,
363
- )
410
+ stats = await cache.get_stats()
411
+
412
+ return CacheStatsResponse(
413
+ total_entries=stats.get("total_entries", 0),
414
+ expired_entries=stats.get("expired_entries", 0),
415
+ valid_entries=stats.get("valid_entries", 0),
416
+ max_size=stats.get("max_size", 0),
417
+ hit_rate=None,
418
+ )
@@ -61,7 +61,6 @@ async def run_mask(
61
61
  source_id,
62
62
  columns=request.columns,
63
63
  strategy=request.strategy,
64
- output_format=request.output_format,
65
64
  )
66
65
  return MaskResponse.from_db(mask)
67
66
  except ValueError as e:
@@ -128,7 +127,7 @@ async def list_masks(
128
127
  """
129
128
  masks = await service.list_for_source(source_id, limit=limit)
130
129
  return MaskListResponse(
131
- data=[MaskListItem.from_db(m) for m in masks],
130
+ data=[MaskListItem.from_db(m, source_name=None) for m in masks],
132
131
  total=len(masks),
133
132
  limit=limit,
134
133
  )
@@ -955,8 +955,9 @@ def setup_middleware(app: Any) -> None:
955
955
  app.add_middleware(RequestLoggingMiddleware)
956
956
 
957
957
  # Rate limiting (general)
958
+ # 600 requests/minute = 10/second - reasonable for dashboard navigation
958
959
  rate_limit_config = RateLimitConfig(
959
- requests_per_minute=120,
960
+ requests_per_minute=600,
960
961
  exclude_paths=["/health", "/docs", "/redoc", "/openapi.json", "/api/openapi.json"],
961
962
  )
962
963
  app.add_middleware(RateLimitMiddleware, config=rate_limit_config)