Skip to content

Move pending approval derivation and thread visit tracking to shared session logic#16

Merged
juliusmarminge merged 2 commits intomainfrom
codething/68f0e731
Feb 13, 2026
Merged

Move pending approval derivation and thread visit tracking to shared session logic#16
juliusmarminge merged 2 commits intomainfrom
codething/68f0e731

Conversation

@juliusmarminge
Copy link
Copy Markdown
Member

@juliusmarminge juliusmarminge commented Feb 13, 2026

Summary

  • Moved pending-approval derivation out of ChatView into shared apps/web/src/session-logic.ts and added a dedicated PendingApproval type.
  • Added derivePendingApprovals tests to cover request, decision, and turn-completion clearing behavior.
  • Added lastVisitedAt to thread persistence (persistenceSchema.ts) and threaded it through hydration/serialization round-trip.
  • Updated sidebar threading status UX to support richer states (Working, Connecting, Completed, Awaiting response) and derive completion visibility from latestTurnCompletedAt vs lastVisitedAt.
  • Updated state reducer behavior so selecting a thread and completing the active thread mark it as visited (including persisted defaulting on import/create).
  • Removed duplicated approval derivation helpers from ChatView and switched to derived session-logic path.

Testing

  • Added tests in apps/web/src/session-logic.test.ts for derivePendingApprovals.
  • Added tests in apps/web/src/persistenceSchema.test.ts for lastVisitedAt hydration/persistence.
  • Added tests in apps/web/src/store.test.ts for active-thread visit updates and completion-seen timestamps.
  • Not run: lint/test command not executed in this context.

Open with Devin

Summary by CodeRabbit

  • New Features

    • Sidebar now shows richer status pills (colored label, dot, pulse) including an “Awaiting response” state for threads with pending approvals.
  • Bug Fixes

    • Thread visit and completion visibility improved: visits and completed turns are tracked so active threads show as seen.
  • Refactor

    • Approval derivation and persistence of thread visit timestamps centralized for more consistent UI behavior.

- Moved pending-approval extraction to `session-logic` and reused it in `Sidebar` status rendering
- Added `lastVisitedAt` threading persistence through schema, types, hydrate/serialize paths, and tests
- Updated sidebar thread pills for completed/approval states and pulsing working status
- Marked active thread visits and completion visibility timestamps on selection and `turn/completed`
- Co-authored-by: codex <codex@users.noreply.github.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 13, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

Adds thread visit-time tracking, moves pending-approval derivation into session-logic as a shared exported function, and replaces Sidebar's status label with a pill-based status UI; updates store and persistence to surface and persist lastVisitedAt, plus tests for these behaviors.

Changes

Cohort / File(s) Summary
Approval handling & session logic
apps/web/src/session-logic.ts, apps/web/src/session-logic.test.ts, apps/web/src/components/ChatView.tsx
Introduced exported derivePendingApprovals and PendingApproval interface in session-logic. Removed local approval helpers/typing from ChatView; ChatView now imports and uses derivePendingApprovals. Tests added/updated to cover pending-approval derivation.
Sidebar status UI
apps/web/src/components/Sidebar.tsx
Replaced simple status label with a data-driven ThreadStatusPill system and helpers (hasUnseenCompletion, threadStatusPill). Added per-thread memoized mapping of pending approvals and updated rendering to show colored pill, dot, pulse, and label states (e.g., “Awaiting response”).
Thread visit-time tracking (store & persistence)
apps/web/src/types.ts, apps/web/src/store.ts, apps/web/src/store.test.ts, apps/web/src/persistenceSchema.ts, apps/web/src/persistenceSchema.test.ts, apps/web/src/persistenceSchema.test.ts
Added optional lastVisitedAt?: string to Thread. Store initializes/updates lastVisitedAt on ADD_THREAD, SET_ACTIVE_THREAD, and when a turn/completed event applies to the active thread. Persistence schema and hydration now include lastVisitedAt. Tests added/updated to assert visit-time behavior and persisted shape.
Miscellaneous UI tweak
apps/web/src/components/ChatView.tsx
Removed terminal shortcut hint logic and related UI usage.

Sequence Diagram(s)

