Replies: 3 comments
|
Hi @imccyu — sorry for the ping. This proposal is currently blocking a real third-party plugin use case around adding global navigation/page surfaces without replacing shipped UI. Since you've recently worked on the client slot/layout architecture, I'd appreciate any guidance on whether this direction fits the intended extension model. Thanks! |
Concrete case: returning from a plugin page to native conversation UIWe are building a workflow plugin that uses the public Opening and disposing the custom page already works. The missing part is reliably returning to the native conversation UI when the user clicks an existing Session or New Session in the native sidebar. On
These actions may leave the observable Session state unchanged. General Session-list notifications are also unsuitable because they include background data updates that are unrelated to user navigation. Our current fallback is to listen for clicks on specific native DOM elements and dispose our Would it be possible to expose a public navigation event or service that lets plugins observe native actions such as:
including cases where the navigation target or Session state does not change? We do not have a strong preference between an event-based API and a navigation service and would be happy to follow the project's architectural direction. The key requirement is to distinguish user navigation intent from background Session data updates. If a supported mechanism already exists, a complete example covering entry into a custom main page, exit through native navigation, and cleanup when the plugin unloads would be very helpful. We can provide a minimal reproduction plugin and concrete acceptance cases if useful. |
Related discussion map and a possible convergence pointTo avoid losing earlier community work, we searched the titles and bodies of all 5,767 Discussions currently available in this repository (58 pages, including 167 closed Discussions; scan date: 2026-09-07). The following is the set that appears materially related to root-level plugin pages, native navigation, Session/view selection, or the lack of a public action that drives an existing UI slot. 1. Root navigation and plugin-owned pages
These proposals differ in layout, but they share the same underlying need: a plugin needs a supported top-level destination whose selection and lifecycle are coordinated by the host. 2. Session and conversation-view navigation
These threads mostly cover plugin-initiated navigation. The concrete case added above covers the opposite direction: the user performs native navigation and the plugin page must yield to the native Conversation surface, including when the target Session is unchanged. 3. Multi-Session presentation and renderer ownership
These are broader than a single root page, but they reinforce the need to model visible/focused surfaces explicitly instead of deriving presentation solely from the current Session ID. 4. Adjacent examples of “registration exists, control is missing”
Shared gapAcross these Discussions, the rendering seam and the navigation/control seam are often separated. A plugin may be able to register content, but still cannot reliably:
That leaves plugins choosing among DOM observation, private stores/components, or replacement of a much larger shell surface. A possible minimal contract for convergenceThe exact API shape can follow the maintainers’ architecture, but a complete contract appears to need these behaviors:
This could be expressed as a Based on the scan, no referenced Discussion currently documents a public API covering that complete lifecycle. #4069 therefore looks like a useful place to consolidate the requirement and eventually record the recommended solution. If another thread or implementation already provides it, linking it here would help plugin authors converge on the supported path. |
Uh oh!
There was an error while loading. Please reload this page.
Summary
Plugins today can register many additive surfaces inside a session (header rows, composer chrome, message actions, per-session views) and one frame-wide
shell.overlay.There is currently no supported contract for a workspace-independent global navigation entry plus a global page.
A plugin that needs its own top-level destination — for example a task manager, search surface, reports page, or other workspace-independent view — has no natural place in the Harness shell.
This is a capability request for the generic extension model, not a request for any single plugin. It comes from building a real third-party plugin and finding no supported surface for this class of UI.
Problem
The sidebar column (
SidebarRoot) is currently composed approximately as:There is no additive seat between New Session and the workspace region.
The existing additive sidebar surfaces are primarily:
sidebar.brand.marksidebar.brand.namesidebar.footer.actionsidebar.footer.actionrenders below the workspace region, so it does not represent a primary global-navigation location.Separately, top-level selection is currently centered around
SessionListState.current: SessionId | undefined, together with session-scopedconversation.viewentries.There is no root-scoped third-party global page/view registry.
As a result, a destination that is neither a Conversation nor a Workspace cannot be represented through the current supported plugin contracts.
Source evidence
Relevant areas in the current source:
packages/client/ui-sidebar/src/client/SidebarRoot.tsxsidebar.workspacespackages/client/ui-sidebar/src/client/contract/slots.tssidebar.workspacesis a root-scopedsingleslotsidebar.footer.actionis a root-scopedlistslotpackages/client/runtime/src/client/sessions/service.tspackages/client/runtime/src/client/sessions/manager.tspackages/client/ui-conversation/src/client/contract/slots.tsconversation.viewis session-scoped rather than globalCandidate navigation contract
One small, backward-compatible extension could be a new root-scoped list slot between New Session and
sidebar.workspaces, for example:The exact name and owner shape are only suggestions.
It could use the existing slot-registration model:
This would reuse existing slot behavior for deterministic ordering and automatic cleanup when a plugin unloads.
Useful properties for an entry would include:
orderGlobal page design question
The navigation entry is only half of the problem: clicking it needs to open a real global surface.
The Harness does not currently appear to expose a root-scoped global page/view registry.
I would appreciate maintainer guidance on how such a surface should integrate with the existing navigation model.
Questions that seem important:
SessionListState.current?An illustrative model might look like:
plus some root-level selected-page state.
This is only intended to make the discussion concrete — not as a prescriptive API proposal.
Backward compatibility
Ideally this could be introduced additively:
sidebar.workspacessidebar.footer.actionsidebar.settingsExample use cases
This capability could support more than one plugin or product feature, for example:
A workspace-independent scheduled-tasks surface is one real example that motivated this investigation, but the requested capability is intentionally generic.
Questions for maintainers
listslot between New Session andsidebar.workspacesfit the intended extension model?sidebar.navigationfit the project's slot naming conventions?I couldn't find an existing public discussion, issue, or PR covering this. If this is already being discussed elsewhere or internally, please point me to the relevant direction.
All reactions