feat: AG-UI 协议对齐与路由导航功能

- 前端: 添加 SSE 流式支持、stateSnapshot 事件、路由导航工具
- 前端: 实现工具调用审批流程,支持 pending 状态展示
- 后端: Agent 状态管理与会话持久化相关重构
- 文档: 新增 agent-agui-full-alignance 设计文档
- 测试: 补充相关单元测试和集成测试
This commit is contained in:
zl-q
2026-03-07 17:30:20 +08:00
parent ec33bb0cee
commit 120df903d2
52 changed files with 4305 additions and 1672 deletions
+39 -1
View File
@@ -68,6 +68,13 @@ void main() {
);
});
test('maps STATE_SNAPSHOT correctly', () {
expect(
agUiEventTypeFromWire('STATE_SNAPSHOT'),
AgUiEventType.stateSnapshot,
);
});
test('returns unknown for unknown type', () {
expect(agUiEventTypeFromWire('UNKNOWN_TYPE'), AgUiEventType.unknown);
});
@@ -228,7 +235,7 @@ void main() {
'type': 'TOOL_CALL_RESULT',
'messageId': 'msg_123',
'toolCallId': 'tc_123',
'result': {'ok': true, 'eventId': 'evt_001'},
'content': '{"result":{"ok":true,"eventId":"evt_001"}}',
};
final event = AgUiEvent.fromJson(json);
@@ -240,6 +247,24 @@ void main() {
expect(toolResult.result['ok'], true);
});
test('parses ToolCallResultEvent content payload', () {
final json = {
'type': 'TOOL_CALL_RESULT',
'messageId': 'msg_123',
'toolCallId': 'tc_123',
'content': '{"result":{"ok":true,"eventId":"evt_001"}}',
};
final event = AgUiEvent.fromJson(json);
expect(event, isA<ToolCallResultEvent>());
final toolResult = event as ToolCallResultEvent;
expect(toolResult.messageId, 'msg_123');
expect(toolResult.toolCallId, 'tc_123');
expect(toolResult.result['ok'], true);
expect(toolResult.result['eventId'], 'evt_001');
});
test('parses ToolCallErrorEvent', () {
final json = {
'type': 'TOOL_CALL_ERROR',
@@ -257,6 +282,19 @@ void main() {
expect(toolError.code, 'EXEC_ERROR');
});
test('parses StateSnapshotEvent', () {
final json = {
'type': 'STATE_SNAPSHOT',
'snapshot': {'scope': 'history_day', 'hasMore': false, 'messages': []},
};
final event = AgUiEvent.fromJson(json);
expect(event, isA<StateSnapshotEvent>());
final stateSnapshot = event as StateSnapshotEvent;
expect(stateSnapshot.snapshot['scope'], 'history_day');
});
test('returns UnknownAgUiEvent for unknown type', () {
final json = {'type': 'UNKNOWN_TYPE', 'someField': 'someValue'};