From 9c37b0217c79390271d9855abe135df02f35c41f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 29 Jul 2026 11:13:16 +0200 Subject: [PATCH 01/13] fix(cli): compile runes in .svelte.ts / .svelte.js modules (#10400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(cli): compile runes in .svelte.ts / .svelte.js modules The svelte plugin only ran on `/\.svelte$/`, so a rune module like `lib.svelte.ts` was bundled as plain TypeScript: the types were stripped and `$state(0)` survived as a call to an undefined global, blowing up at runtime with "ReferenceError: $state is not defined". Route those files through `compileModule`. It parses with plain acorn and chokes on TypeScript, so types come off first via esbuild's transform — which is what vite-plugin-svelte gets for free by running after Vite's own esbuild transform. `wmill app dev` picks this up too; watch mode builds its plugin list with the same `createFrameworkPlugins`. Co-Authored-By: Claude Opus 5 (1M context) * chore: pin ui_builder to 1ffb28e Picks up the matching rune-module fix in the in-editor builder (windmill-labs/windmill-code-ui-builder#24), so `.svelte.ts` modules compile in the editor as well as through the CLI. Co-Authored-By: Claude Opus 5 (1M context) * fix(cli): compile raw apps with the app's own svelte compiler Svelte 5.52.0 moved delegated event handlers off `element.__click` onto a Symbol-keyed map. A raw app supplies its own Svelte *runtime* via package.json, but `import("svelte/compiler")` resolves against the CLI, whose own svelte floats independently — so the two can land on opposite sides of that change and the app builds, renders, and has every onclick/oninput silently dead. Resolve the compiler from the app's node_modules instead, so compiler and runtime are the same install by construction, and raise the CLI's own floor past the break for the fallback path. Also pin ui_builder to 013bf67, which carries the matching fix for the in-editor builder (windmill-labs/windmill-code-ui-builder#25), and move the Svelte raw-app template onto the same range. Those two go together: the new builder rejects a runtime that sits on the far side of the ABI break from its compiler. Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Claude Opus 5 (1M context) --- cli/bun.lock | 12 +- cli/package.json | 2 +- cli/src/commands/app/bundle.ts | 107 +++++++++++++--- ...pp_svelte_compiler_resolution_unit.test.ts | 89 +++++++++++++ cli/test/raw_app_svelte_module_unit.test.ts | 118 ++++++++++++++++++ frontend/scripts/ui_builder_artifact.json | 4 +- .../src/lib/components/raw_apps/templates.ts | 2 +- 7 files changed, 305 insertions(+), 29 deletions(-) create mode 100644 cli/test/raw_app_svelte_compiler_resolution_unit.test.ts create mode 100644 cli/test/raw_app_svelte_module_unit.test.ts diff --git a/cli/bun.lock b/cli/bun.lock index c783e411c7..c48e0f3f22 100644 --- a/cli/bun.lock +++ b/cli/bun.lock @@ -17,7 +17,7 @@ "minimatch": "^10.0.0", "open": "^10.0.0", "pg-gateway": "0.3.0-beta.4", - "svelte": "^5.45.2", + "svelte": "^5.56.8", "tar-stream": "^3.1.7", "windmill-parser-wasm-asset": "1.753.0", "windmill-parser-wasm-csharp": "1.510.1", @@ -156,7 +156,7 @@ "@stoplight/yaml-ast-parser": ["@stoplight/yaml-ast-parser@0.0.50", "", {}, "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.11", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw=="], "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], @@ -180,7 +180,7 @@ "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -206,7 +206,7 @@ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - "devalue": ["devalue@5.6.3", "", {}, "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg=="], + "devalue": ["devalue@5.8.2", "", {}, "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA=="], "diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], @@ -214,7 +214,7 @@ "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], - "esrap": ["esrap@2.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ=="], + "esrap": ["esrap@2.3.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng=="], "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], @@ -274,7 +274,7 @@ "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "svelte": ["svelte@5.53.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-yGONuIrcl/BMmqbm6/52Q/NYzfkta7uVlos5NSzGTfNJTTFtPPzra6rAQoQIwAqupeM3s9uuTf5PvioeiCdg9g=="], + "svelte": ["svelte@5.56.8", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg=="], "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], diff --git a/cli/package.json b/cli/package.json index 548588a402..12f8e6158f 100644 --- a/cli/package.json +++ b/cli/package.json @@ -26,7 +26,7 @@ "minimatch": "^10.0.0", "open": "^10.0.0", "pg-gateway": "0.3.0-beta.4", - "svelte": "^5.45.2", + "svelte": "^5.56.8", "tar-stream": "^3.1.7", "windmill-parser-wasm-asset": "1.753.0", "windmill-parser-wasm-csharp": "1.510.1", diff --git a/cli/src/commands/app/bundle.ts b/cli/src/commands/app/bundle.ts index c515e1e86e..9987713e4f 100644 --- a/cli/src/commands/app/bundle.ts +++ b/cli/src/commands/app/bundle.ts @@ -2,6 +2,8 @@ import * as fs from "node:fs"; import * as path from "node:path"; import process from "node:process"; import { spawn } from "node:child_process"; +import { createRequire } from "node:module"; +import { pathToFileURL } from "node:url"; import * as log from "../../core/log.ts"; import { colors } from "@cliffy/ansi/colors"; import * as windmillUtils from "@windmill-labs/shared-utils"; @@ -78,38 +80,70 @@ export function detectFrameworks(appDir: string): { svelte: boolean; vue: boolea } } +/** + * Loads the Svelte compiler out of the *app's* node_modules. + * + * The app brings its own Svelte runtime via package.json, and compiler and + * runtime have to agree on internals: Svelte 5.52.0 moved delegated event + * handlers off `element.__click` onto a Symbol-keyed map, so an older + * compiler's `onclick` output is silently ignored by a newer runtime — the app + * builds and renders with every handler dead. A bare `import("svelte/compiler")` + * resolves against this CLI instead, whose own svelte floats independently of + * the app's, which is exactly how the two drift apart. + * + * Falls back to the CLI's own compiler when the app has none resolvable. + */ +export async function loadSvelteCompiler(appDir: string): Promise { + try { + const requireFromApp = createRequire( + path.join(path.resolve(appDir), "package.json") + ); + const entry = requireFromApp.resolve("svelte/compiler"); + return await import(pathToFileURL(entry).href); + } catch { + return await import("svelte/compiler"); + } +} + /** * Creates a Svelte esbuild plugin * Uses the svelte compiler from the project's node_modules */ function createSveltePlugin(appDir: string): any { + // Resolved once per build, not per file. + let compilerPromise: Promise | undefined; + const svelteCompiler = () => + (compilerPromise ??= loadSvelteCompiler(appDir)); + + // This converts a message in Svelte's format to esbuild's format + const messageConverter = + (source: string, filename: string) => + ({ message, start, end }: any) => { + let location; + if (start && end) { + const lineText = source.split(/\r\n|\r|\n/g)[start.line - 1]; + const lineEnd = start.line === end.line ? end.column : lineText.length; + location = { + file: filename, + line: start.line, + column: start.column, + length: lineEnd - start.column, + lineText, + }; + } + return { text: message, location }; + }; + return { name: "svelte", setup(build: any) { build.onLoad({ filter: /\.svelte$/ }, async (args: any) => { - // Import svelte compiler from the project's node_modules - const svelte = await import("svelte/compiler"); + const svelte = await svelteCompiler(); // Load the file from the file system const source = await readTextFile(args.path); const filename = path.relative(process.cwd(), args.path); - - // This converts a message in Svelte's format to esbuild's format - const convertMessage = ({ message, start, end }: any) => { - let location; - if (start && end) { - const lineText = source.split(/\r\n|\r|\n/g)[start.line - 1]; - const lineEnd = start.line === end.line ? end.column : lineText.length; - location = { - file: filename, - line: start.line, - column: start.column, - length: lineEnd - start.column, - lineText, - }; - } - return { text: message, location }; - }; + const convertMessage = messageConverter(source, filename); // Convert Svelte syntax to JavaScript try { @@ -120,6 +154,41 @@ function createSveltePlugin(appDir: string): any { return { errors: [convertMessage(e)] }; } }); + + // `lib.svelte.ts` / `lib.svelte.js` are plain modules that may use runes. + // They need `compileModule`, otherwise `$state`/`$derived` sail through + // esbuild untouched and the bundle throws "$state is not defined". + build.onLoad({ filter: /\.svelte\.[jt]s$/ }, async (args: any) => { + const svelte = await svelteCompiler(); + + const source = await readTextFile(args.path); + const filename = path.relative(process.cwd(), args.path); + const convertMessage = messageConverter(source, filename); + + try { + // `compileModule` parses with plain acorn and chokes on TypeScript, so + // types have to come off first (vite-plugin-svelte gets this for free + // by running after Vite's esbuild transform). + const code = filename.endsWith(".ts") + ? ( + await build.esbuild.transform(source, { + loader: "ts", + sourcefile: filename, + }) + ).code + : source; + + const { js, warnings } = svelte.compileModule(code, { filename }); + const contents = js.code + `//# sourceMappingURL=` + js.map.toUrl(); + return { + contents, + loader: "js", + warnings: warnings.map(convertMessage), + }; + } catch (e: any) { + return { errors: [convertMessage(e)] }; + } + }); }, }; } diff --git a/cli/test/raw_app_svelte_compiler_resolution_unit.test.ts b/cli/test/raw_app_svelte_compiler_resolution_unit.test.ts new file mode 100644 index 0000000000..5fbf05384e --- /dev/null +++ b/cli/test/raw_app_svelte_compiler_resolution_unit.test.ts @@ -0,0 +1,89 @@ +/** + * A raw app brings its own Svelte *runtime* via package.json, so it has to be + * compiled with its own *compiler* too — the two share internals that change + * between versions. Svelte 5.52.0 moved delegated event handlers off + * `element.__click` onto a Symbol-keyed map, so compiling with a version on the + * other side of that line produces an app that builds, renders, and has every + * `onclick` silently dead. + * + * `import("svelte/compiler")` resolves against the CLI, whose svelte floats + * independently of the app's. These cover the app-local resolution that avoids + * that drift. + */ + +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import * as os from "node:os"; +import { loadSvelteCompiler } from "../src/commands/app/bundle.ts"; + +let tempDir: string; + +/** A stand-in svelte install, identifiable by a version the real one never has. */ +function installStubSvelte(dir: string, version: string) { + const pkgDir = path.join(dir, "node_modules", "svelte"); + fs.mkdirSync(pkgDir, { recursive: true }); + fs.writeFileSync( + path.join(pkgDir, "package.json"), + JSON.stringify({ + name: "svelte", + version, + type: "module", + exports: { "./compiler": "./compiler.js" }, + }), + "utf-8", + ); + fs.writeFileSync( + path.join(pkgDir, "compiler.js"), + `export const VERSION = ${JSON.stringify(version)};\n` + + `export function compile() { return { js: { code: "", map: null }, warnings: [] }; }\n` + + `export function compileModule() { return { js: { code: "", map: null }, warnings: [] }; }\n`, + "utf-8", + ); +} + +beforeEach(() => { + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "raw-app-svelte-compiler-")); + fs.writeFileSync( + path.join(tempDir, "package.json"), + JSON.stringify({ name: "app", private: true, dependencies: { svelte: "*" } }), + "utf-8", + ); +}); + +afterEach(() => { + fs.rmSync(tempDir, { recursive: true, force: true }); +}); + +describe("loadSvelteCompiler", () => { + test("uses the app's own compiler rather than the CLI's", async () => { + installStubSvelte(tempDir, "0.0.0-app-local"); + + const compiler = await loadSvelteCompiler(tempDir); + + expect(compiler.VERSION).toBe("0.0.0-app-local"); + }); + + test("resolves against the app even when given a relative dir", async () => { + installStubSvelte(tempDir, "0.0.0-relative"); + const cwd = process.cwd(); + try { + process.chdir(path.dirname(tempDir)); + const compiler = await loadSvelteCompiler(path.basename(tempDir)); + expect(compiler.VERSION).toBe("0.0.0-relative"); + } finally { + process.chdir(cwd); + } + }); + + test("falls back to the CLI's compiler when the app has none", async () => { + const compiler = await loadSvelteCompiler(tempDir); + + // The real thing, not a stub — and new enough to emit the Symbol-map form + // of delegated handlers that a modern runtime reads. + expect(typeof compiler.compile).toBe("function"); + expect(compiler.VERSION).not.toContain("app-local"); + const [major, minor] = compiler.VERSION.split(".").map(Number); + expect(major > 5 || (major === 5 && minor >= 52)).toBe(true); + }); +}); diff --git a/cli/test/raw_app_svelte_module_unit.test.ts b/cli/test/raw_app_svelte_module_unit.test.ts new file mode 100644 index 0000000000..736e048100 --- /dev/null +++ b/cli/test/raw_app_svelte_module_unit.test.ts @@ -0,0 +1,118 @@ +/** + * `lib.svelte.ts` / `lib.svelte.js` modules are plain modules that may use + * runes. They need `svelte.compileModule`; without it esbuild happily bundles + * `$state(...)` as an ordinary call and the app dies at runtime with + * "ReferenceError: $state is not defined". + */ + +import { afterAll, beforeAll, describe, expect, test } from "bun:test"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import * as os from "node:os"; +import { createBundle } from "../src/commands/app/bundle.ts"; + +let tempDir: string; +let originalCwd: string; + +// Runes used as bare calls, ignoring the `$state(...)` mentions inside Svelte's +// own warning message template literals. +function bareRuneCalls(js: string): string[] { + return [...js.matchAll(/(^|[^.\w$`])\$(state|derived|effect|props)\s*\(/g)].map( + (m) => m[0] + ); +} + +function writeApp(files: Record) { + for (const [name, content] of Object.entries(files)) { + fs.writeFileSync(path.join(tempDir, name), content, "utf-8"); + } +} + +async function bundle(entry: string): Promise { + const { js } = await createBundle({ + entryPoint: path.join(tempDir, entry), + minify: false, + sourcemap: false, + }); + return js; +} + +beforeAll(() => { + originalCwd = process.cwd(); + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "raw-app-svelte-module-")); + fs.writeFileSync( + path.join(tempDir, "package.json"), + JSON.stringify({ name: "app", private: true, dependencies: { svelte: "*" } }), + "utf-8" + ); + // Reuse the CLI's own svelte install instead of paying for an npm install; + // `ensureNodeModules` only checks that the directory is there. + fs.symlinkSync( + path.join(originalCwd, "node_modules"), + path.join(tempDir, "node_modules") + ); + process.chdir(tempDir); +}); + +afterAll(() => { + process.chdir(originalCwd); + fs.rmSync(tempDir, { recursive: true, force: true }); +}); + +describe("svelte plugin: .svelte.ts modules", () => { + test("compiles runes in a TypeScript rune module and the bundle runs", async () => { + writeApp({ + "lib.svelte.ts": `export class Cycle { + #options: T[] = []; + #index = $state(0); + current = $derived(this.#options[this.#index]); + + constructor(options: T[]) { + this.#options = options; + } + + next() { + this.#index = (this.#index + 1) % this.#options.length; + } +} +`, + "ts_entry.ts": `import { Cycle } from './lib.svelte'; + +const cycle = new Cycle(['a', 'b', 'c']); +cycle.next(); +(globalThis as any).__cycleResult = cycle.current; +`, + }); + + const js = await bundle("ts_entry.ts"); + + expect(bareRuneCalls(js)).toEqual([]); + // Runtime is the real check: unfixed, this throws + // "ReferenceError: $state is not defined". + new Function(js)(); + expect((globalThis as any).__cycleResult).toBe("b"); + }); + + test("compiles runes in a JavaScript rune module", async () => { + writeApp({ + "counter.svelte.js": `export const counter = $state({ n: 0 }); + +export function bump() { + counter.n += 1; +} +`, + "js_entry.ts": `import { counter, bump } from './counter.svelte.js'; + +bump(); +bump(); +(globalThis as any).__counterResult = counter.n; +`, + }); + + const js = await bundle("js_entry.ts"); + + expect(bareRuneCalls(js)).toEqual([]); + new Function(js)(); + expect((globalThis as any).__counterResult).toBe(2); + }); +}); diff --git a/frontend/scripts/ui_builder_artifact.json b/frontend/scripts/ui_builder_artifact.json index 01cfbb2888..544f788f83 100644 --- a/frontend/scripts/ui_builder_artifact.json +++ b/frontend/scripts/ui_builder_artifact.json @@ -1,5 +1,5 @@ { "baseUrl": "https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev", - "version": "76ee616", - "sha256": "1d696d38a152179ef6e1cada5df302d078cc677b6dbc244b5c42335e11feabac" + "version": "013bf67", + "sha256": "4ad957f62a1cf2fe592144f7da702a899294a330acae40ef2d85ffd726326c91" } diff --git a/frontend/src/lib/components/raw_apps/templates.ts b/frontend/src/lib/components/raw_apps/templates.ts index 335ae4d8e8..22fa773f85 100644 --- a/frontend/src/lib/components/raw_apps/templates.ts +++ b/frontend/src/lib/components/raw_apps/templates.ts @@ -136,7 +136,7 @@ export const svelte5Template = { '/index.css': indexCss, '/package.json': `{ "dependencies": { - "svelte": "^5.55.5", + "svelte": "^5.56.8", "windmill-client": "^1" } }` From b1d26bd26814adb846175ae4a958746cc61b7d6f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 29 Jul 2026 12:11:41 +0200 Subject: [PATCH 02/13] chore: pin ui_builder to 2471791 (#10402) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Picks up the language-server fix in the in-editor builder (windmill-labs/windmill-code-ui-builder#26), so .svelte files get IntelliSense, diagnostics and go-to-definition again. The bundled extension's language server was dying on startup with Cannot read properties of undefined (reading 'useCaseSensitiveFileNames') Builds and runtime were unaffected — this is editor language support only, and it predates the rune-module and delegated-event fixes already pinned here. Co-authored-by: Claude Opus 5 (1M context) --- frontend/scripts/ui_builder_artifact.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/scripts/ui_builder_artifact.json b/frontend/scripts/ui_builder_artifact.json index 544f788f83..dcba3214de 100644 --- a/frontend/scripts/ui_builder_artifact.json +++ b/frontend/scripts/ui_builder_artifact.json @@ -1,5 +1,5 @@ { "baseUrl": "https://pub-06154ed168a24e73a86ab84db6bf15d8.r2.dev", - "version": "013bf67", - "sha256": "4ad957f62a1cf2fe592144f7da702a899294a330acae40ef2d85ffd726326c91" + "version": "2471791", + "sha256": "04048791fb6b2ebca5cc30447e163826cdb143d65cce07a629252e131ac83618" } From 64ec1aa490ab5537a73bcb6f6b7e926c6339af39 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 29 Jul 2026 12:12:07 +0200 Subject: [PATCH 03/13] chore(main): release 1.775.2 (#10397) * chore(main): release 1.775.2 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 9 + backend/Cargo.lock | 158 +++++++++--------- backend/Cargo.toml | 4 +- .../parsers/windmill-parser-wasm/Cargo.lock | 48 +++--- .../parsers/windmill-parser-wasm/Cargo.toml | 2 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/src/core/constants.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 2 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 17 files changed, 128 insertions(+), 119 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac51063de9..a69d7b0389 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [1.775.2](https://github.com/windmill-labs/windmill/compare/v1.775.1...v1.775.2) (2026-07-29) + + +### Bug Fixes + +* **cli:** compile runes in .svelte.ts / .svelte.js modules ([#10400](https://github.com/windmill-labs/windmill/issues/10400)) ([9c37b02](https://github.com/windmill-labs/windmill/commit/9c37b0217c79390271d9855abe135df02f35c41f)) +* distinguish waiting-on-user from streaming in ai sessions ([#10396](https://github.com/windmill-labs/windmill/issues/10396)) ([a17ccbd](https://github.com/windmill-labs/windmill/commit/a17ccbdd0d3c9f2f6234c4cc70d0917e83eeaceb)) +* surface the real reason git sync settings saves are rejected ([#10398](https://github.com/windmill-labs/windmill/issues/10398)) ([33d2845](https://github.com/windmill-labs/windmill/commit/33d28456cc8ef9f64301eb3dd6dad6d7325018e3)) + ## [1.775.1](https://github.com/windmill-labs/windmill/compare/v1.775.0...v1.775.1) (2026-07-28) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 11167f13cf..7dd3c795aa 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -14489,7 +14489,7 @@ dependencies = [ [[package]] name = "windmill" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-nats", @@ -14574,7 +14574,7 @@ dependencies = [ [[package]] name = "windmill-ai" -version = "1.775.1" +version = "1.775.2" dependencies = [ "async-stream", "async-trait", @@ -14607,7 +14607,7 @@ dependencies = [ [[package]] name = "windmill-alerting" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14620,7 +14620,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "argon2", @@ -14759,7 +14759,7 @@ dependencies = [ [[package]] name = "windmill-api-agent-workers" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14782,7 +14782,7 @@ dependencies = [ [[package]] name = "windmill-api-assets" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14797,7 +14797,7 @@ dependencies = [ [[package]] name = "windmill-api-auth" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -14823,7 +14823,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.775.1" +version = "1.775.2" dependencies = [ "reqwest 0.12.28", "serde", @@ -14833,7 +14833,7 @@ dependencies = [ [[package]] name = "windmill-api-configs" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14850,7 +14850,7 @@ dependencies = [ [[package]] name = "windmill-api-debug" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "base64 0.22.1", @@ -14872,7 +14872,7 @@ dependencies = [ [[package]] name = "windmill-api-embeddings" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -14895,7 +14895,7 @@ dependencies = [ [[package]] name = "windmill-api-flow-conversations" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14911,7 +14911,7 @@ dependencies = [ [[package]] name = "windmill-api-flows" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14932,7 +14932,7 @@ dependencies = [ [[package]] name = "windmill-api-groups" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14953,7 +14953,7 @@ dependencies = [ [[package]] name = "windmill-api-inputs" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -14967,7 +14967,7 @@ dependencies = [ [[package]] name = "windmill-api-integration-tests" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-nats", @@ -15002,7 +15002,7 @@ dependencies = [ [[package]] name = "windmill-api-jobs" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -15027,7 +15027,7 @@ dependencies = [ [[package]] name = "windmill-api-npm-proxy" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "flate2", @@ -15045,7 +15045,7 @@ dependencies = [ [[package]] name = "windmill-api-openapi" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -15067,7 +15067,7 @@ dependencies = [ [[package]] name = "windmill-api-schedule" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -15087,7 +15087,7 @@ dependencies = [ [[package]] name = "windmill-api-scripts" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -15124,7 +15124,7 @@ dependencies = [ [[package]] name = "windmill-api-settings" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -15152,7 +15152,7 @@ dependencies = [ [[package]] name = "windmill-api-sse" -version = "1.775.1" +version = "1.775.2" dependencies = [ "lazy_static", "serde", @@ -15164,7 +15164,7 @@ dependencies = [ [[package]] name = "windmill-api-users" -version = "1.775.1" +version = "1.775.2" dependencies = [ "argon2", "axum 0.8.9", @@ -15189,7 +15189,7 @@ dependencies = [ [[package]] name = "windmill-api-workers" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -15203,7 +15203,7 @@ dependencies = [ [[package]] name = "windmill-api-workspaces" -version = "1.775.1" +version = "1.775.2" dependencies = [ "axum 0.8.9", "chrono", @@ -15238,7 +15238,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.775.1" +version = "1.775.2" dependencies = [ "chrono", "lazy_static", @@ -15252,7 +15252,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "axum 0.8.9", @@ -15271,7 +15271,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.775.1" +version = "1.775.2" dependencies = [ "aes-gcm", "aho-corasick", @@ -15375,7 +15375,7 @@ dependencies = [ [[package]] name = "windmill-dep-map" -version = "1.775.1" +version = "1.775.2" dependencies = [ "chrono", "itertools 0.14.0", @@ -15394,7 +15394,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.775.1" +version = "1.775.2" dependencies = [ "regex", "serde", @@ -15409,7 +15409,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "astral-tokio-tar", @@ -15433,7 +15433,7 @@ dependencies = [ [[package]] name = "windmill-jseval" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "futures", @@ -15450,7 +15450,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.775.1" +version = "1.775.2" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -15466,7 +15466,7 @@ dependencies = [ [[package]] name = "windmill-mcp" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -15487,7 +15487,7 @@ dependencies = [ [[package]] name = "windmill-native-triggers" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -15518,7 +15518,7 @@ dependencies = [ [[package]] name = "windmill-oauth" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "arc-swap", @@ -15543,7 +15543,7 @@ dependencies = [ [[package]] name = "windmill-object-store" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-stream", @@ -15577,7 +15577,7 @@ dependencies = [ [[package]] name = "windmill-operator" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "futures", @@ -15595,7 +15595,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.775.1" +version = "1.775.2" dependencies = [ "convert_case 0.6.0", "serde", @@ -15604,7 +15604,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -15616,7 +15616,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -15628,7 +15628,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "gosyn", @@ -15640,7 +15640,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -15652,7 +15652,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -15664,7 +15664,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "nu-parser", @@ -15675,7 +15675,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15686,7 +15686,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15698,7 +15698,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "rustpython-ast", @@ -15709,7 +15709,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-recursion", @@ -15731,7 +15731,7 @@ dependencies = [ [[package]] name = "windmill-parser-r" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -15743,7 +15743,7 @@ dependencies = [ [[package]] name = "windmill-parser-ruby" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -15757,7 +15757,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15774,7 +15774,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -15787,7 +15787,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde", @@ -15799,7 +15799,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -15817,7 +15817,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde-wasm-bindgen", @@ -15833,7 +15833,7 @@ dependencies = [ [[package]] name = "windmill-parser-wac" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "rustpython-ast", @@ -15849,7 +15849,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde", @@ -15860,7 +15860,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-recursion", @@ -15899,7 +15899,7 @@ dependencies = [ [[package]] name = "windmill-runtime-nativets" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "const_format", @@ -15939,7 +15939,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.775.1" +version = "1.775.2" dependencies = [ "getrandom 0.3.4", "wasm-bindgen", @@ -15950,7 +15950,7 @@ dependencies = [ [[package]] name = "windmill-store" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-recursion", @@ -15984,7 +15984,7 @@ dependencies = [ [[package]] name = "windmill-test-utils" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16008,7 +16008,7 @@ dependencies = [ [[package]] name = "windmill-trigger" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16041,7 +16041,7 @@ dependencies = [ [[package]] name = "windmill-trigger-amqp" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16068,7 +16068,7 @@ dependencies = [ [[package]] name = "windmill-trigger-azure" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16101,7 +16101,7 @@ dependencies = [ [[package]] name = "windmill-trigger-email" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16121,7 +16121,7 @@ dependencies = [ [[package]] name = "windmill-trigger-gcp" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16155,7 +16155,7 @@ dependencies = [ [[package]] name = "windmill-trigger-http" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16191,7 +16191,7 @@ dependencies = [ [[package]] name = "windmill-trigger-kafka" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16214,7 +16214,7 @@ dependencies = [ [[package]] name = "windmill-trigger-mqtt" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16238,7 +16238,7 @@ dependencies = [ [[package]] name = "windmill-trigger-nats" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-nats", @@ -16262,7 +16262,7 @@ dependencies = [ [[package]] name = "windmill-trigger-postgres" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16297,7 +16297,7 @@ dependencies = [ [[package]] name = "windmill-trigger-sqs" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16325,7 +16325,7 @@ dependencies = [ [[package]] name = "windmill-trigger-websocket" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-trait", @@ -16350,7 +16350,7 @@ dependencies = [ [[package]] name = "windmill-types" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "bitflags 2.13.1", @@ -16369,7 +16369,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-once-cell", @@ -16484,7 +16484,7 @@ dependencies = [ [[package]] name = "windmill-worker-volumes" -version = "1.775.1" +version = "1.775.2" dependencies = [ "bytes", "futures", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 49beac0b8a..a6fffe33f4 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.775.1" +version = "1.775.2" authors.workspace = true edition.workspace = true @@ -88,7 +88,7 @@ members = [ exclude = ["./windmill-duckdb-ffi-internal", "./parsers/windmill-parser-wasm"] [workspace.package] -version = "1.775.1" +version = "1.775.2" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/parsers/windmill-parser-wasm/Cargo.lock b/backend/parsers/windmill-parser-wasm/Cargo.lock index e3639e30c2..0e4e12eb89 100644 --- a/backend/parsers/windmill-parser-wasm/Cargo.lock +++ b/backend/parsers/windmill-parser-wasm/Cargo.lock @@ -6191,7 +6191,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill-common" -version = "1.775.1" +version = "1.775.2" dependencies = [ "aho-corasick", "anyhow", @@ -6272,7 +6272,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.775.1" +version = "1.775.2" dependencies = [ "proc-macro2", "quote", @@ -6284,7 +6284,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.775.1" +version = "1.775.2" dependencies = [ "convert_case", "serde", @@ -6293,7 +6293,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -6305,7 +6305,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -6317,7 +6317,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "gosyn", @@ -6329,7 +6329,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -6341,7 +6341,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -6353,7 +6353,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "nu-parser", @@ -6364,7 +6364,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -6375,7 +6375,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "rustpython-ast", @@ -6398,7 +6398,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "async-recursion", @@ -6420,7 +6420,7 @@ dependencies = [ [[package]] name = "windmill-parser-r" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde_json", @@ -6432,7 +6432,7 @@ dependencies = [ [[package]] name = "windmill-parser-ruby" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -6446,7 +6446,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "convert_case", @@ -6463,7 +6463,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -6476,7 +6476,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde", @@ -6488,7 +6488,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "lazy_static", @@ -6506,7 +6506,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts-asset" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde-wasm-bindgen", @@ -6522,7 +6522,7 @@ dependencies = [ [[package]] name = "windmill-parser-wac" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "rustpython-ast", @@ -6538,7 +6538,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "getrandom 0.2.17", @@ -6570,7 +6570,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "serde", @@ -6581,7 +6581,7 @@ dependencies = [ [[package]] name = "windmill-types" -version = "1.775.1" +version = "1.775.2" dependencies = [ "anyhow", "bitflags", diff --git a/backend/parsers/windmill-parser-wasm/Cargo.toml b/backend/parsers/windmill-parser-wasm/Cargo.toml index 9ee10c7fbb..1cb5004022 100644 --- a/backend/parsers/windmill-parser-wasm/Cargo.toml +++ b/backend/parsers/windmill-parser-wasm/Cargo.toml @@ -12,7 +12,7 @@ resolver = "2" members = ["."] [workspace.package] -version = "1.775.1" +version = "1.775.2" edition = "2021" authors = ["Ruben Fiszel "] diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 381cf1b999..21eca505fd 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.775.1 + version: 1.775.2 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index e77bfb67ba..57c877b441 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.775.1"; +export const VERSION = "v1.775.2"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/src/core/constants.ts b/cli/src/core/constants.ts index bd5add7ecd..59de21e2bf 100644 --- a/cli/src/core/constants.ts +++ b/cli/src/core/constants.ts @@ -10,4 +10,4 @@ export const WM_FORK_PREFIX = "wm-fork"; // (e.g. utils.ts) can read it without importing main.ts and creating a circular // dependency (main → workspace → utils → main) that triggers a TDZ. // Re-exported from main.ts for backwards compatibility. -export const VERSION = "1.775.1"; +export const VERSION = "1.775.2"; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ad6838fa37..4ab6621c30 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "@windmill-labs/components", - "version": "1.775.1", + "version": "1.775.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@windmill-labs/components", - "version": "1.775.1", + "version": "1.775.2", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 4bf61cee55..01e68d2acf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@windmill-labs/components", - "version": "1.775.1", + "version": "1.775.2", "scripts": { "dev": "vite dev", "dev:ui-builder": "mv static/ui_builder static/ui_builder.dev-disabled 2>/dev/null || true ; trap 'mv static/ui_builder.dev-disabled static/ui_builder 2>/dev/null || true' EXIT ; vite dev", diff --git a/lsp/Pipfile b/lsp/Pipfile index a69114c915..24c5b9197c 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.775.1" +wmill = ">=1.775.2" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 8ee13fa39f..833d43cb91 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: '3.0.3' info: - version: 1.775.1 + version: 1.775.2 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 7bdcf6a788..d54c4c5a88 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.775.1' + ModuleVersion = '1.775.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 55b38a4e1d..90b6989676 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.775.1" +version = "1.775.2" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index abde746fc4..7721bf829b 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.775.1", + "version": "1.775.2", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./sqlUtils.ts", "./client.ts", "./wacError.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 0d9ac57f69..b0ac36d410 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.775.1", + "version": "1.775.2", "author": "Ruben Fiszel", "license": "Apache 2.0", "homepage": "https://github.com/windmill-labs/windmill/tree/main/typescript-client#readme", diff --git a/version.txt b/version.txt index 393fbf5b71..765699e2a4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.775.1 +1.775.2 From 9cd6a70f6ace956f679c1ce1fb46543cda569183 Mon Sep 17 00:00:00 2001 From: Guilhem Date: Wed, 29 Jul 2026 17:46:26 +0200 Subject: [PATCH 04/13] fix: sidebar workspace toggle navigates home when already in workspace mode (#10405) * feat: sidebar workspace toggle navigates home when already in workspace mode Co-Authored-By: Claude Opus 5 (1M context) * fix: fire the toggle home navigation on keyboard activation too Co-Authored-By: Claude Opus 5 (1M context) * fix: one activation per key press and no duplicate history entry from home Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Claude Opus 5 (1M context) --- .../toggleButton-v2/ToggleButton.svelte | 14 ++++++++++++- .../sessions/SessionModeSwitch.svelte | 20 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/common/toggleButton-v2/ToggleButton.svelte b/frontend/src/lib/components/common/toggleButton-v2/ToggleButton.svelte index 042bb09865..621e8383d0 100644 --- a/frontend/src/lib/components/common/toggleButton-v2/ToggleButton.svelte +++ b/frontend/src/lib/components/common/toggleButton-v2/ToggleButton.svelte @@ -21,6 +21,11 @@ item: ToggleGroupElements['item'] value: ToggleGroupItemProps class?: string + // Fires on activation, including on the already-selected button — which the + // group's onSelected never reports (melt treats it as a deselection and the + // group keeps the current value). Keyboard activation needs its own keydown + // branch below: melt preventDefaults Enter/Space, so no click is synthesized. + onActivate?: (e: Event) => void } let { @@ -38,7 +43,8 @@ id = undefined, item, value, - class: className = '' + class: className = '', + onActivate }: Props = $props() // Handle backward compatibility: small prop maps to size="sm" @@ -74,6 +80,12 @@ )} use:melt={$item(value)} style={selectedColor ? `--selected-color: ${selectedColor}` : ''} + onclick={onActivate} + onkeydown={(e) => { + // `repeat` filtered out: a held key keeps firing keydown, and one activation + // must mean one call however the consumer's side effect behaves. + if (!e.repeat && (e.key === 'Enter' || e.key === ' ')) onActivate?.(e) + }} > {#if icon} {@const SvelteComponent = icon} diff --git a/frontend/src/lib/components/sessions/SessionModeSwitch.svelte b/frontend/src/lib/components/sessions/SessionModeSwitch.svelte index c4d29c9791..d721b6f16f 100644 --- a/frontend/src/lib/components/sessions/SessionModeSwitch.svelte +++ b/frontend/src/lib/components/sessions/SessionModeSwitch.svelte @@ -1,8 +1,11 @@