fix(events): prevent early events from being dropped before init (#2611)

Christian Rocha created

Change summary

internal/cmd/run.go     |  5 ++++-
internal/cmd/session.go | 26 +++++++++++++++++---------
internal/cmd/stats.go   | 15 +++++++++------
3 files changed, 30 insertions(+), 16 deletions(-)

Detailed changes

internal/cmd/run.go 🔗

@@ -86,7 +86,6 @@ crush run --continue "Follow up on your last response"
 		}
 
 		event.SetNonInteractive(true)
-		event.AppInitialized()
 
 		switch {
 		case sessionID != "":
@@ -102,6 +101,8 @@ crush run --continue "Follow up on your last response"
 			}
 			defer cleanup()
 
+			event.AppInitialized()
+
 			if sessionID != "" {
 				sess, err := resolveSessionByID(ctx, c, ws.ID, sessionID)
 				if err != nil {
@@ -127,6 +128,8 @@ crush run --continue "Follow up on your last response"
 		}
 		defer cleanup()
 
+		event.AppInitialized()
+
 		if !ws.Config().IsConfigured() {
 			return fmt.Errorf("no providers configured - please run 'crush' to set up a provider interactively")
 		}

internal/cmd/session.go 🔗

@@ -107,13 +107,16 @@ func sessionSetup(cmd *cobra.Command) (context.Context, *sessionServices, func()
 	dataDir, _ := cmd.Flags().GetString("data-dir")
 	ctx := cmd.Context()
 
+	cfg, err := config.Init("", dataDir, false)
+	if err != nil {
+		return nil, nil, nil, fmt.Errorf("failed to initialize config: %w", err)
+	}
 	if dataDir == "" {
-		cfg, err := config.Init("", "", false)
-		if err != nil {
-			return nil, nil, nil, fmt.Errorf("failed to initialize config: %w", err)
-		}
 		dataDir = cfg.Config().Options.DataDirectory
 	}
+	if shouldEnableMetrics(cfg.Config()) {
+		event.Init()
+	}
 
 	conn, err := db.Connect(ctx, dataDir)
 	if err != nil {
@@ -130,7 +133,6 @@ func sessionSetup(cmd *cobra.Command) (context.Context, *sessionServices, func()
 
 func runSessionList(cmd *cobra.Command, _ []string) error {
 	event.SetNonInteractive(true)
-	event.SessionListed(sessionListJSON)
 
 	ctx, svc, cleanup, err := sessionSetup(cmd)
 	if err != nil {
@@ -138,6 +140,8 @@ func runSessionList(cmd *cobra.Command, _ []string) error {
 	}
 	defer cleanup()
 
+	event.SessionListed(sessionListJSON)
+
 	list, err := svc.sessions.List(ctx)
 	if err != nil {
 		return fmt.Errorf("failed to list sessions: %w", err)
@@ -253,7 +257,6 @@ func resolveSessionID(ctx context.Context, svc session.Service, id string) (sess
 
 func runSessionShow(cmd *cobra.Command, args []string) error {
 	event.SetNonInteractive(true)
-	event.SessionShown(sessionShowJSON)
 
 	ctx, svc, cleanup, err := sessionSetup(cmd)
 	if err != nil {
@@ -261,6 +264,8 @@ func runSessionShow(cmd *cobra.Command, args []string) error {
 	}
 	defer cleanup()
 
+	event.SessionShown(sessionShowJSON)
+
 	sess, err := resolveSessionID(ctx, svc.sessions, args[0])
 	if err != nil {
 		return err
@@ -280,7 +285,6 @@ func runSessionShow(cmd *cobra.Command, args []string) error {
 
 func runSessionDelete(cmd *cobra.Command, args []string) error {
 	event.SetNonInteractive(true)
-	event.SessionDeletedCommand(sessionDeleteJSON)
 
 	ctx, svc, cleanup, err := sessionSetup(cmd)
 	if err != nil {
@@ -288,6 +292,8 @@ func runSessionDelete(cmd *cobra.Command, args []string) error {
 	}
 	defer cleanup()
 
+	event.SessionDeletedCommand(sessionDeleteJSON)
+
 	sess, err := resolveSessionID(ctx, svc.sessions, args[0])
 	if err != nil {
 		return err
@@ -315,7 +321,6 @@ func runSessionDelete(cmd *cobra.Command, args []string) error {
 
 func runSessionRename(cmd *cobra.Command, args []string) error {
 	event.SetNonInteractive(true)
-	event.SessionRenamed(sessionRenameJSON)
 
 	ctx, svc, cleanup, err := sessionSetup(cmd)
 	if err != nil {
@@ -323,6 +328,8 @@ func runSessionRename(cmd *cobra.Command, args []string) error {
 	}
 	defer cleanup()
 
+	event.SessionRenamed(sessionRenameJSON)
+
 	sess, err := resolveSessionID(ctx, svc.sessions, args[0])
 	if err != nil {
 		return err
@@ -351,7 +358,6 @@ func runSessionRename(cmd *cobra.Command, args []string) error {
 
 func runSessionLast(cmd *cobra.Command, _ []string) error {
 	event.SetNonInteractive(true)
-	event.SessionLastShown(sessionLastJSON)
 
 	ctx, svc, cleanup, err := sessionSetup(cmd)
 	if err != nil {
@@ -359,6 +365,8 @@ func runSessionLast(cmd *cobra.Command, _ []string) error {
 	}
 	defer cleanup()
 
+	event.SessionLastShown(sessionLastJSON)
+
 	list, err := svc.sessions.List(ctx)
 	if err != nil {
 		return fmt.Errorf("failed to list sessions: %w", err)

internal/cmd/stats.go 🔗

@@ -121,18 +121,21 @@ type HourDayHeatmapPt struct {
 }
 
 func runStats(cmd *cobra.Command, _ []string) error {
-	event.StatsViewed()
-
 	dataDir, _ := cmd.Flags().GetString("data-dir")
 	ctx := cmd.Context()
 
+	cfg, err := config.Init("", dataDir, false)
+	if err != nil {
+		return fmt.Errorf("failed to initialize config: %w", err)
+	}
 	if dataDir == "" {
-		cfg, err := config.Init("", "", false)
-		if err != nil {
-			return fmt.Errorf("failed to initialize config: %w", err)
-		}
 		dataDir = cfg.Config().Options.DataDirectory
 	}
+	if shouldEnableMetrics(cfg.Config()) {
+		event.Init()
+	}
+
+	event.StatsViewed()
 
 	conn, err := db.Connect(ctx, dataDir)
 	if err != nil {