@@ -38,12 +38,13 @@ import (
3838)
3939
4040type Server struct {
41- e * echo.Echo
42- runtimes map [string ]runtime.Runtime
43- sessionStore session.Store
44- agentsDir string
45- runConfig config.RuntimeConfig
46- teams map [string ]* team.Team
41+ e * echo.Echo
42+ runtimes map [string ]runtime.Runtime
43+ runtimeCancels map [string ]context.CancelFunc
44+ sessionStore session.Store
45+ agentsDir string
46+ runConfig config.RuntimeConfig
47+ teams map [string ]* team.Team
4748}
4849
4950type Opt func (* Server )
@@ -66,11 +67,12 @@ func New(sessionStore session.Store, runConfig config.RuntimeConfig, teams map[s
6667 e .Use (middleware .CORS ())
6768 e .Use (middleware .Logger ())
6869 s := & Server {
69- e : e ,
70- runtimes : make (map [string ]runtime.Runtime ),
71- sessionStore : sessionStore ,
72- runConfig : runConfig ,
73- teams : teams ,
70+ e : e ,
71+ runtimes : make (map [string ]runtime.Runtime ),
72+ runtimeCancels : make (map [string ]context.CancelFunc ),
73+ sessionStore : sessionStore ,
74+ runConfig : runConfig ,
75+ teams : teams ,
7476 }
7577
7678 for _ , opt := range opts {
@@ -871,8 +873,24 @@ func (s *Server) resumeSession(c echo.Context) error {
871873}
872874
873875func (s * Server ) deleteSession (c echo.Context ) error {
874- if err := s .sessionStore .DeleteSession (c .Request ().Context (), c .Param ("id" )); err != nil {
875- slog .Error ("Failed to delete session" , "session_id" , c .Param ("id" ), "error" , err )
876+ sessionID := c .Param ("id" )
877+
878+ // Cancel the runtime context if it's still running
879+ if cancel , exists := s .runtimeCancels [sessionID ]; exists {
880+ slog .Debug ("Cancelling runtime for session" , "session_id" , sessionID )
881+ cancel ()
882+ delete (s .runtimeCancels , sessionID )
883+ }
884+
885+ // Clean up the runtime
886+ if _ , exists := s .runtimes [sessionID ]; exists {
887+ slog .Debug ("Removing runtime for session" , "session_id" , sessionID )
888+ delete (s .runtimes , sessionID )
889+ }
890+
891+ // Delete the session from storage
892+ if err := s .sessionStore .DeleteSession (c .Request ().Context (), sessionID ); err != nil {
893+ slog .Error ("Failed to delete session" , "session_id" , sessionID , "error" , err )
876894 return c .JSON (http .StatusInternalServerError , map [string ]string {"error" : "failed to delete session" })
877895 }
878896
@@ -955,7 +973,14 @@ func (s *Server) runAgent(c echo.Context) error {
955973 c .Response ().Header ().Set ("Connection" , "keep-alive" )
956974 c .Response ().WriteHeader (http .StatusOK )
957975
958- streamChan := rt .RunStream (c .Request ().Context (), sess )
976+ // Create a cancellable context for this stream
977+ streamCtx , cancel := context .WithCancel (c .Request ().Context ())
978+ s .runtimeCancels [sess .ID ] = cancel
979+ defer func () {
980+ delete (s .runtimeCancels , sess .ID )
981+ }()
982+
983+ streamChan := rt .RunStream (streamCtx , sess )
959984 for event := range streamChan {
960985 data , err := json .Marshal (event )
961986 if err != nil {
0 commit comments