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
@@ -78,12 +78,9 @@ class ValidatorParamType(str, Enum):
78
78
  class ReporterOutputFormat(str, Enum):
79
79
  """Output format for custom reporters."""
80
80
 
81
- PDF = "pdf"
82
81
  HTML = "html"
83
82
  JSON = "json"
84
83
  CSV = "csv"
85
- EXCEL = "excel"
86
- MARKDOWN = "markdown"
87
84
  CUSTOM = "custom"
88
85
 
89
86
 
@@ -865,54 +862,6 @@ class PluginTransitionResponse(BaseSchema):
865
862
  error: str | None = None
866
863
 
867
864
 
868
- # =============================================================================
869
- # Plugin Hot Reload
870
- # =============================================================================
871
-
872
-
873
- class ReloadStrategy(str, Enum):
874
- """Strategy for handling hot reloads."""
875
-
876
- IMMEDIATE = "immediate"
877
- DEBOUNCED = "debounced"
878
- MANUAL = "manual"
879
- SCHEDULED = "scheduled"
880
-
881
-
882
- class HotReloadConfigRequest(BaseSchema):
883
- """Request to configure hot reload for a plugin."""
884
-
885
- strategy: ReloadStrategy = Field(default=ReloadStrategy.DEBOUNCED)
886
- debounce_delay_ms: int = Field(default=500, ge=0, le=5000)
887
- watch_paths: list[str] = Field(default_factory=list)
888
- enabled: bool = True
889
-
890
-
891
- class HotReloadStatus(BaseSchema):
892
- """Hot reload status for a plugin."""
893
-
894
- plugin_id: str
895
- enabled: bool = False
896
- watching: bool = False
897
- strategy: ReloadStrategy = ReloadStrategy.MANUAL
898
- has_pending_reload: bool = False
899
- last_reload_at: datetime | None = None
900
- last_reload_duration_ms: float | None = None
901
-
902
-
903
- class HotReloadResult(BaseSchema):
904
- """Result of a hot reload operation."""
905
-
906
- success: bool
907
- plugin_id: str
908
- old_version: str = ""
909
- new_version: str = ""
910
- duration_ms: float = 0
911
- error: str | None = None
912
- rolled_back: bool = False
913
- changes: list[str] = Field(default_factory=list)
914
-
915
-
916
865
  # =============================================================================
917
866
  # Plugin Dependencies
918
867
  # =============================================================================
@@ -979,235 +928,6 @@ class DependencyResolutionResponse(BaseSchema):
979
928
  error: str | None = None
980
929
 
981
930
 
