refactor(ai-chat): 拆分超大文件并通过 aislop 100 分门槛
- AiChatService 拆出抽象基类,职责不变 - submissions 按提交内容/评审确认/运行时/流程拆为 4 个模块并保持导出兼容 - 导入工具执行器抽取共享 runner,消除重复签名块 - 全仓 aislop 扫描 100/100,0 警告
This commit is contained in:
90
apps/server/src/ai-chat/ai-chat.submit-content.ts
Normal file
90
apps/server/src/ai-chat/ai-chat.submit-content.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { AiReview } from './entities/ai-review.entity';
|
||||
import type { AiChatServiceContext } from './ai-chat.types';
|
||||
|
||||
export function a2uiSubmitInfo(
|
||||
metadata: Record<string, unknown> | null,
|
||||
): { title: string; values: Record<string, unknown> } | null {
|
||||
const submit = metadata?.a2uiSubmit;
|
||||
if (!submit || typeof submit !== 'object' || Array.isArray(submit)) return null;
|
||||
const record = submit as Record<string, unknown>;
|
||||
const title = typeof record.formTitle === 'string' ? record.formTitle : '表单';
|
||||
const values =
|
||||
record.values && typeof record.values === 'object' && !Array.isArray(record.values)
|
||||
? (record.values as Record<string, unknown>)
|
||||
: {};
|
||||
return { title, values };
|
||||
}
|
||||
|
||||
export function buildFormSubmitModelContent(submit: {
|
||||
title: string;
|
||||
values: Record<string, unknown>;
|
||||
}): string {
|
||||
let json: string;
|
||||
try {
|
||||
json = JSON.stringify(submit.values);
|
||||
} catch {
|
||||
json = '[无法序列化]';
|
||||
}
|
||||
return `【表单提交:${submit.title}】\n提交值(JSON):${json.slice(0, 32 * 1024)}\n用户已在表单中确认,你可以执行允许的写操作工具。`;
|
||||
}
|
||||
|
||||
export async function markFormSubmittedOnMessage(
|
||||
context: AiChatServiceContext,
|
||||
assistantMessageId: number,
|
||||
conversationId: number,
|
||||
): Promise<void> {
|
||||
const assistant = await context.messages.findOne({
|
||||
where: { id: assistantMessageId, conversationId },
|
||||
});
|
||||
const a2ui = assistant?.metadata?.a2uiForm;
|
||||
if (assistant && a2ui && typeof a2ui === 'object' && !Array.isArray(a2ui)) {
|
||||
assistant.metadata = {
|
||||
...assistant.metadata,
|
||||
a2uiForm: { ...(a2ui as Record<string, unknown>), status: 'submitted' },
|
||||
};
|
||||
await context.messages.save(assistant);
|
||||
}
|
||||
}
|
||||
|
||||
export function a2uiReviewSubmitInfo(
|
||||
metadata: Record<string, unknown> | null,
|
||||
): { reviewId: string; reviewTitle: string; resultMessage: string } | null {
|
||||
const submit = metadata?.a2uiReviewSubmit;
|
||||
if (!submit || typeof submit !== 'object' || Array.isArray(submit)) return null;
|
||||
const record = submit as Record<string, unknown>;
|
||||
if (typeof record.reviewId !== 'string') return null;
|
||||
return {
|
||||
reviewId: record.reviewId,
|
||||
reviewTitle: typeof record.reviewTitle === 'string' ? record.reviewTitle : '批量导入',
|
||||
resultMessage: typeof record.resultMessage === 'string' ? record.resultMessage : '导入已完成',
|
||||
};
|
||||
}
|
||||
|
||||
export function buildReviewSubmitModelContent(submit: {
|
||||
reviewId: string;
|
||||
reviewTitle: string;
|
||||
resultMessage: string;
|
||||
}): string {
|
||||
return `【批量导入已确认:${submit.reviewTitle}】\n${submit.resultMessage}\n数据已由系统入库,不要再次调用写入工具,直接向用户汇报导入结果即可。`;
|
||||
}
|
||||
|
||||
export async function markReviewSubmittedOnMessage(
|
||||
context: AiChatServiceContext,
|
||||
assistantMessageId: number,
|
||||
conversationId: number,
|
||||
review?: AiReview,
|
||||
): Promise<void> {
|
||||
const assistant = await context.messages.findOne({
|
||||
where: { id: assistantMessageId, conversationId },
|
||||
});
|
||||
const a2ui = assistant?.metadata?.a2uiReview;
|
||||
if (assistant && a2ui && typeof a2ui === 'object' && !Array.isArray(a2ui)) {
|
||||
assistant.metadata = {
|
||||
...assistant.metadata,
|
||||
a2uiReview: review
|
||||
? context.reviewService.serialize(review)
|
||||
: { ...(a2ui as Record<string, unknown>), status: 'submitted' },
|
||||
};
|
||||
await context.messages.save(assistant);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user