Files
tutti/packages/agent/gui/agent-gui/agentGuiNode/model/agentGuiConversationActivityMessage.spec.ts
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

62 lines
1.8 KiB
TypeScript

import { expect, test } from "vitest";
import type { AgentActivityMessage } from "@tutti-os/agent-activity-core";
import { resolveAgentGUIConversationActivityMessage } from "./agentGuiConversationActivityMessage.ts";
test("activity message selects the latest in-memory agent text without hydration", () => {
expect(
resolveAgentGUIConversationActivityMessage([
message("user", "new user prompt", 30),
message("assistant", "older answer", 10),
message("agent", "latest\nanswer", 20)
])
).toBe("latest answer");
});
test("activity message ignores tool calls and empty agent payloads", () => {
expect(
resolveAgentGUIConversationActivityMessage([
message("assistant", "tool details", 20, "tool_call"),
message("assistant", "", 30)
])
).toBeNull();
});
test("activity message ignores explicitly non-user-visible assistant output", () => {
const hidden = message("assistant", "internal settling output", 30);
hidden.semantics = { userVisibleAssistantResponse: false };
expect(resolveAgentGUIConversationActivityMessage([hidden])).toBeNull();
});
test("activity message compacts provider text content blocks", () => {
const candidate = message("assistant", "", 30);
candidate.payload.content = [
{ type: "text", text: "First line" },
{ type: "image", url: "ignored" },
{ type: "text", text: "second\nline" }
];
expect(resolveAgentGUIConversationActivityMessage([candidate])).toBe(
"First line second line"
);
});
function message(
role: string,
text: string,
occurredAtUnixMs: number,
kind = "text"
): AgentActivityMessage {
return {
agentSessionId: "session-1",
kind,
messageId: `${role}-${occurredAtUnixMs}`,
occurredAtUnixMs,
payload: { text },
role,
sequence: occurredAtUnixMs,
turnId: "turn-1",
version: occurredAtUnixMs
};
}