From 483b7d699f01f2bf91c23f9e37534f648a0a4e7e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 15 Jan 2026 17:51:33 +0000 Subject: [PATCH 1/8] fix: improve raw app builder malformed files --- frontend/scripts/untar_ui_builder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/scripts/untar_ui_builder.js b/frontend/scripts/untar_ui_builder.js index b48df61cdf..a13ab8fcee 100644 --- a/frontend/scripts/untar_ui_builder.js +++ b/frontend/scripts/untar_ui_builder.js @@ -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/') From d5fa3d8dec78148becdc826ab83defe39a06af7e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 15 Jan 2026 22:58:52 +0000 Subject: [PATCH 2/8] fix: fix wmill app dev with workspace scripts --- cli/src/commands/app/dev.ts | 87 +++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/cli/src/commands/app/dev.ts b/cli/src/commands/app/dev.ts index 90f20b66af..fd530f00aa 100644 --- a/cli/src/commands/app/dev.ts +++ b/cli/src/commands/app/dev.ts @@ -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 { + 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) => ` @@ -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 = {}) { } } +/** + * 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): 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> { try { const localPath = process.cwd(); @@ -1319,6 +1383,10 @@ async function loadRunnables(): Promise> { 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({ From a0bab87e54dac02200b2ff4a1ee9c6184dc2a87b Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 15 Jan 2026 23:01:38 +0000 Subject: [PATCH 3/8] cli improvements --- cli/src/core/conf.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/cli/src/core/conf.ts b/cli/src/core/conf.ts index 3fe388c45e..d2edc8569c 100644 --- a/cli/src/core/conf.ts +++ b/cli/src/core/conf.ts @@ -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"); From cd88a0379179e204ca9042fe0ed174c1c6c50df1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 15 Jan 2026 23:08:34 +0000 Subject: [PATCH 4/8] update git sync version --- frontend/src/lib/hubPaths.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/hubPaths.json b/frontend/src/lib/hubPaths.json index 0db72de93e..84b5209c82 100644 --- a/frontend/src/lib/hubPaths.json +++ b/frontend/src/lib/hubPaths.json @@ -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/28116/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" -} \ No newline at end of file +} From 21ebaa419651095ff106e2c86275c6ae8340bba0 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 16 Jan 2026 00:07:15 +0000 Subject: [PATCH 5/8] update git sync --- ...d9a35c412d82d27ce369ccb0ba38b9791669.json} | 10 ++++-- ...5a120d12b43a2f6056c3fff1c7c099b5f248a.json | 23 +++++++++++++ backend/ee-repo-ref.txt | 2 +- backend/windmill-api/src/apps.rs | 32 ++++++++++++++++--- backend/windmill-git-sync/src/lib.rs | 4 +++ .../windmill-worker/src/worker_lockfiles.rs | 21 ++++++++---- frontend/src/lib/hubPaths.json | 2 +- 7 files changed, 79 insertions(+), 15 deletions(-) rename backend/.sqlx/{query-ea9bbb972217bab4d7e8f4c08e331899161e80c239d56eb657d73bbf4272939b.json => query-19cca1d42f37e860dc54470fea8dd9a35c412d82d27ce369ccb0ba38b9791669.json} (59%) create mode 100644 backend/.sqlx/query-fb321fba5f4508d6cff5bae5a7c5a120d12b43a2f6056c3fff1c7c099b5f248a.json diff --git a/backend/.sqlx/query-ea9bbb972217bab4d7e8f4c08e331899161e80c239d56eb657d73bbf4272939b.json b/backend/.sqlx/query-19cca1d42f37e860dc54470fea8dd9a35c412d82d27ce369ccb0ba38b9791669.json similarity index 59% rename from backend/.sqlx/query-ea9bbb972217bab4d7e8f4c08e331899161e80c239d56eb657d73bbf4272939b.json rename to backend/.sqlx/query-19cca1d42f37e860dc54470fea8dd9a35c412d82d27ce369ccb0ba38b9791669.json index 450683521d..b9e17c84a0 100644 --- a/backend/.sqlx/query-ea9bbb972217bab4d7e8f4c08e331899161e80c239d56eb657d73bbf4272939b.json +++ b/backend/.sqlx/query-19cca1d42f37e860dc54470fea8dd9a35c412d82d27ce369ccb0ba38b9791669.json @@ -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" } diff --git a/backend/.sqlx/query-fb321fba5f4508d6cff5bae5a7c5a120d12b43a2f6056c3fff1c7c099b5f248a.json b/backend/.sqlx/query-fb321fba5f4508d6cff5bae5a7c5a120d12b43a2f6056c3fff1c7c099b5f248a.json new file mode 100644 index 0000000000..8bb2d4493e --- /dev/null +++ b/backend/.sqlx/query-fb321fba5f4508d6cff5bae5a7c5a120d12b43a2f6056c3fff1c7c099b5f248a.json @@ -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" +} diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index d2edc86dd8..dac8a90ba9 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -6262e373ede45b5b8d45505a63ff73968c04336a \ No newline at end of file +da0a3751abd2b0fed46ca5c7a3aef35923403b28 \ No newline at end of file diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index 785b7e9962..083641681e 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -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, ) diff --git a/backend/windmill-git-sync/src/lib.rs b/backend/windmill-git-sync/src/lib.rs index 340573edf1..3f8c521322 100644 --- a/backend/windmill-git-sync/src/lib.rs +++ b/backend/windmill-git-sync/src/lib.rs @@ -19,6 +19,7 @@ pub enum DeployedObject { Script { hash: ScriptHash, path: String, parent_path: Option }, Flow { path: String, parent_path: Option, version: i64 }, App { path: String, version: i64, parent_path: Option }, + RawApp { path: String, version: i64, parent_path: Option }, Folder { path: String }, Resource { path: String, parent_path: Option }, Variable { path: String, parent_path: Option }, @@ -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", diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 23768c07ef..25dac31b5a 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -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, ) diff --git a/frontend/src/lib/hubPaths.json b/frontend/src/lib/hubPaths.json index 84b5209c82..a09e66c3ad 100644 --- a/frontend/src/lib/hubPaths.json +++ b/frontend/src/lib/hubPaths.json @@ -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/28116/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", From 548d1af654c7d1538aabb5f8b3da3f8661ff8db8 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 16 Jan 2026 00:12:11 +0000 Subject: [PATCH 6/8] chore(main): release 1.607.1 (#7586) * chore(main): release 1.607.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 8 + backend/Cargo.lock | 169 ++++++++++++------ backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/src/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 140 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 031b23c285..d2cedb3a6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8bf9ed08bc..54704ed97d 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -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" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 8bcaa11abf..3edec65b4b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -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 "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 186dd11346..0b51494ae5 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.607.0 + version: 1.607.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index ddf6cc6e52..9708b7aff0 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -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 { return await windmill.UserService.login({ diff --git a/cli/src/main.ts b/cli/src/main.ts index afed6ef82e..289afda3b3 100644 --- a/cli/src/main.ts +++ b/cli/src/main.ts @@ -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"; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index dd8983502b..061b072528 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -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": { diff --git a/frontend/package.json b/frontend/package.json index 309dae3d2d..d4803919de 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.607.0", + "version": "1.607.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index c500c8b781..270913b285 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -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 = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index bfcd57a757..956eb2bbbd 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: '3.0.3' info: - version: 1.607.0 + version: 1.607.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 481647abdd..a1283d61bf 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.607.0' + ModuleVersion = '1.607.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index a34a2185d4..d858b8e961 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -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" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 61ba396e16..584cb99179 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -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" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 9c9252448e..d9be2c88f7 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -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"] diff --git a/typescript-client/package.json b/typescript-client/package.json index d5f4fbeef4..f95b403eee 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -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": { diff --git a/version.txt b/version.txt index 9378bd5cb2..57590e54dc 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.607.0 +1.607.1 From d8d6c391311997aaa167dc7aef20140a9227a426 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 16 Jan 2026 07:19:42 +0000 Subject: [PATCH 7/8] rmcp compilation error --- backend/windmill-mcp/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/windmill-mcp/src/lib.rs b/backend/windmill-mcp/src/lib.rs index eb3df05b08..bf05dc7c45 100644 --- a/backend/windmill-mcp/src/lib.rs +++ b/backend/windmill-mcp/src/lib.rs @@ -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))?; From b6ef536098775c24dd1aa40f3a186d5b04ea53a2 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:33:22 +0100 Subject: [PATCH 8/8] fix: S3 secondary storage client and UI fixes (#7587) * fix storage selector broken * Fix writeS3File not returning secondary storage --- frontend/src/lib/components/S3FilePicker.svelte | 2 +- frontend/src/lib/components/S3FilePickerInner.svelte | 2 +- python-client/wmill/wmill/client.py | 2 +- typescript-client/client.ts | 6 +++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/S3FilePicker.svelte b/frontend/src/lib/components/S3FilePicker.svelte index 16eddb9f1a..13c6f32ef2 100644 --- a/frontend/src/lib/components/S3FilePicker.svelte +++ b/frontend/src/lib/components/S3FilePicker.svelte @@ -122,7 +122,7 @@ (v) => { if (v === storage) return storage = v - s3FilePickerInner?.reloadContent() + s3FilePickerInner?.reloadContent?.() } } /> diff --git a/frontend/src/lib/components/S3FilePickerInner.svelte b/frontend/src/lib/components/S3FilePickerInner.svelte index 5014e834a8..fd163ea855 100644 --- a/frontend/src/lib/components/S3FilePickerInner.svelte +++ b/frontend/src/lib/components/S3FilePickerInner.svelte @@ -443,7 +443,7 @@ : undefined } - async function reloadContent() { + export async function reloadContent() { if (initialFileKey !== undefined) { initialFileKeyInternalCopy = { ...initialFileKey } } diff --git a/python-client/wmill/wmill/client.py b/python-client/wmill/wmill/client.py index 56f6c6d6fc..cb1b502223 100644 --- a/python-client/wmill/wmill/client.py +++ b/python-client/wmill/wmill/client.py @@ -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. diff --git a/typescript-client/client.ts b/typescript-client/client.ts index d959f8a970..5b740110a9 100644 --- a/typescript-client/client.ts +++ b/typescript-client/client.ts @@ -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;