Implement live analysis achievements and admin console

这个提交包含在:
cryptocommuniums-afk
2026-03-15 01:39:34 +08:00
父节点 d1b6603061
当前提交 edc66ea5bc
修改 23 个文件,包含 4033 行新增1022 行删除

查看文件

@@ -17,6 +17,7 @@ import {
normalizeAdjustedPlanResponse,
normalizeTrainingPlanResponse,
} from "./trainingPlan";
import { refreshAllUsersNtrp, refreshUserNtrp, syncRecordingTrainingData } from "./trainingAutomation";
type TaskRow = Awaited<ReturnType<typeof db.getBackgroundTaskById>>;
@@ -419,6 +420,8 @@ async function runMediaFinalizeTask(task: NonNullable<TaskRow>) {
sessionId: string;
title: string;
exerciseType?: string;
sessionMode?: "practice" | "pk";
durationMinutes?: number;
};
const session = await getRemoteMediaSession(payload.sessionId);
@@ -489,6 +492,15 @@ async function runMediaFinalizeTask(task: NonNullable<TaskRow>) {
analysisStatus: "completed",
});
await syncRecordingTrainingData({
userId: task.userId,
videoId,
exerciseType: payload.exerciseType || "unknown",
title: payload.title || session.title,
sessionMode: payload.sessionMode || "practice",
durationMinutes: payload.durationMinutes ?? 5,
});
return {
kind: "media_finalize" as const,
sessionId: session.id,
@@ -499,6 +511,26 @@ async function runMediaFinalizeTask(task: NonNullable<TaskRow>) {
};
}
async function runNtrpRefreshUserTask(task: NonNullable<TaskRow>) {
const payload = task.payload as { targetUserId?: number };
const targetUserId = payload.targetUserId ?? task.userId;
const snapshot = await refreshUserNtrp(targetUserId, { triggerType: "manual", taskId: task.id });
return {
kind: "ntrp_refresh_user" as const,
targetUserId,
snapshot,
};
}
async function runNtrpRefreshAllTask(task: NonNullable<TaskRow>) {
const results = await refreshAllUsersNtrp({ triggerType: "daily", taskId: task.id });
return {
kind: "ntrp_refresh_all" as const,
refreshedUsers: results.length,
results,
};
}
export async function processBackgroundTask(task: NonNullable<TaskRow>) {
switch (task.type) {
case "training_plan_generate":
@@ -511,6 +543,10 @@ export async function processBackgroundTask(task: NonNullable<TaskRow>) {
return runMultimodalCorrectionTask(task);
case "media_finalize":
return runMediaFinalizeTask(task);
case "ntrp_refresh_user":
return runNtrpRefreshUserTask(task);
case "ntrp_refresh_all":
return runNtrpRefreshAllTask(task);
default:
throw new Error(`Unsupported task type: ${String(task.type)}`);
}