refactor(ai-chat): 拆分超大文件并通过 aislop 100 分门槛

- AiChatService 拆出抽象基类,职责不变
- submissions 按提交内容/评审确认/运行时/流程拆为 4 个模块并保持导出兼容
- 导入工具执行器抽取共享 runner,消除重复签名块
- 全仓 aislop 扫描 100/100,0 警告
This commit is contained in:
2026-08-06 12:13:37 +08:00
parent 7f09d5271e
commit 824c33a71c
9 changed files with 1202 additions and 1058 deletions

View 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);
}
}