Skip to content

Commit fc30997

Browse files
committed
Refactor mission input types and update WASM interfaces
- Split `PipelineInput` into `MissionInput` and `PipelineInput` to separate core mission fields from nyx-specific fields. - Update all references to `PipelineInput` in the codebase to use the new `MissionInput` where appropriate. - Adjust serialization/deserialization logic to accommodate the new structure. - Modify tests to reflect changes in input types and ensure compatibility with existing functionality. - Update comments and documentation to clarify the purpose of the new types and their usage. - Ensure that all WASM bindings are updated to use the new `MissionInput` type instead of `PipelineInput`.
1 parent 3b96bef commit fc30997

31 files changed

Lines changed: 294 additions & 253 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
/reports/
1515

16+
# WASM build output
17+
rpo-wasm/pkg/
18+
1619
# OS
1720
.DS_Store
1821
Thumbs.db

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ rpo-nyx (AGPL-3.0) <-- rpo-cli (AGPL-3.0)
2727

2828
```bash
2929
cargo build # build workspace
30-
cargo test # 596 tests across 5 crates (564 + 32 ignored full-physics; 596 total with -- --include-ignored)
30+
cargo test # 597 tests across 5 crates (565 + 32 ignored full-physics; 597 total with -- --include-ignored)
3131
```
3232

3333
Run an example mission (CLI):
@@ -226,7 +226,7 @@ The CLI provides batch execution and shell-composable plumbing for scripting. Th
226226

227227
## Testing
228228

229-
596 tests across 5 crates (361 rpo-core, 131 rpo-nyx, 55 rpo-cli, 36 rpo-wasm, 13 rpo-api). 32 full-physics tests are `#[ignore]` by default (require ANISE kernels, ~50 MB cached download).
229+
597 tests across 5 crates (361 rpo-core, 132 rpo-nyx, 55 rpo-cli, 36 rpo-wasm, 13 rpo-api). 32 full-physics tests are `#[ignore]` by default (require ANISE kernels, ~50 MB cached download).
230230

