feat(server): realtime handle & migration (#15487)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Retry failed Copilot transcription tasks in real time.
  * Retried tasks resume processing and report updated status.
* Managed Copilot provider models can be omitted to use provider
defaults.

* **Bug Fixes**
* Improved handling of incomplete BYOK profiles, including safe
replacement of legacy records.
  * Duplicate profile creation now returns a clear validation error.
* Improved transcript processing reliability by preventing duplicate or
stale dispatches.

* **Migration**
* Consolidated legacy managed-provider settings while preserving
existing profiles and defaults.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-08-16 08:04:19 +08:00
committed by GitHub
parent ff1e3d9c94
commit 06b3d020fa
27 changed files with 1118 additions and 175 deletions
@@ -3,6 +3,7 @@ import { Cron, CronExpression } from '@nestjs/schedule';
import { JobQueue, OneDay, OnJob } from '../../base';
import { Models } from '../../models';
import { CopilotTranscriptionRetryService } from './transcript/retry';
const BACKGROUND_COPILOT_JOB_PRIORITY = 100;
@@ -19,9 +20,15 @@ export class CopilotCronJobs {
constructor(
private readonly models: Models,
private readonly jobs: JobQueue
private readonly jobs: JobQueue,
private readonly transcriptRetry: CopilotTranscriptionRetryService
) {}
@Cron(CronExpression.EVERY_MINUTE)
async reconcileTranscriptDispatches() {
await this.transcriptRetry.reconcileDispatches();
}
@Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
async dailyCleanupJob() {
await this.jobs.add(