Files
windmill/backend/windmill-worker/src/lib.rs
T
a46aa641f9 feat: add R language support (#8263)
* feat: add R language support

Add R as a new supported scripting language in Windmill, following the
same pattern used for Ruby. Includes:

- Backend: ScriptLang::Rlang enum variant, DB migration, tree-sitter-r
  parser crate with tests, WASM parser binding, R executor with NSJail
  sandboxing, job dispatch and signature parsing
- Frontend: language picker, R icon, syntax highlighting, editor bar
  insertions (Sys.getenv, get_variable, get_resource), schema inference,
  init code template, BETA badge
- CLI: .r extension mapping, sync support, bootstrap template

R scripts use `main <- function(...)` syntax, jsonlite for JSON
serialization, and system curl for the Windmill client helper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add R package resolution and installation

Parse library()/require() calls from R scripts to extract dependencies.
Resolve versions from CRAN, cache lockfiles in pip_resolution_cache,
and install packages to a shared R library cache. The run step sets
R_LIBS_USER so installed packages are available to the script.

- Parser: parse_r_requirements() extracts package names from AST
- Executor: resolve() generates lockfile, install() installs from CRAN
- Worker lockfiles: wire up R resolve for dependency jobs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add nsjail sandboxing for R resolve and install phases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: fix R get_variable/get_resource and add sandbox annotation + e2e tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: fix R arg inference with JS fallback parser and get_variable/get_resource

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix flake

* nsjail

* nits

* fix: R install improvements - suppress verbose output, flat lockfile logging, Dockerfile R support, rlimits

- Suppress renv verbose output during resolve and install (controlled by #verbose annotation)
- Filter renv from install list (already loaded, causes noisy restart message)
- Log compact "resolved N packages" instead of full renv.lock JSON
- Add R (r-base, r-cran-renv) to DockerfileFull and DockerfileFullEe
- Use disable_rl for nsjail install config (R compiles from source)
- Reduce default concurrency from 20 to 5
- Add rlang to openflow.openapi.yaml
- Fix MainArgSignature (no_main_func -> auto_kind) after main merge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* final

* fix: remove accidental R install from multiplayer Dockerfile

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: remove R from Windows build and DockerfileExtra

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: rename R migration to avoid timestamp collision with trigger_filter_logic

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* all

* fix: R install improvements - suppress verbose output, flat lockfile logging, Dockerfile R support, rlimits

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: add clear error when Rscript binary is missing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: fix type errors in R fallback parser, use format! in wrap(), add R system prompts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: pyranota <pyra@duck.com>
2026-04-01 06:11:37 +00:00

112 lines
2.9 KiB
Rust

#[cfg(all(feature = "enterprise", feature = "bigquery"))]
mod bigquery_executor;
#[cfg(all(feature = "enterprise", feature = "mssql"))]
mod mssql_executor;
#[cfg(feature = "enterprise")]
mod snowflake_executor;
mod agent_workers;
#[cfg(feature = "python")]
mod ansible_executor;
mod bash_executor;
mod pwsh_executor;
#[cfg(feature = "java")]
mod java_executor;
#[cfg(feature = "ruby")]
mod ruby_executor;
#[cfg(feature = "rlang")]
mod r_executor;
mod ai;
mod ai_executor;
mod bun_executor;
pub mod common;
mod config;
mod csharp_executor;
#[cfg(feature = "private")]
mod dedicated_worker_ee;
mod dedicated_worker_oss;
mod deno_executor;
#[cfg(feature = "duckdb")]
mod duckdb_executor;
mod global_cache;
mod go_executor;
mod graphql_executor;
mod handle_child;
pub mod job_logger;
#[cfg(feature = "private")]
pub mod job_logger_ee;
mod job_logger_oss;
mod js_eval;
pub mod memory_common;
#[cfg(feature = "private")]
pub mod memory_ee;
pub mod memory_oss;
#[cfg(feature = "mysql")]
mod mysql_executor;
#[cfg(feature = "nu")]
mod nu_executor;
#[cfg(feature = "oracledb")]
mod oracledb_executor;
#[cfg(feature = "private")]
pub mod otel_ee;
mod otel_oss;
#[cfg(all(feature = "private", feature = "enterprise"))]
mod otel_tracing_proxy_ee;
mod otel_tracing_proxy_oss;
mod pg_executor;
#[cfg(feature = "php")]
mod php_executor;
mod prepare_deps;
#[cfg(feature = "python")]
mod python_executor;
#[cfg(feature = "python")]
mod python_versions;
pub mod result_processor;
#[cfg(feature = "rust")]
mod rust_executor;
mod sanitized_sql_params;
mod schema;
pub mod sql_utils;
mod universal_pkg_installer;
#[cfg(feature = "private")]
mod volume_ee;
mod volume_oss;
pub mod wac_executor;
mod worker;
mod worker_flow;
mod worker_lockfiles;
mod worker_utils;
#[cfg(all(feature = "private", feature = "enterprise"))]
pub use otel_tracing_proxy_ee::start_jobs_otel_tracing;
#[cfg(all(feature = "private", feature = "enterprise", feature = "deno_core"))]
pub use otel_tracing_proxy_ee::{load_internal_otel_exporter, DENO_OTEL_INITIALIZED};
pub use worker::*;
pub use bun_executor::{
build_loader, compute_bundle_local_and_remote_path, get_common_bun_proc_envs,
install_bun_lockfile, prebundle_bun_script, prepare_job_dir, LoaderMode,
BUN_DEDICATED_WORKER_ARGS, RELATIVE_BUN_BUILDER, RELATIVE_BUN_LOADER,
};
#[cfg(any(feature = "private", test))]
pub use bun_executor::{
compute_ts_codegen, generate_multi_script_wrapper, TsScriptCodegen, TsScriptEntry,
};
#[cfg(any(feature = "private", test))]
pub use deno_executor::generate_dedicated_worker_wrapper as generate_deno_dedicated_worker_wrapper;
pub use deno_executor::{generate_deno_lock, DENO_UNSTABLE_ARGS};
pub use prepare_deps::run_prepare_deps_cli;
#[cfg(all(feature = "python", any(feature = "private", test)))]
pub use python_executor::{
compute_py_codegen, generate_multi_script_wrapper as generate_py_multi_script_wrapper,
PyScriptCodegen, PyScriptEntry,
};
#[cfg(feature = "python")]
pub use python_versions::PyV;