Merge remote-tracking branch 'origin/main' into di/playwright

This commit is contained in:
Diego Imbert
2026-01-16 11:34:06 +01:00
31 changed files with 316 additions and 104 deletions
+8
View File
@@ -1,5 +1,13 @@
# Changelog
## [1.607.1](https://github.com/windmill-labs/windmill/compare/v1.607.0...v1.607.1) (2026-01-16)
### Bug Fixes
* fix wmill app dev with workspace scripts ([d5fa3d8](https://github.com/windmill-labs/windmill/commit/d5fa3d8dec78148becdc826ab83defe39a06af7e))
* improve raw app builder malformed files ([483b7d6](https://github.com/windmill-labs/windmill/commit/483b7d699f01f2bf91c23f9e37534f648a0a4e7e))
## [1.607.0](https://github.com/windmill-labs/windmill/compare/v1.606.1...v1.607.0) (2026-01-15)
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT app_id, value FROM app_version WHERE id = $1",
"query": "SELECT app_id, value, raw_app FROM app_version WHERE id = $1",
"describe": {
"columns": [
{
@@ -12,6 +12,11 @@
"ordinal": 1,
"name": "value",
"type_info": "Json"
},
{
"ordinal": 2,
"name": "raw_app",
"type_info": "Bool"
}
],
"parameters": {
@@ -20,9 +25,10 @@
]
},
"nullable": [
false,
false,
false
]
},
"hash": "ea9bbb972217bab4d7e8f4c08e331899161e80c239d56eb657d73bbf4272939b"
"hash": "19cca1d42f37e860dc54470fea8dd9a35c412d82d27ce369ccb0ba38b9791669"
}
@@ -0,0 +1,23 @@
{
"db_name": "PostgreSQL",
"query": "SELECT app_version.raw_app FROM app\n JOIN app_version ON app_version.id = app.versions[array_upper(app.versions, 1)]\n WHERE app.path = $1 AND app.workspace_id = $2",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "raw_app",
"type_info": "Bool"
}
],
"parameters": {
"Left": [
"Text",
"Text"
]
},
"nullable": [
false
]
},
"hash": "fb321fba5f4508d6cff5bae5a7c5a120d12b43a2f6056c3fff1c7c099b5f248a"
}
+115 -54
View File
@@ -841,9 +841,9 @@ dependencies = [
[[package]]
name = "aws-runtime"
version = "1.5.17"
version = "1.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d81b5b2898f6798ad58f484856768bca817e3cd9de0974c24ae0f1113fe88f1b"
checksum = "959dab27ce613e6c9658eb3621064d0e2027e5f2acb65bc526a43577facea557"
dependencies = [
"aws-credential-types",
"aws-sigv4",
@@ -914,9 +914,9 @@ dependencies = [
[[package]]
name = "aws-sdk-rds"
version = "1.122.0"
version = "1.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf01ccb7824bbf1b455fd9b1d1a9522be98272e42472cf5406a7f3b2f4eb62"
checksum = "43adf02ed73dcbaa18979ab849162331e4b772e276988e5750fd277687d92897"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -924,6 +924,7 @@ dependencies = [
"aws-smithy-async",
"aws-smithy-http",
"aws-smithy-json",
"aws-smithy-observability",
"aws-smithy-query",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
@@ -1258,7 +1259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
dependencies = [
"async-trait",
"axum-core",
"axum-core 0.4.5",
"axum-macros",
"bytes",
"futures-util",
@@ -1268,7 +1269,7 @@ dependencies = [
"hyper 1.8.1",
"hyper-util",
"itoa",
"matchit",
"matchit 0.7.3",
"memchr",
"mime",
"multer",
@@ -1287,6 +1288,40 @@ dependencies = [
"tracing",
]
[[package]]
name = "axum"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
dependencies = [
"axum-core 0.5.6",
"bytes",
"form_urlencoded",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"hyper 1.8.1",
"hyper-util",
"itoa",
"matchit 0.8.4",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tower 0.5.3",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "axum-core"
version = "0.4.5"
@@ -1308,6 +1343,25 @@ dependencies = [
"tracing",
]
[[package]]
name = "axum-core"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
dependencies = [
"bytes",
"futures-core",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"mime",
"pin-project-lite",
"sync_wrapper",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "axum-macros"
version = "0.4.2"
@@ -8126,6 +8180,12 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
[[package]]
name = "matchit"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
[[package]]
name = "md-5"
version = "0.9.1"
@@ -10932,11 +10992,12 @@ dependencies = [
[[package]]
name = "rmcp"
version = "0.12.0"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "528d42f8176e6e5e71ea69182b17d1d0a19a6b3b894b564678b74cd7cab13cfa"
checksum = "d1815dbc06c414d720f8bc1951eccd66bc99efc6376331f1e7093a119b3eb508"
dependencies = [
"async-trait",
"axum 0.8.4",
"base64 0.22.1",
"bytes",
"chrono",
@@ -10966,9 +11027,9 @@ dependencies = [
[[package]]
name = "rmcp-macros"
version = "0.12.0"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3f81daaa494eb8e985c9462f7d6ce1ab05e5299f48aafd76cdd3d8b060e6f59"
checksum = "11f0bc7008fa102e771a76c6d2c9b253be3f2baa5964e060464d038ae1cbc573"
dependencies = [
"darling 0.23.0",
"proc-macro2",
@@ -11107,9 +11168,9 @@ dependencies = [
[[package]]
name = "rustc-demangle"
version = "0.1.26"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d"
[[package]]
name = "rustc-hash"
@@ -13992,7 +14053,7 @@ checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52"
dependencies = [
"async-stream",
"async-trait",
"axum",
"axum 0.7.9",
"base64 0.22.1",
"bytes",
"flate2",
@@ -14063,7 +14124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d"
dependencies = [
"async-trait",
"axum-core",
"axum-core 0.4.5",
"cookie 0.18.1",
"futures-util",
"http 1.4.0",
@@ -14823,9 +14884,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasip2"
version = "1.0.1+wasi-0.2.4"
version = "1.0.2+wasi-0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
dependencies = [
"wit-bindgen",
]
@@ -15182,12 +15243,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windmill"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"aws-sdk-config",
"aws-sigv4",
"axum",
"axum 0.7.9",
"base64 0.22.1",
"bitflags 2.9.4",
"chrono",
@@ -15245,7 +15306,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"argon2",
@@ -15263,7 +15324,7 @@ dependencies = [
"aws-sdk-ssooidc",
"aws-sdk-sts",
"aws-sigv4",
"axum",
"axum 0.7.9",
"backon",
"base32",
"base64 0.22.1",
@@ -15298,7 +15359,7 @@ dependencies = [
"libxml",
"magic-crypt",
"mail-parser",
"matchit",
"matchit 0.7.3",
"mime_guess",
"native-tls",
"nkeys",
@@ -15368,7 +15429,7 @@ dependencies = [
[[package]]
name = "windmill-api-client"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"reqwest 0.12.28",
"serde",
@@ -15378,7 +15439,7 @@ dependencies = [
[[package]]
name = "windmill-audit"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"chrono",
"lazy_static",
@@ -15392,10 +15453,10 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"axum",
"axum 0.7.9",
"k8s-openapi",
"kube",
"serde",
@@ -15411,7 +15472,7 @@ dependencies = [
[[package]]
name = "windmill-common"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"async-recursion",
@@ -15423,7 +15484,7 @@ dependencies = [
"aws-sdk-sts",
"aws-smithy-types",
"aws-smithy-types-convert",
"axum",
"axum 0.7.9",
"backon",
"base64 0.22.1",
"bitflags 2.9.4",
@@ -15505,7 +15566,7 @@ dependencies = [
[[package]]
name = "windmill-git-sync"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"regex",
"serde",
@@ -15520,7 +15581,7 @@ dependencies = [
[[package]]
name = "windmill-indexer"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"astral-tokio-tar",
@@ -15544,7 +15605,7 @@ dependencies = [
[[package]]
name = "windmill-macros"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"itertools 0.14.0",
"lazy_static",
@@ -15560,7 +15621,7 @@ dependencies = [
[[package]]
name = "windmill-mcp"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"oauth2",
@@ -15574,11 +15635,11 @@ dependencies = [
[[package]]
name = "windmill-oauth"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"async-oauth2",
"axum",
"axum 0.7.9",
"base64 0.22.1",
"chrono",
"hex",
@@ -15598,7 +15659,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -15607,7 +15668,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -15619,7 +15680,7 @@ dependencies = [
[[package]]
name = "windmill-parser-csharp"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"serde_json",
@@ -15631,7 +15692,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"gosyn",
@@ -15643,7 +15704,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -15655,7 +15716,7 @@ dependencies = [
[[package]]
name = "windmill-parser-java"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"serde_json",
@@ -15667,7 +15728,7 @@ dependencies = [
[[package]]
name = "windmill-parser-nu"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"nu-parser",
@@ -15678,7 +15739,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -15689,7 +15750,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"itertools 0.14.0",
@@ -15702,7 +15763,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"async-recursion",
@@ -15726,7 +15787,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ruby"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -15740,7 +15801,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -15757,7 +15818,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -15771,7 +15832,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -15790,7 +15851,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"serde",
@@ -15801,11 +15862,11 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"async-recursion",
"axum",
"axum 0.7.9",
"backon",
"chrono",
"chrono-tz",
@@ -15838,7 +15899,7 @@ dependencies = [
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"wasm-bindgen",
"wasm-bindgen-test",
@@ -15848,7 +15909,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.607.0"
version = "1.607.1"
dependencies = [
"anyhow",
"async-once-cell",
@@ -16562,9 +16623,9 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "wit-bindgen"
version = "0.46.0"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
[[package]]
name = "writeable"
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.607.0"
version = "1.607.1"
authors.workspace = true
edition.workspace = true
@@ -35,7 +35,7 @@ members = [
exclude = ["./windmill-duckdb-ffi-internal"]
[workspace.package]
version = "1.607.0"
version = "1.607.1"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
+1 -1
View File
@@ -1 +1 @@
6262e373ede45b5b8d45505a63ff73968c04336a
da0a3751abd2b0fed46ca5c7a3aef35923403b28
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.607.0
version: 1.607.1
title: Windmill API
contact:
+27 -5
View File
@@ -1303,6 +1303,18 @@ async fn delete_app(
));
}
// Check if it's a raw app before deletion
let is_raw_app = sqlx::query_scalar!(
"SELECT app_version.raw_app FROM app
JOIN app_version ON app_version.id = app.versions[array_upper(app.versions, 1)]
WHERE app.path = $1 AND app.workspace_id = $2",
path,
&w_id
)
.fetch_optional(&db)
.await?
.unwrap_or(false);
let mut tx = user_db.begin(&authed).await?;
sqlx::query!(
@@ -1333,16 +1345,26 @@ async fn delete_app(
.await?;
tx.commit().await?;
let deployed_object = if is_raw_app {
DeployedObject::RawApp {
path: path.to_string(),
parent_path: Some(path.to_string()),
version: 0, // dummy version as it will not get inserted in db
}
} else {
DeployedObject::App {
path: path.to_string(),
parent_path: Some(path.to_string()),
version: 0, // dummy version as it will not get inserted in db
}
};
handle_deployment_metadata(
&authed.email,
&authed.username,
&db,
&w_id,
DeployedObject::App {
path: path.to_string(),
parent_path: Some(path.to_string()),
version: 0, // dummy version as it will not get inserted in db
},
deployed_object,
Some(format!("App '{}' deleted", path)),
true,
)
+4
View File
@@ -19,6 +19,7 @@ pub enum DeployedObject {
Script { hash: ScriptHash, path: String, parent_path: Option<String> },
Flow { path: String, parent_path: Option<String>, version: i64 },
App { path: String, version: i64, parent_path: Option<String> },
RawApp { path: String, version: i64, parent_path: Option<String> },
Folder { path: String },
Resource { path: String, parent_path: Option<String> },
Variable { path: String, parent_path: Option<String> },
@@ -45,6 +46,7 @@ impl DeployedObject {
DeployedObject::Script { path, .. } => path.to_owned(),
DeployedObject::Flow { path, .. } => path.to_owned(),
DeployedObject::App { path, .. } => path.to_owned(),
DeployedObject::RawApp { path, .. } => path.to_owned(),
DeployedObject::Folder { path, .. } => path.to_owned(),
DeployedObject::Resource { path, .. } => path.to_owned(),
DeployedObject::Variable { path, .. } => path.to_owned(),
@@ -82,6 +84,7 @@ impl DeployedObject {
DeployedObject::Script { parent_path, .. } => parent_path.to_owned(),
DeployedObject::Flow { parent_path, .. } => parent_path.to_owned(),
DeployedObject::App { parent_path, .. } => parent_path.to_owned(),
DeployedObject::RawApp { parent_path, .. } => parent_path.to_owned(),
DeployedObject::Folder { .. } => None,
DeployedObject::Resource { parent_path, .. } => parent_path.to_owned(),
DeployedObject::Variable { parent_path, .. } => parent_path.to_owned(),
@@ -108,6 +111,7 @@ impl DeployedObject {
DeployedObject::Script { .. } => "script",
DeployedObject::Flow { .. } => "flow",
DeployedObject::App { .. } => "app",
DeployedObject::RawApp { .. } => "raw_app",
DeployedObject::Folder { .. } => "folder",
DeployedObject::Resource { .. } => "resource",
DeployedObject::Variable { .. } => "variable",
+1 -1
View File
@@ -179,7 +179,7 @@ impl McpClient {
let result = self
.client
.call_tool(CallToolRequestParam { name: name.to_string().into(), arguments: mcp_args })
.call_tool(CallToolRequestParam { name: name.to_string().into(), arguments: mcp_args, task: None })
.await
.context(format!("Failed to call MCP tool: {}", name))?;
@@ -2178,10 +2178,13 @@ pub async fn handle_app_dependency_job(
.execute(db)
.await?;
let record = sqlx::query!("SELECT app_id, value FROM app_version WHERE id = $1", id)
.fetch_optional(db)
.await?
.map(|record| (record.app_id, record.value));
let record = sqlx::query!(
"SELECT app_id, value, raw_app FROM app_version WHERE id = $1",
id
)
.fetch_optional(db)
.await?
.map(|record| (record.app_id, record.value, record.raw_app));
let (_, parent_path) = get_deployment_msg_and_parent_path_from_args(job.args.clone());
@@ -2195,7 +2198,7 @@ pub async fn handle_app_dependency_job(
.await?;
// TODO: Use transaction for entire segment?
if let Some((app_id, value)) = record {
if let Some((app_id, value, is_raw_app)) = record {
let value = lock_modules_app(
value,
&job,
@@ -2275,12 +2278,18 @@ pub async fn handle_app_dependency_job(
let (deployment_message, parent_path) =
get_deployment_msg_and_parent_path_from_args(job.args.clone());
let deployed_object = if is_raw_app {
DeployedObject::RawApp { path: job_path, version: id, parent_path }
} else {
DeployedObject::App { path: job_path, version: id, parent_path }
};
if let Err(e) = handle_deployment_metadata(
&job.permissioned_as_email,
&job.created_by,
&db,
&job.workspace_id,
DeployedObject::App { path: job_path, version: id, parent_path },
deployed_object,
deployment_message,
false,
)
+1 -1
View File
@@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts";
import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts";
import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts";
export const VERSION = "v1.607.0";
export const VERSION = "v1.607.1";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({
+84 -3
View File
@@ -36,11 +36,47 @@ import {
} from "./app_metadata.ts";
import { loadRunnablesFromBackend } from "./raw_apps.ts";
import { regenerateAgentDocs } from "./generate_agents.ts";
import { hasFolderSuffix, getFolderSuffix } from "../../utils/resource_folders.ts";
import { hasFolderSuffix, getFolderSuffix, setNonDottedPaths } from "../../utils/resource_folders.ts";
const DEFAULT_PORT = 4000;
const DEFAULT_HOST = "localhost";
/**
* Search for wmill.yaml by traversing upward from the current directory.
* Unlike the standard findWmillYaml() in conf.ts, this does not stop at
* the git root - it continues searching until the filesystem root.
* This is needed for `app dev` which runs from inside a raw_app folder
* that may be deeply nested within a larger git repository.
*/
async function findAndLoadNonDottedPathsSetting(): Promise<void> {
let currentDir = process.cwd();
while (true) {
const wmillYamlPath = path.join(currentDir, "wmill.yaml");
if (fs.existsSync(wmillYamlPath)) {
try {
const config = await yamlParseFile(wmillYamlPath) as { nonDottedPaths?: boolean };
setNonDottedPaths(config?.nonDottedPaths ?? false);
log.debug(`Found wmill.yaml at ${wmillYamlPath}, nonDottedPaths=${config?.nonDottedPaths ?? false}`);
} catch (e) {
log.debug(`Failed to parse wmill.yaml at ${wmillYamlPath}: ${e}`);
}
return;
}
// Check if we've reached the filesystem root
const parentDir = path.dirname(currentDir);
if (parentDir === currentDir) {
// Reached filesystem root without finding wmill.yaml
log.debug("No wmill.yaml found, using default dotted paths");
return;
}
currentDir = parentDir;
}
}
// HTML template with live reload and SQL migration modal
const createHTML = (jsPath: string, cssPath: string) => `
<!DOCTYPE html>
@@ -305,6 +341,10 @@ interface DevOptions extends GlobalOptions {
async function dev(opts: DevOptions) {
GLOBAL_CONFIG_OPT.noCdToRoot = true;
// Search for wmill.yaml by traversing upward (without git root constraint)
// to initialize nonDottedPaths setting before using folder suffix functions
await findAndLoadNonDottedPathsSetting();
// Validate that we're in a .raw_app folder
const cwd = process.cwd();
const currentDirName = path.basename(cwd);
@@ -1303,6 +1343,30 @@ async function genRunnablesTs(schemaOverrides: Record<string, any> = {}) {
}
}
/**
* Convert runnables from file format to API format.
* File format uses type: "script"|"hubscript"|"flow" for path-based runnables.
* API format uses type: "path" with runType: "script"|"hubscript"|"flow".
*/
function convertRunnablesToApiFormat(runnables: Record<string, any>): void {
for (const [runnableId, runnable] of Object.entries(runnables)) {
if (
runnable?.type === "script" ||
runnable?.type === "hubscript" ||
runnable?.type === "flow"
) {
// Convert from file format to API format
// { type: "script" } -> { type: "path", runType: "script" }
const originalType = runnable.type;
runnable.runType = originalType;
runnable.type = "path";
log.debug(
`Converted runnable '${runnableId}' from type='${originalType}' to type='path', runType='${originalType}'`,
);
}
}
}
async function loadRunnables(): Promise<Record<string, Runnable>> {
try {
const localPath = process.cwd();
@@ -1319,6 +1383,10 @@ async function loadRunnables(): Promise<Record<string, Runnable>> {
runnables = rawApp?.runnables ?? {};
}
// Always convert path-based runnables from file format to API format
// This handles both backend folder runnables and raw_app.yaml runnables
convertRunnablesToApiFormat(runnables);
replaceInlineScripts(runnables, backendPath + SEP, true);
return runnables;
@@ -1370,12 +1438,25 @@ async function executeRunnable(
lock: inlineScript.id === undefined ? inlineScript.lock : undefined,
cache_ttl: inlineScript.cache_ttl,
};
} else if (runnable.type === "path" && runnable.runType && runnable.path) {
// Path-based runnables have type: "path" and runType: "script"|"hubscript"|"flow"
} else if (
(runnable.type === "path" || runnable.type === "runnableByPath") &&
runnable.runType &&
runnable.path
) {
// Path-based runnables have type: "path" (or legacy "runnableByPath") and runType: "script"|"hubscript"|"flow"
const prefix = runnable.runType;
requestBody.path = prefix !== "hubscript"
? `${prefix}/${runnable.path}`
: `script/${runnable.path}`;
} else {
// Neither inline script nor valid path-based runnable
const debugInfo = `type=${(runnable as any).type}, runType=${(runnable as any).runType}, ` +
`path=${(runnable as any).path}, hasInlineScript=${!!(runnable as any).inlineScript}`;
log.error(colors.red(`[executeRunnable] Invalid runnable configuration for '${runnableId}': ${debugInfo}`));
throw new Error(
`Invalid runnable '${runnableId}': ${debugInfo}. ` +
`Must have either inlineScript (for inline type) or type="path" with runType and path fields`,
);
}
const uuid = await wmill.executeComponent({
+2 -8
View File
@@ -125,18 +125,12 @@ export const GLOBAL_CONFIG_OPT = { noCdToRoot: false };
function findWmillYaml(): string | null {
const startDir = resolve(Deno.cwd());
const isInGitRepo = isGitRepository();
const gitRoot = isInGitRepo ? getGitRepoRoot() : null;
// If not in git repo, only check current directory
if (!isInGitRepo) {
const wmillYamlPath = join(startDir, "wmill.yaml");
return existsSync(wmillYamlPath) ? wmillYamlPath : null;
}
// If in git repo, search up to git repository root
const gitRoot = getGitRepoRoot();
let currentDir = startDir;
let foundPath: string | null = null;
// Search upward for wmill.yaml until we find it, reach git root, or reach filesystem root
while (true) {
const wmillYamlPath = join(currentDir, "wmill.yaml");
+1 -1
View File
@@ -70,7 +70,7 @@ export {
// }
// });
export const VERSION = "1.607.0";
export const VERSION = "1.607.1";
// Re-exported from constants.ts to maintain backwards compatibility
export { WM_FORK_PREFIX } from "./core/constants.ts";
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "windmill-components",
"version": "1.607.0",
"version": "1.607.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
"version": "1.607.0",
"version": "1.607.1",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "windmill-components",
"version": "1.607.0",
"version": "1.607.1",
"scripts": {
"dev": "vite dev",
"build": "vite build",
+1 -1
View File
@@ -20,7 +20,7 @@ console.log('Running postinstall for root project');
import { x } from 'tar'
const tarUrl = 'https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev/ui_builder-10b2c03.tar.gz'
const tarUrl = 'https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev/ui_builder-910a786.tar.gz'
const outputTarPath = path.join(process.cwd(), 'ui_builder.tar.gz')
const extractTo = path.join(process.cwd(), 'static/ui_builder/')
@@ -122,7 +122,7 @@
(v) => {
if (v === storage) return
storage = v
s3FilePickerInner?.reloadContent()
s3FilePickerInner?.reloadContent?.()
}
}
/>
@@ -443,7 +443,7 @@
: undefined
}
async function reloadContent() {
export async function reloadContent() {
if (initialFileKey !== undefined) {
initialFileKeyInternalCopy = { ...initialFileKey }
}
+2 -2
View File
@@ -20,7 +20,7 @@
"gitSync_18": "hub/28078/sync-script-to-git-repo-windmill",
"gitSync_19": "hub/28081/sync-script-to-git-repo-windmill",
"gitSync_20": "hub/28102/sync-script-to-git-repo-windmill",
"gitSync": "hub/28112/sync-script-to-git-repo-windmill",
"gitSync": "hub/28118/sync-script-to-git-repo-windmill",
"gitSyncTest": "hub/19799/git-repo-test-read-write-windmill",
"gitInitRepo": "hub/28109/git-sync%3A-init-repository-windmill",
"slackErrorHandler": "hub/19741/workspace-or-schedule-error-handler-slack",
@@ -39,4 +39,4 @@
"appReport": "hub/28076/app-report",
"cloneRepoToS3forGitRepoViewer_0": "hub/19825/clone_repo_and_upload_to_instance_storage",
"cloneRepoToS3forGitRepoViewer": "hub/19827/clone_repo_and_upload_to_instance_storage"
}
}
+2 -2
View File
@@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi"
[packages]
wmill = ">=1.607.0"
wmill_pg = ">=1.607.0"
wmill = ">=1.607.1"
wmill_pg = ">=1.607.1"
sendgrid = "*"
mysql-connector-python = "*"
pymongo = "*"
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: '3.0.3'
info:
version: 1.607.0
version: 1.607.1
title: OpenFlow Spec
contact:
name: Ruben Fiszel
@@ -12,7 +12,7 @@
RootModule = 'WindmillClient.psm1'
# Version number of this module.
ModuleVersion = '1.607.0'
ModuleVersion = '1.607.1'
# Supported PSEditions
# CompatiblePSEditions = @()
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.607.0"
version = "1.607.1"
description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -975,7 +975,7 @@ class Windmill:
).json()
except Exception as e:
raise Exception("Could not write file to S3") from e
return S3Object(s3=response["file_key"])
return S3Object(s3=response["file_key"], storage=s3object["storage"])
def sign_s3_objects(self, s3_objects: list[S3Object | str]) -> list[S3Object]:
"""Sign S3 objects for use by anonymous users in public apps.
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill-pg"
version = "1.607.0"
version = "1.607.1"
description = "An extension client for the wmill client library focused on pg"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+5 -1
View File
@@ -961,6 +961,7 @@ export async function writeS3File(
});
return {
s3: response.file_key,
...(s3Obj?.storage && { storage: s3Obj?.storage }),
};
}
@@ -1047,7 +1048,10 @@ export async function getPresignedS3PublicUrl(
* This allows pre-approvals that can be consumed by any later suspend step in the same flow.
* @returns approval page UI URL, resume and cancel API URLs for resuming the flow
*/
export async function getResumeUrls(approver?: string, flowLevel?: boolean): Promise<{
export async function getResumeUrls(
approver?: string,
flowLevel?: boolean
): Promise<{
approvalPage: string;
resume: string;
cancel: string;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@windmill/windmill",
"version": "1.607.0",
"version": "1.607.1",
"exports": "./src/index.ts",
"publish": {
"exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts"]
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "windmill-client",
"description": "Windmill SDK client for browsers and Node.js",
"version": "1.607.0",
"version": "1.607.1",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"devDependencies": {
+1 -1
View File
@@ -1 +1 @@
1.607.0
1.607.1