982
- # =============================================================================
983
- # Plugin Security - Extended
984
- # =============================================================================
985
-
986
-
987
- class IsolationLevel(str, Enum):
988
- """Sandbox isolation levels."""
989
-
990
- NONE = "none"
991
- PROCESS = "process"
992
- CONTAINER = "container"
993
-
994
-
995
- class SignatureAlgorithm(str, Enum):
996
- """Supported signature algorithms."""
997
-
998
- SHA256 = "sha256"
999
- SHA512 = "sha512"
1000
- HMAC_SHA256 = "hmac_sha256"
1001
- HMAC_SHA512 = "hmac_sha512"
1002
- RSA_SHA256 = "rsa_sha256"
1003
- ED25519 = "ed25519"
1004
-
1005
-
1006
- class TrustedSigner(BaseSchema):
1007
- """A trusted signer in the trust store."""
1008
-
1009
- signer_id: str
1010
- name: str
1011
- public_key: str
1012
- algorithm: SignatureAlgorithm
1013
- added_at: datetime
1014
- expires_at: datetime | None = None
1015
- is_active: bool = True
1016
- trust_level: SecurityLevel = SecurityLevel.VERIFIED
1017
-
1018
-
1019
- class TrustStoreResponse(BaseSchema):
1020
- """Response containing trust store information."""
1021
-
1022
- signers: list[TrustedSigner] = Field(default_factory=list)
1023
- total_signers: int = 0
1024
- last_updated: datetime | None = None
1025
-
1026
-
1027
- class AddSignerRequest(BaseSchema):
1028
- """Request to add a signer to the trust store."""
1029
-
1030
- signer_id: str
1031
- name: str
1032
- public_key: str
1033
- algorithm: SignatureAlgorithm = SignatureAlgorithm.ED25519
1034
- expires_at: datetime | None = None
1035
- trust_level: SecurityLevel = SecurityLevel.VERIFIED
1036
-
1037
-
1038
- class SecurityPolicyPreset(str, Enum):
1039
- """Pre-defined security policy presets."""
1040
-
1041
- DEVELOPMENT = "development"
1042
- TESTING = "testing"
1043
- STANDARD = "standard"
1044
- ENTERPRISE = "enterprise"
1045
- STRICT = "strict"
1046
- AIRGAPPED = "airgapped"
1047
-
1048
-
1049
- class SecurityPolicyConfig(BaseSchema):
1050
- """Full security policy configuration."""
1051
-
1052
- preset: SecurityPolicyPreset = SecurityPolicyPreset.STANDARD
1053
- isolation_level: IsolationLevel = IsolationLevel.PROCESS
1054
- require_signature: bool = True
1055
- min_signatures: int = Field(default=1, ge=0, le=10)
1056
- allowed_signers: list[str] = Field(default_factory=list)
1057
- blocked_modules: list[str] = Field(default_factory=list)
1058
- memory_limit_mb: int = Field(default=256, ge=64, le=4096)
1059
- cpu_time_limit_sec: int = Field(default=30, ge=1, le=600)
1060
- network_enabled: bool = False
1061
- filesystem_read: bool = False
1062
- filesystem_write: bool = False
1063
-
1064
-
1065
- class SecurityAnalysisRequest(BaseSchema):
1066
- """Request to analyze plugin security."""
1067
-
1068
- plugin_id: str
1069
- code: str | None = None
1070
- deep_analysis: bool = Field(default=False, description="Perform deep AST analysis")
1071
-
1072
-
1073
- class CodeAnalysisResult(BaseSchema):
1074
- """Result of code security analysis."""
1075
-
1076
- is_safe: bool
1077
- issues: list[str] = Field(default_factory=list)
1078
- warnings: list[str] = Field(default_factory=list)
1079
- blocked_constructs: list[str] = Field(default_factory=list)
1080
- detected_imports: list[str] = Field(default_factory=list)
1081
- detected_permissions: list[str] = Field(default_factory=list)
1082
- complexity_score: int = Field(default=0, ge=0, le=100)
1083
-
1084
-
1085
- class ExtendedSecurityReport(SecurityReport):
1086
- """Extended security report with detailed analysis."""
1087
-
1088
- code_analysis: CodeAnalysisResult | None = None
1089
- signature_count: int = 0
1090
- trust_level: SecurityLevel = SecurityLevel.UNVERIFIED
1091
- can_run_in_sandbox: bool = True
1092
- code_hash: str = ""
1093
- recommendations: list[str] = Field(default_factory=list)
1094
-
1095
-
1096
- class VerifySignatureRequest(BaseSchema):
1097
- """Request to verify plugin signature."""
1098
-
1099
- plugin_id: str
1100
- signature: str
1101
- content_hash: str
1102
- algorithm: SignatureAlgorithm = SignatureAlgorithm.ED25519
1103
-
1104
-
1105
- class VerifySignatureResponse(BaseSchema):
1106
- """Response from signature verification."""
1107
-
1108
- is_valid: bool
1109
- signer_id: str | None = None
1110
- signer_name: str | None = None
1111
- signed_at: datetime | None = None
1112
- error: str | None = None
1113
-
1114
-
1115
- # =============================================================================
1116
- # Plugin Hooks
1117
- # =============================================================================
1118
-
1119
-
1120
- class HookType(str, Enum):
1121
- """Types of hooks in the plugin system."""
1122
-
1123
- BEFORE_VALIDATION = "before_validation"
1124
- AFTER_VALIDATION = "after_validation"
1125
- ON_ISSUE_FOUND = "on_issue_found"
1126
- BEFORE_PROFILE = "before_profile"
1127
- AFTER_PROFILE = "after_profile"
1128
- BEFORE_COMPARE = "before_compare"
1129
- AFTER_COMPARE = "after_compare"
1130
- ON_PLUGIN_LOAD = "on_plugin_load"
1131
- ON_PLUGIN_UNLOAD = "on_plugin_unload"
1132
- ON_PLUGIN_ERROR = "on_plugin_error"
1133
- BEFORE_NOTIFICATION = "before_notification"
1134
- AFTER_NOTIFICATION = "after_notification"
1135
- ON_SCHEDULE_RUN = "on_schedule_run"
1136
- ON_DATA_SOURCE_CONNECT = "on_data_source_connect"
1137
- ON_SCHEMA_CHANGE = "on_schema_change"
1138
- CUSTOM = "custom"
1139
-
1140
-
1141
- class HookPriority(str, Enum):
1142
- """Priority levels for hook execution."""
1143
-
1144
- HIGHEST = "highest"
1145
- HIGH = "high"
1146
- NORMAL = "normal"
1147
- LOW = "low"
1148
- LOWEST = "lowest"
1149
-
1150
-
1151
- class HookRegistration(BaseSchema):
1152
- """A registered hook."""
1153
-
1154
- id: str
1155
- hook_type: HookType
1156
- plugin_id: str
1157
- function_name: str
1158
- priority: HookPriority = HookPriority.NORMAL
1159
- is_async: bool = False
1160
- is_enabled: bool = True
1161
- description: str | None = None
1162
-
1163
-
1164
- class HookListResponse(BaseSchema):
1165
- """Response listing registered hooks."""
1166
-
1167
- hooks: list[HookRegistration] = Field(default_factory=list)
1168
- total: int = 0
1169
- by_type: dict[str, int] = Field(default_factory=dict)
1170
-
1171
-
1172
- class RegisterHookRequest(BaseSchema):
1173
- """Request to register a new hook."""
1174
-
1175
- hook_type: HookType
1176
- plugin_id: str
1177
- function_name: str
1178
- priority: HookPriority = HookPriority.NORMAL
1179
- description: str | None = None
1180
-
1181
-
1182
- class UnregisterHookRequest(BaseSchema):
1183
- """Request to unregister a hook."""
1184
-
1185
- hook_id: str
1186
-
1187
-
1188
- class HookExecutionResult(BaseSchema):
1189
- """Result of hook execution."""
1190
-
1191
- hook_id: str
1192
- plugin_id: str
1193
- success: bool
1194
- result: Any = None
1195
- error: str | None = None
1196
- execution_time_ms: float = 0
1197
- modified_data: bool = False
1198
-
1199
-
1200
- class HookExecutionSummary(BaseSchema):
1201
- """Summary of all hook executions for an event."""
1202
-
1203
- hook_type: HookType
1204
- total_hooks: int
1205
- successful: int
1206
- failed: int
1207
- total_time_ms: float
1208
- results: list[HookExecutionResult] = Field(default_factory=list)
1209
-
1210
-
1211
931
  # =============================================================================
1212
932
  # Plugin Documentation
1213
933
  # =============================================================================