feat(版本): 优化概览与只读状态

关键改动:

- 增加需求排序和版本只读状态规则及测试

- 完善版本概览阶段耗时、项目页和工作台展示

- 优化小宝预警请求节流、建议状态和风险过滤

Co-Authored-By: Codex GPT-5 <codex@openai.com>
This commit is contained in:
Script Generator
2026-06-30 18:18:18 +08:00
parent 3d3d56697a
commit eef3c8f000
32 changed files with 1072 additions and 289 deletions

View File

@@ -9,7 +9,7 @@ type RiskInsightCurrent = Pick<
'riskLevel' | 'riskScore' | 'confidence' | 'forecastReleaseDate' | 'signals' | 'trend'
>;
type RiskInsightPrevious = Pick<
export type RiskInsightPrevious = Pick<
XiaobaoRiskSnapshot,
| 'riskScore'
| 'confidence'
@@ -103,6 +103,35 @@ export function shouldRequestRiskInsightWithCacheGate(
return shouldRequestRiskInsightWithCooldown(current, previous, latestInsight, now);
}
export interface RiskInsightRequestGateInput {
riskCacheLoaded: boolean;
cache: XiaobaoRiskInsightCacheItem[];
current: XiaobaoVersionRisk;
previous?: RiskInsightPrevious;
lastRequestedAt?: string;
now?: Date;
}
export function shouldRequestRiskInsightWithRequestGate(input: RiskInsightRequestGateInput): boolean {
const now = input.now ?? new Date();
if (isRiskInsightRequestCoolingDown(input.lastRequestedAt, now)) return false;
return shouldRequestRiskInsightWithCacheGate(
input.riskCacheLoaded,
input.cache,
input.current,
input.previous,
now,
);
}
export function isRiskInsightRequestCoolingDown(lastRequestedAt: string | undefined, now: Date = new Date()): boolean {
if (!lastRequestedAt) return false;
const requestedAt = getTime(lastRequestedAt);
const nowTime = now.getTime();
if (!Number.isFinite(requestedAt) || !Number.isFinite(nowTime)) return false;
return nowTime - requestedAt < RISK_INSIGHT_COOLDOWN_MS;
}
export function buildRiskInsightSignature(risk: XiaobaoVersionRisk): string {
return JSON.stringify({
versionId: risk.versionId,