feat(chat): add typed change-set summary message in timeline
This commit is contained in:
@@ -4,6 +4,7 @@ import { getAuthContext } from "../utils/auth";
|
||||
import { prisma } from "../utils/prisma";
|
||||
import { buildChangeSet, captureSnapshot } from "../utils/changeSet";
|
||||
import { persistChatMessage, runCrmAgentFor, type AgentTraceEvent } from "../agent/crmAgent";
|
||||
import type { ChangeSet } from "../utils/changeSet";
|
||||
|
||||
function extractMessageText(message: any): string {
|
||||
if (!message || !Array.isArray(message.parts)) return "";
|
||||
@@ -37,6 +38,28 @@ function humanizeTraceText(trace: AgentTraceEvent): string {
|
||||
return text;
|
||||
}
|
||||
|
||||
function renderChangeSetSummary(changeSet: ChangeSet): string {
|
||||
const totals = { created: 0, updated: 0, deleted: 0 };
|
||||
for (const item of changeSet.items) {
|
||||
if (item.action === "created") totals.created += 1;
|
||||
else if (item.action === "updated") totals.updated += 1;
|
||||
else if (item.action === "deleted") totals.deleted += 1;
|
||||
}
|
||||
|
||||
const byEntity = new Map<string, number>();
|
||||
for (const item of changeSet.items) {
|
||||
byEntity.set(item.entity, (byEntity.get(item.entity) ?? 0) + 1);
|
||||
}
|
||||
|
||||
const lines = [
|
||||
"Technical change summary",
|
||||
`Total: ${changeSet.items.length} · Created: ${totals.created} · Updated: ${totals.updated} · Archived: ${totals.deleted}`,
|
||||
...[...byEntity.entries()].map(([entity, count]) => `- ${entity}: ${count}`),
|
||||
];
|
||||
|
||||
return lines.join("\n");
|
||||
}
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const auth = await getAuthContext(event);
|
||||
const body = await readBody<{ messages?: any[] }>(event);
|
||||
@@ -98,9 +121,24 @@ export default defineEventHandler(async (event) => {
|
||||
eventType: "assistant",
|
||||
phase: "final",
|
||||
transient: false,
|
||||
changeSet,
|
||||
});
|
||||
|
||||
if (changeSet) {
|
||||
await persistChatMessage({
|
||||
teamId: auth.teamId,
|
||||
conversationId: auth.conversationId,
|
||||
authorUserId: null,
|
||||
role: "ASSISTANT",
|
||||
text: renderChangeSetSummary(changeSet),
|
||||
requestId,
|
||||
eventType: "note",
|
||||
phase: "final",
|
||||
transient: false,
|
||||
messageKind: "change_set_summary",
|
||||
changeSet,
|
||||
});
|
||||
}
|
||||
|
||||
writer.write({ type: "text-start", id: textId });
|
||||
writer.write({ type: "text-delta", id: textId, delta: reply.text });
|
||||
writer.write({ type: "text-end", id: textId });
|
||||
|
||||
Reference in New Issue
Block a user