Files
tutti/packages/agent/gui/host/workspaceAgentSessionMessages.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

99 lines
2.8 KiB
TypeScript

import {
loadAllAgentSessionMessages,
mergeAgentActivityMessages,
type AgentActivityMessage
} from "@tutti-os/agent-activity-core";
import {
isWorkspaceAgentActivityOptimisticMessage,
mergeWorkspaceAgentActivityDurableAndOverlayMessages
} from "../shared/workspaceAgentMessageOverlay";
const DEFAULT_WORKSPACE_AGENT_MESSAGES_LIMIT = 20;
export interface AgentActivitySessionMessagesPage {
messages: AgentActivityMessage[];
latestVersion?: number;
hasMore?: boolean;
}
export interface WorkspaceAgentActivityListSessionMessagesInput {
workspaceId: string;
agentSessionId: string;
afterVersion?: number;
beforeVersion?: number;
limit?: number;
order?: "asc" | "desc";
}
export async function loadWorkspaceAgentSessionMessagePages({
workspaceId,
agentSessionId,
afterVersion = 0,
limit = DEFAULT_WORKSPACE_AGENT_MESSAGES_LIMIT,
maxPages,
listSessionMessages
}: {
workspaceId?: string;
agentSessionId: string;
afterVersion?: number;
limit?: number;
maxPages?: number;
listSessionMessages: (
payload: WorkspaceAgentActivityListSessionMessagesInput
) => Promise<AgentActivitySessionMessagesPage>;
}): Promise<AgentActivityMessage[]> {
const normalizedWorkspaceId = workspaceId?.trim() || "";
const { messages } = await loadAllAgentSessionMessages<AgentActivityMessage>({
afterVersion,
...(maxPages === undefined ? {} : { maxPages }),
listPage: async (cursor) => {
const response = await listSessionMessages({
workspaceId: normalizedWorkspaceId,
agentSessionId,
afterVersion: cursor,
limit
});
return {
messages: response.messages,
latestVersion: response.latestVersion,
hasMore:
typeof response.hasMore === "boolean"
? response.hasMore
: response.messages.length >= limit
};
}
});
return messages;
}
export function mergeWorkspaceAgentMessages(
previous: readonly AgentActivityMessage[],
incoming: readonly AgentActivityMessage[]
): AgentActivityMessage[] {
const previousDurableMessages = previous.filter(
(message) => !isWorkspaceAgentActivityOptimisticMessage(message)
);
const incomingDurableMessages = incoming.filter(
(message) => !isWorkspaceAgentActivityOptimisticMessage(message)
);
const durableMessages = mergeAgentActivityMessages(
previousDurableMessages,
incomingDurableMessages
);
const previousOptimisticMessages = previous.filter(
isWorkspaceAgentActivityOptimisticMessage
);
const incomingOptimisticMessages = incoming.filter(
isWorkspaceAgentActivityOptimisticMessage
);
const localMessages = mergeAgentActivityMessages(
previousOptimisticMessages,
incomingOptimisticMessages
);
return mergeWorkspaceAgentActivityDurableAndOverlayMessages({
durableMessages,
localMessages
});
}