Add multi-session auth and changelog tracking
这个提交包含在:
@@ -199,21 +199,28 @@ export async function syncRecordingTrainingData(input: {
|
||||
title: string;
|
||||
sessionMode?: "practice" | "pk";
|
||||
durationMinutes?: number | null;
|
||||
actionCount?: number | null;
|
||||
actionSummary?: Record<string, number> | null;
|
||||
dominantAction?: string | null;
|
||||
validityStatus?: string | null;
|
||||
invalidReason?: string | null;
|
||||
}) {
|
||||
const trainingDate = db.getDateKey();
|
||||
const planMatch = await db.matchActivePlanForExercise(input.userId, input.exerciseType);
|
||||
const exerciseLabel = ACTION_LABELS[input.exerciseType || "unknown"] || input.exerciseType || input.title;
|
||||
const resolvedExerciseType = input.exerciseType || input.dominantAction || "recording";
|
||||
const planMatch = await db.matchActivePlanForExercise(input.userId, resolvedExerciseType);
|
||||
const exerciseLabel = ACTION_LABELS[resolvedExerciseType || "unknown"] || resolvedExerciseType || input.title;
|
||||
const totalActions = Math.max(0, input.actionCount ?? 0);
|
||||
const recordResult = await db.upsertTrainingRecordBySource({
|
||||
userId: input.userId,
|
||||
planId: planMatch?.planId ?? null,
|
||||
linkedPlanId: planMatch?.planId ?? null,
|
||||
matchConfidence: planMatch?.confidence ?? null,
|
||||
exerciseName: exerciseLabel,
|
||||
exerciseType: input.exerciseType || "unknown",
|
||||
exerciseType: resolvedExerciseType,
|
||||
sourceType: "recording",
|
||||
sourceId: `recording:${input.videoId}`,
|
||||
videoId: input.videoId,
|
||||
actionCount: 0,
|
||||
actionCount: totalActions,
|
||||
durationMinutes: Math.max(1, input.durationMinutes ?? 5),
|
||||
completed: 1,
|
||||
poseScore: null,
|
||||
@@ -222,8 +229,15 @@ export async function syncRecordingTrainingData(input: {
|
||||
source: "recording",
|
||||
sessionMode: input.sessionMode || "practice",
|
||||
title: input.title,
|
||||
actionCount: totalActions,
|
||||
actionSummary: input.actionSummary ?? {},
|
||||
dominantAction: input.dominantAction ?? null,
|
||||
validityStatus: input.validityStatus ?? "pending",
|
||||
invalidReason: input.invalidReason ?? null,
|
||||
},
|
||||
notes: "自动写入:录制归档",
|
||||
notes: input.validityStatus?.startsWith("invalid")
|
||||
? `自动写入:录制归档(无效录制)${input.invalidReason ? ` · ${input.invalidReason}` : ""}`
|
||||
: "自动写入:录制归档",
|
||||
});
|
||||
|
||||
if (recordResult.isNew) {
|
||||
@@ -234,7 +248,12 @@ export async function syncRecordingTrainingData(input: {
|
||||
deltaSessions: 1,
|
||||
deltaRecordingCount: 1,
|
||||
deltaPkCount: input.sessionMode === "pk" ? 1 : 0,
|
||||
metadata: { latestRecordingExerciseType: input.exerciseType || "unknown" },
|
||||
deltaTotalActions: totalActions,
|
||||
deltaEffectiveActions: input.validityStatus?.startsWith("invalid") ? 0 : totalActions,
|
||||
metadata: {
|
||||
latestRecordingExerciseType: resolvedExerciseType,
|
||||
latestRecordingValidity: input.validityStatus ?? "pending",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户