Hide desktop agent dialog mode

This commit is contained in:
Haitao Pan 2026-05-27 14:50:59 +08:00
parent eaca7e0f7d
commit 6c009c71a2
5 changed files with 71 additions and 19 deletions

View File

@ -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

View File

@ -451,19 +451,21 @@ class UiFeatureAccess {
}
List<AssistantExecutionTarget> get availableExecutionTargets {
return const <AssistantExecutionTarget>[
AssistantExecutionTarget.agent,
AssistantExecutionTarget.gateway,
];
if (supportsMultiAgent) {
return const <AssistantExecutionTarget>[
AssistantExecutionTarget.agent,
AssistantExecutionTarget.gateway,
];
}
return const <AssistantExecutionTarget>[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;
}
}

View File

@ -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 <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
SingleAgentProvider.codex,
SingleAgentProvider.opencode,
@ -211,6 +215,7 @@ void main() {
) async {
final controller = AppController(
environmentOverride: const <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
SingleAgentProvider.codex,
SingleAgentProvider.opencode,
@ -260,6 +265,7 @@ void main() {
) async {
final controller = AppController(
environmentOverride: const <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
SingleAgentProvider.codex,
SingleAgentProvider.opencode,
@ -372,6 +378,7 @@ void main() {
(tester) async {
final controller = AppController(
environmentOverride: const <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
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>{
UiFeatureBuildMode.debug,
UiFeatureBuildMode.profile,
UiFeatureBuildMode.release,
},
);
}
Widget _buildTestApp({required Widget child, double height = 360}) {
return MaterialApp(
theme: AppTheme.light(),

View File

@ -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 <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
SingleAgentProvider.codex,
SingleAgentProvider.openclaw,
@ -108,6 +110,7 @@ void main() {
() async {
final controller = AppController(
environmentOverride: const <String, String>{},
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
initialBridgeProviderCatalog: const <SingleAgentProvider>[
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<Map<String, dynamic>> _generatedArtifactPayloads() {
];
}
UiFeatureManifest _manifestWithDesktopMultiAgentEnabled() {
return UiFeatureManifest.fromYamlString(
File(UiFeatureManifest.assetPath).readAsStringSync(),
).copyWithFeature(
platform: UiFeaturePlatform.desktop,
module: 'assistant',
feature: 'multi_agent',
enabled: true,
buildModes: const <UiFeatureBuildMode>{
UiFeatureBuildMode.debug,
UiFeatureBuildMode.profile,
UiFeatureBuildMode.release,
},
);
}
AppController _connectedController(GoTaskServiceClient client) {
return AppController(
goTaskServiceClient: client,
uiFeatureManifest: _manifestWithDesktopMultiAgentEnabled(),
environmentOverride: const <String, String>{
'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 <String, String>{
'BRIDGE_AUTH_TOKEN': 'bridge-token',
},

View File

@ -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>{
WorkspaceDestination.assistant,
WorkspaceDestination.settings,
});
expect(
desktop.allowedDestinations,
<WorkspaceDestination>{
WorkspaceDestination.assistant,
WorkspaceDestination.settings,
},
desktop.availableExecutionTargets,
const <AssistantExecutionTarget>[AssistantExecutionTarget.gateway],
);
expect(
desktop.sanitizeExecutionTarget(AssistantExecutionTarget.agent),
AssistantExecutionTarget.gateway,
);
});
});