evOo-local/packages/core/src/thread-message-updates.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

42 lines
1.5 KiB
TypeScript

import type { MessageBlock } from "@rakazo/contracts";
import { cloudAgentBlockFromPayload } from "./cloud-agent.js";
/** Remove this run's live message and obsolete unscoped progress without reordering history. */
export function takeLiveMessage<Message extends { id: string; runId?: string | null }>(
messages: readonly Message[],
liveId: string,
): { previous: Message | undefined; remaining: Message[] } {
let previous: Message | undefined;
const remaining: Message[] = [];
for (const message of messages) {
if (message.id === liveId) previous = message;
else if (!message.id.startsWith("progress:") || message.runId) remaining.push(message);
}
return { previous, remaining };
}
export function updateCloudAgentMessages<Message extends { id: string; blocks: MessageBlock[] }>(
messages: readonly Message[],
payload: Record<string, unknown>,
): Message[] {
const agentId = String(payload.agentId ?? "");
const messageId = String(payload.messageId ?? "");
const block = cloudAgentBlockFromPayload(payload);
return messages.map((message) => {
if (
(messageId && message.id === messageId) ||
message.blocks.some(
(existing) => existing.kind === "cloud_agent" && existing.agentId === agentId,
)
) {
return {
...message,
blocks: message.blocks.map((existing) =>
existing.kind === "cloud_agent" && existing.agentId === agentId ? block : existing,
),
};
}
return message;
});
}