@@ -1732,6 +1732,10 @@ func (s *Service) SessionTail(ctx context.Context, sessionID string, afterID int
17321732 if err != nil {
17331733 return core.SessionTail {}, err
17341734 }
1735+ snapshot , err := s .store .Snapshot (ctx )
1736+ if err != nil {
1737+ return core.SessionTail {}, err
1738+ }
17351739 if len (kinds ) == 0 {
17361740 kinds = []core.EventType {
17371741 core .EventWorkerOutput ,
@@ -1759,6 +1763,14 @@ func (s *Service) SessionTail(ctx context.Context, sessionID string, afterID int
17591763 EventID : session .CurrentActionEvent ,
17601764 }
17611765 }
1766+ worker := sessionTailWorker (snapshot .Workers , session .WorkerID )
1767+ node := sessionTailNode (snapshot .ExecutionNodes , session )
1768+ pullRequests := sessionTailPullRequests (snapshot .PullRequests , session .TaskID , session .WorkerID )
1769+ completion := s .sessionTailCompletion (ctx , session .WorkerID )
1770+ changedFiles := []core.SessionChangedFile (nil )
1771+ if completion != nil {
1772+ changedFiles = completion .ChangedFiles
1773+ }
17621774 return core.SessionTail {
17631775 SessionID : session .ID ,
17641776 WorkerID : session .WorkerID ,
@@ -1767,9 +1779,101 @@ func (s *Service) SessionTail(ctx context.Context, sessionID string, afterID int
17671779 LastEventID : lastEventID ,
17681780 Events : events ,
17691781 CurrentAction : currentAction ,
1782+ Session : & session ,
1783+ Worker : worker ,
1784+ Node : node ,
1785+ PullRequests : pullRequests ,
1786+ Completion : completion ,
1787+ ChangedFiles : changedFiles ,
17701788 }, nil
17711789}
17721790
1791+ func sessionTailWorker (workers []core.Worker , workerID string ) * core.Worker {
1792+ for _ , worker := range workers {
1793+ if worker .ID == workerID {
1794+ return & worker
1795+ }
1796+ }
1797+ return nil
1798+ }
1799+
1800+ func sessionTailNode (nodes []core.ExecutionNode , session core.Session ) * core.ExecutionNode {
1801+ for _ , node := range nodes {
1802+ if session .NodeID != "" && node .ID == session .NodeID {
1803+ return & node
1804+ }
1805+ }
1806+ for _ , node := range nodes {
1807+ if node .WorkerID == session .WorkerID {
1808+ return & node
1809+ }
1810+ }
1811+ return nil
1812+ }
1813+
1814+ func sessionTailPullRequests (pullRequests []core.PullRequest , taskID string , workerID string ) []core.PullRequest {
1815+ taskPullRequests := []core.PullRequest {}
1816+ workerPullRequests := []core.PullRequest {}
1817+ for _ , pr := range pullRequests {
1818+ if pr .TaskID != taskID {
1819+ continue
1820+ }
1821+ taskPullRequests = append (taskPullRequests , pr )
1822+ if workerID != "" && pullRequestMetadataString (pr , "workerId" ) == workerID {
1823+ workerPullRequests = append (workerPullRequests , pr )
1824+ }
1825+ }
1826+ if len (workerPullRequests ) > 0 {
1827+ return workerPullRequests
1828+ }
1829+ return taskPullRequests
1830+ }
1831+
1832+ func (s * Service ) sessionTailCompletion (ctx context.Context , workerID string ) * core.SessionCompletion {
1833+ events , err := s .store .ListWorkerEvents (ctx , workerID , 0 , 1000 , core .EventWorkerCompleted )
1834+ if err != nil {
1835+ return nil
1836+ }
1837+ var completion * core.SessionCompletion
1838+ for _ , event := range events {
1839+ next := sessionCompletionFromEvent (event )
1840+ if next != nil {
1841+ completion = next
1842+ }
1843+ }
1844+ return completion
1845+ }
1846+
1847+ func sessionCompletionFromEvent (event core.Event ) * core.SessionCompletion {
1848+ if event .Type != core .EventWorkerCompleted {
1849+ return nil
1850+ }
1851+ var payload struct {
1852+ Status core.WorkerStatus `json:"status,omitempty"`
1853+ Summary string `json:"summary,omitempty"`
1854+ Error string `json:"error,omitempty"`
1855+ ChangedFiles []core.SessionChangedFile `json:"changedFiles,omitempty"`
1856+ WorkspaceChanges struct {
1857+ ChangedFiles []core.SessionChangedFile `json:"changedFiles,omitempty"`
1858+ } `json:"workspaceChanges,omitempty"`
1859+ }
1860+ if err := json .Unmarshal (event .Payload , & payload ); err != nil {
1861+ return nil
1862+ }
1863+ changedFiles := payload .ChangedFiles
1864+ if len (changedFiles ) == 0 {
1865+ changedFiles = payload .WorkspaceChanges .ChangedFiles
1866+ }
1867+ return & core.SessionCompletion {
1868+ Status : payload .Status ,
1869+ Summary : payload .Summary ,
1870+ Error : payload .Error ,
1871+ EventID : event .ID ,
1872+ At : event .At ,
1873+ ChangedFiles : changedFiles ,
1874+ }
1875+ }
1876+
17731877func (s * Service ) Subscribe () (int , <- chan core.Event ) {
17741878 return s .broker .Subscribe ()
17751879}
0 commit comments