sequenceDiagram
    participant Provider as Provider (events)
    participant Store as Store (state)
    participant Session as session-logic
    participant UI as Sidebar / ChatView

    Provider->>Store: append events to thread.events
    Store->>Session: expose thread.events (derive)
    Session->>Session: derivePendingApprovals(events)
    Session-->>Store: pending approvals (derived)
    Store->>UI: expose pendingApprovalByThreadId and thread data
    UI->>UI: render ThreadStatusPill / pending approvals list
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.14% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main refactoring: moving pending approval logic to shared session-logic and adding thread visit tracking.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codething/68f0e731

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Feb 13, 2026

Greptile Overview

Greptile Summary

Moved pending approval derivation logic from ChatView into shared session-logic.ts module and added lastVisitedAt thread tracking for improved UI state management.

  • Centralized derivePendingApprovals function with enhanced logic that clears pending approvals on turn/completed events (improvement over original implementation)
  • Added lastVisitedAt timestamp to Thread interface with full persistence support and test coverage
  • Updated Sidebar with richer thread status indicators: "Working", "Connecting", "Completed", and "Awaiting response" states
  • Implemented automatic lastVisitedAt updates on thread selection and turn completion for active threads
  • Removed code duplication from ChatView and unused terminalShortcutHint variable
  • All changes include comprehensive test coverage for derivation logic, persistence round-trips, and state reducer behavior

Confidence Score: 5/5

  • This PR is safe to merge with high confidence
  • Well-structured refactoring with comprehensive test coverage, proper type safety, and logical improvements to approval clearing behavior. All changes follow established patterns and maintain backward compatibility through optional field handling.
  • No files require special attention

Important Files Changed

Filename Overview
apps/web/src/session-logic.ts Added derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.ts Added lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.ts Updated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsx Enhanced thread status pills with richer states (Awaiting response, Completed) based on pending approvals and unseen completion tracking

Sequence Diagram

sequenceDiagram
    participant User
    participant Sidebar
    participant Store
    participant Thread
    participant SessionLogic

    User->>Sidebar: Select thread
    Sidebar->>Store: SET_ACTIVE_THREAD
    Store->>Thread: Update lastVisitedAt (current timestamp)
    
    User->>ChatView: Send message / Turn starts
    ChatView->>Store: APPLY_EVENT (turn/started)
    Store->>Thread: Add event, update session status
    
    Note over Thread,SessionLogic: During turn execution
    ChatView->>Store: APPLY_EVENT (approval request)
    Store->>Thread: Add approval request event
    
    Sidebar->>SessionLogic: derivePendingApprovals(thread.events)
    SessionLogic-->>Sidebar: Returns pending approvals
    Sidebar->>Sidebar: Show "Awaiting response" pill
    
    User->>ChatView: Approve/Deny action
    ChatView->>Store: APPLY_EVENT (decision)
    Store->>Thread: Add decision event
    
    Note over Thread,SessionLogic: Turn completes
    ChatView->>Store: APPLY_EVENT (turn/completed)
    Store->>Thread: Update latestTurnCompletedAt
    Store->>Thread: Update lastVisitedAt (active thread only)
    
    Sidebar->>SessionLogic: derivePendingApprovals(thread.events)
    SessionLogic->>SessionLogic: Clear pending on turn/completed
    SessionLogic-->>Sidebar: Returns empty array
    
    Sidebar->>Sidebar: Check hasUnseenCompletion
    Note over Sidebar: completedAt > lastVisitedAt
    Sidebar->>Sidebar: Show "Completed" pill (if inactive)
    
    User->>Sidebar: Select thread again
    Sidebar->>Store: SET_ACTIVE_THREAD
    Store->>Thread: Update lastVisitedAt
    Sidebar->>Sidebar: Hide "Completed" pill
Loading

Last reviewed commit: 1b7abe5

@macroscopeapp
Copy link
Copy Markdown
Contributor

macroscopeapp bot commented Feb 13, 2026

Move pending approval derivation to apps/web/src/session-logic.ts and add thread visit tracking with lastVisitedAt used by Sidebar status pills in Sidebar.tsx

Introduce derivePendingApprovals in session-logic and update Sidebar to render status pills based on pending approvals, session state, and unseen completions; add lastVisitedAt to Thread, persist it, hydrate it, and update it on thread activation and turn completion.

📍Where to Start

Start with derivePendingApprovals and related helpers in session-logic.ts, then review status pill rendering in Sidebar.tsx and lastVisitedAt handling in store.ts.


Macroscope summarized cab54fe.

@juliusmarminge juliusmarminge merged commit 057770e into main Feb 13, 2026
2 of 3 checks passed
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.

1 participant