88from app .db import get_session
99from app .integrations .agentception_client import AgentCeptionClient
1010from app .integrations .phios_client import IntegrationClientError , PhiOSClient
11- from app .integrations .schemas import BranchSetCreateRequest , ContextPackRequest , DecisionStateRequest , LaunchMissionRequest , PersonaBranchSetCreateRequest , PortfolioDecisionRequest , PrepareMissionRequest , ReplayDraftRequest , ReplayLaunchRequest , SoftwareTaskRequest , WritebackRequest
12- from app .models import IntegrationSetting , Message , Run
11+ from app .integrations .schemas import BranchSetCreateRequest , ContextPackRequest , DecisionStateRequest , LaunchMissionRequest , PersonaBranchSetCreateRequest , PersonaPolicyCheckRequest , PortfolioDecisionRequest , PrepareMissionRequest , ReplayDraftRequest , ReplayLaunchRequest , SoftwareTaskRequest , WritebackRequest
12+ from app .models import IntegrationRun , IntegrationSetting , Message , Run
1313from app .services .adapters .integrations import statuses
1414from app .services .integration_orchestrator import IntegrationOrchestrator
1515
@@ -301,6 +301,21 @@ def integration_eliminate(run_id: int, payload: DecisionStateRequest, session: S
301301 raise HTTPException (status_code = 400 , detail = str (exc )) from exc
302302
303303
304+
305+ @router .get ('/api/integrations/lineage/{root_run_id}/decision-audit' )
306+ def integration_lineage_decision_audit (root_run_id : int , session : Session = Depends (get_session )):
307+ try :
308+ descendants = IntegrationOrchestrator (session ).get_descendants (root_run_id )
309+ run_ids = [root_run_id ] + [d ['id' ] for d in descendants ]
310+ events = []
311+ for rid in run_ids :
312+ events .extend (IntegrationOrchestrator (session ).list_operator_decision_events (rid , limit = 50 ))
313+ events = sorted (events , key = lambda x : x .get ('created_at' , '' ), reverse = True )
314+ return {'root_run_id' : root_run_id , 'events' : events [:200 ]}
315+ except IntegrationClientError as exc :
316+ raise HTTPException (status_code = 400 , detail = str (exc )) from exc
317+
318+
304319@router .get ('/api/integrations/runs/{run_id}/provenance' )
305320def integration_provenance (run_id : int , session : Session = Depends (get_session )):
306321 try :
@@ -309,6 +324,41 @@ def integration_provenance(run_id: int, session: Session = Depends(get_session))
309324 raise HTTPException (status_code = 400 , detail = str (exc )) from exc
310325
311326
327+ @router .get ('/api/integrations/runs/{run_id}/decision-events' )
328+ def integration_decision_events (run_id : int , limit : int = 100 , session : Session = Depends (get_session )):
329+ try :
330+ return {'events' : IntegrationOrchestrator (session ).list_operator_decision_events (run_id , limit = limit )}
331+ except IntegrationClientError as exc :
332+ raise HTTPException (status_code = 400 , detail = str (exc )) from exc
333+
334+
335+ @router .get ('/api/integrations/runs/{run_id}/persona-compare' )
336+ def integration_persona_compare (run_id : int , other_run_id : int | None = None , session : Session = Depends (get_session )):
337+ try :
338+ return IntegrationOrchestrator (session ).get_persona_delta_compare (run_id , other_run_id )
339+ except IntegrationClientError as exc :
340+ raise HTTPException (status_code = 400 , detail = str (exc )) from exc
341+
342+
343+ @router .post ('/api/integrations/runs/{run_id}/policy-check' )
344+ def integration_policy_check (run_id : int , payload : PersonaPolicyCheckRequest , session : Session = Depends (get_session )):
345+ row = IntegrationOrchestrator (session ).get_run (run_id )
346+ if not row :
347+ raise HTTPException (status_code = 404 , detail = 'run not found' )
348+ real = session .get (IntegrationRun , run_id )
349+ if not real :
350+ raise HTTPException (status_code = 404 , detail = 'run not found' )
351+ return IntegrationOrchestrator (session ).evaluate_persona_policy (real , action = payload .action )
352+
353+
354+ @router .get ('/api/integrations/runs/{run_id}/audit-summary' )
355+ def integration_audit_summary (run_id : int , session : Session = Depends (get_session )):
356+ try :
357+ return IntegrationOrchestrator (session ).get_audit_summary (run_id )
358+ except IntegrationClientError as exc :
359+ raise HTTPException (status_code = 400 , detail = str (exc )) from exc
360+
361+
312362@router .post ('/api/integrations/runs/{run_id}/refresh' )
313363def integration_refresh (run_id : int , session : Session = Depends (get_session )):
314364 try :
@@ -384,6 +434,16 @@ def integration_persona_insights(root_run_id: int | None = None, session: Sessio
384434 return IntegrationOrchestrator (session ).get_persona_performance_summary (root_run_id )
385435
386436
437+ @router .get ('/api/integrations/persona-trends' )
438+ def integration_persona_trends (window : str = '30d' , repo : str | None = None , strategy : str | None = None , status : str | None = None , session : Session = Depends (get_session )):
439+ return IntegrationOrchestrator (session ).get_persona_trends (window = window , repo = repo , strategy = strategy , status = status )
440+
441+
442+ @router .get ('/api/integrations/persona-trends/matrix' )
443+ def integration_persona_matrix (window : str = '30d' , repo : str | None = None , status : str | None = None , session : Session = Depends (get_session )):
444+ return IntegrationOrchestrator (session ).get_persona_strategy_matrix (window = window , repo = repo , status = status )
445+
446+
387447@router .get ('/api/integrations/cohorts' )
388448def integration_cohorts (
389449 group_by : str = 'repo' ,
0 commit comments