231231
```bash
232232
cargo test # full suite (5 crates)

rpo-api/tests/integration.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ async fn extract_drag_different_configs() {
358358
let msg = json!({
359359
"type": "extract_drag",
360360
"request_id": 40,
361-
"chief": serde_json::to_value(&input.chief).unwrap(),
362-
"deputy": serde_json::to_value(&input.deputy).unwrap(),
361+
"chief": serde_json::to_value(&input.base.chief).unwrap(),
362+
"deputy": serde_json::to_value(&input.base.deputy).unwrap(),
363363
"chief_config": serde_json::to_value(chief_config).unwrap(),
364364
"deputy_config": serde_json::to_value(deputy_config).unwrap()
365365
});
@@ -414,8 +414,8 @@ async fn validate_mission_roundtrip() {
414414
"type": "validate",
415415
"request_id": 20,
416416
"mission": serde_json::to_value(&output.mission).unwrap(),
417-
"chief": serde_json::to_value(&input.chief).unwrap(),
418-
"deputy": serde_json::to_value(&input.deputy).unwrap(),
417+
"chief": serde_json::to_value(&input.base.chief).unwrap(),
418+
"deputy": serde_json::to_value(&input.base.deputy).unwrap(),
419419
"chief_config": serde_json::to_value(chief_config).unwrap(),
420420
"deputy_config": serde_json::to_value(deputy_config).unwrap(),
421421
"samples_per_leg": 2
@@ -474,11 +474,11 @@ async fn mc_ensemble_roundtrip() {
474474
"type": "run_mc",
475475
"request_id": 30,
476476
"mission": serde_json::to_value(&output.mission).unwrap(),
477-
"chief": serde_json::to_value(&input.chief).unwrap(),
478-
"deputy": serde_json::to_value(&input.deputy).unwrap(),
477+
"chief": serde_json::to_value(&input.base.chief).unwrap(),
478+
"deputy": serde_json::to_value(&input.base.deputy).unwrap(),
479479
"chief_config": serde_json::to_value(chief_config).unwrap(),
480480
"deputy_config": serde_json::to_value(deputy_config).unwrap(),
481-
"mission_config": serde_json::to_value(&input.config).unwrap(),
481+
"mission_config": serde_json::to_value(&input.base.config).unwrap(),
482482
"propagator": "j2",
483483
"monte_carlo": {
484484
"num_samples": 3,
@@ -577,8 +577,8 @@ async fn cancel_active_validation() {
577577
"type": "validate",
578578
"request_id": 50,
579579
"mission": serde_json::to_value(&output.mission).unwrap(),
580-
"chief": serde_json::to_value(&input.chief).unwrap(),
581-
"deputy": serde_json::to_value(&input.deputy).unwrap(),
580+
"chief": serde_json::to_value(&input.base.chief).unwrap(),
581+
"deputy": serde_json::to_value(&input.base.deputy).unwrap(),
582582
"chief_config": serde_json::to_value(chief_config).unwrap(),
583583
"deputy_config": serde_json::to_value(deputy_config).unwrap(),
584584
"samples_per_leg": 2
@@ -648,8 +648,8 @@ async fn cancel_active_drag_no_late_result() {
648648
let drag_msg = json!({
649649
"type": "extract_drag",
650650
"request_id": 77,
651-
"chief": serde_json::to_value(&input.chief).unwrap(),
652-
"deputy": serde_json::to_value(&input.deputy).unwrap(),
651+
"chief": serde_json::to_value(&input.base.chief).unwrap(),
652+
"deputy": serde_json::to_value(&input.base.deputy).unwrap(),
653653
"chief_config": serde_json::to_value(chief_config).unwrap(),
654654
"deputy_config": serde_json::to_value(deputy_config).unwrap()
655655
});

rpo-cli/src/commands/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ pub fn plan_with_physics(
6060
status!(spinner, "Classification + Lambert transfer...");
6161
let transfer_input = TransferComputationInput::from(input);
6262
let mut transfer = compute_transfer(&transfer_input)?;
63-
let suggestion = suggest_enrichment(&transfer, input);
63+
let suggestion = suggest_enrichment(&transfer, &input.base);
6464
if let Some(ref s) = suggestion {
6565
apply_perch_enrichment(&mut transfer, s);
6666
}
@@ -79,7 +79,7 @@ pub fn plan_with_physics(
7979
)?;
8080

8181
status!(spinner, "Waypoint targeting...");
82-
let wp_mission = plan_waypoints_from_transfer(&transfer, input, &propagator)?;
82+
let wp_mission = plan_waypoints_from_transfer(&transfer, &input.base, &propagator)?;
8383

8484
Ok(PlannedMission {
8585
transfer,

rpo-cli/src/commands/mc.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ pub fn run(
5353
};
5454

5555
// Optional covariance propagation
56-
let covariance_report = if let Some(ref nav) = input.navigation_accuracy {
56+
let covariance_report = if let Some(ref nav) = input.base.navigation_accuracy {
5757
status!(plan.spinner, "Running covariance propagation...");
5858
Some(compute_mission_covariance(
5959
&plan.wp_mission,
6060
&plan.transfer.plan.chief_at_arrival,
6161
nav,
62-
input.maneuver_uncertainty.as_ref(),
62+
input.base.maneuver_uncertainty.as_ref(),
6363
&plan.propagator,
6464
)?)
6565
} else {
@@ -68,8 +68,8 @@ pub fn run(
6868

6969
// Resolve MC dispersions: derive from top-level nav/maneuver if not explicitly set
7070
let resolved_mc = mc_config.with_resolved_dispersions(
71-
input.navigation_accuracy.as_ref(),
72-
input.maneuver_uncertainty.as_ref(),
71+
input.base.navigation_accuracy.as_ref(),
72+
input.base.maneuver_uncertainty.as_ref(),
7373
);
7474

7575
// Run Monte Carlo
@@ -84,7 +84,7 @@ pub fn run(
8484
initial_chief: &plan.transfer.perch_chief,
8585
initial_deputy: &plan.transfer.perch_deputy,
8686
config: &resolved_mc,
87-
mission_config: &input.config,
87+
mission_config: &input.base.config,
8888
chief_config: &chief_config,
8989
deputy_config: &deputy_config,
9090
propagator: &plan.propagator,
@@ -105,12 +105,12 @@ pub fn run(
105105

106106
// Build canonical output with nominal safety context (free-drift, POCA).
107107
let safety = compute_safety_analysis(
108-
&plan.wp_mission, input.config.safety.as_ref(), input.cola.as_ref(), &plan.propagator,
108+
&plan.wp_mission, input.base.config.safety.as_ref(), input.base.cola.as_ref(), &plan.propagator,
109109
);
110110
let mut result = build_output(
111111
rpo_core::pipeline::BuildOutputCtx {
112112
transfer: &plan.transfer,
113-
input: &input,
113+
input: &input.base,
114114
propagator: &plan.propagator,
115115
auto_drag: plan.derived_drag,
116116
suggestion: plan.suggestion,

rpo-cli/src/commands/mission.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn run(
2626
match mode {
2727
OutputMode::Json => output_json(&result, output),
2828
OutputMode::Summary => {
29-
let propagator = to_propagation_model(&input.propagator);
29+
let propagator = to_propagation_model(&input.base.propagator);
3030
let md = markdown_fmt::mission_to_markdown(&result, &input, &propagator, false);
3131
output_text(&md, output)
3232
}

rpo-cli/src/commands/safety.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn run(input_path: &Path) -> Result<(), CliError> {
1818
)?;
1919
let output = execute_mission(&input)?;
2020

21-
let safety_config = input.config.safety.unwrap_or_default();
21+
let safety_config = input.base.config.safety.unwrap_or_default();
2222
let result = output.mission.safety.as_ref().map(|s| {
2323
let assessment = assess_safety(s, &safety_config);
2424
serde_json::json!({

rpo-cli/src/commands/validate.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn run(
4848

4949
// Compute safety analysis and derive COLA burns for nyx injection.
5050
let (safety, cola_burns) = compute_validation_burns(
51-
&plan.wp_mission, input.config.safety.as_ref(), input.cola.as_ref(), &plan.propagator,
51+
&plan.wp_mission, input.base.config.safety.as_ref(), input.base.cola.as_ref(), &plan.propagator,
5252
)?;
5353

5454
status!(
@@ -63,7 +63,7 @@ pub fn run(
6363
let cola_input = ColaValidationInput {
6464
burns: cola_burns,
6565
analytical_maneuvers: safety.cola.clone().unwrap_or_default(),
66-
target_distance_km: input.cola.as_ref().map(|c| c.target_distance_km),
66+
target_distance_km: input.base.cola.as_ref().map(|c| c.target_distance_km),
6767
};
6868

6969
let dynamics = build_full_physics_dynamics(&plan.almanac)?;
@@ -86,7 +86,7 @@ pub fn run(
8686
let result = rpo_core::pipeline::build_output(
8787
rpo_core::pipeline::BuildOutputCtx {
8888
transfer: &plan.transfer,
89-
input: &input,
89+
input: &input.base,
9090
propagator: &plan.propagator,
9191
auto_drag: plan.derived_drag,
9292
suggestion: plan.suggestion,

rpo-cli/src/output/common.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub struct OverlayFlags {
6363
pub fn apply_overlays(input: &mut PipelineInput, flags: &OverlayFlags) {
6464
// COLA overlay
6565
if let Some(threshold) = flags.cola_threshold {
66-
input.cola = Some(ColaConfig {
66+
input.base.cola = Some(ColaConfig {
6767
target_distance_km: threshold,
6868
max_dv_km_s: flags.cola_budget.unwrap_or(DEFAULT_COLA_BUDGET_KM_S),
6969
});
@@ -76,7 +76,7 @@ pub fn apply_overlays(input: &mut PipelineInput, flags: &OverlayFlags) {
7676
(None, false) => None,
7777
};
7878
if let Some(min_separation_km) = separation_km {
79-
input.safety_requirements = Some(SafetyRequirements {
79+
input.base.safety_requirements = Some(SafetyRequirements {
8080
min_separation_km,
8181
alignment: EiAlignment::default(),
8282
});
@@ -231,7 +231,7 @@ pub fn resolve_drag_and_propagator(
231231
};
232232
Ok(resolve_propagator(
233233
auto_drag_config,
234-
to_propagation_model(&input.propagator),
234+
to_propagation_model(&input.base.propagator),
235235
))
236236
}
237237

rpo-cli/src/output/markdown_fmt/mc.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub fn mc_to_markdown(
2424
derived_drag: Option<&DragConfig>,
2525
) -> String {
2626
let mut out = String::with_capacity(8192);
27-
let sc = input.config.safety.unwrap_or_default();
27+
let sc = input.base.config.safety.unwrap_or_default();
2828
let stats = &report.statistics;
2929

3030
let mc_vr = determine_mc_verdict(report, &sc);
@@ -561,7 +561,7 @@ mod tests {
561561
/// Regression test for Task 3 of the CLI report audit.
562562
///
563563
/// The MC renderer previously appended [`insights::cola_analytical_miss_insights`]
564-
/// to its insight list whenever both `output.safety.cola` and `input.cola`
564+
/// to its insight list whenever both `output.safety.cola` and `input.base.cola`
565565
/// were set. That warning is narratively wrong in `mc.md`: MC samples
566566
/// propagate the pre-COLA baseline, so a warning *about* the analytical
567567
/// COLA solver belongs in the mission renderer, not here. This test asserts
@@ -585,10 +585,10 @@ mod tests {
585585
// actually needs avoidance.
586586
output.safety.cola = Some(vec![make_subthreshold_maneuver()]);
587587

588-
// Ensure `input.cola.target_distance_km` is comfortably above the
588+
// Ensure `input.base.cola.target_distance_km` is comfortably above the
589589
// injected 0.050 km post-avoidance POCA so the insight is unambiguously
590590
// triggered (pre-fix).
591-
input.cola = Some(ColaConfig {
591+
input.base.cola = Some(ColaConfig {
592592
target_distance_km: 0.300,
593593
max_dv_km_s: 0.010,
594594
});
@@ -724,7 +724,7 @@ mod tests {
724724
&std::fs::read_to_string(examples_dir().join("mission.json")).unwrap(),
725725
)
726726
.unwrap();
727-
input.cola = Some(ColaConfig {
727+
input.base.cola = Some(ColaConfig {
728728
target_distance_km: 0.300,
729729
max_dv_km_s: 0.010,
730730
});
@@ -887,7 +887,7 @@ mod tests {
887887
)
888888
.unwrap();
889889
// Strip any COLA config so the renderer doesn't inject unrelated callouts.
890-
input.cola = None;
890+
input.base.cola = None;
891891

892892
let mut output = execute_mission(&input).unwrap();
893893
output.safety.cola = None;

0 commit comments

Comments
 (0)