mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-07-21 10:15:47 +00:00
* feat(frontend): add side conversations for quoted follow-ups * style(frontend): apply prettier formatting to sidecar-chat files * fix(frontend): surface sidecar cascade cleanup failures via console.warn Previously deleteSidecarThreadsForParent silently swallowed both lookup errors and per-thread deletion failures, so parent thread deletions could succeed while orphaning sidecar threads with no signal to the caller. Log a warning that includes the parent id and the failed thread ids/reasons so the leak is discoverable in telemetry, matching the existing console.warn/error pattern in this file. * fix(frontend): address all sidecar review feedback Resolve every reviewer comment on PR #3934: - input-box/hooks/sidecar-panel: clear quoted references only via an `onSent` callback that fires after the in-flight guard, so a dropped send no longer silently discards quotes (willem-bd #3550). - message-list: flip the selection toolbar below the selection when it would clip above the viewport (willem-bd #3551). - reference-metadata/thread/input-box: keep referenced ids, roles, and count arrays 1:1 parallel instead of deduping ids (willem-bd #3552). - message-list: widen selection containment to the shared assistant-turn container and hint when a selection crosses messages (willem-bd #3553). - sidecar/api: coalesce concurrent sidecar creates for one parent behind a single in-flight promise to prevent duplicates (willem-bd #3554). - sidecar-trigger/context: force-restore on trigger click so a sidecar deleted elsewhere self-heals instead of opening a dead thread (willem-bd #3555). - threads/hooks: surface sidecar cascade cleanup failures via console.warn for both lookup and per-thread deletes (Copilot). Add unit + e2e coverage for parallel metadata, atomic create, and trigger self-healing.
76 lines
1.9 KiB
TypeScript
76 lines
1.9 KiB
TypeScript
import { expect, test } from "@rstest/core";
|
|
|
|
import {
|
|
buildReferenceMessageMetadata,
|
|
readReferenceMessageContexts,
|
|
type SidecarContext,
|
|
} from "@/core/sidecar";
|
|
|
|
const contexts: SidecarContext[] = [
|
|
{
|
|
type: "referenced_message",
|
|
label: "Selected assistant text #2",
|
|
messageId: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Build it as a side conversation.",
|
|
},
|
|
{
|
|
type: "referenced_message",
|
|
label: "Selected assistant text #2",
|
|
messageId: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Keep the cited snippets compact.",
|
|
},
|
|
];
|
|
|
|
test("builds visible message reference metadata for selected contexts", () => {
|
|
expect(buildReferenceMessageMetadata(contexts)).toEqual({
|
|
referenced_message_count: 2,
|
|
referenced_message_ids: ["parent-ai-1", "parent-ai-1"],
|
|
referenced_message_roles: ["assistant", "assistant"],
|
|
referenced_message_contexts: [
|
|
{
|
|
label: "Selected assistant text #2",
|
|
message_id: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Build it as a side conversation.",
|
|
},
|
|
{
|
|
label: "Selected assistant text #2",
|
|
message_id: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Keep the cited snippets compact.",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
test("reads visible message reference metadata defensively", () => {
|
|
expect(
|
|
readReferenceMessageContexts({
|
|
referenced_message_contexts: [
|
|
{
|
|
label: "Selected assistant text #2",
|
|
message_id: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Build it as a side conversation.",
|
|
},
|
|
{
|
|
label: 42,
|
|
message_id: "ignored",
|
|
role: "assistant",
|
|
content: "Bad reference",
|
|
},
|
|
],
|
|
}),
|
|
).toEqual([
|
|
{
|
|
type: "referenced_message",
|
|
label: "Selected assistant text #2",
|
|
messageId: "parent-ai-1",
|
|
role: "assistant",
|
|
content: "Build it as a side conversation.",
|
|
},
|
|
]);
|
|
});
|