fix: 归并异步工具状态卡片

- 统一异步阶段事件的稳定任务标识

- 保留原始工具调用 ID 供事件关联

- 将提交、轮询和结果状态更新到同一审批卡片
This commit is contained in:
2026-07-23 19:48:44 +08:00
parent 4a8e633083
commit 8b4ba65e1c
4 changed files with 147 additions and 3 deletions

View File

@@ -575,6 +575,56 @@ public class AgentRunServiceDraftAndHitlTest {
Assert.assertEquals(1, recorder.recordCount);
}
/**
* 验证异步轮询调用会暴露原始调用 ID并从入参解析稳定任务 ID。
*
* @throws Exception 反射调用失败时抛出
*/
@Test
public void buildToolEventPayloadShouldExposeStableAsyncTaskIdentity() throws Exception {
AgentRunService service = new AgentRunService();
AgentRuntimeEvent event = AgentRuntimeEvent.of(AgentRuntimeEventType.TOOL_CALL);
event.setToolCallId("observe-call-2");
event.getPayload().put("input", Map.of("taskId", "task-1"));
event.getPayload().put("phase", "PRE_ACTING");
event.getMetadata().put("asyncTool", true);
event.getMetadata().put("asyncToolName", "document_generation");
event.getMetadata().put("asyncToolPhase", "observe");
Map<String, Object> payload = invoke(service, "buildToolEventPayload",
new Class<?>[]{AgentRuntimeEvent.class}, event);
Assert.assertEquals("observe-call-2", payload.get("sourceToolCallId"));
Assert.assertEquals("task-1", payload.get("taskId"));
Assert.assertEquals("task-1", payload.get("toolCallId"));
Assert.assertEquals("observe", payload.get("phase"));
}
/**
* 验证异步轮询结果会从结果元数据恢复稳定任务 ID。
*
* @throws Exception 反射调用失败时抛出
*/
@Test
public void buildToolEventPayloadShouldResolveAsyncTaskIdentityFromResultMetadata() throws Exception {
AgentRunService service = new AgentRunService();
AgentRuntimeEvent event = AgentRuntimeEvent.of(AgentRuntimeEventType.TOOL_RESULT);
event.setToolCallId("observe-call-2");
event.getPayload().put("phase", "POST_ACTING");
event.getMetadata().put("asyncTool", true);
event.getMetadata().put("asyncToolName", "document_generation");
event.getMetadata().put("asyncToolPhase", "observe");
event.getMetadata().put("taskId", "task-1");
Map<String, Object> payload = invoke(service, "buildToolEventPayload",
new Class<?>[]{AgentRuntimeEvent.class}, event);
Assert.assertEquals("observe-call-2", payload.get("sourceToolCallId"));
Assert.assertEquals("task-1", payload.get("taskId"));
Assert.assertEquals("task-1", payload.get("toolCallId"));
Assert.assertEquals("observe", payload.get("phase"));
}
/**
* 验证草稿工具审批只注册内存恢复令牌,不写 HITL pending 表。
*