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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

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

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

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

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

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe 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 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

FilenameOverview
apps/web/src/session-logic.tsAdded derivePendingApprovals function and PendingApproval type, moved from ChatView with improved logic to clear approvals on turn completion
apps/web/src/persistenceSchema.tsAdded lastVisitedAt to persisted thread schema and hydration/serialization logic with proper optional handling
apps/web/src/store.tsUpdated reducer to set lastVisitedAt on thread selection and turn completion for active thread, defaults to createdAt on thread creation
apps/web/src/components/Sidebar.tsxEnhanced 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

macroscopeappBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

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 mainFeb 13, 2026
2 of 3 checks passed
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 2, 2026
Sign up for freeto 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

@juliusmarminge