fix: align routing resolve payload

This commit is contained in:
Haitao Pan 2026-04-23 16:16:29 +08:00
parent e608f71e5a
commit 5de94ca089
2 changed files with 95 additions and 2 deletions

View File

@ -19,8 +19,19 @@ class GoRuntimeDispatchDesktopClient implements RuntimeDispatchResolver {
Iterable<String> requiredCapabilities = const <String>[],
}) async {
final response = await _client.request(
method: 'xworkmate.dispatch.resolve',
method: 'xworkmate.routing.resolve',
params: <String, dynamic>{
'routing': <String, dynamic>{
'routingMode': 'auto',
if (preferredProviderId.trim().isNotEmpty)
'preferredGatewayTarget': preferredProviderId.trim(),
'explicitExecutionTarget': '',
'explicitProviderId': preferredProviderId.trim(),
'explicitModel': '',
'explicitSkills': const <String>[],
'allowSkillInstall': false,
'availableSkills': const <Object?>[],
},
'preferredProviderId': preferredProviderId.trim(),
'requiredCapabilities': requiredCapabilities
.map((item) => item.trim())
@ -45,8 +56,19 @@ class GoRuntimeDispatchDesktopClient implements RuntimeDispatchResolver {
required Map<String, dynamic> nodeInfo,
}) async {
final response = await _client.request(
method: 'xworkmate.dispatch.resolve',
method: 'xworkmate.routing.resolve',
params: <String, dynamic>{
'routing': <String, dynamic>{
'routingMode': 'auto',
if (preferredProviderId.trim().isNotEmpty)
'preferredGatewayTarget': preferredProviderId.trim(),
'explicitExecutionTarget': '',
'explicitProviderId': preferredProviderId.trim(),
'explicitModel': '',
'explicitSkills': const <String>[],
'allowSkillInstall': false,
'availableSkills': const <Object?>[],
},
'preferredProviderId': preferredProviderId.trim(),
'requiredCapabilities': requiredCapabilities
.map((item) => item.trim())

View File

@ -0,0 +1,71 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:xworkmate/runtime/gateway_acp_client.dart';
import 'package:xworkmate/runtime/go_runtime_dispatch_desktop_client.dart';
import 'package:xworkmate/runtime/runtime_external_code_agents.dart';
void main() {
test('desktop dispatch resolver uses xworkmate.routing.resolve', () async {
final capture = await _startAcpHttpServer();
addTearDown(capture.close);
final client = GatewayAcpClient(
endpointResolver: () => capture.baseEndpoint,
);
final resolver = GoRuntimeDispatchDesktopClient(
client: client,
endpointResolver: () => capture.baseEndpoint,
);
addTearDown(resolver.dispose);
await resolver.resolveGatewayDispatch(
providers: const <ExternalCodeAgentProvider>[],
preferredProviderId: 'codex',
requiredCapabilities: const <String>['skill-a'],
nodeState: const <String, dynamic>{},
nodeInfo: const <String, dynamic>{},
);
expect(capture.method, 'xworkmate.routing.resolve');
expect(capture.body, contains('"routingMode":"auto"'));
expect(capture.body, contains('"preferredGatewayTarget":"codex"'));
});
}
Future<_CapturedAcpHttpServer> _startAcpHttpServer() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
final capture = _CapturedAcpHttpServer._(
server,
Uri.parse('http://127.0.0.1:${server.port}'),
);
server.listen((request) async {
final body = await utf8.decoder.bind(request).join();
capture.body = body;
final decoded = jsonDecode(body);
capture.method = decoded['method']?.toString() ?? '';
final id = decoded['id']?.toString() ?? 'request-id';
request.response.headers.contentType = ContentType.json;
request.response.write(
jsonEncode(<String, dynamic>{
'jsonrpc': '2.0',
'id': id,
'result': <String, dynamic>{'providerId': 'codex'},
}),
);
await request.response.close();
});
return capture;
}
class _CapturedAcpHttpServer {
_CapturedAcpHttpServer._(this._server, this.baseEndpoint);
final HttpServer _server;
final Uri baseEndpoint;
String method = '';
String body = '';
Future<void> close() => _server.close(force: true);
}