* fix: handle empty strings in AI resource fields via serde deserializer
Add `empty_string_as_none` deserializer that converts empty strings to None
during deserialization. Applied to base_url, api_key, region, and AWS
credential fields in AIStandardResource and ProviderResource.
This fixes the "relative URL without a base" error when creating Anthropic
resources with empty base_url fields.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* nit
* nit
* nit
* cleaning
* cleaning
* cleaning
* cleaning
* fix: apply empty_string_as_none deserializer to api_key field
Consistent with other fields in ProviderResource, empty strings are now
deserialized as None for the api_key field.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Enable running the dev command from any directory by specifying the
target .raw_app folder as an argument. Workspace resolution and
authentication still happen from the original cwd to find wmill.yaml.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
QuickJS was missing an explicit memory limit, unlike deno_core which has
a 128MB heap limit. This adds a 32MB limit appropriate for lightweight
flow expression evaluation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, accessing a non-existent step via results.nonexistent would
throw an error. This fix makes both Deno Core and QuickJS return null
instead, enabling patterns like:
- results.nonexistent ?? 'default'
- results.nonexistent?.value ?? 'default'
The fix was applied to:
- js_eval.rs: handle_full_regex fast-path now uses .ok().flatten()
- js_eval_quickjs.rs: fallback path now uses .ok().unwrap_or(null)
Added flow engine test to verify the behavior.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add QuickJS as alternative JS engine for flow expression evaluation
Add rquickjs as an optional alternative to deno_core for evaluating
JavaScript expressions in flow transformations. QuickJS offers ~8-16x
faster startup times for simple expressions, making it ideal for
evaluating many small expressions in flows.
Key changes:
- Add new `quickjs` feature flag for windmill-worker
- Implement js_eval_quickjs.rs with true async Rust callbacks for
variable(), resource(), and results.xxx access (no pre-fetching)
- Share expression transformation logic (replace_with_await,
replace_with_await_result) between both implementations
- Add USE_QUICKJS_FOR_FLOW_EVAL env var to switch engines at runtime
- When only quickjs feature is enabled (no deno_core), QuickJS is
automatically used
- Add comprehensive parity tests comparing QuickJS and deno_core output
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* all
* quickjs
* quickjs
* all
* all
* all
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Fix standalone bundle path lookup in worker to not add redundant file
extension (the path already contains .tar/.esm suffixes from the API)
- Fix CLI preview tar bundle handling to preserve binary data correctly
(was using btoa(blob.text()) which corrupted binary tar data)
- Add integration tests for script/flow preview commands covering:
- Regular scripts (non-codebase)
- Codebase scripts (CJS and ESM formats)
- Codebase scripts with assets (tar bundles)
- Flow preview
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add `wmill script preview <path> [--data <json>]` command to test scripts against remote workspace without deploying
- Add `wmill flow preview <path> [--data <json>]` command to test flows against remote workspace without deploying
- Support codebase scripts with automatic bundling via esbuild
- Add `--silent` flag to suppress logs and only output final result
- Fix `findCodebase` to properly check if path is within codebase relative_path before pattern matching
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Previously, getCurrentGitBranch() was called inside loops for every
file processed during sync pull/push operations. For workspaces with
1900+ files, this spawned thousands of git subprocesses, causing a ~2x
performance regression.
This fix caches the git branch at the start of:
- elementsToMap() for pull operations
- push() for push operations
Expected improvement: ~3.2s -> ~1.6s for large workspaces.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The dnt polyfill's import-meta-ponyfill doesn't resolve symlinks when
comparing process.argv[1] with import.meta.url. When npm creates a
symlink for the `wmill` bin (e.g., /usr/bin/wmill -> .../main.js),
the paths don't match and isMain() incorrectly returns false, causing
the CLI to silently exit without running.
This fix resolves symlinks using fs.realpathSync() before comparison,
ensuring the CLI works correctly when invoked via npm-installed symlinks.
Tested with Node.js 20 and 25.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove service re-exports from client.ts
- Build default export explicitly in index.ts
- Use unbundled ESM output
- Add sideEffects: false
Results: ~900 bytes vs 91KB for simple imports
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
tsdown's bundled .d.ts output uses namespace declarations that reference
forward-declared types, which breaks Monaco/ATA type acquisition.
Switch to:
- tsdown for JS bundles (ESM + CJS) with --no-dts
- tsc with emitDeclarationOnly for clean individual .d.ts files
This restores the type structure from 1.617.0 which worked correctly
with Monaco editor's automatic type acquisition.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
tsdown generates "export { X as default }" which doesn't work properly
with Monaco's TypeScript type acquisition. This post-processes the .d.ts
files to use "export default X" instead.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enables `import wmill from "windmill-client"` syntax which was previously
broken due to missing default export in the generated ESM bundle.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When creating an Anthropic resource with "standard platform", the resource
JSON may contain `"base_url": ""` rather than omitting the field. Serde
deserializes this as `Some("")`, which bypassed the fallback logic and
caused "relative URL without a base" errors.
Similarly, AWS Bedrock with an empty region string would produce an
invalid URL like `https://bedrock-runtime..amazonaws.com`.
Filter out empty strings when checking for custom base_url and region
values, allowing the default URLs to be used correctly.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: typescript client esm build
* fix: add --dts flag and restore tsconfig options for typescript client ESM build
- Add --dts flag to tsdown commands to generate declaration files
- Restore outDir in tsconfig.json for compatibility
- Restore forceConsistentCasingInFileNames for case-sensitive systems
- Update README_DEV.md to reflect new tsdown build process
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The endpoint now returns all non-system schemas, including empty ones
without tables. This is useful for CLI and frontend features that need
to know about available schemas for autocompletion and app creation.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
These commands were using folder suffix checks without first loading the
nonDottedPaths setting from wmill.yaml, causing them to fail when run
inside folders with non-dotted names (e.g., myapp__raw_app instead of
myapp.raw_app).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
* fix(mcp): use computed base_internal_url instead of static default
Pass the actual base_internal_url (computed from the runtime port) to
the MCP backend instead of using the static BASE_INTERNAL_URL which
defaults to http://localhost:8000. This fixes internal API calls when
the server runs on a non-default port.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix
* remove BASE_INTERNAL_URL
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>