* feat(yaml-validator)!: unify flow, schedule, and trigger validation
- replace FlowValidator with WindmillYamlValidator.validate(doc, target)
- generate schedule/trigger schemas from backend OpenAPI and OpenFlow refs
- add schedule/trigger/filename-target tests and update AI agent fixtures
- bump windmill-yaml-validator to 2.0.0
BREAKING CHANGE: FlowValidator and validateFlow() are replaced by WindmillYamlValidator.validate(doc, target).
* add lint command
* add deno-compat script and docs for local yaml-validator testing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: make nullable fields pass yaml validation
Add nullable: true to static_asset_config and authentication_resource_path
in HttpTrigger schema. Post-process generated JSON schemas to add null to
enums with nullable: true (AJV doesn't handle OpenAPI 3.0 nullable + enum).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add nullable to all Option<T> fields in trigger and schedule OpenAPI schemas
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(frontend): handle nullable fields from updated OpenAPI types
Add ?? undefined coalescing at assignment sites where generated types
now include | null from the OpenAPI nullable additions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(lint): show allowed values in enum validation errors
Instead of "must be equal to one of the allowed values", now shows
"must be one of: 'r', 'w', 'rw'" for enum validation failures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add nullable to Edit/New trigger and schedule OpenAPI schemas
Ensures create/update request body types accept null for the same
fields that GET response types return as nullable, enabling clean
round-tripping without type mismatches.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* use published package
* publish
* refactor(lint): remove unused --includes/--excludes/--extra-includes CLI options
These options were defined but never wired to the file filtering logic.
The lint command still respects includes/excludes from wmill.yaml via
mergeConfigWithConfigFile.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(lint): handle additionalProperties errors and expand test coverage
Add formatting for AJV additionalProperties keyword to show the unknown
property name. Add unit tests for all formatValidationError branches and
integration tests for --json report shape, --fail-on-warn with mixed
files, non-existent directory, and enum error output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add realistic validator tests for schedules, triggers, and edge cases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add email trigger validation support
Add email trigger schema generation, validation, and linting. Email
triggers are no longer skipped with a warning — they are validated
like all other trigger types.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore(cli): bump windmill-yaml-validator to 1.1.1 (email trigger support)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* publish
* rm
* fix: address PR review feedback for lint command
- Add email to trigger kinds test loop instead of separate test
- Add email to ValidationTarget docs in README
- Type formatYamlDiagnostics param directly instead of unsafe cast
- Destructure json option before mergeConfigWithConfigFile for clarity
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(cli): add --lint option to sync push command
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add force_sandboxing global setting and #sandbox bash annotation
Add a new global setting `force_sandboxing` to enable nsjail sandboxing
for all jobs, overriding the DISABLE_NSJAIL environment variable.
Also add a #sandbox annotation for bash scripts to enable sandboxing
on a per-script basis.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: decouple nsjail probing from DISABLE_NSJAIL and apply force_sandboxing to all executors
NSJAIL_AVAILABLE now always probes for the nsjail binary at startup
regardless of the DISABLE_NSJAIL policy flag, fixing #sandbox annotation
and force_sandboxing being unusable in default (DISABLE_NSJAIL=true)
configuration. All language executors now use is_sandboxing_enabled()
instead of checking DISABLE_NSJAIL directly, so force_sandboxing
applies to all job types, not just bash.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: clarify force_sandboxing and DISABLE_NSJAIL relationship
Neither setting overrides the other — sandboxing is enabled when either
force_sandboxing=true OR DISABLE_NSJAIL=false. Updated frontend
description and backend comments to reflect this.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* all
* all
* revert typo
* all
* all
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The recent refactor of CloseButton (from on:close component events to
onClick prop) broke tag removal in MultiSelect/TagsToListenTo. The
refactor changed on:pointerdown (component event) to onPointerdown
(native DOM event), which stopped native pointerdown propagation and
broke the drag tracking in DraggableTags, causing the dropdown to open
on every close button click.
Reverts CloseButton and all callers back to using createEventDispatcher
and on:close.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add workspace search and runnable details tools to navigator mode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: correct uFuzzy search result indexing in workspace search
uFuzzy.search() returns [idxs, info, order] where order contains indices
into idxs, not into the original haystack. The code was using order values
directly as array indices, returning wrong results.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: mutualize search_workspace and get_runnable_details tools
- Move search_workspace tool def + implementation into shared.ts as
createSearchWorkspaceTool() factory, used by navigator and flow modes
- Move get_runnable_details tool into shared.ts as
createGetRunnableDetailsTool() factory, used by navigator, flow, and
script modes
- Replace flow mode's scripts-only search_scripts with search_workspace
that searches both scripts and flows
- Add search_workspace and get_runnable_details to script mode
- Remove duplicated WorkspaceScriptsSearch class from flow/core.ts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add get_runnable_details to flow mode system prompt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add hard limit on runnable content passed to AI context
Truncate script content and flow value at 20k chars in
get_runnable_details to avoid flooding the context window.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: make search_workspace type param required for strict schema
OpenAI strict mode requires all properties in required array. Make type
a required enum ('all', 'scripts', 'flows') instead of optional.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* cleaning
* nit
* cleaning
* refactor: use shared createSearchWorkspaceTool in app mode
Replace app mode's local list_workspace_runnables tool with the shared
createSearchWorkspaceTool() factory, consistent with navigator, flow,
and script modes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* search by keyword
* cleaning
* fix: document search_workspace and get_runnable_details in script mode system prompt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add get_runnable_details tool to app mode
Without it, the AI can find scripts/flows but can't inspect their
schema/content when configuring backend runnables with correct inputs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: race condition in WorkspaceRunnablesSearch workspace caching
Track scriptsWorkspace and flowsWorkspace separately instead of a single
shared workspace field. Previously, initScripts could update the shared
workspace field, causing initFlows to skip re-fetching when the workspace
changed (it saw the workspace already matched), returning stale data.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add new BENCHMARK_KIND variants (sequentialflow, scriptlogs, concurrencylimit,
concurrencykey, mixed, mixed_no_cc) for targeted performance testing. Fix shared
iteration counting across workers using a global atomic counter. Add job_perms
inserts and queue diagnostics for benchmark mode.
Move db connection setup to dedicated module and drop the initial connection pool
before creating the main one, preventing connection starvation when PostgreSQL
max_connections is low.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Add vertical nav bar to workspace settings
* harmonize settings content titles
* remove sidebar icons
* add background to sidebar
* nit user section
* EEonly display
* Workspace settings general design
* Add schema validation and dirty detection
* Put critical alerts in a separated tab
* separate error success handler
* only enable save when there is some changes
* Fix dirty detection for deployment UI
* Only enable save button when changes for datatables ws storage
* Add setting footer component
* Use new footer setting for saving configs
* nit
* apply setting footer
* improve save button
* nit
* nit
* nit
* make ws app use same pattern as other tabs
* Separate scrolling between sidebar and content
* Gather error handlers
* use universal save button for object storage
* Title sentence case
* nit
* nit
* improve dirty config logic
* nit
* nit
* clean dead code
* Use settings footer for deployment settings
* Git sync settings
* move tabs
* fix dirty stats of error handlers
* nit
* nit
* fix: parse Python datetime.datetime and datetime.date type annotations correctly
The Python parser only matched ExprKind::Name for type annotations, so
`datetime.datetime` (an Attribute expression) silently fell through to
Typ::Unknown and no datetime picker was shown in the UI.
- Extend parse_expr to resolve `datetime.*` attribute access (alongside
the existing `wmill.*` handling)
- Add Typ::Date variant for `datetime.date` → JSON schema format "date"
- Update python worker to import and convert `date.fromisoformat()`
- Update argSigToJsonSchemaType, AI types, schema validation, and SQL
datatype wasm for the new Date variant
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* all
* all
* all
* all
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Add frontend for the workspace proctection rules
* api to add and update workspace protection rules
* Fix bypasser selection
* Fix Select bug on refocus
* Change rulesets to use bitflags
* Messages for protection rules errors
* claude remove ui for rules
* Hide edit buttons when rule
* No edit refactor pt1
* Update edit buttons to be disabled when rule is active
* Merge deploy ui and rulsets in one tab
* Remove not cleaned line in migration
* multiple fixes
* Remove old protection rule logic
* Add prrotection rule for deploying through Merge UI
* Add Alert on legacy Deploy UI
* Add backend enforcing of workspace rules
* Finish backend blocking on rulsets
* Last changes to api ruleset blocks
* Prepare sqlx
* Remove unused import and argument
* Update SQLx metadata
* fix npm run check
* Re trigger CI
---------
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* use skills
* add prompts
* update system prompts
* generate skills on init
* add prompts in cli
* better for raw apps
* nit
* test pipeline draft
* better
* yaml for triggers and schedules
* cleaning
* better
* add descriptions to ai agent fileds
* adjust
* better openapi
* better
* nit
* feat: add typed provider and memory schemas for ai agent in openapi
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: improve zod validation errors with dynamic schema extraction
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* regen
* fix
* cleaning
* refactor: deduplicate skill descriptions in generate_skills_ts_export
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* cleaning
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
When testing an Anthropic API key in workspace AI settings, the testKey
function now uses the Anthropic SDK instead of the OpenAI SDK. This
ensures proper API compatibility and correct request format.
Changes:
- Added import for convertOpenAIToAnthropicMessages
- Modified testKey to detect Anthropic provider and use dedicated handler
- Added testAnthropicKey helper function that uses Anthropic SDK's
messages.create with proper headers and message format
Fixes#7762
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
The workspace selection page uses a different layout that doesn't render
the AI chat. However, drawers on this page were applying the chat offset
based on the chatState from localStorage, causing them to appear with an
incorrect offset to the right.
This fix passes disableChatOffset to UserSettings and SuperadminSettings
drawers on the workspace selection page.
Fixes#7806
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>