From 6c009c71a287a4e79c94845d656971b4f7140d49 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 27 May 2026 14:50:59 +0800 Subject: [PATCH] Hide desktop agent dialog mode --- config/feature_flags.yaml | 6 ++--- lib/app/ui_feature_manifest_core.dart | 18 +++++++------ .../assistant/assistant_lower_pane_test.dart | 23 ++++++++++++++++ .../assistant_execution_target_test.dart | 27 ++++++++++++++++--- ...feature_manifest_desktop_surface_test.dart | 16 +++++++---- 5 files changed, 71 insertions(+), 19 deletions(-) diff --git a/config/feature_flags.yaml b/config/feature_flags.yaml index 162c2991..558cbc25 100644 --- a/config/feature_flags.yaml +++ b/config/feature_flags.yaml @@ -138,10 +138,10 @@ desktop: description: Desktop file attachment action in assistant composer ui_surface: assistant_page multi_agent: - enabled: true + enabled: false release_tier: beta - build_modes: [debug, profile, release] - description: Desktop multi-agent assistant controls + build_modes: [] + description: Desktop multi-agent assistant controls hidden by default ui_surface: assistant_page local_runtime: enabled: true diff --git a/lib/app/ui_feature_manifest_core.dart b/lib/app/ui_feature_manifest_core.dart index 329a1b39..ab17b846 100644 --- a/lib/app/ui_feature_manifest_core.dart +++ b/lib/app/ui_feature_manifest_core.dart @@ -451,19 +451,21 @@ class UiFeatureAccess { } List get availableExecutionTargets { - return const [ - AssistantExecutionTarget.agent, - AssistantExecutionTarget.gateway, - ]; + if (supportsMultiAgent) { + return const [ + AssistantExecutionTarget.agent, + AssistantExecutionTarget.gateway, + ]; + } + return const [AssistantExecutionTarget.gateway]; } AssistantExecutionTarget sanitizeExecutionTarget( AssistantExecutionTarget? target, ) { - final resolved = target ?? AssistantExecutionTarget.agent; - return availableExecutionTargets.contains(resolved) - ? resolved - : AssistantExecutionTarget.agent; + final available = availableExecutionTargets; + final resolved = target ?? available.first; + return available.contains(resolved) ? resolved : available.first; } } diff --git a/test/features/assistant/assistant_lower_pane_test.dart b/test/features/assistant/assistant_lower_pane_test.dart index 042870ca..1c7517ce 100644 --- a/test/features/assistant/assistant_lower_pane_test.dart +++ b/test/features/assistant/assistant_lower_pane_test.dart @@ -1,6 +1,9 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:xworkmate/app/app_controller.dart'; +import 'package:xworkmate/app/ui_feature_manifest.dart'; import 'package:xworkmate/features/assistant/assistant_page_composer_clipboard.dart'; import 'package:xworkmate/features/assistant/assistant_page_composer_skill_models.dart'; import 'package:xworkmate/features/assistant/assistant_page_composer_skill_picker.dart'; @@ -62,6 +65,7 @@ void main() { testWidgets('shows mode-specific provider catalogs', (tester) async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.opencode, @@ -211,6 +215,7 @@ void main() { ) async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.opencode, @@ -260,6 +265,7 @@ void main() { ) async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.opencode, @@ -372,6 +378,7 @@ void main() { (tester) async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.opencode, @@ -614,6 +621,22 @@ void main() { }); } +UiFeatureManifest _manifestWithDesktopMultiAgentEnabled() { + return UiFeatureManifest.fromYamlString( + File(UiFeatureManifest.assetPath).readAsStringSync(), + ).copyWithFeature( + platform: UiFeaturePlatform.desktop, + module: 'assistant', + feature: 'multi_agent', + enabled: true, + buildModes: const { + UiFeatureBuildMode.debug, + UiFeatureBuildMode.profile, + UiFeatureBuildMode.release, + }, + ); +} + Widget _buildTestApp({required Widget child, double height = 360}) { return MaterialApp( theme: AppTheme.light(), diff --git a/test/runtime/assistant_execution_target_test.dart b/test/runtime/assistant_execution_target_test.dart index 56cbf94b..da3cd305 100644 --- a/test/runtime/assistant_execution_target_test.dart +++ b/test/runtime/assistant_execution_target_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:xworkmate/app/app_controller.dart'; import 'package:xworkmate/app/app_controller_desktop_external_acp_routing.dart'; import 'package:xworkmate/app/app_controller_openclaw_task_queue.dart'; +import 'package:xworkmate/app/ui_feature_manifest.dart'; import 'package:xworkmate/features/assistant/assistant_page_composer_skill_models.dart'; import 'package:xworkmate/runtime/gateway_acp_client.dart'; import 'package:xworkmate/runtime/go_task_service_client.dart'; @@ -63,6 +64,7 @@ void main() { () async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.openclaw, @@ -108,6 +110,7 @@ void main() { () async { final controller = AppController( environmentOverride: const {}, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), initialBridgeProviderCatalog: const [ SingleAgentProvider.codex, SingleAgentProvider.opencode, @@ -157,7 +160,7 @@ void main() { ); test( - 'new task sessions do not inherit execution target from main', + 'new task sessions use the feature-visible default instead of main', () async { final localHome = await Directory.systemTemp.createTemp( 'xworkmate-no-main-target-inheritance-', @@ -195,7 +198,7 @@ void main() { expect( controller.assistantExecutionTargetForSession('draft:fresh-task'), - AssistantExecutionTarget.agent, + AssistantExecutionTarget.gateway, ); await controller.switchSession('draft:fresh-task'); @@ -205,7 +208,7 @@ void main() { ); expect( freshThread.executionBinding.executionMode, - ThreadExecutionMode.agent, + ThreadExecutionMode.gateway, ); expect( freshThread.workspaceBinding.workspacePath, @@ -3537,9 +3540,26 @@ List> _generatedArtifactPayloads() { ]; } +UiFeatureManifest _manifestWithDesktopMultiAgentEnabled() { + return UiFeatureManifest.fromYamlString( + File(UiFeatureManifest.assetPath).readAsStringSync(), + ).copyWithFeature( + platform: UiFeaturePlatform.desktop, + module: 'assistant', + feature: 'multi_agent', + enabled: true, + buildModes: const { + UiFeatureBuildMode.debug, + UiFeatureBuildMode.profile, + UiFeatureBuildMode.release, + }, + ); +} + AppController _connectedController(GoTaskServiceClient client) { return AppController( goTaskServiceClient: client, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), environmentOverride: const { 'BRIDGE_AUTH_TOKEN': 'bridge-token', }, @@ -3555,6 +3575,7 @@ AppController _connectedController(GoTaskServiceClient client) { AppController _connectedGatewayController(GoTaskServiceClient client) { return AppController( goTaskServiceClient: client, + uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(), environmentOverride: const { 'BRIDGE_AUTH_TOKEN': 'bridge-token', }, diff --git a/test/runtime/ui_feature_manifest_desktop_surface_test.dart b/test/runtime/ui_feature_manifest_desktop_surface_test.dart index 60e4e1f0..7e101008 100644 --- a/test/runtime/ui_feature_manifest_desktop_surface_test.dart +++ b/test/runtime/ui_feature_manifest_desktop_surface_test.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:xworkmate/app/ui_feature_manifest.dart'; import 'package:xworkmate/models/app_models.dart'; +import 'package:xworkmate/runtime/runtime_models.dart'; void main() { group('Desktop feature manifest cleanup', () { @@ -14,12 +15,17 @@ void main() { buildMode: UiFeatureBuildMode.debug, ); + expect(desktop.allowedDestinations, { + WorkspaceDestination.assistant, + WorkspaceDestination.settings, + }); expect( - desktop.allowedDestinations, - { - WorkspaceDestination.assistant, - WorkspaceDestination.settings, - }, + desktop.availableExecutionTargets, + const [AssistantExecutionTarget.gateway], + ); + expect( + desktop.sanitizeExecutionTarget(AssistantExecutionTarget.agent), + AssistantExecutionTarget.gateway, ); }); });