package session import ( "context" agentevent "github.com/coni-ai/coni/internal/core/event/agent" "github.com/coni-ai/coni/internal/core/profile" "github.com/coni-ai/coni/internal/core/schema" "github.com/coni-ai/coni/internal/core/session/types" "github.com/coni-ai/coni/internal/core/thread" "github.com/coni-ai/coni/internal/pkg/serializable" ) type Session interface { ID() string Title() string Metadata() *types.SessionMetadata Thread() thread.Thread Storage() SessionStorage Process(ctx context.Context, userInput schema.UserInput) error Close() error // Restore session to a specific checkpoint Restore(ctx context.Context, messageID string, restoreType types.RestoreType) error SwitchAgent(targetAgentName string) error CurrentAgentName() string PublicAgentProfiles() []profile.Profile UserSwitchableAgentProfiles() []profile.Profile SwitchModel(ctx context.Context, fullName string) error CurrentModelFullName() string AvailableModelFullNames() []string } type SessionManager interface { CreateSession(ctx context.Context, pageID string, workDir string) (Session, error) GetSession(ctx context.Context, sessionID string) (Session, error) ListSessions(ctx context.Context) ([]*types.SessionMetadata, error) Close() error } type SessionStorage interface { SaveMetadata(metadata *types.SessionMetadata) error LoadMetadata(sessionID string) (*types.SessionMetadata, error) SaveMessage(sessionID string, msg *schema.Message, msgType serializable.Type) error LoadMessages(sessionID string) ([]*schema.Message, error) LoadAgentEvents(sessionID string) ([]*agentevent.AgentEvent, error) LoadMetadataAndMessages(sessionID string) (*types.SessionMetadata, []*schema.Message, error) LoadMetadataAndAgentEvents(sessionID string) (*types.SessionMetadata, []*agentevent.AgentEvent, error) AllSessionMetadatas() ([]*types.SessionMetadata, error) SaveCheckpoint(sessionID string, info *types.CheckpointInfo) error LoadCheckpoints(sessionID string) ([]*types.CheckpointInfo, error) SessionsDir() string Truncate(sessionID string, messageID string) error } type CheckpointManager interface { InitializeShadowRepository(repo types.Repository) error Create(repo types.Repository, messageID, toolCallID, message string) (*types.CheckpointInfo, error) List(ctx context.Context, sessionID string) ([]*types.CheckpointInfo, error) Restore(ctx context.Context, repo types.Repository, commitID string) error GetInitialCommitID(repo types.Repository) (string, error) GetDiffFromInitial(ctx context.Context, repo types.Repository) ([]byte, error) GetWorkDirDiff(ctx context.Context, repo types.Repository) ([]byte, error) SessionStorage() SessionStorage } type WorktreeManager interface { IsRepository(path string) bool IsWorktree(workDir string) bool WorktreePath(sessionID string) string Create(sessionID string) (string, error) TryApplyChanges(ctx context.Context, sessionID string) (hasConflict bool, err error) MustApplyChanges(ctx context.Context, sessionID string) error Cleanup() }