import type { Prisma } from '@prisma/client'; /** * M-AI-03-09: Result Projector 接口(ADR-003 §6.1 冻结) * * 每个 Projector 负责将 validatedOutput 投影到具体业务实体。 * 在 Prisma Transaction 内执行,与 AiJobArtifact + markSucceeded 共享事务。 */ export interface ArtifactReference { artifactType: string; artifactId: string; ordinal: number; } export interface ProjectionContext { job: { id: string; userId: string; jobType: string; targetType: string | null; targetId: string | null; snapshotId: string | null; promptVersion: string | null; outputSchemaVersion: string | null; }; snapshot: any; validatedOutput: Record; } export interface ResultProjector { /** 全局唯一 key,对应 JobDefinition.projectorKey */ readonly key: string; /** * 在 Prisma Transaction 内执行投影。 * 如果业务实体已存在(幂等),返回已有 Artifact 引用。 */ project( tx: Prisma.TransactionClient, context: ProjectionContext, ): Promise; } /** NestJS 注入 Token */ export const RESULT_PROJECTORS = 'RESULT_PROJECTORS';