feat: 补齐会话中心 v1 与任务创建准备流

This commit is contained in:
2026-04-02 18:48:21 +08:00
parent 29cea8b0aa
commit 145f958663
9 changed files with 1462 additions and 59 deletions
+36
View File
@@ -4,6 +4,27 @@ export type PlatformId = (typeof platforms)[number];
export const searchRequirements = ["none", "recommended", "required"] as const;
export type SearchRequirement = (typeof searchRequirements)[number];
export const sessionStatuses = ["missing", "ready", "expired"] as const;
export type SessionStatus = (typeof sessionStatuses)[number];
export const strategyLayers = ["L0", "L1", "L2", "L3"] as const;
export type StrategyLayer = (typeof strategyLayers)[number];
export const platformCapabilities = ["search", "detail", "reviews", "login"] as const;
export type PlatformCapability = (typeof platformCapabilities)[number];
export const strategyAttemptOutcomes = [
"succeeded",
"blocked",
"failed",
"no_result",
"skipped"
] as const;
export type StrategyAttemptOutcome = (typeof strategyAttemptOutcomes)[number];
export const strategyAttemptTriggers = ["system", "retry", "recovery"] as const;
export type StrategyAttemptTrigger = (typeof strategyAttemptTriggers)[number];
export const taskStatuses = [
"Draft",
"Searching",
@@ -64,3 +85,18 @@ export type SampleFlag = (typeof sampleFlags)[number];
export const evidenceSourceTypes = ["product", "review"] as const;
export type EvidenceSourceType = (typeof evidenceSourceTypes)[number];
export const retentionActions = ["task_deleted", "retention_cleanup"] as const;
export type RetentionAction = (typeof retentionActions)[number];
export const auditActions = [
"session.prepared",
"session.cleared",
"task.recovery_completed",
"platform.retry_started",
"platform.retry_completed",
"task.deleted",
"report.published",
"report.unchanged"
] as const;
export type AuditAction = (typeof auditActions)[number];
+120
View File
@@ -1,7 +1,15 @@
import type {
AuditAction,
PlatformCapability,
PlatformId,
PlatformStatus,
SearchRequirement,
ReportableTaskStatus,
RetentionAction,
SessionStatus,
StrategyAttemptOutcome,
StrategyAttemptTrigger,
StrategyLayer,
TaskStage,
TaskStatus
} from "./enums";
@@ -46,8 +54,120 @@ export interface TaskEventRecord {
export interface SessionReadinessRecord {
platform: PlatformId;
ready: boolean;
status: SessionStatus;
searchRequirement: SearchRequirement;
reason: string;
lastPreparedAt?: string | undefined;
expiresAt?: string | undefined;
}
export interface SessionStateRecord {
platform: PlatformId;
ready: boolean;
status: SessionStatus;
searchRequirement: SearchRequirement;
scope: "workspace";
ttlHours: number;
lastPreparedAt?: string | undefined;
expiresAt?: string | undefined;
encryptedSnapshotAvailable: boolean;
cipherLabel?: string | undefined;
}
export interface StrategyAttemptRecord {
attemptId: string;
taskId: string;
platform: PlatformId;
capability: PlatformCapability;
layer: StrategyLayer;
outcome: StrategyAttemptOutcome;
trigger: StrategyAttemptTrigger;
startedAt: string;
finishedAt: string;
durationMs: number;
errorType?: string | undefined;
detail: string;
}
export interface PlatformRunMetricRecord {
taskId: string;
platform: PlatformId;
searchDurationMs: number;
detailDurationMs: number;
reviewsDurationMs: number;
retryCount: number;
recoveryCount: number;
lastUpdatedAt: string;
}
export interface ReportMetricRecord {
taskId: string;
reportVersion: number;
taskStatus: ReportableTaskStatus;
selectedLinkCount: number;
reviewSampleCount: number;
blockedPlatforms: PlatformId[];
failedPlatforms: PlatformId[];
sampleInsufficient: boolean;
partialPlatformFailure: boolean;
generatedAt: string;
}
export interface RetentionMetricRecord {
metricId: string;
action: RetentionAction;
taskId?: string | undefined;
deletedReportCount: number;
deletedArtifactCount: number;
residualArtifactCount: number;
recordedAt: string;
}
export type AuditMetadataValue = string | number | boolean | null;
export type AuditMetadata = Record<string, AuditMetadataValue>;
export interface AuditLogRecord {
auditId: string;
taskId?: string | undefined;
platform?: PlatformId | undefined;
action: AuditAction;
message: string;
createdAt: string;
metadata?: AuditMetadata | undefined;
}
export interface ObservabilityOverview {
strategyAttempts: {
total: number;
searchSuccessRate: number;
browserFallbackShare: number;
byLayer: Array<{
layer: StrategyLayer;
count: number;
}>;
byOutcome: Array<{
outcome: StrategyAttemptOutcome;
count: number;
}>;
};
platformRuns: PlatformRunMetricRecord[];
reports: {
published: number;
unchanged: number;
sampleInsufficient: number;
partialFailures: number;
};
retention: {
taskDeletes: number;
cleanupRuns: number;
deletedReports: number;
residualArtifacts: number;
};
audits: {
total: number;
recoveryActions: number;
deleteActions: number;
};
}
export interface TaskRecord {