feat(apps/chat): 新增 UI Schema 导航和路由导航工具
This commit is contained in:
@@ -177,7 +177,7 @@ class TextMessageEndEvent extends AgUiEvent {
|
||||
answer: _asString(json['answer']),
|
||||
role: _asString(json['role'], fallback: 'assistant'),
|
||||
status: _asString(json['status'], fallback: 'success'),
|
||||
uiSchema: _asMap(json['ui_schema']) ?? _asMap(json['uiSchema']),
|
||||
uiSchema: _asMap(json['ui_schema']),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -238,17 +238,12 @@ class ToolCallResultEvent extends AgUiEvent {
|
||||
|
||||
factory ToolCallResultEvent.fromJson(Map<String, dynamic> json) =>
|
||||
ToolCallResultEvent(
|
||||
messageId: _asString(
|
||||
json['messageId'],
|
||||
fallback: 'tool-${_asString(json['tool_call_id'])}',
|
||||
),
|
||||
toolCallId: _asString(json['tool_call_id'] ?? json['toolCallId']),
|
||||
toolName: _asString(json['tool_name'] ?? json['toolName']),
|
||||
resultSummary: _asString(
|
||||
json['result_summary'] ?? json['resultSummary'],
|
||||
),
|
||||
messageId: _asString(json['messageId']),
|
||||
toolCallId: _asString(json['tool_call_id']),
|
||||
toolName: _asString(json['tool_name']),
|
||||
resultSummary: _asString(json['result']),
|
||||
status: _asString(json['status'], fallback: 'success'),
|
||||
uiSchema: _asMap(json['ui_schema']) ?? _asMap(json['uiSchema']),
|
||||
uiSchema: _asMap(json['ui_schema']),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -328,7 +323,7 @@ class HistoryMessage {
|
||||
timestamp:
|
||||
DateTime.tryParse(_asString(json['timestamp'])) ?? DateTime.now(),
|
||||
attachments: _parseHistoryAttachments(json['attachments']),
|
||||
uiSchema: _asMap(json['ui_schema']) ?? _asMap(json['uiSchema']),
|
||||
uiSchema: _asMap(json['ui_schema']),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
import '../../../../core/router/app_routes.dart';
|
||||
|
||||
typedef RouteNavigator = void Function(String target, {bool replace});
|
||||
|
||||
const Set<String> _allowedRoutes = {
|
||||
'/settings',
|
||||
'/todo',
|
||||
'/calendar/dayweek',
|
||||
'/messages/invites',
|
||||
AppRoutes.settingsMain,
|
||||
AppRoutes.todoList,
|
||||
AppRoutes.todoCreate,
|
||||
AppRoutes.calendarDayWeek,
|
||||
AppRoutes.calendarMonth,
|
||||
AppRoutes.calendarEventCreate,
|
||||
AppRoutes.messageInviteList,
|
||||
AppRoutes.contactsList,
|
||||
AppRoutes.contactsAdd,
|
||||
};
|
||||
|
||||
const List<String> _allowedRoutePrefixes = [
|
||||
'/calendar/events/',
|
||||
'/todo/',
|
||||
'/messages/invites/',
|
||||
];
|
||||
|
||||
class RouteNavigationTool {
|
||||
@@ -29,17 +38,10 @@ class RouteNavigationTool {
|
||||
Map<String, dynamic> execute(Map<String, dynamic> args) {
|
||||
final target = args['target'];
|
||||
if (target is! String || target.isEmpty) {
|
||||
return {
|
||||
'ok': false,
|
||||
'error': 'target is required',
|
||||
};
|
||||
return {'ok': false, 'error': 'target is required'};
|
||||
}
|
||||
if (!_isAllowedTarget(target)) {
|
||||
return {
|
||||
'ok': false,
|
||||
'target': target,
|
||||
'error': 'target is not allowed',
|
||||
};
|
||||
return {'ok': false, 'target': target, 'error': 'target is not allowed'};
|
||||
}
|
||||
final replace = args['replace'] == true;
|
||||
final navigator = _navigator;
|
||||
@@ -52,12 +54,7 @@ class RouteNavigationTool {
|
||||
};
|
||||
}
|
||||
navigator(target, replace: replace);
|
||||
return {
|
||||
'ok': true,
|
||||
'target': target,
|
||||
'replace': replace,
|
||||
'applied': true,
|
||||
};
|
||||
return {'ok': true, 'target': target, 'replace': replace, 'applied': true};
|
||||
}
|
||||
|
||||
bool _isAllowedTarget(String target) {
|
||||
|
||||
Reference in New Issue
Block a user