@@ -15,6 +15,8 @@ import (
1515 "github.com/GrayCodeAI/trace/cli/interactive"
1616 "github.com/GrayCodeAI/trace/cli/logging"
1717 "github.com/GrayCodeAI/trace/cli/paths"
18+ "github.com/GrayCodeAI/trace/cli/provenance"
19+ "github.com/GrayCodeAI/trace/cli/review"
1820 "github.com/GrayCodeAI/trace/cli/session"
1921 "github.com/GrayCodeAI/trace/cli/settings"
2022 "github.com/GrayCodeAI/trace/cli/trailers"
@@ -636,6 +638,28 @@ func addCheckpointTrailerWithComment(message string, checkpointID id.CheckpointI
636638 return userContent + "\n \n " + trailer + "\n " + comment + "\n \n " + gitComments
637639}
638640
641+ func applyProvenanceEnvToState (state * SessionState ) {
642+ if os .Getenv (provenance .ReviewSession ) != "" {
643+ state .Kind = session .KindAgentReview
644+ if skills , err := review .DecodeSkills (os .Getenv (provenance .ReviewSkills )); err == nil {
645+ state .ReviewSkills = skills
646+ }
647+ if prompt := strings .TrimSpace (os .Getenv (provenance .ReviewPrompt )); prompt != "" {
648+ state .ReviewPrompt = prompt
649+ }
650+ }
651+
652+ if os .Getenv (provenance .InvestigateSession ) != "" {
653+ state .Kind = session .KindAgentInvestigate
654+ if runID := strings .TrimSpace (os .Getenv (provenance .InvestigateRunID )); provenance .IsValidRunID (runID ) {
655+ state .InvestigateRunID = runID
656+ }
657+ if topic := strings .TrimSpace (os .Getenv (provenance .InvestigateTopic )); topic != "" {
658+ state .InvestigateTopic = topic
659+ }
660+ }
661+ }
662+
639663// InitializeSession creates session state for a new session or updates an existing one.
640664// This implements the optional SessionInitializer interface.
641665// Called during UserPromptSubmit to allow git hooks to detect active sessions.
@@ -698,6 +722,8 @@ func (s *ManualCommitStrategy) InitializeSession(ctx context.Context, sessionID
698722 state .ModelName = model
699723 }
700724
725+ applyProvenanceEnvToState (state )
726+
701727 // Update LastPrompt on every turn so condensation always has the current prompt
702728 if userPrompt != "" {
703729 state .LastPrompt = truncatePromptForStorage (userPrompt )
@@ -765,6 +791,8 @@ func (s *ManualCommitStrategy) InitializeSession(ctx context.Context, sessionID
765791 return fmt .Errorf ("failed to initialize session: %w" , err )
766792 }
767793
794+ applyProvenanceEnvToState (state )
795+
768796 // Apply phase transition: new session starts as ACTIVE.
769797 if transErr := TransitionAndLog (ctx , state , session .EventTurnStart , session.TransitionContext {}, session.NoOpActionHandler {}); transErr != nil {
770798 logging .Warn (logging .WithComponent (ctx , "hooks" ), "turn start transition failed" ,
0 commit comments