merge origin/staging into report chart render branch
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

Keep BUG-607 after 602–606 and retain both 09-09 changelog entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-09 15:13:37 +08:00
co-authored by Cursor
67 changed files with 1826 additions and 172 deletions
@@ -36,6 +36,8 @@ import { previousInferenceFromReceipt } from "@/lib/rectification-agentic/v9/inf
import { CHOICE_STOP_LABEL, parseAgentChoiceCopy } from "@/lib/rectification-agentic/v9/choice-card";
import {
classifyRectificationTurnIntent,
isCollectDeclineUtterance,
isCollectSkipUtterance,
optionIdForAnswerClass,
shouldDeclineCollectFocus,
shouldContinueAgentForDatedEvent,
@@ -493,11 +495,30 @@ export async function POST(request: Request) {
return completedMessageResponse(applied.narration, requestId, caseId, applied.turnId);
}
} else if (focus && isCollectFocusSchema(focus.expectedAnswerSchema)) {
const userMessage = parsed.data.message ?? "";
if (isCollectDeclineUtterance(userMessage) || isCollectSkipUtterance(userMessage)) {
const applied = await applyCollectFocusDenial(accounting, {
userId,
caseId,
focusId: focus.id,
status: isCollectSkipUtterance(userMessage) ? "skipped" : "declined",
narrateAdopt,
});
const finished = await persistCollectDenialTurn({
accounting,
userId,
caseId,
requestId,
userMessage,
applied,
});
return completedMessageResponse(finished.streamText, requestId, caseId, finished.turnId);
}
let classified = null;
try {
classified = await classifyRectificationTurnIntent(selectedModel, {
focus,
userMessage: parsed.data.message ?? "",
userMessage,
caseStatus,
signal: request.signal,
});
+12
View File
@@ -1518,6 +1518,18 @@ button:disabled { cursor: default; opacity: .45; }
.composer-queue__recall:focus-visible { outline: 3px solid color-mix(in srgb, var(--color-focus) 56%, transparent); outline-offset: 2px; }
.composer-wrap { position: sticky; bottom: 0; z-index: 2; min-width: 0; border-top: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent); padding: var(--space-3) var(--space-6) var(--space-4); background: var(--color-frosted); backdrop-filter: saturate(130%) blur(20px); }
.rectification-collect-replies {
width: min(760px, 100%);
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
margin: 0 auto var(--space-2);
}
.rectification-collect-reply {
min-height: 44px;
min-width: 44px;
padding: 0 var(--space-4);
}
/* Jump to latest: shared by both chat surfaces. Hangs off the composer wrap's top
edge so it never reflows the transcript or the composer. */
.jump-to-latest {