From 23cff7db70f2460062952242714a13e4693d2ccf Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sun, 8 Mar 2026 00:20:09 -0500 Subject: [PATCH] Restore Daytona env export workaround alongside SDK fix The Daytona toolbox's /process/execute endpoint does not yet process the envs field (not in its OpenAPI spec), so prepend export statements as a fallback. The SDK also sends envs for forward compatibility. Co-Authored-By: Claude Opus 4.6 --- crates/arc-workflows/src/daytona_sandbox.rs | 23 ++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/arc-workflows/src/daytona_sandbox.rs b/crates/arc-workflows/src/daytona_sandbox.rs index 992e96bee..c399e9d86 100644 --- a/crates/arc-workflows/src/daytona_sandbox.rs +++ b/crates/arc-workflows/src/daytona_sandbox.rs @@ -896,9 +896,30 @@ impl Sandbox for DaytonaSandbox { timeout: Some(std::time::Duration::from_millis(timeout_ms)), }; + // The Daytona toolbox's /process/execute endpoint does not yet + // process the `envs` field (not in its OpenAPI spec), so we also + // prepend `export` statements as a fallback until server support + // lands. The SDK sends `envs` too for forward compatibility. + let command_with_env = if let Some(vars) = env_vars { + if !vars.is_empty() { + let exports: Vec = vars + .iter() + .map(|(k, v)| { + let escaped = v.replace('\'', "'\\''"); + format!("export {k}='{escaped}'") + }) + .collect(); + format!("{}\n{}", exports.join("\n"), command) + } else { + command.to_string() + } + } else { + command.to_string() + }; + // Wrap with `bash -c` so pipes, env vars, and shell features work. // The Daytona API uses direct exec, not a shell. - let wrapped = wrap_bash_command(command); + let wrapped = wrap_bash_command(&command_with_env); let result = process_svc .execute_command(&wrapped, options) .await