Skip to content

Harden dashboard API lifecycle races - #222

Merged
TraderSamwise merged 4 commits into
masterfrom
chore/next-20260622-tui-lifecycle-2
Jun 22, 2026
Merged

Harden dashboard API lifecycle races#222
TraderSamwise merged 4 commits into
masterfrom
chore/next-20260622-tui-lifecycle-2

Conversation

@TraderSamwise

@TraderSamwise TraderSamwise commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add a shared dashboard lifecycle token for API callbacks before they render, flash, or open overlays
  • Validate the project-service endpoint before opening the dashboard SSE stream
  • Gate long-running dashboard mutations, worktree operations, coordination actions, graveyard actions, and background refreshes against stale dashboard state
  • Add regression coverage for delayed service responses after navigation/teardown and stale authoritative refreshes

Verification

  • yarn typecheck
  • yarn lint
  • yarn vitest run src/multiplexer/project-event-stream.test.ts src/multiplexer/runtime-state.test.ts src/multiplexer/dashboard-control.test.ts src/multiplexer/dashboard-ops.test.ts src/multiplexer/worktrees.test.ts src/multiplexer/archives.test.ts src/multiplexer/subscreens.test.ts src/multiplexer/dashboard-view-methods.test.ts
  • yarn vitest run
  • yarn build

Summary by CodeRabbit

Bug Fixes

  • Prevented stale notifications, coordination updates, and dashboard errors from appearing after navigating away from the dashboard.
  • Improved UI reliability during concurrent dashboard operations (route picking, worktree create/remove, graveyard resurrection/deletion), including correct suppression of outdated results.
  • Enhanced error handling and state cleanup when background refresh data is unavailable or when long-running actions complete after the dashboard context changes.

@vercel

vercel Bot commented Jun 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
app Ready Ready Preview, Comment Jun 22, 2026 2:59pm

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Introduces a new src/multiplexer/dashboard-lifecycle.ts module exporting DashboardLifecycleToken, captureDashboardLifecycle, isDashboardLifecycleCurrent, and renderDashboardIfCurrent. These primitives are then applied across all async dashboard flows—control-plane repair, orchestration route picker, session/service mutations, project event streaming, background refresh, coordination/subscreens, worktrees, and graveyard archives—to suppress UI updates when the dashboard context has become stale.

Changes

Dashboard Lifecycle Gating

