Add multi-session auth and changelog tracking

这个提交包含在:
cryptocommuniums-afk
2026-03-15 17:30:19 +08:00
父节点 c4ec397ed3
当前提交 a9ea94fb78
修改 27 个文件,包含 1280 行新增89 行删除

查看文件

@@ -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",
},
});
}