Team/user CRMFS export + scoped chat

This commit is contained in:
Ruslan Bakiev
2026-02-18 09:37:48 +07:00
parent 513a394b93
commit a8db021597
17 changed files with 1872 additions and 23 deletions

View File

@@ -0,0 +1,22 @@
import { prisma } from "../utils/prisma";
import { getAuthContext } from "../utils/auth";
export default defineEventHandler(async (event) => {
const auth = await getAuthContext(event);
const items = await prisma.chatMessage.findMany({
where: { teamId: auth.teamId, conversationId: auth.conversationId },
orderBy: { createdAt: "asc" },
take: 200,
});
return {
items: items.map((m) => ({
id: m.id,
role: m.role === "USER" ? "user" : m.role === "ASSISTANT" ? "assistant" : "system",
text: m.text,
plan: (m.planJson as any)?.steps ?? null,
tools: (m.planJson as any)?.tools ?? null,
createdAt: m.createdAt,
})),
};
});

View File

@@ -0,0 +1,33 @@
import { readBody } from "h3";
import { persistChatMessage, runCrmAgentFor } from "../agent/crmAgent";
import { getAuthContext } from "../utils/auth";
export default defineEventHandler(async (event) => {
const body = await readBody<{ text?: string }>(event);
const text = (body?.text ?? "").trim();
if (!text) {
throw createError({ statusCode: 400, statusMessage: "text is required" });
}
const auth = await getAuthContext(event);
await persistChatMessage({
teamId: auth.teamId,
conversationId: auth.conversationId,
authorUserId: auth.userId,
role: "USER",
text,
});
const reply = await runCrmAgentFor({ teamId: auth.teamId, userId: auth.userId, userText: text });
await persistChatMessage({
teamId: auth.teamId,
conversationId: auth.conversationId,
authorUserId: null,
role: "ASSISTANT",
text: reply.text,
plan: reply.plan,
tools: reply.tools,
});
return { ok: true };
});

View File

@@ -0,0 +1,25 @@
import { readBody } from "h3";
import { persistChatMessage } from "../../agent/crmAgent";
import { getAuthContext } from "../../utils/auth";
export default defineEventHandler(async (event) => {
const body = await readBody<{ text?: string }>(event);
const text = (body?.text ?? "").trim();
if (!text) {
throw createError({ statusCode: 400, statusMessage: "text is required" });
}
const auth = await getAuthContext(event);
await persistChatMessage({
teamId: auth.teamId,
conversationId: auth.conversationId,
authorUserId: null,
role: "ASSISTANT",
text,
plan: [],
tools: [],
});
return { ok: true };
});

View File

@@ -0,0 +1,8 @@
import { exportDatasetFromPrismaFor } from "../../dataset/exporter";
import { getAuthContext } from "../../utils/auth";
export default defineEventHandler(async (event) => {
const auth = await getAuthContext(event);
await exportDatasetFromPrismaFor({ teamId: auth.teamId, userId: auth.userId });
return { ok: true };
});