package ai import ( "context" "sync" ) // ReportManager tracks in-flight report goroutines so they can be cancelled. type ReportManager struct { mu sync.Mutex cancels map[string]context.CancelFunc } func NewReportManager() *ReportManager { return &ReportManager{cancels: make(map[string]context.CancelFunc)} } func (m *ReportManager) Register(id string, cancel context.CancelFunc) { m.mu.Lock() defer m.mu.Unlock() m.cancels[id] = cancel } func (m *ReportManager) Cancel(id string) { m.mu.Lock() defer m.mu.Unlock() if cancel, ok := m.cancels[id]; ok { cancel() delete(m.cancels, id) } } func (m *ReportManager) Remove(id string) { m.mu.Lock() defer m.mu.Unlock() delete(m.cancels, id) }