Layer / File(s) Summary
DashboardLifecycleToken utility module and tests
src/multiplexer/dashboard-lifecycle.ts, src/multiplexer/dashboard-lifecycle.test.ts
New module defining DashboardLifecycleToken interface with mode, inputEpoch, requiresInputEpoch, and screen fields, plus captureDashboardLifecycle, isDashboardLifecycleCurrent, and renderDashboardIfCurrent helpers used by all downstream modules; comprehensive test coverage validates token capture, epoch/screen freshness enforcement, and conditional rendering.
Dashboard control-plane lifecycle gating and resolveCurrentProjectServiceEndpointForDashboard
src/multiplexer/dashboard-control.ts, src/multiplexer/dashboard-control.test.ts
startRuntimeGuardRepair, refreshRuntimeGuard, and showOrchestrationRoutePicker capture lifecycle tokens and gate rendering/error-display on currency; exports new resolveCurrentProjectServiceEndpointForDashboard which validates endpoint freshness by checking projectStateDir alongside pid and ensures control-plane running within timeout; tests cover projectStateDir mismatch recovery, endpoint resolution validation, stale route-picker suppression, and stale repair-error suppression.
Project event stream endpoint resolution and refresh lifecycle gating
src/multiplexer/project-event-stream.ts, src/multiplexer/project-event-stream.test.ts
Dashboard event loop switches to resolveCurrentProjectServiceEndpointForDashboard; refresh-timer callback early-exits when dashboard mode changes; refreshDashboardApiViews captures lifecycle and gates coordination refinement/rendering on currency; applyDashboardAlert early-exits non-dashboard mode preventing footer updates; tests cover dashboard-exit timing, in-flight refresh suppression, control-plane repair on endpoint failure, and alert suppression after mode exit.
Session/service mutation lifecycle gating
src/multiplexer/dashboard-ops.ts, src/multiplexer/dashboard-ops.test.ts
runDashboardSessionMutation and runDashboardServiceMutation capture lifecycle tokens, render conditionally via renderDashboardIfCurrent, and gate success/error UI on lifecycle currency; all test fixtures updated with dashboardInputEpoch: 0 for epoch-based gating validation; new test verifies that advancing epoch during in-flight mutation suppresses stale completion rendering.
Create-pending settlement lifecycle gating
src/multiplexer/dashboard-view-methods.ts, src/multiplexer/dashboard-view-methods.test.ts
settleDashboardCreatePending captures settlement and UI/input-epoch lifecycle snapshots; render only occurs when UI lifecycle is current; async settlement polling early-exits when settlement lifecycle is stale; tests verify mode-change suppression and epoch-advance suppression of settlement rendering.
Background dashboard refresh lifecycle gating
src/multiplexer/runtime-state.ts, src/multiplexer/runtime-state.test.ts
startStatusRefresh captures lifecycle before refreshDashboardModelFromService, gates coordination refinement and view rendering on freshness; test verifies suppression of coordination refresh and dashboard rendering after mode changes during in-flight background refresh.
Coordination UI lifecycle gating
src/multiplexer/coordination.ts, src/multiplexer/notifications.test.ts
showCoordination captures lifecycle before coordination refresh and gates rendering conditionally; applyNotificationMutation captures lifecycle and gates success/error footer updates and re-render on currency; test fixtures updated with dashboardInputEpoch and coordination screen state.
Subscreens and thread-action lifecycle gating
src/multiplexer/subscreens.ts, src/multiplexer/subscreens.test.ts
openRelevantThreadForSession captures lifecycle token and early-exits if stale; refactored refreshCoordinationThreads helper now accepts lifecycle token, gates footer flash and coordination rendering on currency, and returns success/failure boolean; all thread action handlers capture lifecycle tokens and conditionally show errors; tests cover coordination refresh failures, stale-screen suppression during in-flight mutations, and deferred mutation completion with screen changes.
Worktrees mutation and polling lifecycle gating
src/multiplexer/worktrees.ts, src/multiplexer/worktrees.test.ts
runDashboardWorktreeMutation, waitForRenderedDashboardWorktreeState, and waitForRenderedDashboardWorktreeCreate accept lifecycle tokens; create-worktree key handler captures both settle/UI lifecycle tokens and early-exits on stale states; remove-worktree flow captures lifecycle tokens and clears removal job state conditionally in finally block; tests cover pending-state cleanup after mode changes, epoch advances, and deferred mutations with no error suppression.
Graveyard resurrection and deletion lifecycle gating
src/multiplexer/archives.ts, src/multiplexer/archives.test.ts
resurrectGraveyardEntry and deleteSelectedGraveyardWorktree capture lifecycle tokens and early-exit on stale states; forces graveyard refresh with error on snapshot unavailability; delete-confirm state cleared in catch paths; tests cover graveyard-screen-specific failure suppression, post-resurrection refresh failures, delete-confirm cleanup, and stale-screen error suppression.

Sequence Diagram(s)

sequenceDiagram
  participant Caller as Async Action<br/>(mutation, refresh)
  participant captureDashboardLifecycle
  participant AsyncOp as Async Operation<br/>(HTTP, spawn, timer)
  participant isDashboardLifecycleCurrent
  participant UI as UI Update Path<br/>(render, error, flash)

  Caller->>captureDashboardLifecycle: capture(host, opts)
  captureDashboardLifecycle-->>Caller: DashboardLifecycleToken
  Caller->>AsyncOp: start operation
  Note over Caller,AsyncOp: user may navigate away<br/>or advance inputEpoch
  AsyncOp-->>Caller: resolve / reject
  Caller->>isDashboardLifecycleCurrent: check(host, token)
  alt lifecycle still current
    isDashboardLifecycleCurrent-->>Caller: true
    Caller->>UI: renderDashboard /<br/>showDashboardError /<br/>footerFlash
    UI-->>Caller: UI updated
  else lifecycle became stale
    isDashboardLifecycleCurrent-->>Caller: false
    Caller->>Caller: early return
    Note over Caller: no UI update<br/>no stale ghost render
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~65 minutes

Possibly related PRs

  • TraderSamwise/aimux#219: Directly modifies resurrectGraveyardEntry and refreshGraveyardEntriesFromService in src/multiplexer/archives.ts—the same graveyard mutation and refresh code paths that this PR adds lifecycle gating to.
  • TraderSamwise/aimux#221: Modifies startRuntimeGuardRepair in src/multiplexer/dashboard-control.ts with conditional repair verification and error/render behavior, the same function this PR adds lifecycle token capture to.
  • TraderSamwise/aimux#178: Modifies showCoordination and applyNotificationMutation in src/multiplexer/coordination.ts at the same function level where this PR adds lifecycle gating.

Poem

🐇 Hops through async time with care,
A token captured in the air —
"Is this still current?" asks the hare,
If stale, no render — UI stays fair.
No ghost of screens past haunts the view,
The lifecycle knows what's old and new! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.13% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Harden dashboard API lifecycle races' accurately and concisely summarizes the main change—adding lifecycle token validation to prevent stale callbacks from executing during dashboard operations.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/next-20260622-tui-lifecycle-2

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

@TraderSamwise

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@TraderSamwise

Copy link
Copy Markdown
Owner Author

Sub-agent review fixes pushed in 8db3824:\n\n- Fixed runtime guard repair callbacks so internal busy/guard state is cleaned up even when the dashboard lifecycle is stale; stale UI errors/renders remain suppressed.\n- Fixed worktree create settlement so service polling is not cancelled by later dashboard input; only final UI feedback/focus is epoch-gated.\n\nVerification after fixes:\n- yarn vitest run src/multiplexer/dashboard-control.test.ts src/multiplexer/worktrees.test.ts\n- yarn typecheck\n- yarn lint\n- yarn vitest run\n- yarn build

@TraderSamwise

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/multiplexer/dashboard-control.ts (1)

268-302: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Stale repair callbacks still persist runtimeGuardRepairFailedKey before the lifecycle gate.

At Line 300, the stale callback writes runtimeGuardRepairFailedKey before the staleness check at Line 301. Because Line 268 short-circuits future repairs on that key, a stale failure can suppress later valid repair attempts in a new dashboard lifecycle.

Suggested fix
   const fail = (message: string) => {
     if (settled) return;
     settled = true;
     releaseRuntimeGuardRepairLock(lockPath);
     host.runtimeGuardRepairing = false;
-    host.runtimeGuardRepairFailedKey = repairKey;
     if (!isDashboardLifecycleCurrent(host, lifecycle)) return;
+    host.runtimeGuardRepairFailedKey = repairKey;
     showRuntimeGuardRepairFailure(host, "Aimux repair failed", message);
   };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/multiplexer/dashboard-control.ts` around lines 268 - 302, The fail
callback function is assigning host.runtimeGuardRepairFailedKey before the
lifecycle staleness check at isDashboardLifecycleCurrent, causing stale
callbacks to persist state that blocks future repairs. Move the line
host.runtimeGuardRepairFailedKey = repairKey to occur after the if
(!isDashboardLifecycleCurrent(host, lifecycle)) return check so that only
callbacks from the current lifecycle can update this state and affect future
repair attempts.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/multiplexer/archives.ts`:
- Line 161: The lifecycle guard on line 161 in the isDashboardLifecycleCurrent
check is using the current host.mode instead of the origin mode from the
captured lifecycle token. Change the condition from checking host.mode ===
"dashboard" to checking lifecycle.mode === "dashboard" to ensure the gate is
based on the operation's original mode, not the current mode. Apply the same fix
to line 179 to ensure consistent lifecycle mode checking across both locations
and prevent stale-flow leaks and improper error suppression.

In `@src/multiplexer/dashboard-lifecycle.ts`:
- Around line 26-33: The lifecycle check function implements fail-open behavior
when host capabilities are missing, which bypasses the gating that callers opted
into. When token.screen is defined (indicating the caller requires screen
gating), the function should return false if the host lacks the capability to
verify it, rather than defaulting to true. Refactor the screen validation logic
in this function to ensure that if token.screen is provided and the host cannot
be verified to match that screen (via host.isDashboardScreen function,
host.dashboardState?.isScreen method, or host.dashboardState?.screen property),
the check returns false instead of true, ensuring fail-closed behavior for
opted-in guards.
- Around line 1-41: The source file changes to captureDashboardLifecycle,
isDashboardLifecycleCurrent, and renderDashboardIfCurrent functions modify
runtime behavior but the dist/ directory has not been regenerated. Per
repository policy, runtime behavior changes in src/**/*.ts files require
regenerating the compiled TypeScript output in dist/ and committing it alongside
source changes. Run yarn build to regenerate the dist/ directory output from
these TypeScript source modifications, then include the generated dist/ files in
the PR commit.

In `@src/multiplexer/project-event-stream.ts`:
- Around line 50-51: The await call to
resolveCurrentProjectServiceEndpointForDashboard lacks error handling and can
crash the entire dashboard stream loop if endpoint resolution fails during
control-plane operations. Wrap the endpoint resolution await call in a try/catch
block to gracefully handle any rejections from
resolveCurrentProjectServiceEndpointForDashboard, allowing the loop to recover
and retry instead of terminating.

In `@src/multiplexer/subscreens.ts`:
- Around line 51-56: The lifecycle token captured by captureDashboardLifecycle
in the block containing the refreshCoordinationFromService logic does not
include the screen property, allowing the lifecycle check to pass even when the
dashboard screen changes while the input epoch remains the same. Add the screen
property to the options object passed to captureDashboardLifecycle (alongside
inputEpoch: true) so that the subsequent isDashboardLifecycleCurrent check can
properly detect screen changes and prevent the async continuation from executing
coordination side effects on outdated screen contexts.

---

Outside diff comments:
In `@src/multiplexer/dashboard-control.ts`:
- Around line 268-302: The fail callback function is assigning
host.runtimeGuardRepairFailedKey before the lifecycle staleness check at
isDashboardLifecycleCurrent, causing stale callbacks to persist state that
blocks future repairs. Move the line host.runtimeGuardRepairFailedKey =
repairKey to occur after the if (!isDashboardLifecycleCurrent(host, lifecycle))
return check so that only callbacks from the current lifecycle can update this
state and affect future repair attempts.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a74c2691-71c7-4087-96d3-788550039cb7

📥 Commits

Reviewing files that changed from the base of the PR and between e2d0752 and ff48a5a.

📒 Files selected for processing (19)
  • src/multiplexer/archives.test.ts
  • src/multiplexer/archives.ts
  • src/multiplexer/coordination.ts
  • src/multiplexer/dashboard-control.test.ts
  • src/multiplexer/dashboard-control.ts
  • src/multiplexer/dashboard-lifecycle.ts
  • src/multiplexer/dashboard-ops.test.ts
  • src/multiplexer/dashboard-ops.ts
  • src/multiplexer/dashboard-view-methods.test.ts
  • src/multiplexer/dashboard-view-methods.ts
  • src/multiplexer/notifications.ts
  • src/multiplexer/project-event-stream.test.ts
  • src/multiplexer/project-event-stream.ts
  • src/multiplexer/runtime-state.test.ts
  • src/multiplexer/runtime-state.ts
  • src/multiplexer/subscreens.test.ts
  • src/multiplexer/subscreens.ts
  • src/multiplexer/worktrees.test.ts
  • src/multiplexer/worktrees.ts

Comment thread src/multiplexer/archives.ts Outdated
Comment thread src/multiplexer/dashboard-lifecycle.ts
Comment thread src/multiplexer/dashboard-lifecycle.ts Outdated
Comment thread src/multiplexer/project-event-stream.ts Outdated
Comment thread src/multiplexer/subscreens.ts Outdated
@TraderSamwise

Copy link
Copy Markdown
Owner Author

Second sub-agent review fixes pushed in 65c6f37:\n\n- Split settlement lifecycle from UI lifecycle for worktree graveyard and pending-create settlement. Later dashboard input no longer prematurely clears pending creates/removals.\n- Strengthened project-service endpoint validation to require the health response projectStateDir to match the current project.\n- Kept non-dashboard graveyard resurrection failures visible while guarding dashboard graveyard delete/resurrect UI after stale navigation.\n\nVerification after fixes:\n- yarn vitest run src/multiplexer/dashboard-control.test.ts src/multiplexer/worktrees.test.ts src/multiplexer/dashboard-view-methods.test.ts src/multiplexer/archives.test.ts\n- yarn typecheck\n- yarn lint\n- yarn vitest run\n- yarn build

@TraderSamwise

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@TraderSamwise

Copy link
Copy Markdown
Owner Author

Sub-agent orphan finding resolved in 0ded6b8: graveyard worktree delete now mirrors resurrection stale-snapshot recovery by forcing a graveyard refresh and dashboard model refresh after reporting the error. The other sub-agent finding overlapped the CodeRabbit SSE endpoint-resolution thread fixed in the same commit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
src/multiplexer/worktrees.test.ts (2)

641-644: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Assert stale removal-job cleanup directly.

Please add expect(host.worktreeRemovalJob).toBeNull() in this stale-input case so the test also protects the .finally lifecycle cleanup path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/multiplexer/worktrees.test.ts` around lines 641 - 644, The test case for
the stale-input scenario is missing an assertion to verify that the worktree
removal job cleanup is properly executed. Add an expect statement after the
existing assertions in this test block to verify that host.worktreeRemovalJob is
null, ensuring the .finally lifecycle cleanup path is protected and properly
nullifies the removal job reference.

204-212: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Strengthen stale-epoch create assertions to validate UI suppression explicitly.

This case proves settlement continues, but it doesn’t explicitly verify that stale post-settle UI updates are suppressed after dashboardInputEpoch changes.

Proposed assertion update
     handleWorktreeInputKey(host, Buffer.from("\r"));
     await vi.waitFor(() => expect(postToProjectService).toHaveBeenCalledOnce());
+    host.dashboardState.focusedWorktreePath = "/repo/.aimux/worktrees/existing";
     host.dashboardInputEpoch = 1;
     resolveCreate();

     await vi.waitFor(() => expect(pending.state.get("worktree:/repo/.aimux/worktrees/demo")).toBeNull());
     expect(host.dashboardWorktreeGroupsCache[0]).toMatchObject({ name: "demo", branch: "demo" });
-    expect(host.dashboardState.focusedWorktreePath).toBe("/repo/.aimux/worktrees/demo");
+    expect(host.dashboardState.focusedWorktreePath).toBe("/repo/.aimux/worktrees/existing");
+    expect(host.dashboardUiStateStore.markSelectionDirty).not.toHaveBeenCalled();
     expect(host.showDashboardError).not.toHaveBeenCalled();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/multiplexer/worktrees.test.ts` around lines 204 - 212, The test proves
that settlement continues after the dashboardInputEpoch changes, but it does not
explicitly verify that stale UI updates are suppressed. Add explicit assertions
between the dashboardInputEpoch assignment and after resolveCreate() that
validate UI update methods (such as dashboard state modifications or UI callback
functions) are not invoked by the stale post-settle operations, ensuring that
the epoch change successfully suppresses outdated updates from completing
promises.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/multiplexer/worktrees.test.ts`:
- Around line 641-644: The test case for the stale-input scenario is missing an
assertion to verify that the worktree removal job cleanup is properly executed.
Add an expect statement after the existing assertions in this test block to
verify that host.worktreeRemovalJob is null, ensuring the .finally lifecycle
cleanup path is protected and properly nullifies the removal job reference.
- Around line 204-212: The test proves that settlement continues after the
dashboardInputEpoch changes, but it does not explicitly verify that stale UI
updates are suppressed. Add explicit assertions between the dashboardInputEpoch
assignment and after resolveCreate() that validate UI update methods (such as
dashboard state modifications or UI callback functions) are not invoked by the
stale post-settle operations, ensuring that the epoch change successfully
suppresses outdated updates from completing promises.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b57876dc-7af9-4cec-b5b1-f3bc47902c71

📥 Commits

Reviewing files that changed from the base of the PR and between ff48a5a and 0ded6b8.

📒 Files selected for processing (16)
  • src/multiplexer/archives.test.ts
  • src/multiplexer/archives.ts
  • src/multiplexer/dashboard-control.test.ts
  • src/multiplexer/dashboard-control.ts
  • src/multiplexer/dashboard-lifecycle.test.ts
  • src/multiplexer/dashboard-lifecycle.ts
  • src/multiplexer/dashboard-ops.test.ts
  • src/multiplexer/dashboard-view-methods.test.ts
  • src/multiplexer/dashboard-view-methods.ts
  • src/multiplexer/notifications.test.ts
  • src/multiplexer/project-event-stream.test.ts
  • src/multiplexer/project-event-stream.ts
  • src/multiplexer/subscreens.test.ts
  • src/multiplexer/subscreens.ts
  • src/multiplexer/worktrees.test.ts
  • src/multiplexer/worktrees.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • src/multiplexer/project-event-stream.ts
  • src/multiplexer/dashboard-view-methods.ts
  • src/multiplexer/project-event-stream.test.ts
  • src/multiplexer/subscreens.ts
  • src/multiplexer/archives.ts
  • src/multiplexer/dashboard-control.ts
  • src/multiplexer/worktrees.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant