* fix: refuse dot segments in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse spaces, query and fragment markers in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse percent signs in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let ALLOW_PRIVATE_AI_BASE_URLS name the private hosts it allows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse loose and wildcard allowlist entries, judge embedded v4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: never admit local-use NAT64 addresses through an allowlist net
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse dot segments in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse spaces, query and fragment markers in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse percent signs in AI proxy paths
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: route the python SDK's S3 client settings through the S3 proxy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the boto3 config key and expose the proxied bucket to polars
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: proxy S3 settings only for server-signed tokens and keep tls verify
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: isolate fork object storage under a per-fork prefix with read-through
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: guard fork storage isolation against traversal, shared lakes and orphaning
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: serialize fork purges with same-id creation and guard shared middle forks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop fork storage mappings on every replica and lock fork deletion against child creation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* wip: require isolated forks rule
* feat: add a Require isolated forks protection rule
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: recheck isolated forks under the datatable lock and judge bypass in the base
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 455681e55eb7cdfcfdb7cd79cbae75b333e07943
This commit updates the EE repository reference after PR #893 was merged in windmill-ee-private.
Previous ee-repo-ref: 93f26e3cf816e4eb97b7d4dbbb5fc97fdf9821af
New ee-repo-ref: 455681e55eb7cdfcfdb7cd79cbae75b333e07943
Automated by sync-ee-ref workflow.
* fix: exempt only datatables the base does not own, compact fork data choices
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: pin the isolated-forks owner check, fix its docs wording
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: route the python SDK's S3 client settings through the S3 proxy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the boto3 config key and expose the proxied bucket to polars
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: proxy S3 settings only for server-signed tokens and keep tls verify
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: isolate fork object storage under a per-fork prefix with read-through
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: guard fork storage isolation against traversal, shared lakes and orphaning
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: serialize fork purges with same-id creation and guard shared middle forks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop fork storage mappings on every replica and lock fork deletion against child creation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 455681e55eb7cdfcfdb7cd79cbae75b333e07943
This commit updates the EE repository reference after PR #893 was merged in windmill-ee-private.
Previous ee-repo-ref: 93f26e3cf816e4eb97b7d4dbbb5fc97fdf9821af
New ee-repo-ref: 455681e55eb7cdfcfdb7cd79cbae75b333e07943
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: route the python SDK's S3 client settings through the S3 proxy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the boto3 config key and expose the proxied bucket to polars
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: proxy S3 settings only for server-signed tokens and keep tls verify
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to cd3395013d8484cd3917cdb6ee7837b6ac91e577
This commit updates the EE repository reference after PR #889 was merged in windmill-ee-private.
Previous ee-repo-ref: e90873bba9dde1e899741d111137f94dde2e5ff8
New ee-repo-ref: cd3395013d8484cd3917cdb6ee7837b6ac91e577
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: add a toggle to leave forks of non-dev workspaces out of dev isolation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: track the non-dev forks toggle reactively and bound the forking rule checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: point ee-repo-ref at the skip non-dev forks telemetry registration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep forks of archived dev workspaces isolated and warn about forkable non-dev forks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: reset tag lineage caches on every archive and unarchive
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf: cache the token dev lineage lookup and trim isolation hot-path costs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: point ee-repo-ref at the merged skip non-dev forks telemetry registration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: route dev workspace and fork jobs to their own worker groups
* fix: harden dev workspace isolation against review findings
* fix: verify hashed dedicated tags and keep dev lineage across renames
* fix: let tag-scoped tokens reach jobs queued on dev workspace tags
* fix: expand tag scopes only in dev workspaces and forks
* fix: expand tag scopes only while dev workspace isolation is on
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: collapse the dev workspace isolation section by default
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: count dev workspace isolation toggles and dev-serving group flags
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: validate the dev workspace tag suffix on every instance config writer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 71e9c0de8317e839f955ebef6a819062f20ac418
This commit updates the EE repository reference after PR #892 was merged in windmill-ee-private.
Previous ee-repo-ref: b5ab84e1705f939c399f6315a03f88b55bce1804
New ee-repo-ref: 71e9c0de8317e839f955ebef6a819062f20ac418
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* fix: give inline script runs their own job dir
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: remove the inline job dir when the run is dropped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: require variables:read for the token variable of an mcp resource
A token scoped to resources:read/write on an MCP resource could have the API
decrypt the variable the resource's `token` points at and send it as a bearer
to the resource's URL. The url and header `$var:` references already required
variables:read on the variable; the token reference now does too, checked before
the OAuth refresh touches that variable.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let an mcp resource's scope cover the variables it references
A scoped token reading or calling an MCP resource resolved its token variable
with the resource scope alone, but its url and header variables also needed
variables:read on each. The resource scope now covers all three; RLS still
bounds them to secrets the caller can read. Reverts the token-side check from
the previous commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: scope resource references when they are written, not when they are read
A token scoped to a resource now reads everything that resource references
(`$var:`, `$jsonvar:`, `$res:`), through get_value_interpolated and the MCP
tool routes alike. What makes that safe moves to the write: create, update,
update_value and version restore refuse a scoped token adding a reference it
holds no read scope on. References the stored value already carries are kept,
since whoever put them there was allowed to.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: hold every resource reference writer to its own user's read rights
A resource-scoped reader resolves stored references as itself, so an unscoped
session could plant a reference to a secret its own user cannot read and have
a reader's scoped token resolve it. Adding a reference now also requires the
writer's user to see its target under RLS. A reference to nothing yet stays
allowed, since a promotion pushes resources before the secrets they use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: vet only variable references on write and keep nested resources scoped
A nested `$res:` brought along the variables of a resource the writer could see
but whose references it could not read, and what it references can change after
it is written. It needs its own read scope again, and the write check covers
only `$var:`/`$jsonvar:`.
An MCP token stored as a bare path resolved as a variable without being vetted
on write. It now needs its own variables:read scope, and the `$var:` prefix is
parsed with strip_prefix, as the write check does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep variable scopes on result-cache resources
The worker writes job output to g/results/<hash> straight to the table, so its
references never pass the write check. A token scoped to such a resource still
needs read scope on the variables it references.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: require read rights on kept references and pin result-cache resources to g/results/
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: check resource variable references at read time, with wildcard resource scopes covering matching variables
Returns to the read-time rule: a variable a resource references needs
variables:read on it, unless it is the resource's linked secret or a wildcard
pattern in the token's resources: scopes matches it. The MCP token reference is
now held to that rule like the url and header references.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: name mcp script and flow tools after their last path segment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: skip suffix expansion for mcp tool names longer than any short name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let deployed low-code apps run runtime-built inline queries again
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: limit id-less app runs to the database studio's sql languages
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover the deployed-row exclusion with sql content
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Revert "docs: agent editor comments describe runs as the caller"
This reverts commit d94919c9fe.
* Revert "refactor: agents run as the caller, with a note on what a shared one needs"
This reverts commit 0748a2fb51.
* fix: a run as an identity continues only the caller's own conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: an agent run as its identity takes only attachments its caller may read
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: the resource editor keeps an agent's identity on an admin's save
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: regenerate workspace tool schemas for preserve_on_behalf_of
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: the rust client sets preserve_on_behalf_of on resource writes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: agents run on behalf of their identity only when they opt in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: an agent holds an identity only while it runs on behalf of it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: reduce the agent identity migration to clearing untrusted keys
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse decoded variable references in inputs to an agent run as its identity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: user renames and offboarding re-point an agent's identity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse model-written tool arguments that the tool's job would interpolate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: agent on-behalf-of migration after main's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: the agent identity migration also clears trashed agents
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: share AI sessions read-only by link, optionally public
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: render shared session snapshots from an allowlist, without mermaid or remote images
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* style: make the session share button icon-only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: safe reasoning links, artifact list and full-load exits on shared sessions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: resolve canceled jobs and batch re-run them in limited batches
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: offer the re-run batch limit only for failed or canceled filters
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: label an unresolved canceled run as canceled in its status badge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: tell the user that sources a batch could not re-run block the next batch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: warn when a re-run batch includes resolved runs and offer to hide them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: say in the re-run confirmation that failed or canceled sources get resolved
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: grant raw app SDK tokens identity access without a toggle
* test: pin the implicit identity scope on raw app SDK tokens
* refactor: let raw app SDK tokens reach whoami at the route check
* feat: operators get AI sessions
`prefersSessionHandoff` stops taking the role, so every AI entry point an operator
can reach — Ask AI, the home composer, Open in session, the flow editor's hand-off,
the raw-app template picker — opens a session for them like anyone else. The
sessions page drops its refusal, and the layout stops keeping them on the docked
chat.
In the sidebar they now get the Workspace/AI Sessions switch and session mode, and
lose the Ask AI entry that stood in for them, since the pane behind it is no longer
the one they are sent to.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: operators get run-oriented examples in the home composer
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* docs: note builder_flows in the operator composer examples comment
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: gate session tools and editors on operator rights
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: keep operator AI sessions behind a browser opt-in
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep flows refused in the prompt for operators without builder rights
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: decide every frontend edit check through one editRights module
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: let admins who are also operators open session editors, as drafts.rs does
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: let operators with manage rights save schedule and trigger drafts
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep rebase_draft from operators who can only draft schedules and triggers
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: let operators save resource and variable drafts
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: name deploy and delete tools only where a kind is left to act on
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: list an operator's draft-only resources and variables while they may draft them
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* perf: drive schedule already-exists check from v2_job_queue
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf: index v2_job_queue by workspace and scheduled_for
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: iterate workspace picker nav items without spreading a NodeList
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: let raw app backend runnables import each other
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: preview only imported sibling runnables and reserve the main id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: resolve a module's workspace imports from the entrypoint's folder
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: scope run-mode app scripts to their app and key bundles on module imports
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: clone app_version_lite into forks with remapped app_script ids
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: update the run-mode raw_code comment for app-scoped ids
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: run module-bearing app scripts only from the deployed version
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: run deployed inline code only through the deployed version's rows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: in-workspace app viewers run through the deployed rows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let the app embed token read the app's lite value
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: pass sibling modules to the agent-worker Python preview resolver
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: list the lite route in the app embed scope comment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 455f98540fb042d4f624dcec681dab88b2c8df22
This commit updates the EE repository reference after PR #883 was merged in windmill-ee-private.
Previous ee-repo-ref: 927d3592a6b2127ffe16fb14eb47f5bd66afc026
New ee-repo-ref: 455f98540fb042d4f624dcec681dab88b2c8df22
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: run script and flow previews on behalf of another user
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse operators and detect servers that drop preview on_behalf_of
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: editor previews run as the configured on_behalf_of identity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: probe before submitting, keep step and viewer data identity in previews
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: never let a job token request viewer data access on a preview
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: open impersonated preview logs with who they run as and who asked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: allow early return on steps inside a branch to one
The "Early return for sync webhooks" flow setting could only point at a
top-level step. It can now also point at a step inside a branch to one,
in any branch including the default one, and through nested branches to
one.
When the branch is taken, the sync call returns that step's result as
soon as it completes while the rest of the flow keeps running. When it
is not taken, the call returns the flow's final result. The sync wait
loops already resolved nested steps and fell back to the final result,
so they are unchanged.
Worker: check_if_early_return_or_last_in_early_return_parent now
accepts a job whose step id matches early_return at any depth, as long
as every job between it and the root is a branch to one. A loop
iteration or a subflow reusing the same id does not take the stream.
The existing case, the last step of a branch to one that is itself the
early-return step, is unchanged.
Frontend: the native <select> is replaced by EarlyReturnPicker, a
searchable list in flow order where each nested step shows its path
(e.g. `a › Branch 1`). Branch to all and loops inside a branch to one,
and the steps inside them, are not offered: the results lookup cannot
resolve them when nested. Picking a nested step shows a hint that it
only runs if its branch is taken.
* fix: stream the last step when the early return branch is not taken
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the stream off the last step once the early return step ran
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: list early return steps by id only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: use the standard select for the early return step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: match the early return step by its flow scope, not its path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep branch to all and loop steps off the early return stream
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: allow early return on steps inside a branch to all
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: resolve a nested branch to all or loop as the early return step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: pin which step streams for an early return inside branches
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: return an empty nested loop or branch to all as its early return list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* revert: read an empty container's early return status from the root
An empty nested loop or branch to all falls back to the flow's final result again,
so an empty top-level loop that failed keeps its real status.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: stefan <stefan.radovanovic@ip-paris.fr>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: operators get AI sessions
`prefersSessionHandoff` stops taking the role, so every AI entry point an operator
can reach — Ask AI, the home composer, Open in session, the flow editor's hand-off,
the raw-app template picker — opens a session for them like anyone else. The
sessions page drops its refusal, and the layout stops keeping them on the docked
chat.
In the sidebar they now get the Workspace/AI Sessions switch and session mode, and
lose the Ask AI entry that stood in for them, since the pane behind it is no longer
the one they are sent to.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: operators get run-oriented examples in the home composer
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* docs: note builder_flows in the operator composer examples comment
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: gate session tools and editors on operator rights
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: keep operator AI sessions behind a browser opt-in
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep flows refused in the prompt for operators without builder rights
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: decide every frontend edit check through one editRights module
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: let admins who are also operators open session editors, as drafts.rs does
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: let operators with manage rights save schedule and trigger drafts
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep rebase_draft from operators who can only draft schedules and triggers
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: list operators' schedule and trigger drafts under their draft rights
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* docs: say which drafts write_draft gates now that schedules and triggers have their own
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: read and change workspace settings from ai sessions and mcp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: cover wmill workspace settings commands in the settings guidance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: say unknown settings keys are warned and ee-only ones refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: cover datatable_permissions and protection_rules in the settings guidance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add the workspace settings document, applied server-side
* feat: add wmill workspace get-settings and apply-settings
* fix: warn on unknown settings keys and refuse ee-only ones in the dry run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: stub the settings document endpoint in the push settings unit tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse mistyped settings and keep 4xx status on a partial settings apply
Reject non-boolean switches and non-string Slack credentials instead of
coercing them into destructive writes, preserve the failing endpoint's
status when wrapping a partial-apply error, keep the stored Slack secret
when an older CLI pushes one encrypted under another workspace's key,
print the plan's warnings in apply-settings, and state the admin check
load_settings_document leaves to its caller.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: compare handler arguments verbatim and type-check scalar settings
A handler's extra_args is stored as sent and its nulls reach the job as
arguments, so an added or removed null argument is now a change. Scalar
settings are type-checked in the plan so a dry run never reports a change
the endpoint then refuses, and an error handler's omitted mute flags
compare as the false the endpoint stores.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: require a 32-bit integer rate limit in the settings plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: data table permissions and protection rules in the settings document
The settings document gains datatable_permissions, each data table's roles
named by their Postgres role name and written by catalog id, and
protection_rules, keyed by rule name. Both are managed only when stated and
stated as a whole. The dev workspace lock stays with the dev workspace
setting.
wmill sync carries datatable_permissions only with includeDatatablePermissions
(or --include-datatable-permissions), since tenants and roles are specific to
a workspace and an instance. protection_rules stay out of settings.yaml:
protection-rules.yaml syncs them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: validate the default data table role and plan permissions against a replaced datatable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: scope data table migrations to the schemas they declare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep unschemed objects and unqualified sql out of per-schema scopes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: order snapshot prerequisites and widen scopes to what they reference
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: point ee-repo-ref at the migration_scope allowlist entry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: infer scopes only from generated ddl and snapshot every user object
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: snapshot every schema from one exported snapshot, infer only unedited sql
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: keep the initial snapshot whole-database and scopes author-declared
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: warn before an out-of-order run when applied status is unknown
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 57f4b973e2369f54a89817ff23dc44047ba7b9e4
This commit updates the EE repository reference after PR #880 was merged in windmill-ee-private.
Previous ee-repo-ref: abb876d6234d5dfe7c644fdf12cf55f7bc1db1cc
New ee-repo-ref: 57f4b973e2369f54a89817ff23dc44047ba7b9e4
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: show a raw app's document.title in the page tab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: drop unrelated formatting changes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: restore the page title only while the tab shows the app's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: connect a data table as the job's own identity unless the runnable opts into its viewer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: key cached results by the data table mode and keep the flag across ai edits
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: hash the cache key's mode and viewer as fixed fields so no argument name can forge them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 2f74548ad1ec50c8e1faf17e42d5648160e833f1
This commit updates the EE repository reference after PR #878 was merged in windmill-ee-private.
Previous ee-repo-ref: 4ad768a777fff9f1ecc86a2803bc27d80f8242d6
New ee-repo-ref: 2f74548ad1ec50c8e1faf17e42d5648160e833f1
Automated by sync-ee-ref workflow.
* feat: rename the flag to viewer_data_access and apply it to object storage permission rules
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: describe viewer_data_access as covering object storage rules too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 0ffb633473c5465513576afc6f54d18f93c7f1e1
This commit updates the EE repository reference after PR #879 was merged in windmill-ee-private.
Previous ee-repo-ref: e9e06a9eb94168f46b378276b01fa0117dc7d8ed
New ee-repo-ref: 0ffb633473c5465513576afc6f54d18f93c7f1e1
Automated by sync-ee-ref workflow.
* feat: show the viewer data access control as an icon button
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* fix: encrypt ai session backups with aes-256-gcm
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* test: cover ai session backups written with aes-256-gcm
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: name the release ai session readers ship in
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: hold ai session gcm writes until old servers are rolled out
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: show the email handler's SMTP status to non-superadmin workspace admins
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the SMTP status check out of the not-configured warning
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: widen variable.value only once every process can recover from it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: wait out the previous release's servers before widening variable.value
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: write a v2 secret too long for the narrow column in cbc until it is widened
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: pin the default python version of an instance at initialization
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: detect a new instance from the schema it created, not from its age
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: record the python baseline on the migration connection
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: record the instance python version in the setting itself
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: start new instances on python 3.15
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the forced python version ahead of the stored one when a worker reads it late
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: start new instances on python 3.14 rather than 3.15
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: start new instances on python 3.13
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 06610ecc950ed64a2709d7f1aa8c7b49a95fdbae
This commit updates the EE repository reference after PR #869 was merged in windmill-ee-private.
Previous ee-repo-ref: 599eae0034b34c5e0d3d42df37cf18bbe01f9b49
New ee-repo-ref: 06610ecc950ed64a2709d7f1aa8c7b49a95fdbae
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* fix(cli): count superadmins as able to preserve ownership on push
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BzU9zd53JsTShCsbKzYzB
* fix: resolve variables in the url and headers of an mcp resource
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep resolved mcp secrets out of header warnings and userinfo urls
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the url from mcp client errors before rmcp logs them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: run rmcp's reqwest client without a log subscriber
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: scrub the request target from mcp error bodies
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop server error bodies from mcp transport errors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: fail closed when an mcp error message has no status prefix
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: recheck app read access on every publisher-mode component run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: pin that app read grants and revocations apply to the next run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: cache only app permit grants, for 60s, instead of rechecking every run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>