Merge branch 'master' into codex/frontend-error-dialogs

# Conflicts:
#	.hermes/shared-memory/decision-log.md
#	server-rs/crates/api-server/src/generated_asset_sheets.rs
This commit is contained in:
kdletters
2026-05-26 22:10:41 +08:00
175 changed files with 4760 additions and 465 deletions

View File

@@ -1805,6 +1805,18 @@ pub fn select_next_profiles<'a>(
available
}
pub fn select_runtime_next_profile<'a>(
same_work_next_profile: Option<&'a PuzzleWorkProfile>,
similar_work_profiles: &'a [&'a PuzzleWorkProfile],
prefer_similar_work: bool,
) -> Option<&'a PuzzleWorkProfile> {
if prefer_similar_work {
similar_work_profiles.first().copied().or(same_work_next_profile)
} else {
same_work_next_profile.or_else(|| similar_work_profiles.first().copied())
}
}
pub fn recommendation_score(
current_profile: &PuzzleWorkProfile,
candidate: &PuzzleWorkProfile,
@@ -3321,6 +3333,28 @@ mod tests {
assert_eq!(selected.profile_id, "b");
}
#[test]
fn select_runtime_next_profile_prefers_similar_work_when_requested() {
let same_work = build_published_profile("same", "owner-a", vec!["奇幻"]);
let similar_work = build_published_profile("similar", "owner-b", vec!["奇幻"]);
let similar_work_profiles = [&similar_work];
let selected = select_runtime_next_profile(
Some(&same_work),
&similar_work_profiles,
true,
)
.expect("should select similar work first");
assert_eq!(selected.profile_id, "similar");
}
#[test]
fn select_runtime_next_profile_falls_back_to_same_work_when_no_similar_candidate() {
let same_work = build_published_profile("same", "owner-a", vec!["奇幻"]);
let selected = select_runtime_next_profile(Some(&same_work), &[], true)
.expect("should fall back to same work");
assert_eq!(selected.profile_id, "same");
}
#[test]
fn restart_cleared_count_uses_selected_level_index() {
let mut profile = build_published_profile("entry", "owner-a", vec!["机关"]);

View File

@@ -237,6 +237,8 @@ pub struct PuzzleRunNextLevelInput {
pub owner_user_id: String,
#[serde(default)]
pub target_profile_id: Option<String>,
#[serde(default)]
pub prefer_similar_work: bool,
pub advanced_at_micros: i64,
}