diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css
index 300075b88d..abe0021813 100644
--- a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css
+++ b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css
@@ -250,13 +250,15 @@
}
.settingsArea,
-.footerActions {
+.footerActions,
+.extraActions {
flex: none;
min-width: 0;
width: 100%;
}
-.footerActions {
+.footerActions,
+.extraActions {
display: flex;
}
@@ -265,7 +267,8 @@
}
.collapsed .settingsArea,
-.collapsed .footerActions {
+.collapsed .footerActions,
+.collapsed .extraActions {
display: flex;
justify-content: center;
width: auto;
diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx
index d3fe6a63c1..3e5e338e6f 100644
--- a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx
+++ b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx
@@ -178,8 +178,12 @@ export function SidebarRoot({
})}
- {/* Footer actions stack above Settings in both sidebar widths. */}
+ {/* Footer actions stack above Settings in both sidebar widths; the
+ extra seat (ambient status rows) stacks one level above them. */}
+
+ {renderSlot('sidebar.footer.extra', { wide })}
+
{renderSlot('sidebar.footer.action', { wide })}
diff --git a/packages/client/ui-sidebar/src/client/contract/slots.ts b/packages/client/ui-sidebar/src/client/contract/slots.ts
index a8c4f2894d..a01a4a63c0 100644
--- a/packages/client/ui-sidebar/src/client/contract/slots.ts
+++ b/packages/client/ui-sidebar/src/client/contract/slots.ts
@@ -33,6 +33,13 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
* package's 'sidebar' entry; each action receives only the column state.
*/
'sidebar.footer.action': { kind: 'list'; scope: 'root'; owner: SidebarFooterActionOwnerProps }
+ /**
+ * Additive extra row stacked ABOVE the footer actions (one row above
+ * Settings). Declared by this package's 'sidebar' entry; each entry
+ * receives only the column state. This seat gives ambient status rows a
+ * line of their own instead of displacing the footer actions.
+ */
+ 'sidebar.footer.extra': { kind: 'list'; scope: 'root'; owner: SidebarFooterExtraOwnerProps }
}
}
@@ -62,6 +69,12 @@ export interface SidebarFooterActionOwnerProps {
wide: boolean
}
+/** Owner share of an extra row stacked above the footer actions. */
+export interface SidebarFooterExtraOwnerProps {
+ /** Whether the sidebar renders wide content (false = 56px rail). */
+ wide: boolean
+}
+
/**
* Registrant-private injected share (arrives via the register inject
* factory). The shell keeps only its own controls: starting a Session from
@@ -85,5 +98,5 @@ export type SidebarRootInjected = {
*/
export type SidebarRootComponentProps =
PropsRuntime<'sidebar'>
- & PropsRenderSlots<'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action'>
+ & PropsRenderSlots<'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action' | 'sidebar.footer.extra'>
& SidebarRootInjected & PropsLocale<'sidebar'>
diff --git a/packages/client/ui-sidebar/src/client/index.ts b/packages/client/ui-sidebar/src/client/index.ts
index 0bd2c98295..aa05b73d7d 100644
--- a/packages/client/ui-sidebar/src/client/index.ts
+++ b/packages/client/ui-sidebar/src/client/index.ts
@@ -48,6 +48,7 @@ export function apply(ctx: ClientContext): void {
'sidebar.workspaces': { kind: 'single', scope: 'root' },
'sidebar.settings': { kind: 'single', scope: 'root' },
'sidebar.footer.action': { kind: 'list', scope: 'root' },
+ 'sidebar.footer.extra': { kind: 'list', scope: 'root' },
},
inject: injectProps,
}, SidebarRoot),