diff --git a/apps/.i18n/native-source.json b/apps/.i18n/native-source.json index b8aa7b60ffaa..8adbf255d512 100644 --- a/apps/.i18n/native-source.json +++ b/apps/.i18n/native-source.json @@ -33081,14 +33081,6 @@ "surface": "apple", "id": "native.apple.2a5e0e9e073b8db1" }, - { - "kind": "ui-modifier", - "line": 115, - "path": "apps/macos/Sources/OpenClaw/GatewayDiscoveryMenu.swift", - "source": "Discover OpenClaw gateways on your LAN", - "surface": "apple", - "id": "native.apple.66ad783199ef9729" - }, { "kind": "conditional-branch", "line": 220, diff --git a/apps/macos/Sources/OpenClaw/GatewayDiscoveryMenu.swift b/apps/macos/Sources/OpenClaw/GatewayDiscoveryMenu.swift index f45e4301abc6..127a4e596df1 100644 --- a/apps/macos/Sources/OpenClaw/GatewayDiscoveryMenu.swift +++ b/apps/macos/Sources/OpenClaw/GatewayDiscoveryMenu.swift @@ -94,24 +94,3 @@ struct GatewayDiscoveryInlineList: View { value?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" } } - -struct GatewayDiscoveryMenu: View { - var discovery: GatewayDiscoveryModel - var onSelect: (GatewayDiscoveryModel.DiscoveredGateway) -> Void - - var body: some View { - Menu { - if self.discovery.gateways.isEmpty { - Button(self.discovery.statusText) {} - .disabled(true) - } else { - ForEach(self.discovery.gateways) { gateway in - Button(gateway.displayName) { self.onSelect(gateway) } - } - } - } label: { - Image(systemName: "dot.radiowaves.left.and.right") - } - .help("Discover OpenClaw gateways on your LAN") - } -} diff --git a/apps/macos/Tests/OpenClawIPCTests/ChannelsSettingsSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/ChannelsSettingsSmokeTests.swift index 40f4db0ca57b..40d770f60d26 100644 --- a/apps/macos/Tests/OpenClawIPCTests/ChannelsSettingsSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/ChannelsSettingsSmokeTests.swift @@ -1,5 +1,5 @@ +import Foundation import OpenClawProtocol -import SwiftUI import Testing @testable import OpenClaw @@ -41,122 +41,6 @@ private func makeChannelsStore( @Suite(.serialized) @MainActor struct ChannelsSettingsSmokeTests { - @Test func `channels settings builds body with snapshot`() { - let store = makeChannelsStore( - channels: [ - "whatsapp": SnapshotAnyCodable([ - "configured": true, - "linked": true, - "authAgeMs": 86_400_000, - "self": ["e164": "+15551234567"], - "running": true, - "connected": false, - "lastConnectedAt": 1_700_000_000_000, - "lastDisconnect": [ - "at": 1_700_000_050_000, - "status": 401, - "error": "logged out", - "loggedOut": true, - ], - "reconnectAttempts": 2, - "lastMessageAt": 1_700_000_060_000, - "lastEventAt": 1_700_000_060_000, - "lastError": "needs login", - ]), - "telegram": SnapshotAnyCodable([ - "configured": true, - "tokenSource": "env", - "running": true, - "mode": "polling", - "lastStartAt": 1_700_000_000_000, - "probe": [ - "ok": true, - "status": 200, - "elapsedMs": 120, - "bot": ["id": 123, "username": "openclawbot"], - "webhook": ["url": "https://example.com/hook", "hasCustomCert": false], - ], - "lastProbeAt": 1_700_000_050_000, - ]), - "signal": SnapshotAnyCodable([ - "configured": true, - "baseUrl": "http://127.0.0.1:8080", - "running": true, - "lastStartAt": 1_700_000_000_000, - "probe": [ - "ok": true, - "status": 200, - "elapsedMs": 140, - "version": "0.12.4", - ], - "lastProbeAt": 1_700_000_050_000, - ]), - "imessage": SnapshotAnyCodable([ - "configured": false, - "running": false, - "lastError": "not configured", - "probe": ["ok": false, "error": "imsg not found (imsg)"], - "lastProbeAt": 1_700_000_050_000, - ]), - ]) - - store.whatsappLoginMessage = "Scan QR" - store.whatsappLoginQrDataUrl = - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMB/ay7pS8AAAAASUVORK5CYII=" - - let view = ChannelsSettings(store: store) - _ = view.body - } - - @Test func `channels settings builds body without snapshot`() { - let store = makeChannelsStore( - channels: [ - "whatsapp": SnapshotAnyCodable([ - "configured": false, - "linked": false, - "running": false, - "connected": false, - "reconnectAttempts": 0, - ]), - "telegram": SnapshotAnyCodable([ - "configured": false, - "running": false, - "lastError": "bot missing", - "probe": [ - "ok": false, - "status": 403, - "error": "unauthorized", - "elapsedMs": 120, - ], - "lastProbeAt": 1_700_000_100_000, - ]), - "signal": SnapshotAnyCodable([ - "configured": false, - "baseUrl": "http://127.0.0.1:8080", - "running": false, - "lastError": "not configured", - "probe": [ - "ok": false, - "status": 404, - "error": "unreachable", - "elapsedMs": 200, - ], - "lastProbeAt": 1_700_000_200_000, - ]), - "imessage": SnapshotAnyCodable([ - "configured": false, - "running": false, - "lastError": "not configured", - "cliPath": "imsg", - "probe": ["ok": false, "error": "imsg not found (imsg)"], - "lastProbeAt": 1_700_000_200_000, - ]), - ]) - - let view = ChannelsSettings(store: store) - _ = view.body - } - @Test func `whatsapp login wait result keeps latest qr until connected`() { let store = makeChannelsStore(channels: [:]) store.whatsappLoginQrDataUrl = "data:image/png;base64,initial" diff --git a/apps/macos/Tests/OpenClawIPCTests/ClawHubSkillsBrowserSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/ClawHubSkillsBrowserSmokeTests.swift deleted file mode 100644 index e0fd47edbb43..000000000000 --- a/apps/macos/Tests/OpenClawIPCTests/ClawHubSkillsBrowserSmokeTests.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Testing -@testable import OpenClaw - -@MainActor -struct ClawHubSkillsBrowserSmokeTests { - @Test func `ClawHub browser builds guarded review flow`() { - let view = ClawHubSkillsBrowser(installedSkills: [], onInstalled: { _ in }) - _ = view.body - } -} diff --git a/apps/macos/Tests/OpenClawIPCTests/CronJobEditorSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/CronJobEditorSmokeTests.swift index 1ed5ac65bbee..76205e5a1bbf 100644 --- a/apps/macos/Tests/OpenClawIPCTests/CronJobEditorSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/CronJobEditorSmokeTests.swift @@ -15,17 +15,7 @@ struct CronJobEditorSmokeTests { onSave: { _ in }) } - @Test func `status pill builds body`() { - _ = StatusPill(text: "ok", tint: .green).body - _ = StatusPill(text: "disabled", tint: .secondary).body - } - - @Test func `cron job editor builds body for new job`() { - let view = self.makeEditor() - _ = view.body - } - - @Test func `cron job editor builds body for existing job`() { + @Test func `cron job editor preserves advanced delivery routes`() { let channelsStore = ChannelsStore(isPreview: true) let job = CronJob( id: "job-1", @@ -72,8 +62,6 @@ struct CronJobEditorSmokeTests { lastDurationMs: 1000)) let view = self.makeEditor(job: job, channelsStore: channelsStore) - _ = view.body - let delivery = view.buildDelivery() #expect(delivery["threadId"] as? Int == 42) #expect((delivery["completionDestination"] as? [String: Any])?["to"] as? String == diff --git a/apps/macos/Tests/OpenClawIPCTests/InstancesSettingsSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/InstancesSettingsSmokeTests.swift deleted file mode 100644 index d5a73c2ab7cb..000000000000 --- a/apps/macos/Tests/OpenClawIPCTests/InstancesSettingsSmokeTests.swift +++ /dev/null @@ -1,55 +0,0 @@ -import Testing -@testable import OpenClaw - -@Suite(.serialized) -@MainActor -struct InstancesSettingsSmokeTests { - @Test func `instances settings builds body with multiple instances`() { - let store = InstancesStore(isPreview: true) - store.statusMessage = "Loaded" - store.instances = [ - InstanceInfo( - id: "macbook", - host: "macbook-pro", - ip: "10.0.0.2", - version: "1.2.3", - platform: "macOS 15.1", - deviceFamily: "Mac", - modelIdentifier: "MacBookPro18,1", - lastInputSeconds: 15, - mode: "local", - reason: "heartbeat", - text: "MacBook Pro local", - ts: 1_700_000_000_000), - InstanceInfo( - id: "android", - host: "pixel", - ip: "10.0.0.3", - version: "2.0.0", - platform: "Android 14", - deviceFamily: "Android", - modelIdentifier: nil, - lastInputSeconds: 120, - mode: "node", - reason: "presence", - text: "Android node", - ts: 1_700_000_100_000), - InstanceInfo( - id: "gateway", - host: "gateway", - ip: "10.0.0.4", - version: "3.0.0", - platform: "iOS 18", - deviceFamily: nil, - modelIdentifier: nil, - lastInputSeconds: nil, - mode: "gateway", - reason: "gateway", - text: "Gateway", - ts: 1_700_000_200_000), - ] - - let view = InstancesSettings(store: store) - _ = view.body - } -} diff --git a/apps/macos/Tests/OpenClawIPCTests/MasterDiscoveryMenuSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/MasterDiscoveryMenuSmokeTests.swift deleted file mode 100644 index bf39f4ebfea1..000000000000 --- a/apps/macos/Tests/OpenClawIPCTests/MasterDiscoveryMenuSmokeTests.swift +++ /dev/null @@ -1,78 +0,0 @@ -import OpenClawDiscovery -import SwiftUI -import Testing -@testable import OpenClaw - -@Suite(.serialized) -@MainActor -struct MasterDiscoveryMenuSmokeTests { - @Test func `inline list builds body when empty`() { - let discovery = GatewayDiscoveryModel(localDisplayName: InstanceIdentity.displayName) - discovery.statusText = "Searching…" - discovery.gateways = [] - - let view = GatewayDiscoveryInlineList( - discovery: discovery, - currentTarget: nil, - currentUrl: nil, - transport: .ssh, - onSelect: { _ in }) - _ = view.body - } - - @Test func `inline list builds body with master and selection`() { - let discovery = GatewayDiscoveryModel(localDisplayName: InstanceIdentity.displayName) - discovery.statusText = "Found 1" - discovery.gateways = [ - GatewayDiscoveryModel.DiscoveredGateway( - displayName: "Office Mac", - lanHost: "office.local", - tailnetDns: "office.tailnet-123.ts.net", - sshPort: 2222, - gatewayPort: nil, - cliPath: nil, - stableID: "office", - debugID: "office", - isLocal: false), - ] - - let currentTarget = "\(NSUserName())@office.tailnet-123.ts.net:2222" - let view = GatewayDiscoveryInlineList( - discovery: discovery, - currentTarget: currentTarget, - currentUrl: nil, - transport: .ssh, - onSelect: { _ in }) - _ = view.body - } - - @Test func `menu builds body with masters`() { - let discovery = GatewayDiscoveryModel(localDisplayName: InstanceIdentity.displayName) - discovery.statusText = "Found 2" - discovery.gateways = [ - GatewayDiscoveryModel.DiscoveredGateway( - displayName: "A", - lanHost: "a.local", - tailnetDns: nil, - sshPort: 22, - gatewayPort: nil, - cliPath: nil, - stableID: "a", - debugID: "a", - isLocal: false), - GatewayDiscoveryModel.DiscoveredGateway( - displayName: "B", - lanHost: nil, - tailnetDns: "b.ts.net", - sshPort: 22, - gatewayPort: nil, - cliPath: nil, - stableID: "b", - debugID: "b", - isLocal: false), - ] - - let view = GatewayDiscoveryMenu(discovery: discovery, onSelect: { _ in }) - _ = view.body - } -} diff --git a/apps/macos/Tests/OpenClawIPCTests/MenuContentSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/MenuContentSmokeTests.swift index 02d93b670eb2..2a7d2b92ecee 100644 --- a/apps/macos/Tests/OpenClawIPCTests/MenuContentSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/MenuContentSmokeTests.swift @@ -1,5 +1,4 @@ import AppKit -import SwiftUI import Testing @testable import OpenClaw @@ -10,40 +9,6 @@ struct MenuContentSmokeTests { #expect(AppTerminationTiming.cleanupDeadlineSeconds < AppTerminationTiming.signalExitFailsafeSeconds) } - @Test func `menu content builds body local mode`() { - let state = AppState(preview: true) - state.connectionMode = .local - let view = MenuContent(state: state, updater: nil) - _ = view.body - } - - @Test func `menu content builds body remote mode`() { - let state = AppState(preview: true) - state.connectionMode = .remote - let view = MenuContent(state: state, updater: nil) - _ = view.body - } - - @Test func `menu content builds body unconfigured mode`() { - let state = AppState(preview: true) - state.connectionMode = .unconfigured - let view = MenuContent(state: state, updater: nil) - _ = view.body - } - - @Test func `menu content builds body with debug and canvas`() { - let state = AppState(preview: true) - state.connectionMode = .local - state.debugPaneEnabled = true - state.canvasEnabled = true - state.canvasPanelVisible = true - state.swabbleEnabled = true - state.voicePushToTalkEnabled = true - state.heartbeatsEnabled = true - let view = MenuContent(state: state, updater: nil) - _ = view.body - } - @Test func `dock menu exposes primary shortcuts`() throws { let delegate = AppDelegate() let menu = try #require(delegate.applicationDockMenu(NSApplication.shared)) diff --git a/apps/macos/Tests/OpenClawIPCTests/OnboardingViewSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/OnboardingViewSmokeTests.swift index f2dd386c3b8a..7d3d03d51d75 100644 --- a/apps/macos/Tests/OpenClawIPCTests/OnboardingViewSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/OnboardingViewSmokeTests.swift @@ -3,7 +3,6 @@ import Foundation import OpenClawDiscovery import OpenClawIPC import OpenClawKit -import SwiftUI import Testing @testable import OpenClaw @@ -41,14 +40,6 @@ struct OnboardingViewSmokeTests { "2 gateways found on your network — click to choose one.") } - @Test func `onboarding view builds body`() { - let state = AppState(preview: true) - let view = OnboardingView( - state: state, - discoveryModel: GatewayDiscoveryModel(localDisplayName: InstanceIdentity.displayName)) - _ = view.body - } - @Test func `foreign local listener is not advertised as attachable`() { let profile = AppProfile(environment: ["OPENCLAW_PROFILE": "p2380"]) let foreign = OnboardingView.LocalGatewayProbe( diff --git a/apps/macos/Tests/OpenClawIPCTests/QuickChatViewSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/QuickChatViewSmokeTests.swift deleted file mode 100644 index 1ee1a24d7cf4..000000000000 --- a/apps/macos/Tests/OpenClawIPCTests/QuickChatViewSmokeTests.swift +++ /dev/null @@ -1,49 +0,0 @@ -import OpenClawProtocol -import SwiftUI -import Testing -@testable import OpenClaw - -@Suite(.serialized) -@MainActor -struct QuickChatViewSmokeTests { - @Test func `quick chat view builds body`() { - let model = QuickChatModel( - sessionKeyProvider: { "main" }, - agentsProvider: { - AgentsListResult( - defaultid: "main", - mainkey: "main", - scope: AnyCodable("per-agent"), - agents: [AgentSummary(id: "main", name: "Agent")]) - }, - agentIdentityProvider: { _ in QuickChatAgentDisplay(id: "main", name: "Agent", emoji: nil) }, - sendProvider: { _, _, _, _, _, _ in "ok" }, - permissionStatusProvider: { capabilities in - Dictionary(uniqueKeysWithValues: capabilities.map { ($0, true) }) - }, - permissionGrantProvider: { capabilities in - Dictionary(uniqueKeysWithValues: capabilities.map { ($0, true) }) - }, - connectionGateProvider: { .available }, - modelControlsProvider: { _ in .testFixture }, - modelPatchProvider: { _, _ in nil }) - let view = QuickChatView( - model: model, - replyBinding: QuickChatReplyBinding(), - onDismiss: {}, - onSendAccepted: { _ in }, - onShowAgentPicker: {}, - onShowModelMenu: {}, - onShowRecentSessions: {}, - onToggleDictation: {}, - onStopDictation: {}, - onCaptureTextContext: {}, - onShowCaptureMenu: {}, - onGrantPermissions: {}, - onPasteReply: {}, - onContentHeightChange: { _ in }, - onTextViewReady: { _ in }) - - _ = view.body - } -} diff --git a/apps/macos/Tests/OpenClawIPCTests/SettingsViewSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/SettingsViewSmokeTests.swift index 30c34c089263..43d45c8833c0 100644 --- a/apps/macos/Tests/OpenClawIPCTests/SettingsViewSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/SettingsViewSmokeTests.swift @@ -60,22 +60,6 @@ struct SettingsViewSmokeTests { _ = hosting.fittingSize } - @Test func `config settings builds body`() { - let view = ConfigSettings() - _ = view.body - } - - @Test func `debug settings builds body`() { - let view = DebugSettings() - _ = view.body - } - - @Test func `connection settings builds body`() { - let state = AppState(preview: true) - let view = GeneralSettings(state: state, page: .connection) - _ = view.body - } - @Test func `general settings renders the keyboard shortcut recorder`() { let state = AppState(preview: true) let hosting = NSHostingView(rootView: GeneralSettings(state: state)) @@ -84,41 +68,10 @@ struct SettingsViewSmokeTests { _ = hosting.fittingSize } - @Test func `sessions settings builds body`() { - let view = SessionsSettings(rows: SessionRow.previewRows, isPreview: true) - _ = view.body - } - - @Test func `permissions settings builds body`() { - let state = AppState(preview: true) - let view = PermissionsSettings( - state: state, - status: [ - .notifications: .granted, - .screenRecording: .notGranted, - ], - refresh: {}, - showOnboarding: {}) - _ = view.body - } - - @Test func `settings root view builds body`() { - let state = AppState(preview: true) - let view = SettingsRootView(state: state, updater: nil, initialTab: .general) - _ = view.body - } - - @Test func `Gateway settings is visible and builds body`() throws { + @Test func `Gateway settings is visible`() { let tabs = SettingsTabGroup.defaultGroups(showDebug: false, showSystemAgent: false) .flatMap(\.tabs) #expect(tabs.contains(.gateways)) - - let profile = try MacGatewayProfile( - id: "studio", - name: "Studio", - url: #require(URL(string: "wss://studio.example"))) - let view = GatewaySettings(profiles: [profile], isPreview: true) - _ = view.body } @Test func `OpenClaw settings require configured inference`() { @@ -197,25 +150,4 @@ struct SettingsViewSmokeTests { previousGatewayID: directA, currentGatewayID: directB) == .init(clearsPrevious: true, resetsSystemAgent: true)) } - - @Test func `about settings builds body`() { - let view = AboutSettings(updater: nil) - _ = view.body - } - - @Test func `voice wake settings builds body`() { - let state = AppState(preview: true) - let view = VoiceWakeSettings(state: state, isActive: false) - _ = view.body - } - - @Test func `skills settings builds body`() { - let view = SkillsSettings(state: .preview) - _ = view.body - } - - @Test func `exec approvals settings builds body`() { - let view = ExecApprovalsSettings() - _ = view.body - } } diff --git a/apps/macos/Tests/OpenClawIPCTests/VoiceWakeOverlayViewSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/VoiceWakeOverlayViewSmokeTests.swift deleted file mode 100644 index 5c43ff255b39..000000000000 --- a/apps/macos/Tests/OpenClawIPCTests/VoiceWakeOverlayViewSmokeTests.swift +++ /dev/null @@ -1,28 +0,0 @@ -import SwiftUI -import Testing -@testable import OpenClaw - -@Suite(.serialized) -@MainActor -struct VoiceWakeOverlayViewSmokeTests { - @Test func `overlay view builds body in display mode`() { - let controller = VoiceWakeOverlayController(enableUI: false) - _ = controller.startSession(source: .wakeWord, transcript: "hello", forwardEnabled: true) - let view = VoiceWakeOverlayView(controller: controller) - _ = view.body - } - - @Test func `overlay view builds body in editing mode`() { - let controller = VoiceWakeOverlayController(enableUI: false) - let token = controller.startSession(source: .pushToTalk, transcript: "edit me", forwardEnabled: true) - controller.userBeganEditing() - controller.updateLevel(token: token, 0.6) - let view = VoiceWakeOverlayView(controller: controller) - _ = view.body - } - - @Test func `close button overlay builds body`() { - let view = CloseButtonOverlay(isVisible: true, onHover: { _ in }, onClose: {}) - _ = view.body - } -}