@@ -11,6 +11,7 @@ import { GroupIndexer } from './indexer/group-indexer.js';
1111import { AttachmentService } from './services/attachment-service.js' ;
1212import { ClawNetTransportService } from './services/clawnet-transport-service.js' ;
1313import { ApiProxyService } from './services/api-proxy-service.js' ;
14+ import { EventPushService } from './services/event-push-service.js' ;
1415import { ContractProvider } from './services/contract-provider.js' ;
1516import { GroupService } from './services/group-service.js' ;
1617import { IdentityAdapterService } from './services/identity-adapter-service.js' ;
@@ -51,6 +52,7 @@ export class TelagentNode {
5152 private attachmentService : AttachmentService | null = null ;
5253 private clawnetTransportService : ClawNetTransportService | null = null ;
5354 private apiProxyService : ApiProxyService | null = null ;
55+ private eventPushService : EventPushService | null = null ;
5456 private monitoringService : NodeMonitoringService | null = null ;
5557 private ownerPermissionService : OwnerPermissionService | null = null ;
5658 private indexer : GroupIndexer | null = null ;
@@ -253,6 +255,12 @@ export class TelagentNode {
253255 ) ;
254256 }
255257
258+ // Event Push Service (real-time SSE for Webapp)
259+ this . eventPushService = new EventPushService (
260+ this . clawnetGateway ,
261+ this . apiProxyService ?? undefined ,
262+ ) ;
263+
256264 this . monitoringService = new NodeMonitoringService ( {
257265 thresholds : {
258266 errorRateWarnRatio : this . config . monitoring . errorRateWarnRatio ,
@@ -290,6 +298,7 @@ export class TelagentNode {
290298 peerProfileRepository : this . peerProfileRepository ,
291299 configuredPassphrase : passphrase ?? undefined ,
292300 apiProxyService : this . apiProxyService ?? undefined ,
301+ eventPushService : this . eventPushService ?? undefined ,
293302 } ;
294303
295304 this . apiServer = new ApiServer ( runtime ) ;
@@ -303,7 +312,17 @@ export class TelagentNode {
303312 logger . info ( '[telagent] [startup] starting API server...' ) ;
304313 await this . apiServer . start ( ) ;
305314 this . clawnetTransportService . startListening ( {
306- onEnvelope : ( raw , sourceDid ) => this . messageService ! . ingestFederatedEnvelope ( raw , sourceDid ) ,
315+ onEnvelope : async ( raw , sourceDid ) => {
316+ await this . messageService ! . ingestFederatedEnvelope ( raw , sourceDid ) ;
317+ // Push real-time event to local SSE clients
318+ this . eventPushService ?. emitLocal ( {
319+ type : 'new-envelope' ,
320+ sourceDid,
321+ envelopeId : typeof raw . envelopeId === 'string' ? raw . envelopeId : undefined ,
322+ conversationId : typeof raw . conversationId === 'string' ? raw . conversationId : undefined ,
323+ atMs : Date . now ( ) ,
324+ } ) ;
325+ } ,
307326 onAttachment : async ( info , _sourceDid ) => {
308327 // A peer relayed an attachment to us via ClawNet P2P.
309328 // Download from our local ClawNet node and save under the same objectKey
@@ -398,6 +417,7 @@ export class TelagentNode {
398417
399418 this . stopMailboxCleaner ( ) ;
400419 this . apiProxyService ?. dispose ( ) ;
420+ this . eventPushService ?. dispose ( ) ;
401421 this . clawnetTransportService ?. stopListening ( ) ;
402422 await this . apiServer ?. stop ( ) ;
403423 await this . indexer ?. stop ( ) ;
0 commit comments