fix(mac): place debug menu under Settings

This commit is contained in:
Peter Steinberger
2025-12-13 18:10:31 +00:00
parent 40c66b1741
commit 2a71c20ee4

View File

@@ -65,131 +65,11 @@ struct MenuContent: View {
Divider()
Button("Settings…") { self.open(tab: .general) }
.keyboardShortcut(",", modifiers: [.command])
self.debugMenu
Button("About Clawdis") { self.open(tab: .about) }
if let updater, updater.isAvailable {
Button("Check for Updates…") { updater.checkForUpdates(nil) }
}
if self.state.debugPaneEnabled {
Menu("Debug") {
Menu {
ForEach(self.sessionMenu) { row in
Menu(row.key) {
Menu("Thinking") {
ForEach(["low", "medium", "high", "default"], id: \.self) { level in
let normalized = level == "default" ? nil : level
Button {
Task {
try? await DebugActions.updateSession(
key: row.key,
thinking: normalized,
verbose: row.verboseLevel)
await self.reloadSessionMenu()
}
} label: {
Label(
level.capitalized,
systemImage: row.thinkingLevel == normalized ? "checkmark" : "")
}
}
}
Menu("Verbose") {
ForEach(["on", "off", "default"], id: \.self) { level in
let normalized = level == "default" ? nil : level
Button {
Task {
try? await DebugActions.updateSession(
key: row.key,
thinking: row.thinkingLevel,
verbose: normalized)
await self.reloadSessionMenu()
}
} label: {
Label(
level.capitalized,
systemImage: row.verboseLevel == normalized ? "checkmark" : "")
}
}
}
Button {
DebugActions.openSessionStoreInCode()
} label: {
Label("Open Session Log", systemImage: "doc.text")
}
}
}
Divider()
} label: {
Label("Sessions", systemImage: "clock.arrow.circlepath")
}
Divider()
Button {
DebugActions.openConfigFolder()
} label: {
Label("Open Config Folder", systemImage: "folder")
}
Button {
Task { await DebugActions.runHealthCheckNow() }
} label: {
Label("Run Health Check Now", systemImage: "stethoscope")
}
Button {
Task { _ = await DebugActions.sendTestHeartbeat() }
} label: {
Label("Send Test Heartbeat", systemImage: "waveform.path.ecg")
}
Button {
Task { _ = await DebugActions.toggleVerboseLoggingMain() }
} label: {
Label(
DebugActions.verboseLoggingEnabledMain
? "Verbose Logging (Main): On"
: "Verbose Logging (Main): Off",
systemImage: "text.alignleft")
}
Button {
DebugActions.openSessionStore()
} label: {
Label("Open Session Store", systemImage: "externaldrive")
}
Divider()
Button {
DebugActions.openAgentEventsWindow()
} label: {
Label("Open Agent Events…", systemImage: "bolt.horizontal.circle")
}
Button {
DebugActions.openLog()
} label: {
Label("Open Log", systemImage: "doc.text.magnifyingglass")
}
Button {
Task { _ = await DebugActions.sendDebugVoice() }
} label: {
Label("Send Debug Voice Text", systemImage: "waveform.circle")
}
Button {
Task { await DebugActions.sendTestNotification() }
} label: {
Label("Send Test Notification", systemImage: "bell")
}
Button {
Task { await DebugActions.openChatInBrowser() }
} label: {
Label("Open Chat in Browser…", systemImage: "safari")
}
Divider()
Button {
DebugActions.restartGateway()
} label: {
Label("Restart Gateway", systemImage: "arrow.clockwise")
}
Button {
DebugActions.restartApp()
} label: {
Label("Restart App", systemImage: "arrow.triangle.2.circlepath")
}
}
}
Button("Quit") { NSApplication.shared.terminate(nil) }
}
.task(id: self.state.swabbleEnabled) {
@@ -211,6 +91,127 @@ struct MenuContent: View {
}
}
@ViewBuilder
private var debugMenu: some View {
if self.state.debugPaneEnabled {
Menu("Debug") {
Menu {
ForEach(self.sessionMenu) { row in
Menu(row.key) {
Menu("Thinking") {
ForEach(["low", "medium", "high", "default"], id: \.self) { level in
let normalized = level == "default" ? nil : level
Button {
Task {
try? await DebugActions.updateSession(
key: row.key,
thinking: normalized,
verbose: row.verboseLevel)
await self.reloadSessionMenu()
}
} label: {
Label(level.capitalized, systemImage: row.thinkingLevel == normalized ? "checkmark" : "")
}
}
}
Menu("Verbose") {
ForEach(["on", "off", "default"], id: \.self) { level in
let normalized = level == "default" ? nil : level
Button {
Task {
try? await DebugActions.updateSession(
key: row.key,
thinking: row.thinkingLevel,
verbose: normalized)
await self.reloadSessionMenu()
}
} label: {
Label(level.capitalized, systemImage: row.verboseLevel == normalized ? "checkmark" : "")
}
}
}
Button {
DebugActions.openSessionStoreInCode()
} label: {
Label("Open Session Log", systemImage: "doc.text")
}
}
}
Divider()
} label: {
Label("Sessions", systemImage: "clock.arrow.circlepath")
}
Divider()
Button {
DebugActions.openConfigFolder()
} label: {
Label("Open Config Folder", systemImage: "folder")
}
Button {
Task { await DebugActions.runHealthCheckNow() }
} label: {
Label("Run Health Check Now", systemImage: "stethoscope")
}
Button {
Task { _ = await DebugActions.sendTestHeartbeat() }
} label: {
Label("Send Test Heartbeat", systemImage: "waveform.path.ecg")
}
Button {
Task { _ = await DebugActions.toggleVerboseLoggingMain() }
} label: {
Label(
DebugActions.verboseLoggingEnabledMain
? "Verbose Logging (Main): On"
: "Verbose Logging (Main): Off",
systemImage: "text.alignleft")
}
Button {
DebugActions.openSessionStore()
} label: {
Label("Open Session Store", systemImage: "externaldrive")
}
Divider()
Button {
DebugActions.openAgentEventsWindow()
} label: {
Label("Open Agent Events…", systemImage: "bolt.horizontal.circle")
}
Button {
DebugActions.openLog()
} label: {
Label("Open Log", systemImage: "doc.text.magnifyingglass")
}
Button {
Task { _ = await DebugActions.sendDebugVoice() }
} label: {
Label("Send Debug Voice Text", systemImage: "waveform.circle")
}
Button {
Task { await DebugActions.sendTestNotification() }
} label: {
Label("Send Test Notification", systemImage: "bell")
}
Button {
Task { await DebugActions.openChatInBrowser() }
} label: {
Label("Open Chat in Browser…", systemImage: "safari")
}
Divider()
Button {
DebugActions.restartGateway()
} label: {
Label("Restart Gateway", systemImage: "arrow.clockwise")
}
Button {
DebugActions.restartApp()
} label: {
Label("Restart App", systemImage: "arrow.triangle.2.circlepath")
}
}
}
}
private func open(tab: SettingsTab) {
SettingsTabRouter.request(tab)
NSApp.activate(ignoringOtherApps: true)