diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx
index 5b9223b5eebc..05b17a1309ea 100644
--- a/packages/app/src/app.tsx
+++ b/packages/app/src/app.tsx
@@ -28,7 +28,7 @@ import {
Show,
} from "solid-js"
import { Dynamic } from "solid-js/web"
-import { CommandProvider } from "@/context/command"
+import { CommandProvider, useCommand, type CommandOption } from "@/context/command"
import { CommentsProvider } from "@/context/comments"
import { FileProvider } from "@/context/file"
import { ServerSDKProvider, useServerSDK } from "@/context/server-sdk"
@@ -40,6 +40,7 @@ import { LayoutProvider } from "@/context/layout"
import { ModelsProvider } from "@/context/models"
import { NotificationProvider, useNotification } from "@/context/notification"
import { PermissionProvider } from "@/context/permission"
+import { usePlatform } from "@/context/platform"
import { PromptProvider } from "@/context/prompt"
import { ServerConnection, ServerProvider, serverName, useServer } from "@/context/server"
import { SettingsProvider, useSettings } from "@/context/settings"
@@ -300,12 +301,36 @@ function SharedProviders(props: ParentProps) {
<>
+
{props.children}
>
)
}
+function DesktopCommands() {
+ const command = useCommand()
+ const language = useLanguage()
+ const platform = usePlatform()
+
+ command.register("desktop", () => {
+ const commands: CommandOption[] = []
+ if (platform.platform === "desktop" && platform.exportDebugLogs) {
+ commands.push({
+ id: "logs.export",
+ title: "Export logs",
+ category: language.t("command.category.settings"),
+ onSelect: () => {
+ void platform.exportDebugLogs?.()
+ },
+ })
+ }
+ return commands
+ })
+
+ return null
+}
+
// Server-scoped providers shared by the legacy shell and the top-level new shell.
type ServerScopedShellProps = ParentProps<{
directory?: () => string | undefined
diff --git a/packages/app/src/desktop-menu.test.ts b/packages/app/src/desktop-menu.test.ts
new file mode 100644
index 000000000000..c7e36a7cb73b
--- /dev/null
+++ b/packages/app/src/desktop-menu.test.ts
@@ -0,0 +1,13 @@
+import { describe, expect, test } from "bun:test"
+import { DESKTOP_MENU } from "./desktop-menu"
+
+describe("desktop menu", () => {
+ test("exports logs through the desktop command registry", () => {
+ const items = DESKTOP_MENU.flatMap((menu) => menu.items ?? []).filter(
+ (item) => item.type === "item" && item.label === "Export Logs...",
+ )
+
+ expect(items).toHaveLength(2)
+ expect(items.every((item) => item.type === "item" && item.command === "logs.export" && !item.action)).toBe(true)
+ })
+})
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 31c59579b6ff..690460d3af6e 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -943,18 +943,6 @@ export default function LegacyLayout(props: ParentProps) {
keybind: "mod+comma",
onSelect: () => openSettings(),
},
- ...(platform.platform === "desktop" && platform.exportDebugLogs
- ? [
- {
- id: "logs.export",
- title: "Export logs",
- category: language.t("command.category.settings"),
- onSelect: () => {
- void platform.exportDebugLogs?.()
- },
- },
- ]
- : []),
{
id: "session.previous",
title: language.t("command.session.previous"),