fix: consume canvas agent pending requests

This commit is contained in:
134 2026-06-23 22:55:55 +08:00
parent d5ac630d01
commit cd0037dc47
2 changed files with 47 additions and 6 deletions

View File

@ -23,6 +23,16 @@ function normalizeNodeId(value: unknown) {
return String(value || "").trim(); return String(value || "").trim();
} }
function shouldConsumePendingRequest(params: {
pendingNodeId?: string;
detailNodeId?: string;
hasDetail: boolean;
}) {
const pendingNodeId = normalizeNodeId(params.pendingNodeId);
const detailNodeId = normalizeNodeId(params.detailNodeId);
return !params.hasDetail || !pendingNodeId || pendingNodeId === detailNodeId;
}
export function storeCanvasAgentSlotFillRequest( export function storeCanvasAgentSlotFillRequest(
targetWindow: CanvasAgentPendingRequestWindow, targetWindow: CanvasAgentPendingRequestWindow,
request: PendingCanvasAgentSlotFillRequest request: PendingCanvasAgentSlotFillRequest
@ -42,9 +52,13 @@ export function consumeCanvasAgentSlotFillRequest(
) { ) {
const pending = getPendingCanvasAgentSlotFillRequest(targetWindow); const pending = getPendingCanvasAgentSlotFillRequest(targetWindow);
if (!pending) return null; if (!pending) return null;
const pendingNodeId = normalizeNodeId(pending.nodeId); if (
const detailNodeId = normalizeNodeId(detail?.nodeId); shouldConsumePendingRequest({
if (!pendingNodeId || pendingNodeId === detailNodeId) { pendingNodeId: pending.nodeId,
detailNodeId: detail?.nodeId,
hasDetail: Boolean(detail),
})
) {
delete targetWindow.__canvasAgentPendingSlotFillRequest; delete targetWindow.__canvasAgentPendingSlotFillRequest;
} }
return pending; return pending;
@ -69,9 +83,13 @@ export function consumeCanvasAgentAnnotationEditRequest(
) { ) {
const pending = getPendingCanvasAgentAnnotationEditRequest(targetWindow); const pending = getPendingCanvasAgentAnnotationEditRequest(targetWindow);
if (!pending) return null; if (!pending) return null;
const pendingNodeId = normalizeNodeId(pending.nodeId); if (
const detailNodeId = normalizeNodeId(detail?.nodeId); shouldConsumePendingRequest({
if (!pendingNodeId || pendingNodeId === detailNodeId) { pendingNodeId: pending.nodeId,
detailNodeId: detail?.nodeId,
hasDetail: Boolean(detail),
})
) {
delete targetWindow.__canvasAgentPendingAnnotationEditRequest; delete targetWindow.__canvasAgentPendingAnnotationEditRequest;
} }
return pending; return pending;

View File

@ -3706,6 +3706,29 @@ test.describe("canvas chat pure helpers", () => {
expect(getPendingCanvasAgentAnnotationEditRequest(targetWindow)).toBeNull(); expect(getPendingCanvasAgentAnnotationEditRequest(targetWindow)).toBeNull();
}); });
test("consumes pending canvas agent UI requests when no event detail is provided", () => {
const targetWindow = {} as CanvasAgentPendingRequestWindow;
const slotRequest = {
nodeId: "slot-1",
label: "主图槽",
};
const annotationRequest = {
nodeId: "image-annotated",
title: "白底主图",
annotationCount: 2,
};
storeCanvasAgentSlotFillRequest(targetWindow, slotRequest);
storeCanvasAgentAnnotationEditRequest(targetWindow, annotationRequest);
expect(consumeCanvasAgentSlotFillRequest(targetWindow)).toEqual(slotRequest);
expect(consumeCanvasAgentAnnotationEditRequest(targetWindow)).toEqual(
annotationRequest
);
expect(getPendingCanvasAgentSlotFillRequest(targetWindow)).toBeNull();
expect(getPendingCanvasAgentAnnotationEditRequest(targetWindow)).toBeNull();
});
test("keeps pending annotation edit targets eligible for the next canvas context", () => { test("keeps pending annotation edit targets eligible for the next canvas context", () => {
const nodes = [ const nodes = [
{ {