@@ -128,7 +128,22 @@ class ListRepoIncidentsParams(BaseModel):
128128 validity : list [str ] | None = Field (default = DEFAULT_VALIDITIES , description = "Filter by validity (list of validity names)" )
129129
130130
131- async def list_repo_incidents (params : ListRepoIncidentsParams ) -> dict [str , Any ]:
131+ class ListRepoIncidentsResult (BaseModel ):
132+ """Result from listing repository incidents."""
133+ source_id : str | None = Field (default = None , description = "Source ID of the repository" )
134+ incidents : list [dict [str , Any ]] = Field (default_factory = list , description = "List of incident objects" )
135+ total_count : int = Field (description = "Total number of incidents" )
136+ next_cursor : str | None = Field (default = None , description = "Pagination cursor for next page" )
137+ applied_filters : dict [str , Any ] = Field (default_factory = dict , description = "Filters that were applied to the query" )
138+ suggestion : str = Field (default = "" , description = "Suggestions for interpreting or modifying the results" )
139+
140+
141+ class ListRepoIncidentsError (BaseModel ):
142+ """Error result from listing repository incidents."""
143+ error : str = Field (description = "Error message" )
144+
145+
146+ async def list_repo_incidents (params : ListRepoIncidentsParams ) -> ListRepoIncidentsResult | ListRepoIncidentsError :
132147 """
133148 List secret incidents or occurrences related to a specific repository.
134149
@@ -145,7 +160,7 @@ async def list_repo_incidents(params: ListRepoIncidentsParams) -> dict[str, Any]
145160
146161 # Validate that at least one of repository_name or source_id is provided
147162 if not params .repository_name and not params .source_id :
148- return { " error" : " Either repository_name or source_id must be provided"}
163+ return ListRepoIncidentsError ( error = " Either repository_name or source_id must be provided")
149164
150165 logger .debug (f"Listing incidents with repository_name={ params .repository_name } , source_id={ params .source_id } " )
151166
@@ -185,64 +200,54 @@ async def list_repo_incidents(params: ListRepoIncidentsParams) -> dict[str, Any]
185200 incidents_result = await client .paginate_all (f"/sources/{ params .source_id } /incidents/secrets" , api_params )
186201 if isinstance (incidents_result , list ):
187202 count = len (incidents_result )
188- return {
189- " source_id" : params .source_id ,
190- " incidents" : incidents_result ,
191- " total_count" : count ,
192- " applied_filters" : _build_filter_info (params ),
193- " suggestion" : _build_suggestion (params , count ),
194- }
203+ return ListRepoIncidentsResult (
204+ source_id = params .source_id ,
205+ incidents = incidents_result ,
206+ total_count = count ,
207+ applied_filters = _build_filter_info (params ),
208+ suggestion = _build_suggestion (params , count ),
209+ )
195210 elif isinstance (incidents_result , dict ):
196211 count = incidents_result .get ("total_count" , len (incidents_result .get ("data" , [])))
197- return {
198- " source_id" : params .source_id ,
199- " incidents" : incidents_result .get ("data" , []),
200- " total_count" : count ,
201- " applied_filters" : _build_filter_info (params ),
202- " suggestion" : _build_suggestion (params , count ),
203- }
212+ return ListRepoIncidentsResult (
213+ source_id = params .source_id ,
214+ incidents = incidents_result .get ("data" , []),
215+ total_count = count ,
216+ applied_filters = _build_filter_info (params ),
217+ suggestion = _build_suggestion (params , count ),
218+ )
204219 else :
205220 # Fallback for unexpected types
206- return {
207- "source_id" : params .source_id ,
208- "incidents" : [],
209- "total_count" : 0 ,
210- "error" : f"Unexpected response type: { type (incidents_result ).__name__ } " ,
211- "applied_filters" : _build_filter_info (params ),
212- "suggestion" : _build_suggestion (params , 0 ),
213- }
221+ return ListRepoIncidentsError (
222+ error = f"Unexpected response type: { type (incidents_result ).__name__ } " ,
223+ )
214224 else :
215225 incidents_result = await client .list_source_incidents (params .source_id , ** api_params )
216226 if isinstance (incidents_result , dict ):
217227 count = incidents_result .get ("total_count" , 0 )
218- return {
219- " source_id" : params .source_id ,
220- " incidents" : incidents_result .get ("data" , []),
221- " next_cursor" : incidents_result .get ("next_cursor" ),
222- " total_count" : count ,
223- " applied_filters" : _build_filter_info (params ),
224- " suggestion" : _build_suggestion (params , count ),
225- }
228+ return ListRepoIncidentsResult (
229+ source_id = params .source_id ,
230+ incidents = incidents_result .get ("data" , []),
231+ next_cursor = incidents_result .get ("next_cursor" ),
232+ total_count = count ,
233+ applied_filters = _build_filter_info (params ),
234+ suggestion = _build_suggestion (params , count ),
235+ )
226236 elif isinstance (incidents_result , list ):
227237 # Handle case where API returns a list directly
228238 count = len (incidents_result )
229- return {
230- " source_id" : params .source_id ,
231- " incidents" : incidents_result ,
232- " total_count" : count ,
233- " applied_filters" : _build_filter_info (params ),
234- " suggestion" : _build_suggestion (params , count ),
235- }
239+ return ListRepoIncidentsResult (
240+ source_id = params .source_id ,
241+ incidents = incidents_result ,
242+ total_count = count ,
243+ applied_filters = _build_filter_info (params ),
244+ suggestion = _build_suggestion (params , count ),
245+ )
236246 else :
237247 # Fallback for unexpected types
238- return {
239- "source_id" : params .source_id ,
240- "incidents" : [],
241- "total_count" : 0 ,
242- "error" : f"Unexpected response type: { type (incidents_result ).__name__ } " ,
243- "applied_filters" : _build_filter_info (params ),
244- "suggestion" : _build_suggestion (params , 0 ),
245- }
248+ return ListRepoIncidentsError (
249+ error = f"Unexpected response type: { type (incidents_result ).__name__ } " ,
250+ )
246251 else :
247252 # Use repository_name lookup (legacy path)
248253 result = await client .list_repo_incidents_directly (
@@ -259,14 +264,20 @@ async def list_repo_incidents(params: ListRepoIncidentsParams) -> dict[str, Any]
259264 mine = params .mine ,
260265 )
261266
262- # Enrich result with filter info
267+ # Enrich result with filter info and convert to Pydantic model
263268 if isinstance (result , dict ):
264269 count = result .get ("total_count" , len (result .get ("incidents" , [])))
265- result ["applied_filters" ] = _build_filter_info (params )
266- result ["suggestion" ] = _build_suggestion (params , count )
267-
268- return result
270+ return ListRepoIncidentsResult (
271+ source_id = result .get ("source_id" ),
272+ incidents = result .get ("incidents" , []),
273+ total_count = count ,
274+ next_cursor = result .get ("next_cursor" ),
275+ applied_filters = _build_filter_info (params ),
276+ suggestion = _build_suggestion (params , count ),
277+ )
278+ else :
279+ return ListRepoIncidentsError (error = "Unexpected result format from legacy path" )
269280
270281 except Exception as e :
271282 logger .error (f"Error listing repository incidents: { str (e )} " )
272- return { " error" : f"Failed to list repository incidents: { str (e )} " }
283+ return ListRepoIncidentsError ( error = f"Failed to list repository incidents: { str (e )} " )
0 commit comments