fix(rectification): show the house table and hide the activity fold
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -16,10 +16,10 @@ import {
|
||||
type RectificationCandidateResult,
|
||||
} from "@/lib/rectification-candidate-result";
|
||||
import { membershipHref } from "@/lib/membership";
|
||||
import { vargaSentenceFromMethods } from "@/lib/rectification-varga-sentence";
|
||||
import {
|
||||
isPublicRectificationMethod,
|
||||
isPublicRectificationTool,
|
||||
type PublicRectificationTool,
|
||||
} from "@/lib/rectification-agentic/v9/public-receipt";
|
||||
import type { PublicLanguageModel } from "@/lib/public-models";
|
||||
import { ChatMessageRow } from "./chat-message-row";
|
||||
@@ -27,8 +27,8 @@ import {
|
||||
ChatMessageActions,
|
||||
toggleChatMessageFeedback,
|
||||
} from "./chat-message-actions";
|
||||
import { CompletedActivityReceipt } from "./completed-activity-receipt";
|
||||
import { ModelSelector } from "./model-selector";
|
||||
import { RectificationHouseTableView } from "./rectification-house-table";
|
||||
import { Button } from "./ui/button";
|
||||
import { Textarea } from "./ui/textarea";
|
||||
|
||||
@@ -74,33 +74,11 @@ type RectificationAgenticChatProps = Readonly<{
|
||||
|
||||
type RenderMessage = ChatMessageView & {
|
||||
renderKey: string;
|
||||
activeActivity?: PublicActivity;
|
||||
completedReceipt?: CompletedActivityReceiptView;
|
||||
failed?: boolean;
|
||||
turnId?: string;
|
||||
};
|
||||
|
||||
type PublicActivity = Readonly<{
|
||||
tool: PublicRectificationTool;
|
||||
label: string;
|
||||
}>;
|
||||
|
||||
const ACTIVE_TOOL_LABELS: Readonly<Record<PublicRectificationTool, string>> = {
|
||||
"rectification-read-case": "正在读取校正记录…",
|
||||
"rectification-set-focus": "正在设置对话焦点…",
|
||||
"rectification-resolve-focus": "正在处理当前焦点…",
|
||||
"rectification-record-evidence-batch": "正在整理多条事件证据…",
|
||||
"rectification-propose-evidence": "正在整理事件证据…",
|
||||
"rectification-confirm-evidence": "正在确认事件证据…",
|
||||
"rectification-revise-evidence": "正在修订事件证据…",
|
||||
"rectification-compare-candidates": "正在比较候选时间…",
|
||||
"rectification-read-diagnostics": "正在检查候选稳健性…",
|
||||
"rectification-offer-candidates": "正在生成候选建议…",
|
||||
"rectification-accept-candidate": "正在采用候选时间…",
|
||||
"rectification-confirm-birth-time": "正在确认校正时间…",
|
||||
"rectification-close-case": "正在完成校正记录…",
|
||||
};
|
||||
|
||||
function completedReceiptFromPersisted(receipt: PersistedTurn["receipt"]): CompletedActivityReceiptView {
|
||||
if (!receipt) return { steps: [], methods: [] };
|
||||
if (Array.isArray(receipt.tool_activities)) {
|
||||
@@ -132,13 +110,6 @@ export function toggleRectificationFeedback(
|
||||
return toggleChatMessageFeedback(current, requested);
|
||||
}
|
||||
|
||||
function activityPhase(tool: PublicRectificationTool): NonNullable<ChatMessageView["activity"]>["phase"] {
|
||||
if (tool === "rectification-compare-candidates" || tool === "rectification-read-diagnostics") {
|
||||
return "chart-calculation";
|
||||
}
|
||||
return "evidence-validation";
|
||||
}
|
||||
|
||||
function hasActivityReceipt(receipt: CompletedActivityReceiptView): boolean {
|
||||
return receipt.steps.length > 0 || receipt.methods.length > 0 || Boolean(receipt.failedTool);
|
||||
}
|
||||
@@ -354,13 +325,7 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
} else if (event.type === "tool.activity") {
|
||||
const tool = isPublicRectificationTool(event.tool) ? event.tool : null;
|
||||
if (!tool) continue;
|
||||
if (event.status === "started") {
|
||||
const activeActivity = { tool, label: ACTIVE_TOOL_LABELS[tool] } satisfies PublicActivity;
|
||||
setMessages((current) => current.map((message) => message.renderKey === assistantRenderKey
|
||||
? { ...message, activeActivity }
|
||||
: message));
|
||||
continue;
|
||||
}
|
||||
if (event.status === "started") continue;
|
||||
if (event.status !== "completed" && event.status !== "failed") continue;
|
||||
activityReceiptState = reduceRectificationActivityReceipt(activityReceiptState, {
|
||||
tool,
|
||||
@@ -370,12 +335,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
: [],
|
||||
});
|
||||
completedReceipt = receiptFromRectificationActivityState(activityReceiptState);
|
||||
setMessages((current) => current.map((message) => message.renderKey === assistantRenderKey
|
||||
? {
|
||||
...message,
|
||||
activeActivity: message.activeActivity?.tool === tool ? undefined : message.activeActivity,
|
||||
}
|
||||
: message));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -389,7 +348,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
...message,
|
||||
text: parsed.text,
|
||||
state: "settled",
|
||||
activeActivity: undefined,
|
||||
completedReceipt,
|
||||
failed: false,
|
||||
turnId: completedTurnId,
|
||||
@@ -400,7 +358,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
...message,
|
||||
text: "",
|
||||
state: "settled",
|
||||
activeActivity: undefined,
|
||||
completedReceipt,
|
||||
failed: true,
|
||||
}];
|
||||
@@ -431,7 +388,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
...message,
|
||||
text: "",
|
||||
state: "settled",
|
||||
activeActivity: undefined,
|
||||
completedReceipt,
|
||||
failed: true,
|
||||
}]
|
||||
@@ -564,27 +520,23 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
&& !readonly
|
||||
&& regeneratingMessageKey === null;
|
||||
const displayedMessage = regenerating
|
||||
? { ...message, text: "", state: "thinking" as const, activeActivity: undefined }
|
||||
? { ...message, text: "", state: "thinking" as const }
|
||||
: message;
|
||||
const vargaSentence = message.state === "settled" && !message.failed
|
||||
? vargaSentenceFromMethods(message.completedReceipt?.methods)
|
||||
: null;
|
||||
return (
|
||||
<div key={message.renderKey} className="rectification-message-wrap rectification-message-entry">
|
||||
{message.state === "settled" && message.failed && !message.completedReceipt?.failedTool && (
|
||||
{message.state === "settled" && message.failed && (
|
||||
<p className="rectification-activity-failure" role="status">
|
||||
本轮处理未完成,已保留服务端记录的执行进度。
|
||||
</p>
|
||||
)}
|
||||
{message.state === "settled" && message.completedReceipt && (
|
||||
<CompletedActivityReceipt receipt={message.completedReceipt} />
|
||||
)}
|
||||
{(!message.failed || Boolean(displayedMessage.text) || regenerating) && (
|
||||
<ChatMessageRow
|
||||
message={{
|
||||
...displayedMessage,
|
||||
activity: displayedMessage.activeActivity
|
||||
? { phase: activityPhase(displayedMessage.activeActivity.tool), label: displayedMessage.activeActivity.label }
|
||||
: undefined,
|
||||
}}
|
||||
showActivity={displayedMessage.state === "thinking" || Boolean(displayedMessage.activeActivity)}
|
||||
message={displayedMessage}
|
||||
showActivity={displayedMessage.state === "thinking"}
|
||||
vargaSentence={vargaSentence}
|
||||
/>
|
||||
)}
|
||||
{showActions && !regenerating && (
|
||||
@@ -603,6 +555,9 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
{candidateResult?.houseTable && (
|
||||
<RectificationHouseTableView table={candidateResult.houseTable} />
|
||||
)}
|
||||
{candidateResult?.selectionAllowed && (
|
||||
<section className="rectification-candidates" aria-label="生时校正候选时间">
|
||||
<div className="rectification-candidates-heading">
|
||||
|
||||
Reference in New Issue
Block a user