roder-dynamic-workflows 0.1.2

Agentic software development tools and SDKs for Roder.
Documentation
use crate::host_api::WorkflowExecution;
use crate::model::{
    WorkflowRunInput, WorkflowRuntimeError, WorkflowRuntimeErrorKind, WorkflowRuntimeResult,
};
use crate::runner::WorkflowScriptRuntime;

const WORKFLOW_SCRIPT_STACK_BYTES: usize = 32 * 1024 * 1024;

pub(crate) async fn run_script_on_dedicated_stack(
    runtime: WorkflowScriptRuntime,
    source: String,
    input: WorkflowRunInput,
) -> WorkflowRuntimeResult<WorkflowExecution> {
    tokio::task::spawn_blocking(move || run_script_thread(runtime, source, input))
        .await
        .map_err(|err| {
            WorkflowRuntimeError::new(
                WorkflowRuntimeErrorKind::ScriptExecution,
                format!("workflow script task failed: {err}"),
            )
        })?
}

fn run_script_thread(
    runtime: WorkflowScriptRuntime,
    source: String,
    input: WorkflowRunInput,
) -> WorkflowRuntimeResult<WorkflowExecution> {
    std::thread::Builder::new()
        .name("roder-workflow-script".to_string())
        .stack_size(WORKFLOW_SCRIPT_STACK_BYTES)
        .spawn(move || runtime.run(&source, input))
        .map_err(|err| {
            WorkflowRuntimeError::new(
                WorkflowRuntimeErrorKind::ScriptExecution,
                format!("failed to launch workflow script thread: {err}"),
            )
        })?
        .join()
        .map_err(|_| {
            WorkflowRuntimeError::new(
                WorkflowRuntimeErrorKind::ScriptExecution,
                "workflow script thread panicked",
            )
        })?
}