binalyze-air-sdk 1.0.1__py3-none-any.whl → 1.0.3__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 (142) hide show
  1. binalyze_air/__init__.py +77 -77
  2. binalyze_air/apis/__init__.py +67 -27
  3. binalyze_air/apis/acquisitions.py +107 -0
  4. binalyze_air/apis/api_tokens.py +49 -0
  5. binalyze_air/apis/assets.py +161 -0
  6. binalyze_air/apis/audit_logs.py +26 -0
  7. binalyze_air/apis/{authentication.py → auth.py} +29 -27
  8. binalyze_air/apis/auto_asset_tags.py +79 -75
  9. binalyze_air/apis/backup.py +177 -0
  10. binalyze_air/apis/baseline.py +46 -0
  11. binalyze_air/apis/cases.py +225 -0
  12. binalyze_air/apis/cloud_forensics.py +116 -0
  13. binalyze_air/apis/event_subscription.py +96 -96
  14. binalyze_air/apis/evidence.py +249 -53
  15. binalyze_air/apis/interact.py +153 -36
  16. binalyze_air/apis/investigation_hub.py +234 -0
  17. binalyze_air/apis/license.py +104 -0
  18. binalyze_air/apis/logger.py +83 -0
  19. binalyze_air/apis/multipart_upload.py +201 -0
  20. binalyze_air/apis/notifications.py +115 -0
  21. binalyze_air/apis/organizations.py +267 -0
  22. binalyze_air/apis/params.py +44 -39
  23. binalyze_air/apis/policies.py +186 -0
  24. binalyze_air/apis/preset_filters.py +79 -0
  25. binalyze_air/apis/recent_activities.py +71 -0
  26. binalyze_air/apis/relay_server.py +104 -0
  27. binalyze_air/apis/settings.py +395 -27
  28. binalyze_air/apis/tasks.py +80 -0
  29. binalyze_air/apis/triage.py +197 -0
  30. binalyze_air/apis/user_management.py +183 -74
  31. binalyze_air/apis/webhook_executions.py +50 -0
  32. binalyze_air/apis/webhooks.py +322 -230
  33. binalyze_air/base.py +207 -133
  34. binalyze_air/client.py +217 -1337
  35. binalyze_air/commands/__init__.py +175 -145
  36. binalyze_air/commands/acquisitions.py +661 -387
  37. binalyze_air/commands/api_tokens.py +55 -0
  38. binalyze_air/commands/assets.py +324 -362
  39. binalyze_air/commands/{authentication.py → auth.py} +36 -36
  40. binalyze_air/commands/auto_asset_tags.py +230 -230
  41. binalyze_air/commands/backup.py +47 -0
  42. binalyze_air/commands/baseline.py +32 -396
  43. binalyze_air/commands/cases.py +609 -602
  44. binalyze_air/commands/cloud_forensics.py +88 -0
  45. binalyze_air/commands/event_subscription.py +101 -101
  46. binalyze_air/commands/evidences.py +918 -988
  47. binalyze_air/commands/interact.py +172 -58
  48. binalyze_air/commands/investigation_hub.py +315 -0
  49. binalyze_air/commands/license.py +183 -0
  50. binalyze_air/commands/logger.py +126 -0
  51. binalyze_air/commands/multipart_upload.py +363 -0
  52. binalyze_air/commands/notifications.py +45 -0
  53. binalyze_air/commands/organizations.py +200 -221
  54. binalyze_air/commands/policies.py +175 -203
  55. binalyze_air/commands/preset_filters.py +55 -0
  56. binalyze_air/commands/recent_activities.py +32 -0
  57. binalyze_air/commands/relay_server.py +144 -0
  58. binalyze_air/commands/settings.py +431 -29
  59. binalyze_air/commands/tasks.py +95 -56
  60. binalyze_air/commands/triage.py +224 -360
  61. binalyze_air/commands/user_management.py +351 -126
  62. binalyze_air/commands/webhook_executions.py +77 -0
  63. binalyze_air/config.py +244 -244
  64. binalyze_air/exceptions.py +49 -49
  65. binalyze_air/http_client.py +426 -305
  66. binalyze_air/models/__init__.py +287 -285
  67. binalyze_air/models/acquisitions.py +365 -250
  68. binalyze_air/models/api_tokens.py +73 -0
  69. binalyze_air/models/assets.py +438 -438
  70. binalyze_air/models/audit.py +247 -272
  71. binalyze_air/models/audit_logs.py +14 -0
  72. binalyze_air/models/{authentication.py → auth.py} +69 -69
  73. binalyze_air/models/auto_asset_tags.py +227 -116
  74. binalyze_air/models/backup.py +138 -0
  75. binalyze_air/models/baseline.py +231 -231
  76. binalyze_air/models/cases.py +275 -275
  77. binalyze_air/models/cloud_forensics.py +145 -0
  78. binalyze_air/models/event_subscription.py +170 -171
  79. binalyze_air/models/evidence.py +65 -65
  80. binalyze_air/models/evidences.py +367 -348
  81. binalyze_air/models/interact.py +266 -135
  82. binalyze_air/models/investigation_hub.py +265 -0
  83. binalyze_air/models/license.py +150 -0
  84. binalyze_air/models/logger.py +83 -0
  85. binalyze_air/models/multipart_upload.py +352 -0
  86. binalyze_air/models/notifications.py +138 -0
  87. binalyze_air/models/organizations.py +293 -293
  88. binalyze_air/models/params.py +153 -127
  89. binalyze_air/models/policies.py +260 -249
  90. binalyze_air/models/preset_filters.py +79 -0
  91. binalyze_air/models/recent_activities.py +70 -0
  92. binalyze_air/models/relay_server.py +121 -0
  93. binalyze_air/models/settings.py +538 -84
  94. binalyze_air/models/tasks.py +215 -149
  95. binalyze_air/models/triage.py +141 -142
  96. binalyze_air/models/user_management.py +200 -97
  97. binalyze_air/models/webhook_executions.py +33 -0
  98. binalyze_air/queries/__init__.py +121 -133
  99. binalyze_air/queries/acquisitions.py +155 -155
  100. binalyze_air/queries/api_tokens.py +46 -0
  101. binalyze_air/queries/assets.py +186 -105
  102. binalyze_air/queries/audit.py +400 -416
  103. binalyze_air/queries/{authentication.py → auth.py} +55 -55
  104. binalyze_air/queries/auto_asset_tags.py +59 -59
  105. binalyze_air/queries/backup.py +66 -0
  106. binalyze_air/queries/baseline.py +21 -185
  107. binalyze_air/queries/cases.py +292 -292
  108. binalyze_air/queries/cloud_forensics.py +137 -0
  109. binalyze_air/queries/event_subscription.py +54 -54
  110. binalyze_air/queries/evidence.py +139 -139
  111. binalyze_air/queries/evidences.py +279 -279
  112. binalyze_air/queries/interact.py +140 -28
  113. binalyze_air/queries/investigation_hub.py +329 -0
  114. binalyze_air/queries/license.py +85 -0
  115. binalyze_air/queries/logger.py +58 -0
  116. binalyze_air/queries/multipart_upload.py +180 -0
  117. binalyze_air/queries/notifications.py +71 -0
  118. binalyze_air/queries/organizations.py +222 -222
  119. binalyze_air/queries/params.py +154 -115
  120. binalyze_air/queries/policies.py +149 -149
  121. binalyze_air/queries/preset_filters.py +60 -0
  122. binalyze_air/queries/recent_activities.py +44 -0
  123. binalyze_air/queries/relay_server.py +42 -0
  124. binalyze_air/queries/settings.py +533 -20
  125. binalyze_air/queries/tasks.py +125 -81
  126. binalyze_air/queries/triage.py +230 -230
  127. binalyze_air/queries/user_management.py +193 -83
  128. binalyze_air/queries/webhook_executions.py +39 -0
  129. binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
  130. binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
  131. {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
  132. binalyze_air/apis/endpoints.py +0 -22
  133. binalyze_air/apis/evidences.py +0 -216
  134. binalyze_air/apis/users.py +0 -68
  135. binalyze_air/commands/users.py +0 -101
  136. binalyze_air/models/endpoints.py +0 -76
  137. binalyze_air/models/users.py +0 -82
  138. binalyze_air/queries/endpoints.py +0 -25
  139. binalyze_air/queries/users.py +0 -69
  140. binalyze_air_sdk-1.0.1.dist-info/METADATA +0 -635
  141. binalyze_air_sdk-1.0.1.dist-info/RECORD +0 -82
  142. {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
@@ -1,232 +1,232 @@
1
- """
2
- Baseline-related data models for the Binalyze AIR SDK.
3
- """
4
-
5
- from typing import List, Optional, Dict, Any
6
- from datetime import datetime
7
- from enum import Enum
8
- from pydantic import Field
9
-
10
- from ..base import AIRBaseModel, Filter
11
-
12
-
13
- class BaselineStatus(str, Enum):
14
- """Baseline status."""
15
- ACTIVE = "active"
16
- INACTIVE = "inactive"
17
- CREATING = "creating"
18
- FAILED = "failed"
19
-
20
-
21
- class BaselineType(str, Enum):
22
- """Baseline type."""
23
- SYSTEM = "system"
24
- SECURITY = "security"
25
- CUSTOM = "custom"
26
- COMPLIANCE = "compliance"
27
-
28
-
29
- class ComparisonStatus(str, Enum):
30
- """Comparison status."""
31
- PENDING = "pending"
32
- RUNNING = "running"
33
- COMPLETED = "completed"
34
- FAILED = "failed"
35
-
36
-
37
- class ChangeType(str, Enum):
38
- """Type of change detected."""
39
- ADDED = "added"
40
- REMOVED = "removed"
41
- MODIFIED = "modified"
42
- MOVED = "moved"
43
-
44
-
45
- class BaselineItem(AIRBaseModel):
46
- """Individual baseline item."""
47
-
48
- id: str
49
- path: str
50
- item_type: str # file, registry, service, process, etc.
51
- hash: Optional[str] = None
52
- size: Optional[int] = None
53
- permissions: Optional[str] = None
54
- owner: Optional[str] = None
55
- created_at: Optional[datetime] = None
56
- modified_at: Optional[datetime] = None
57
- attributes: Dict[str, Any] = {}
58
- metadata: Dict[str, Any] = {}
59
-
60
-
61
- class Baseline(AIRBaseModel):
62
- """Baseline model."""
63
-
64
- id: str = Field(alias="_id")
65
- name: str
66
- description: Optional[str] = None
67
- type: BaselineType
68
- status: BaselineStatus = BaselineStatus.CREATING
69
- endpoint_id: str = Field(alias="endpointId")
70
- endpoint_name: str = Field(alias="endpointName")
71
- organization_id: int = Field(default=0, alias="organizationId")
72
- created_at: Optional[datetime] = Field(default=None, alias="createdAt")
73
- updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
74
- created_by: str = Field(alias="createdBy")
75
- item_count: int = Field(default=0, alias="itemCount")
76
- file_count: int = Field(default=0, alias="fileCount")
77
- registry_count: int = Field(default=0, alias="registryCount")
78
- service_count: int = Field(default=0, alias="serviceCount")
79
- process_count: int = Field(default=0, alias="processCount")
80
- network_connection_count: int = Field(default=0, alias="networkConnectionCount")
81
- tags: List[str] = []
82
- profile_id: Optional[str] = Field(default=None, alias="profileId")
83
- profile_name: Optional[str] = Field(default=None, alias="profileName")
84
- last_comparison: Optional[datetime] = Field(default=None, alias="lastComparison")
85
- comparison_count: int = Field(default=0, alias="comparisonCount")
86
-
87
-
88
- class BaselineProfile(AIRBaseModel):
89
- """Baseline profile model."""
90
-
91
- id: str = Field(alias="_id")
92
- name: str
93
- description: Optional[str] = None
94
- organization_id: int = Field(default=0, alias="organizationId")
95
- include_files: bool = Field(default=True, alias="includeFiles")
96
- include_registry: bool = Field(default=True, alias="includeRegistry")
97
- include_services: bool = Field(default=True, alias="includeServices")
98
- include_processes: bool = Field(default=False, alias="includeProcesses")
99
- include_network: bool = Field(default=False, alias="includeNetwork")
100
- file_patterns: List[str] = Field(default=[], alias="filePatterns")
101
- exclude_patterns: List[str] = Field(default=[], alias="excludePatterns")
102
- registry_keys: List[str] = Field(default=[], alias="registryKeys")
103
- custom_checks: List[Dict[str, Any]] = Field(default=[], alias="customChecks")
104
- created_at: Optional[datetime] = Field(default=None, alias="createdAt")
105
- updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
106
- created_by: str = Field(alias="createdBy")
107
- is_default: bool = Field(default=False, alias="isDefault")
108
- usage_count: int = Field(default=0, alias="usageCount")
109
-
110
-
111
- class BaselineChange(AIRBaseModel):
112
- """Baseline change detection model."""
113
-
114
- id: str = Field(alias="_id")
115
- comparison_id: str = Field(alias="comparisonId")
116
- change_type: ChangeType = Field(alias="changeType")
117
- item_type: str = Field(alias="itemType")
118
- path: str
119
- old_value: Optional[Dict[str, Any]] = Field(default=None, alias="oldValue")
120
- new_value: Optional[Dict[str, Any]] = Field(default=None, alias="newValue")
121
- severity: str = "medium" # low, medium, high, critical
122
- category: str
123
- description: str
124
- detected_at: datetime = Field(alias="detectedAt")
125
- risk_score: float = Field(default=0.0, alias="riskScore")
126
-
127
-
128
- class BaselineComparison(AIRBaseModel):
129
- """Baseline comparison result model."""
130
-
131
- id: str = Field(alias="_id")
132
- baseline_id: str = Field(alias="baselineId")
133
- baseline_name: str = Field(alias="baselineName")
134
- endpoint_id: str = Field(alias="endpointId")
135
- endpoint_name: str = Field(alias="endpointName")
136
- status: ComparisonStatus
137
- started_at: Optional[datetime] = Field(default=None, alias="startedAt")
138
- completed_at: Optional[datetime] = Field(default=None, alias="completedAt")
139
- duration: Optional[int] = None # seconds
140
- total_changes: int = Field(default=0, alias="totalChanges")
141
- added_items: int = Field(default=0, alias="addedItems")
142
- removed_items: int = Field(default=0, alias="removedItems")
143
- modified_items: int = Field(default=0, alias="modifiedItems")
144
- moved_items: int = Field(default=0, alias="movedItems")
145
- high_risk_changes: int = Field(default=0, alias="highRiskChanges")
146
- medium_risk_changes: int = Field(default=0, alias="mediumRiskChanges")
147
- low_risk_changes: int = Field(default=0, alias="lowRiskChanges")
148
- changes: List[BaselineChange] = []
149
- organization_id: int = Field(default=0, alias="organizationId")
150
- triggered_by: str = Field(alias="triggeredBy")
151
- error_message: Optional[str] = Field(default=None, alias="errorMessage")
152
-
153
-
154
- class BaselineSchedule(AIRBaseModel):
155
- """Baseline comparison schedule model."""
156
-
157
- id: str = Field(alias="_id")
158
- baseline_id: str = Field(alias="baselineId")
159
- name: str
160
- enabled: bool = True
161
- frequency: str # daily, weekly, monthly
162
- time_of_day: str = Field(alias="timeOfDay") # HH:MM format
163
- day_of_week: Optional[int] = Field(default=None, alias="dayOfWeek") # 0-6, Monday=0
164
- day_of_month: Optional[int] = Field(default=None, alias="dayOfMonth") # 1-31
165
- next_run: Optional[datetime] = Field(default=None, alias="nextRun")
166
- last_run: Optional[datetime] = Field(default=None, alias="lastRun")
167
- created_at: Optional[datetime] = Field(default=None, alias="createdAt")
168
- created_by: str = Field(alias="createdBy")
169
- notification_enabled: bool = Field(default=True, alias="notificationEnabled")
170
- notification_threshold: int = Field(default=10, alias="notificationThreshold") # minimum changes to notify
171
-
172
-
173
- class BaselineFilter(Filter):
174
- """Filter for baseline queries."""
175
-
176
- name: Optional[str] = None
177
- type: Optional[List[BaselineType]] = None
178
- status: Optional[List[BaselineStatus]] = None
179
- endpoint_id: Optional[str] = None
180
- endpoint_name: Optional[str] = None
181
- created_by: Optional[str] = None
182
- tags: Optional[List[str]] = None
183
- profile_id: Optional[str] = None
184
- has_recent_comparison: Optional[bool] = None
185
-
186
-
187
- class CreateBaselineRequest(AIRBaseModel):
188
- """Request model for creating a baseline."""
189
-
190
- name: str
191
- description: Optional[str] = None
192
- type: BaselineType = BaselineType.SYSTEM
193
- endpoint_id: str
194
- profile_id: Optional[str] = None
195
- tags: List[str] = []
196
- organization_id: int = 0
197
-
198
-
199
- class UpdateBaselineRequest(AIRBaseModel):
200
- """Request model for updating a baseline."""
201
-
202
- name: Optional[str] = None
203
- description: Optional[str] = None
204
- status: Optional[BaselineStatus] = None
205
- tags: Optional[List[str]] = None
206
-
207
-
208
- class CreateBaselineProfileRequest(AIRBaseModel):
209
- """Request model for creating a baseline profile."""
210
-
211
- name: str
212
- description: Optional[str] = None
213
- include_files: bool = True
214
- include_registry: bool = True
215
- include_services: bool = True
216
- include_processes: bool = False
217
- include_network: bool = False
218
- file_patterns: List[str] = []
219
- exclude_patterns: List[str] = []
220
- registry_keys: List[str] = []
221
- custom_checks: List[Dict[str, Any]] = []
222
- organization_id: int = 0
223
-
224
-
225
- class CompareBaselineRequest(AIRBaseModel):
226
- """Request model for comparing baselines."""
227
-
228
- baseline_id: str
229
- endpoint_ids: Optional[List[str]] = None # If None, use baseline's endpoint
230
- profile_id: Optional[str] = None # Override baseline's profile
231
- include_low_risk: bool = True
1
+ """
2
+ Baseline-related data models for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from typing import List, Optional, Dict, Any
6
+ from datetime import datetime
7
+ from enum import Enum
8
+ from pydantic import Field
9
+
10
+ from ..base import AIRBaseModel, Filter
11
+
12
+
13
+ class BaselineStatus(str, Enum):
14
+ """Baseline status."""
15
+ ACTIVE = "active"
16
+ INACTIVE = "inactive"
17
+ CREATING = "creating"
18
+ FAILED = "failed"
19
+
20
+
21
+ class BaselineType(str, Enum):
22
+ """Baseline type."""
23
+ SYSTEM = "system"
24
+ SECURITY = "security"
25
+ CUSTOM = "custom"
26
+ COMPLIANCE = "compliance"
27
+
28
+
29
+ class ComparisonStatus(str, Enum):
30
+ """Comparison status."""
31
+ PENDING = "pending"
32
+ RUNNING = "running"
33
+ COMPLETED = "completed"
34
+ FAILED = "failed"
35
+
36
+
37
+ class ChangeType(str, Enum):
38
+ """Type of change detected."""
39
+ ADDED = "added"
40
+ REMOVED = "removed"
41
+ MODIFIED = "modified"
42
+ MOVED = "moved"
43
+
44
+
45
+ class BaselineItem(AIRBaseModel):
46
+ """Individual baseline item."""
47
+
48
+ id: str
49
+ path: str
50
+ item_type: str # file, registry, service, process, etc.
51
+ hash: Optional[str] = None
52
+ size: Optional[int] = None
53
+ permissions: Optional[str] = None
54
+ owner: Optional[str] = None
55
+ created_at: Optional[datetime] = None
56
+ modified_at: Optional[datetime] = None
57
+ attributes: Dict[str, Any] = {}
58
+ metadata: Dict[str, Any] = {}
59
+
60
+
61
+ class Baseline(AIRBaseModel):
62
+ """Baseline model."""
63
+
64
+ id: str = Field(alias="_id")
65
+ name: str
66
+ description: Optional[str] = None
67
+ type: BaselineType
68
+ status: BaselineStatus = BaselineStatus.CREATING
69
+ endpoint_id: str = Field(alias="endpointId")
70
+ endpoint_name: str = Field(alias="endpointName")
71
+ organization_id: int = Field(default=0, alias="organizationId")
72
+ created_at: Optional[datetime] = Field(default=None, alias="createdAt")
73
+ updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
74
+ created_by: str = Field(alias="createdBy")
75
+ item_count: int = Field(default=0, alias="itemCount")
76
+ file_count: int = Field(default=0, alias="fileCount")
77
+ registry_count: int = Field(default=0, alias="registryCount")
78
+ service_count: int = Field(default=0, alias="serviceCount")
79
+ process_count: int = Field(default=0, alias="processCount")
80
+ network_connection_count: int = Field(default=0, alias="networkConnectionCount")
81
+ tags: List[str] = []
82
+ profile_id: Optional[str] = Field(default=None, alias="profileId")
83
+ profile_name: Optional[str] = Field(default=None, alias="profileName")
84
+ last_comparison: Optional[datetime] = Field(default=None, alias="lastComparison")
85
+ comparison_count: int = Field(default=0, alias="comparisonCount")
86
+
87
+
88
+ class BaselineProfile(AIRBaseModel):
89
+ """Baseline profile model."""
90
+
91
+ id: str = Field(alias="_id")
92
+ name: str
93
+ description: Optional[str] = None
94
+ organization_id: int = Field(default=0, alias="organizationId")
95
+ include_files: bool = Field(default=True, alias="includeFiles")
96
+ include_registry: bool = Field(default=True, alias="includeRegistry")
97
+ include_services: bool = Field(default=True, alias="includeServices")
98
+ include_processes: bool = Field(default=False, alias="includeProcesses")
99
+ include_network: bool = Field(default=False, alias="includeNetwork")
100
+ file_patterns: List[str] = Field(default=[], alias="filePatterns")
101
+ exclude_patterns: List[str] = Field(default=[], alias="excludePatterns")
102
+ registry_keys: List[str] = Field(default=[], alias="registryKeys")
103
+ custom_checks: List[Dict[str, Any]] = Field(default=[], alias="customChecks")
104
+ created_at: Optional[datetime] = Field(default=None, alias="createdAt")
105
+ updated_at: Optional[datetime] = Field(default=None, alias="updatedAt")
106
+ created_by: str = Field(alias="createdBy")
107
+ is_default: bool = Field(default=False, alias="isDefault")
108
+ usage_count: int = Field(default=0, alias="usageCount")
109
+
110
+
111
+ class BaselineChange(AIRBaseModel):
112
+ """Baseline change detection model."""
113
+
114
+ id: str = Field(alias="_id")
115
+ comparison_id: str = Field(alias="comparisonId")
116
+ change_type: ChangeType = Field(alias="changeType")
117
+ item_type: str = Field(alias="itemType")
118
+ path: str
119
+ old_value: Optional[Dict[str, Any]] = Field(default=None, alias="oldValue")
120
+ new_value: Optional[Dict[str, Any]] = Field(default=None, alias="newValue")
121
+ severity: str = "medium" # low, medium, high, critical
122
+ category: str
123
+ description: str
124
+ detected_at: datetime = Field(alias="detectedAt")
125
+ risk_score: float = Field(default=0.0, alias="riskScore")
126
+
127
+
128
+ class BaselineComparison(AIRBaseModel):
129
+ """Baseline comparison result model."""
130
+
131
+ id: str = Field(alias="_id")
132
+ baseline_id: str = Field(alias="baselineId")
133
+ baseline_name: str = Field(alias="baselineName")
134
+ endpoint_id: str = Field(alias="endpointId")
135
+ endpoint_name: str = Field(alias="endpointName")
136
+ status: ComparisonStatus
137
+ started_at: Optional[datetime] = Field(default=None, alias="startedAt")
138
+ completed_at: Optional[datetime] = Field(default=None, alias="completedAt")
139
+ duration: Optional[int] = None # seconds
140
+ total_changes: int = Field(default=0, alias="totalChanges")
141
+ added_items: int = Field(default=0, alias="addedItems")
142
+ removed_items: int = Field(default=0, alias="removedItems")
143
+ modified_items: int = Field(default=0, alias="modifiedItems")
144
+ moved_items: int = Field(default=0, alias="movedItems")
145
+ high_risk_changes: int = Field(default=0, alias="highRiskChanges")
146
+ medium_risk_changes: int = Field(default=0, alias="mediumRiskChanges")
147
+ low_risk_changes: int = Field(default=0, alias="lowRiskChanges")
148
+ changes: List[BaselineChange] = []
149
+ organization_id: int = Field(default=0, alias="organizationId")
150
+ triggered_by: str = Field(alias="triggeredBy")
151
+ error_message: Optional[str] = Field(default=None, alias="errorMessage")
152
+
153
+
154
+ class BaselineSchedule(AIRBaseModel):
155
+ """Baseline comparison schedule model."""
156
+
157
+ id: str = Field(alias="_id")
158
+ baseline_id: str = Field(alias="baselineId")
159
+ name: str
160
+ enabled: bool = True
161
+ frequency: str # daily, weekly, monthly
162
+ time_of_day: str = Field(alias="timeOfDay") # HH:MM format
163
+ day_of_week: Optional[int] = Field(default=None, alias="dayOfWeek") # 0-6, Monday=0
164
+ day_of_month: Optional[int] = Field(default=None, alias="dayOfMonth") # 1-31
165
+ next_run: Optional[datetime] = Field(default=None, alias="nextRun")
166
+ last_run: Optional[datetime] = Field(default=None, alias="lastRun")
167
+ created_at: Optional[datetime] = Field(default=None, alias="createdAt")
168
+ created_by: str = Field(alias="createdBy")
169
+ notification_enabled: bool = Field(default=True, alias="notificationEnabled")
170
+ notification_threshold: int = Field(default=10, alias="notificationThreshold") # minimum changes to notify
171
+
172
+
173
+ class BaselineFilter(Filter):
174
+ """Filter for baseline queries."""
175
+
176
+ name: Optional[str] = None
177
+ type: Optional[List[BaselineType]] = None
178
+ status: Optional[List[BaselineStatus]] = None
179
+ endpoint_id: Optional[str] = None
180
+ endpoint_name: Optional[str] = None
181
+ created_by: Optional[str] = None
182
+ tags: Optional[List[str]] = None
183
+ profile_id: Optional[str] = None
184
+ has_recent_comparison: Optional[bool] = None
185
+
186
+
187
+ class CreateBaselineRequest(AIRBaseModel):
188
+ """Request model for creating a baseline."""
189
+
190
+ name: str
191
+ description: Optional[str] = None
192
+ type: BaselineType = BaselineType.SYSTEM
193
+ endpoint_id: str
194
+ profile_id: Optional[str] = None
195
+ tags: List[str] = []
196
+ organization_id: int = 0
197
+
198
+
199
+ class UpdateBaselineRequest(AIRBaseModel):
200
+ """Request model for updating a baseline."""
201
+
202
+ name: Optional[str] = None
203
+ description: Optional[str] = None
204
+ status: Optional[BaselineStatus] = None
205
+ tags: Optional[List[str]] = None
206
+
207
+
208
+ class CreateBaselineProfileRequest(AIRBaseModel):
209
+ """Request model for creating a baseline profile."""
210
+
211
+ name: str
212
+ description: Optional[str] = None
213
+ include_files: bool = True
214
+ include_registry: bool = True
215
+ include_services: bool = True
216
+ include_processes: bool = False
217
+ include_network: bool = False
218
+ file_patterns: List[str] = []
219
+ exclude_patterns: List[str] = []
220
+ registry_keys: List[str] = []
221
+ custom_checks: List[Dict[str, Any]] = []
222
+ organization_id: int = 0
223
+
224
+
225
+ class CompareBaselineRequest(AIRBaseModel):
226
+ """Request model for comparing baselines."""
227
+
228
+ baseline_id: str
229
+ endpoint_ids: Optional[List[str]] = None # If None, use baseline's endpoint
230
+ profile_id: Optional[str] = None # Override baseline's profile
231
+ include_low_risk: bool = True
232
232
  generate_report: bool = True