fix(middleware): Prevent todo completion reminder IMMessage leak (#2907)
* fix(middleware): Prevent todo completion reminder IMMessage leak (#2892) * make format * fix(middleware): Clear stale todo reminder counts (#2892) * add size guard for _completion_reminder_counts and add a integration test
This commit is contained in:
@@ -26,6 +26,13 @@ export type MessageGroup =
|
||||
| AssistantClarificationGroup
|
||||
| AssistantSubagentGroup;
|
||||
|
||||
const HIDDEN_CONTROL_MESSAGE_NAMES = new Set([
|
||||
"summary",
|
||||
"loop_warning",
|
||||
"todo_reminder",
|
||||
"todo_completion_reminder",
|
||||
]);
|
||||
|
||||
export function getMessageGroups(messages: Message[]): MessageGroup[] {
|
||||
if (messages.length === 0) {
|
||||
return [];
|
||||
@@ -53,10 +60,6 @@ export function getMessageGroups(messages: Message[]): MessageGroup[] {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (message.name === "todo_reminder") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (message.type === "human") {
|
||||
groups.push({ id: message.id, type: "human", messages: [message] });
|
||||
continue;
|
||||
@@ -368,8 +371,8 @@ export function findToolCallResult(toolCallId: string, messages: Message[]) {
|
||||
export function isHiddenFromUIMessage(message: Message) {
|
||||
return (
|
||||
message.additional_kwargs?.hide_from_ui === true ||
|
||||
message.name === "summary" ||
|
||||
message.name === "loop_warning"
|
||||
(typeof message.name === "string" &&
|
||||
HIDDEN_CONTROL_MESSAGE_NAMES.has(message.name))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,3 +63,37 @@ test("aggregates token usage messages once per assistant turn", () => {
|
||||
),
|
||||
).toEqual([null, null, ["ai-1", "ai-2"], null, ["ai-3"]]);
|
||||
});
|
||||
|
||||
test("hides internal todo reminder messages from message groups", () => {
|
||||
const messages = [
|
||||
{
|
||||
id: "human-1",
|
||||
type: "human",
|
||||
content: "Audit the middleware",
|
||||
},
|
||||
{
|
||||
id: "todo-reminder-1",
|
||||
type: "human",
|
||||
name: "todo_completion_reminder",
|
||||
content: "<system_reminder>finish todos</system_reminder>",
|
||||
},
|
||||
{
|
||||
id: "todo-reminder-2",
|
||||
type: "human",
|
||||
name: "todo_reminder",
|
||||
content: "<system_reminder>remember todos</system_reminder>",
|
||||
},
|
||||
{
|
||||
id: "ai-1",
|
||||
type: "ai",
|
||||
content: "Done",
|
||||
},
|
||||
] as Message[];
|
||||
|
||||
const groups = getMessageGroups(messages);
|
||||
|
||||
expect(groups.map((group) => group.type)).toEqual(["human", "assistant"]);
|
||||
expect(
|
||||
groups.flatMap((group) => group.messages).map((message) => message.id),
|
||||
).toEqual(["human-1", "ai-1"]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user