Skip to content

Serialize lifecycle transitions - #152

Closed
IeuanWalker wants to merge 9 commits into
mainfrom
Phase9
Closed

Serialize lifecycle transitions#152
IeuanWalker wants to merge 9 commits into
mainfrom
Phase9

Conversation

@IeuanWalker

Copy link
Copy Markdown
Owner

No description provided.

@IeuanWalker
IeuanWalker requested a review from Copilot July 23, 2026 00:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors Cockpit’s session state so lifecycle transitions (SDK connectivity + agent run state) are tracked independently from UI-facing “display status” overlays caused by pending interactions (permissions / user input / elicitation), and updates the UI + tests accordingly.

Changes:

  • Introduces structured session state containers (Lifecycle, Conversation, Ui, PendingInteractions) plus compatibility shims on SessionModel.
  • Centralizes cross-interaction status/bookkeeping in SessionInteractionCoordinator so concurrent interaction types preserve existing visible-status transition behavior.
  • Updates UI components, session/event processing, update gating logic, benchmarks, and unit tests to use the new lifecycle + display-status split.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
Tests/Cockpit.UnitTests/Features/UserInputRequests/UserInputFeatureTests.cs Updates user-input tests to assert DisplayStatus and AgentRunState behavior via interaction coordination.
Tests/Cockpit.UnitTests/Features/Update/UpdateFeatureTests.cs Updates “active session” tests to validate lifecycle-based activity checks (AgentRunStateEnum).
Tests/Cockpit.UnitTests/Features/Sessions/SessionUiStateTests.cs Adds coverage for new per-session UI state container + compatibility surface forwarding.
Tests/Cockpit.UnitTests/Features/Sessions/SessionStatusBehaviourTests.cs Adds coverage for visible status presentation + concurrent interaction-type transition rules.
Tests/Cockpit.UnitTests/Features/Sessions/SessionListFeatureTests.cs Updates session creation helpers to use AgentRunState instead of legacy Status.
Tests/Cockpit.UnitTests/Features/Sessions/SessionLifecycleStateTests.cs Adds tests validating lifecycle state grouping + DisplayStatus projection from lifecycle run state.
Tests/Cockpit.UnitTests/Features/Sessions/SessionInteractionCoordinatorTests.cs Adds coordinator tests for add/resolve ordering, duplicates, reconnect cleanup, and run-state reveal.
Tests/Cockpit.UnitTests/Features/Sessions/SessionConversationStateTests.cs Adds tests for message snapshot publication semantics in the new conversation state container.
Tests/Cockpit.UnitTests/Features/SessionEvents/SessionEventProcessorTests.cs Updates event-processor tests to set AgentRunState instead of session Status.
Tests/Cockpit.UnitTests/Features/SessionEvents/Handlers/SessionShutdownHandlerTests.cs Updates shutdown-handler tests to use lifecycle run state.
Tests/Cockpit.UnitTests/Features/SessionEvents/Handlers/SessionIdleHandlerTests.cs Updates idle-handler tests to use lifecycle run state.
Tests/Cockpit.UnitTests/Features/Permissions/PermissionFeatureTests.cs Updates permission tests for new lifecycle + pending-interactions bookkeeping and revised comments.
Tests/Cockpit.UnitTests/Features/Models/ModelFeatureTests.cs Updates model tests to initialize sessions with AgentRunState.
Tests/Cockpit.UnitTests/Features/ElicitationRequests/ElicitationFeatureTests.cs Updates elicitation tests to use coordinator-based pending interactions and lifecycle run state.
Tests/Cockpit.UnitTests/Features/Agents/AgentFeatureTests.cs Updates agent tests to initialize sessions with AgentRunState.
Tests/Cockpit.Benchmarks/SessionLoadingBenchmarks.cs Updates benchmark session materialization to use AgentRunState as lifecycle state.
src/Cockpit/MauiProgram.cs Registers SessionInteractionCoordinator as a singleton for shared interaction bookkeeping.
src/Cockpit/Features/UserInputRequests/UserInputFeature.cs Switches session-visible state updates to SessionInteractionCoordinator instead of direct session mutations.
src/Cockpit/Features/Updates/UpdateFeature.cs Changes “active session” determination to key off lifecycle run state (AgentRunStateEnum).
src/Cockpit/Features/Sessions/SessionFeature.SdkConfiguration.cs Extracts system-message customization/config helpers into a dedicated partial file.
src/Cockpit/Features/Sessions/SessionFeature.Replay.cs Extracts session replay helper to use Conversation snapshot publication APIs.
src/Cockpit/Features/Sessions/SessionFeature.Reconnect.cs Updates reconnect/disconnect cleanup to use lifecycle SDK state + coordinator bookkeeping clears.
src/Cockpit/Features/Sessions/SessionFeature.Messages.cs Refactors message sending to be session-scoped and to publish conversation snapshots via Conversation.
src/Cockpit/Features/Sessions/SessionFeature.Loading.cs Extracts session loading logic into a dedicated partial file using lifecycle + conversation containers.
src/Cockpit/Features/Sessions/SessionFeature.Lifecycle.cs Removes large blocks moved into new partials; updates remaining lifecycle transitions to set Lifecycle.AgentRunState.
src/Cockpit/Features/Sessions/SessionFeature.Eviction.cs Updates eviction candidate checks and cleanup to use Lifecycle and Conversation, and coordinator clears.
src/Cockpit/Features/Sessions/SessionFeature.Discovery.cs Extracts session discovery/materialization logic to a dedicated partial file using AgentRunState.
src/Cockpit/Features/Sessions/SessionFeature.cs Wires coordinator into SessionFeature and serializes event processing via Conversation.SyncRoot.
src/Cockpit/Features/Sessions/SessionFeature.Creation.cs Extracts session creation logic into a dedicated partial file using lifecycle state and helpers.
src/Cockpit/Features/Sessions/Models/SessionUiState.cs Adds UI-owned per-session state container.
src/Cockpit/Features/Sessions/Models/SessionStatusEnum.cs Documents SessionStatusEnum as UI-facing, projected status.
src/Cockpit/Features/Sessions/Models/SessionModel.UiCompatibility.cs Adds compatibility forwarding properties for legacy UI fields to Ui.
src/Cockpit/Features/Sessions/Models/SessionModel.LifecycleCompatibility.cs Adds compatibility forwarding properties for legacy lifecycle fields to Lifecycle.
src/Cockpit/Features/Sessions/Models/SessionModel.cs Reshapes SessionModel into grouped sub-states and projects DisplayStatus from pending interactions + lifecycle.
src/Cockpit/Features/Sessions/Models/SessionModel.ConversationCompatibility.cs Adds compatibility forwarding properties for legacy conversation/event fields to Conversation.
src/Cockpit/Features/Sessions/Models/SessionLifecycleState.cs Adds grouped lifecycle state container (SDK state + run state + change flags).
src/Cockpit/Features/Sessions/Models/SessionConversationState.cs Adds grouped conversation state container with immutable snapshot publication helpers.
src/Cockpit/Features/Sessions/Models/AgentRunStateEnum.cs Introduces lifecycle run-state enum distinct from UI-facing status.
src/Cockpit/Features/Sessions/Interactions/SessionInteractionCoordinator.cs Adds centralized coordinator for pending interaction bookkeeping + display-status transitions.
src/Cockpit/Features/Sessions/Interactions/PendingInteractionState.cs Adds session-scoped pending-interaction storage + synchronization root.
src/Cockpit/Features/SessionEvents/SessionEventProcessor.cs Updates reconnect continuation handling to set lifecycle run state to Running.
src/Cockpit/Features/SessionEvents/Handlers/UserMessageHandler.cs Updates user-message handling to set lifecycle run state to Running.
src/Cockpit/Features/SessionEvents/Handlers/ThinkingExhaustedContinuationHandler.cs Updates thinking-exhausted continuation to set lifecycle run state to Running.
src/Cockpit/Features/SessionEvents/Handlers/SessionIdleHandler.cs Updates idle handling to set lifecycle run state and respect Lifecycle.SuppressFinishedNotification.
src/Cockpit/Features/SessionEvents/Handlers/SessionErrorHandler.cs Updates error handling to set lifecycle run state to Error.
src/Cockpit/Features/SessionEvents/Handlers/AssistantTurnStartHandler.cs Updates turn-start handling to set lifecycle run state to Running.
src/Cockpit/Features/Permissions/PermissionFeature.cs Switches permission bookkeeping to SessionInteractionCoordinator and uses Ui.IsYolo for YOLO gating.
src/Cockpit/Features/Models/ModelFeature.Persistence.cs Updates persistence restore logic to set Lifecycle.ModelChanged rather than legacy flags.
src/Cockpit/Features/ElicitationRequests/ElicitationFeature.cs Switches elicitation bookkeeping to SessionInteractionCoordinator.
src/Cockpit/Components/Pages/SessionsPanel/SessionListItem.razor.css Removes per-component status color rules (moved into shared status badge styling).
src/Cockpit/Components/Pages/SessionsPanel/SessionListItem.razor.cs Removes legacy “status class” logic now handled by SessionStatusBadge.
src/Cockpit/Components/Pages/SessionsPanel/SessionListItem.razor Uses SessionStatusBadge + lifecycle SDK state for list item rendering.
src/Cockpit/Components/Pages/ContextPanel/TokenUsagePanel.razor.cs Disables compaction based on lifecycle run state instead of UI-facing status.
src/Cockpit/Components/Pages/ChatPanel/UserInputRequest/UserInputRequestPanel.razor.cs Moves request lookup + response draft text into PendingInteractions and Ui.
src/Cockpit/Components/Pages/ChatPanel/Permissions/PermissionRequestPanel.razor.cs Moves request lookup into PendingInteractions.
src/Cockpit/Components/Pages/ChatPanel/InputArea/SessionModeControl.razor.cs Sets lifecycle “agent mode changed” flag via Lifecycle.
src/Cockpit/Components/Pages/ChatPanel/InputArea/SessionModeControl.razor Disables mode changes based on DisplayStatus + pending permissions.
src/Cockpit/Components/Pages/ChatPanel/InputArea/ModelControl.razor.cs Sets lifecycle “model changed” via Lifecycle and checks display/pending permissions for tooltips.
src/Cockpit/Components/Pages/ChatPanel/InputArea/ModelControl.razor Disables model/reasoning changes based on DisplayStatus and pending permissions.
src/Cockpit/Components/Pages/ChatPanel/InputArea/ChatInputArea.razor.cs Moves draft text, YOLO toggle, and attachment bookkeeping under Ui; uses PendingInteractions for disabling.
src/Cockpit/Components/Pages/ChatPanel/InputArea/ChatInputArea.razor Disables input based on PendingInteractions and uses Ui.IsYolo for the YOLO button.
src/Cockpit/Components/Pages/ChatPanel/InputArea/AttachmentsControl.razor.cs Reads/mutates attachments under Ui.PendingAttachments with its lock.
src/Cockpit/Components/Pages/ChatPanel/InputArea/AgentControl.razor.cs Sets lifecycle “agent changed” flag via Lifecycle.
src/Cockpit/Components/Pages/ChatPanel/InputArea/AgentControl.razor Disables agent changes based on DisplayStatus and pending permissions.
src/Cockpit/Components/Pages/ChatPanel/ElicitationRequest/ElicitationRequestPanel.razor.cs Moves request lookup into PendingInteractions.
src/Cockpit/Components/Pages/ChatPanel/ChatPanel.razor.cs Updates scroll behavior to use conversation snapshots and moves terminal-open state into Ui.
src/Cockpit/Components/Pages/ChatPanel/ChatPanel.razor Uses SessionStatusBadge for header status and Ui.IsTerminalOpen for terminal toggle.
src/Cockpit/Components/Pages/ChatPanel/ChatMessages.razor.cs Uses conversation snapshots to decide initial scroll-to-bottom behavior.
src/Cockpit/Components/Pages/ChatPanel/ChatMessages.razor Renders message history from Conversation.MessagesSnapshot.
src/Cockpit/Components/Controls/SessionStatusVariant.cs Adds a variant enum to render status consistently across header and session list.
src/Cockpit/Components/Controls/SessionStatusPresentation.cs Centralizes presentation mapping for status labels/classes for reuse + testing.
src/Cockpit/Components/Controls/SessionStatusBadge.razor.css Consolidates shared styling for header + list status rendering (including moved list colors).
src/Cockpit/Components/Controls/SessionStatusBadge.razor Adds shared status badge component for header and session list rendering.

_sessionListFeature.NotifyStateChanged();
_toastService.Error("Session Unavailable", opts =>
{
opts.Description = "The session file may be corrupted, incompatible, or in use by another instance. You may need to delete or exit the session running else where";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants