diff --git a/lib/crates/fabro-server/src/run_manifest.rs b/lib/crates/fabro-server/src/run_manifest.rs index d4a47557a..48f11fe34 100644 --- a/lib/crates/fabro-server/src/run_manifest.rs +++ b/lib/crates/fabro-server/src/run_manifest.rs @@ -97,9 +97,6 @@ pub(crate) fn prepare_manifest_with_mode( )?; if let Some(goal) = manifest.goal.as_ref() { let run = settings.run.get_or_insert_with(RunLayer::default); - // The CLI has already resolved any goal-file reads into - // `manifest.goal.text`, so the server side always stores the - // final text inline. run.goal = Some(RunGoalLayer::Inline(InterpString::parse(&goal.text))); } diff --git a/lib/crates/fabro-server/src/server.rs b/lib/crates/fabro-server/src/server.rs index 38311ea8d..1680f5859 100644 --- a/lib/crates/fabro-server/src/server.rs +++ b/lib/crates/fabro-server/src/server.rs @@ -2495,15 +2495,19 @@ fn octet_stream_response(bytes: Bytes) -> Response { #[allow(clippy::result_large_err)] fn api_event_envelope_from_store(event: &EventEnvelope) -> Result { - serde_json::to_value(event) - .and_then(serde_json::from_value) - .map_err(|err| { - ApiError::new( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to serialize stored event: {err}"), - ) - .into_response() - }) + // The payload is already a serde_json::Value; merge `seq` into it + // instead of serializing the whole envelope and re-parsing. + let mut obj = event.payload.as_value().clone(); + if let serde_json::Value::Object(ref mut map) = obj { + map.insert("seq".into(), serde_json::Value::from(event.seq)); + } + serde_json::from_value(obj).map_err(|err| { + ApiError::new( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Failed to deserialize stored event: {err}"), + ) + .into_response() + }) } fn clear_live_run_state(run: &mut ManagedRun) {