diff --git a/apps/desktop/src/renderer/styles/sidebar.css b/apps/desktop/src/renderer/styles/sidebar.css
index 1b64c4c435..4ad00614c1 100644
--- a/apps/desktop/src/renderer/styles/sidebar.css
+++ b/apps/desktop/src/renderer/styles/sidebar.css
@@ -190,6 +190,7 @@
}
.maka-session-row {
+ position: relative;
min-width: 0;
-webkit-app-region: no-drag;
}
@@ -267,6 +268,22 @@
min-height: var(--h-control-sm, 24px);
}
+/* SideNavItem owns the row button and only supports non-interactive
+ * endContent. The action menu occupies the reserved trailing slot visually,
+ * but remains its sibling in the DOM so neither control contains the other. */
+.maka-session-row-action {
+ position: absolute;
+ inset-block-start: calc(
+ (var(--size-element-md) - var(--size-element-sm)) / 2
+ );
+ inset-inline-end: var(--space-2);
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--h-control-sm, 24px);
+}
+
.maka-session-row-trailing-spacer {
display: block;
width: 8px;
diff --git a/packages/ui/src/__tests__/session-history-row-actions.test.tsx b/packages/ui/src/__tests__/session-history-row-actions.test.tsx
new file mode 100644
index 0000000000..254a9fa362
--- /dev/null
+++ b/packages/ui/src/__tests__/session-history-row-actions.test.tsx
@@ -0,0 +1,45 @@
+import assert from 'node:assert/strict';
+import test from 'node:test';
+import { renderToStaticMarkup } from 'react-dom/server';
+import type { SessionSummary } from '@maka/core/session';
+import { LocaleProvider } from '../locale-context.js';
+import { SessionHistoryList, type SessionRowActions } from '../session-history-list.js';
+
+const session: SessionSummary = {
+ id: 'session-1',
+ name: 'Release notes',
+ isFlagged: false,
+ isArchived: false,
+ labels: [],
+ hasUnread: false,
+ status: 'active',
+ backend: 'ai-sdk',
+ llmConnectionSlug: 'test-connection',
+ connectionLocked: true,
+ model: 'test-model',
+ permissionMode: 'ask',
+};
+
+const rowActions: SessionRowActions = {
+ onToggleFlag: () => undefined,
+ onArchive: () => undefined,
+ onUnarchive: () => undefined,
+ onRename: () => undefined,
+ onDelete: () => undefined,
+};
+
+test('renders session navigation and row actions as sibling controls', () => {
+ const markup = renderToStaticMarkup(
+
+ undefined}
+ rowActions={rowActions}
+ />
+ ,
+ );
+
+ assert.equal((markup.match(/