@@ -10,7 +10,8 @@ namespace SharpClaw.Application.Core.Modules;
1010
1111public sealed class HostAgentJobController (
1212 AgentJobService jobs ,
13- SharpClawDbContext db ) : IAgentJobController
13+ SharpClawDbContext db ,
14+ ChatCache chatCache ) : IAgentJobController
1415{
1516 public Task < AgentJobResponse > SubmitJobAsync (
1617 Guid channelId ,
@@ -33,14 +34,16 @@ public async Task AddJobLogAsync(
3334 var job = await db . AgentJobs . FirstOrDefaultAsync ( j => j . Id == jobId , ct ) ;
3435 if ( job is null ) return ;
3536
36- job . LogEntries . Add ( new AgentJobLogEntryDB
37+ var entry = new AgentJobLogEntryDB
3738 {
3839 AgentJobId = jobId ,
3940 Message = message ,
4041 Level = level ,
41- } ) ;
42+ } ;
43+ job . LogEntries . Add ( entry ) ;
4244
4345 await db . SaveChangesAsync ( ct ) ;
46+ chatCache . AppendJobLogIfCached ( jobId , ToLogResponse ( entry ) ) ;
4447 }
4548
4649 public async Task MarkJobFailedAsync (
@@ -55,14 +58,16 @@ public async Task MarkJobFailedAsync(
5558 job . Status = AgentJobStatus . Failed ;
5659 job . CompletedAt = DateTimeOffset . UtcNow ;
5760 job . ErrorLog = exception . ToString ( ) ;
58- job . LogEntries . Add ( new AgentJobLogEntryDB
61+ var entry = new AgentJobLogEntryDB
5962 {
6063 AgentJobId = jobId ,
6164 Message = $ "Job failed: { exception . Message } ",
6265 Level = JobLogLevels . Error ,
63- } ) ;
66+ } ;
67+ job . LogEntries . Add ( entry ) ;
6468
6569 await db . SaveChangesAsync ( ct ) ;
70+ chatCache . AppendJobLogIfCached ( jobId , ToLogResponse ( entry ) ) ;
6671 }
6772
6873 public async Task MarkJobCompletedAsync (
@@ -80,16 +85,18 @@ public async Task MarkJobCompletedAsync(
8085 if ( resultData is not null )
8186 job . ResultData = resultData ;
8287
83- job . LogEntries . Add ( new AgentJobLogEntryDB
88+ var entry = new AgentJobLogEntryDB
8489 {
8590 AgentJobId = jobId ,
8691 Message = string . IsNullOrWhiteSpace ( message )
8792 ? "Job completed by module."
8893 : message ,
8994 Level = JobLogLevels . Info ,
90- } ) ;
95+ } ;
96+ job . LogEntries . Add ( entry ) ;
9197
9298 await db . SaveChangesAsync ( ct ) ;
99+ chatCache . AppendJobLogIfCached ( jobId , ToLogResponse ( entry ) ) ;
93100 }
94101
95102 public async Task MarkJobCancelledAsync (
@@ -103,16 +110,18 @@ public async Task MarkJobCancelledAsync(
103110
104111 job . Status = AgentJobStatus . Cancelled ;
105112 job . CompletedAt = DateTimeOffset . UtcNow ;
106- job . LogEntries . Add ( new AgentJobLogEntryDB
113+ var entry = new AgentJobLogEntryDB
107114 {
108115 AgentJobId = jobId ,
109116 Message = string . IsNullOrWhiteSpace ( message )
110117 ? "Job cancelled by module."
111118 : message ,
112119 Level = JobLogLevels . Warning ,
113- } ) ;
120+ } ;
121+ job . LogEntries . Add ( entry ) ;
114122
115123 await db . SaveChangesAsync ( ct ) ;
124+ chatCache . AppendJobLogIfCached ( jobId , ToLogResponse ( entry ) ) ;
116125 }
117126
118127 public async Task CancelStaleJobsByActionPrefixAsync (
@@ -131,19 +140,29 @@ public async Task CancelStaleJobsByActionPrefixAsync(
131140 . Where ( j => j . ActionKey ! . StartsWith ( actionKeyPrefix , StringComparison . OrdinalIgnoreCase ) )
132141 . ToList ( ) ;
133142
143+ var cancelledLogs = new List < ( Guid JobId , AgentJobLogEntryDB Entry ) > ( stale . Count ) ;
134144 foreach ( var job in stale )
135145 {
136146 job . Status = AgentJobStatus . Cancelled ;
137147 job . CompletedAt = DateTimeOffset . UtcNow ;
138- job . LogEntries . Add ( new AgentJobLogEntryDB
148+ var entry = new AgentJobLogEntryDB
139149 {
140150 AgentJobId = job . Id ,
141151 Message = "Cancelled: stale from previous session." ,
142152 Level = JobLogLevels . Warning ,
143- } ) ;
153+ } ;
154+ job . LogEntries . Add ( entry ) ;
155+ cancelledLogs . Add ( ( job . Id , entry ) ) ;
144156 }
145157
146158 if ( stale . Count > 0 )
159+ {
147160 await db . SaveChangesAsync ( ct ) ;
161+ foreach ( var ( jobId , entry ) in cancelledLogs )
162+ chatCache . AppendJobLogIfCached ( jobId , ToLogResponse ( entry ) ) ;
163+ }
148164 }
165+
166+ private static AgentJobLogResponse ToLogResponse ( AgentJobLogEntryDB log )
167+ => new ( log . Message , log . Level , log . CreatedAt ) ;
149168}
0 commit comments