Skip to content

fix(dashboard): render the sidebar and footer plugin slots declared in slots.ts (#76381) - #76488

Open
spfcraze wants to merge 1 commit into
NousResearch:mainfrom
spfcraze:fix/pluginslot-shell-renders
Open

spfcraze wants to merge 1 commit into
NousResearch:mainfrom
spfcraze:fix/pluginslot-shell-renders

Conversation

@spfcraze

@spfcraze spfcraze commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

KNOWN_SLOT_NAMES declares and extending-the-dashboard.md documents ten shell slots, but App.tsx rendered only seven — plugins targeting sidebar, footer-left, or footer-right mounted into nothing (silent no-op), including Nous's own strike-freedom-cockpit example. Render footer-left/footer-right in SidebarFooter with the default cells (version, org link) as PluginSlot fallbacks so plugin content replaces them exactly as documented, and render the sidebar slot in the shell rail only when layoutVariant === 'cockpit'. Fixes #76381.

Related Issue

#76381

Changes Made

  • fix/pluginslot-shell-renders — 4 file(s) changed vs base:
    • web/src/App.tsx
    • web/src/components/CockpitSidebarSlot.tsx
    • web/src/components/SidebarFooter.tsx
    • web/src/plugins/shell-slots.test.tsx

web/src/components/SidebarFooter.tsx: both cells wrapped in PluginSlot with the original content as fallback (replaces-default semantics per the docs). web/src/components/CockpitSidebarSlot.tsx (new): the cockpit-only rule extracted so it is testable without mounting the full App shell. web/src/App.tsx: rail renders CockpitSidebarSlot after the nav. web/src/plugins/shell-slots.test.tsx (new): 6 vitest tests via renderToStaticMarkup (node env, no jsdom) — fallback cells render, plugin content replaces each footer cell, sidebar renders only in cockpit, nothing when unclaimed.

How to Test

Validation completed (recorded by prp):

  1. Sabotage check: not applicable to this change class (non-pytest) — manual verification recorded: vitest (node22, web/): base leg test-file fails (missing CockpitSidebarSlot + 2 footer fallback assertions), head leg 6/6 pass — RAN both directions on the real tree
  2. Vitest (node 22, web/): 6/6 pass. Sabotage verified manually both directions — the test file fails on pre-fix main (missing CockpitSidebarSlot + footer fallback assertions), 6/6 pass with the fix (recorded via prp sabotage --waive; TS-only change, no pytest pin exists). Python-side gates: seams no call-target changes, claims CLEAR, docs CLEAR. Stage 0: high-confidence UNCLAIMED via swarm + prp dupcheck (closest neighbors feat(dashboard): reskin extension points for themes and plugins #14776 origin PR, feat(dashboard): add sessions:overview-top plugin slot #44825 page-scoped slot, fix(desktop): keep fuller pending assistant over empty inflight shell #75967 desktop reconciler — none render these slots). Full repo-wide Python suite NOT run (TS-only change; CI owns it).
  3. Duplicate check: 47 potential matches reviewed — none covers this change.
  4. The full repo-wide suite was not run for this change; GitHub CI owns full-suite validation.

Logs

Sabotage verification:

# not applicable to this change class (non-pytest).
# Manual verification performed: vitest (node22, web/): base leg test-file fails (missing CockpitSidebarSlot + 2 footer fallback assertions), head leg 6/6 pass — RAN both directions on the real tree

…n slots.ts (NousResearch#76381)

KNOWN_SLOT_NAMES declares and extending-the-dashboard.md documents ten
shell slots, but App.tsx rendered only seven — plugins targeting
sidebar, footer-left, or footer-right mounted into nothing (silent
no-op), including Nous's own strike-freedom-cockpit example.

Render footer-left/footer-right in SidebarFooter with the default cells
(version, org link) as PluginSlot fallbacks so plugin content replaces
them exactly as documented, and render the sidebar slot in the shell
rail only when layoutVariant === 'cockpit' (extracted as
CockpitSidebarSlot so the rule is testable).

Tests (web/src/plugins/shell-slots.test.tsx, vitest +
renderToStaticMarkup, no jsdom): default cells render as fallback,
plugin content replaces each footer cell, sidebar slot renders plugin
content only in the cockpit variant, nothing when unclaimed. Verified
both directions on the real tree: the file fails on pre-fix main
(missing component + footer assertions), 6/6 pass with the fix.
@alt-glitch alt-glitch added type/bug Something isn't working P3 Low — cosmetic, nice to have comp/dashboard Web dashboard / control panel UI (dashboard/, landing) comp/plugins Plugin system and bundled plugins labels Aug 2, 2026
@teknium1

teknium1 commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the focused dashboard-plugin fix. Verified against current main (baec57de6653): web/src/plugins/slots.ts:67-71 and website/docs/user-guide/features/extending-the-dashboard.md:585-589 declare/document these three slots, while web/src/App.tsx:523-819 renders only the other seven shell slots and web/src/components/SidebarFooter.tsx:17-34 has no footer-slot wrappers.

The PR's PluginSlot fallbacks preserve the existing footer cells, and CockpitSidebarSlot implements the documented cockpit-only condition. The regression tests exercise the real components and registry through static rendering. GitHub reports the head cleanly mergeable after main advanced five commits.

Automated hermes-sweeper review.

@teknium1 teknium1 added sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform labels Aug 2, 2026
@GottZ

GottZ commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

This was generated by AI during triage.

Summary

One PR addresses issue #76381. #76488 adds all three missing shell render points: footer slots wrap the existing cells as fallbacks, while the sidebar slot is mounted only for the documented cockpit layout.

Related pull requests

  • fix(dashboard): render the sidebar and footer plugin slots declared in slots.ts (#76381) #76488 best fix — (+133/-17) — keep open with a salvage path: The diff directly fixes the silent no-render cause by adding footer-left and footer-right PluginSlot wrappers in SidebarFooter and mounting sidebar through a cockpit-only component in App.tsx. Its six regression tests cover fallback preservation, plugin replacement, and cockpit-only rendering, consistent with the maintainer-bot keep_open review.

Suggested consolidation

Keep #76488 open with the complete three-slot implementation and focused regression suite as the salvage path. It is the only PR in this complex, directly addresses every missing render point reported by #76381, and has no competing or duplicate PRs to close.

Complex graph

flowchart LR
    classDef open fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a
    classDef merged fill:#dcfce7,stroke:#15803d,color:#14532d
    classDef closed fill:#e5e7eb,stroke:#6b7280,color:#1f2937
    classDef unverified fill:#f3f4f6,stroke:#9ca3af,color:#374151
    classDef best stroke-width:3px,stroke:#b45309
    classDef target stroke-width:3px,stroke:#4338ca
    I76381(["issue #76381 (open)"])
    P76488["PR #76488 (open)"]
    P76488 -->|best fix| I76381
    class I76381 open
    class P76488 open
    class P76488 best
    class P76488 target
    click I76381 "https://github.com/NousResearch/hermes-agent/issues/76381"
    click P76488 "https://github.com/NousResearch/hermes-agent/pull/76488"
Loading

Graph: solid arrow = fixes / best fix, dashed arrow = partial or unverified (see edge label); boxed group = PRs duplicating each other; amber border = best fix; indigo border = target; gray node = closed (state tag in the node label).

Cross-PR triage: Reviewed 1 pull request and 1 issue in this complex. Each diff was read against this issue; Assessment working set: 8 kB of PR diffs, 4 kB of issue/PR text, <1 kB of discussion (2 comments), 2 verify verdicts. verdicts reflect diff content, not PR titles. Part of an automated triage batch.

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

Labels

comp/dashboard Web dashboard / control panel UI (dashboard/, landing) comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

sidebar/footer-* PluginSlot names declared+documented but never rendered in App.tsx

4 participants