The change-versions job on the release PR failed to push after the branch
was deleted on merge, so v1.848.0 shipped with only version.txt bumped.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: run a workspace handler when a secret variable expires
Secret variables gain an optional `value_expires_at`, and a workspace can point
at a script or flow to run once that date passes, so a rotation is driven by the
platform instead of tracked out of band.
The secret never leaves the database. The sweep selects the path, description and
expiry and nothing else, so the handler is given a reference to rotate rather than
a value to handle. Job results are stored in cleartext and shown in Runs, which is
what makes that a boundary rather than a preference; a test asserts the job's args
never contain the value.
Each row is claimed by writing `expiration_dispatched_for` in the same transaction
as the push, so a failed push un-claims it and a lost race claims nothing. Moving
the date re-arms the row; re-saving the same date does not. A pass takes at most
100 rows under a transaction-scoped advisory lock, and orders so that one broken
workspace cannot starve the rest.
Dispatch runs as `g/variable_expiration_handler`, exempt from the CE group limit
and from non-premium exec metering the way the error and schedule handlers already
are. A handler that keeps failing backs off and raises a critical alert instead of
retrying every pass, and the back-off ends when the handler is repointed.
The expiry travels with the variable through workspace clone, tarball export and
workspace comparison. The dispatch marker deliberately does not, so a fork re-arms
on its own copy.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(frontend): expose variable value expiration in the UI
The variable drawer takes an optional expiry on a secret value, and the variables
list badges it, turning red once the date has passed. A workspace settings tab
picks the handler, its extra args, and whether variables under `u/` are skipped.
That mute flag is stored inside the handler setting, so the toggle stays disabled
until a handler is picked: saving it on its own would clear the setting it lives
in and still report success.
The expiry is carried as a tri-state through the draft deploy and copilot paths —
absent leaves the remote value alone, an explicit null clears it — so deploying a
draft cannot silently drop a date someone set elsewhere.
The settings tab names the one case where the configured identity does not apply:
a handler script carrying `on_behalf_of` runs as that user rather than as
`g/variable_expiration_handler`, which matters because the same tab asks the admin
to grant that group write access to the variables it rotates.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(cli): sync variable expiry and the workspace expiration handler
`wmill sync` carries `value_expires_at` on variables in both directions, and
pushes the workspace handler alongside the error and success handlers in the
grouped settings format. Dropping the key from a variable's yaml clears the
remote expiry, so the file stays canonical rather than accumulating fields that
can only ever be added.
The handler follows the same rule, with the caveat recorded where the type is
declared: an omitted handler only reaches the clear when some other setting
differs, because the push short-circuits on a comparison that walks the local
object's keys and so never sees a missing one. That gate is shared with the two
existing handlers and is left as it is here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): open the variable expiration handler template in a new tab
The "Create a handler" button hands its script template to /scripts/add through
the URL hash, which `load` reads from `window.location`. A client-side navigation
leaves the previous page's hash in place, so the payload was dropped and the
editor opened on the default template at a `u/` path. `target="_blank"` forces a
full page load, matching the success handler's "Create from template" button.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): make the variable expiry field state its own status
The expiry field rendered a DateTimeInput whose time defaults to 12:00 when it
holds no value, so a variable with no expiry looked like one already configured,
and "cleared" looked identical to "never set". Setting an expiry is optional, so
the field has to say which it is.
Rebuild it on the shape ScriptAdvancedSettings already uses for Timeout, Cache and
Concurrency limits: a toggle whose checked state is the stored value being present,
seeding a date on enable rather than revealing an empty picker, with the input
under its own label. Drop `clearable` with it, so the toggle is the single way to
mean "no expiry" instead of competing with an X.
Stop the surrounding copy promising a run that may not happen. A handler is only
dispatched if the workspace has one configured and does not skip u/ paths, so the
list tooltip now states the date alone, and the form hedges both conditions,
naming the u/ mute only on personal paths where it can apply.
Also anchor the mute toggle's tooltip: Popover's trigger is a span around a
block-level label, which stretched to the full width of its SettingCard and left
the popup floating beside the card rather than under the control.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(rust-client): initialize value_expires_at in the variable models
The generated `CreateVariable` / `EditVariable` structs gain the field from
openapi.yaml, and client.rs builds both with exhaustive literals.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(frontend): drop extra_args when the variable expiration handler is cleared
Clearing the handler nulls the whole setting server-side, extra_args included,
but the tab kept its loaded copy. A handler picked afterwards without reloading
was persisted with the cleared one's arguments, which the tab does not display.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: back the variable expiration handler's built-in Slack and Teams destinations
Backfills the Slack bot token grant for g/variable_expiration_handler, mirroring
20231016142659 for g/error_handler: the slack_bot folder's extra_perms is written
once at Slack connect and never refreshed, and disconnecting leaves the folder
behind, so workspaces that already connected Slack cannot pick the grant up from
the creation-time list alone.
Adds run_variable_expiration_test_job so an admin can exercise the handler on
demand rather than waiting for a real expiry, which may be months away. It goes
through push_variable_expiration_handler so the test run proves what matters:
the handler resolves, and the group can read what it needs, under the same
identity and argument shape the sweep uses.
Also covers extra_args on the edit endpoint, which the settings tab now writes
for the built-ins' channel. The endpoint rebuilds the setting from the request,
so an omitted extra_args erases it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* feat(frontend): offer Slack and Teams as variable expiration handlers
Gives the variable expiration tab the same no-code destinations the workspace
error handler has, so "tell #ops before this credential expires" no longer
requires writing a script.
A sibling component rather than a fourth mode of ErrorOrRecoveryHandler: that
one is shared with the workspace error handler and the three schedule handlers,
and its stripped-args list, hub path suffixes and Email tab are all
error-shaped. This reuses the pieces that are already generic
(SlackConnectionStatus, TeamsConnectionStatus, ChannelSelector, ScriptPicker,
SchemaForm) and leaves those five call sites untouched.
extra_args stops being an API/CLI-only escape hatch now that the built-ins write
their channel into it, so it joins the unsaved-changes comparison and the
discard path, normalised through the existing helper that drops the two
auto-managed keys.
The two hub ids are placeholders until the scripts are pushed to the hub.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* fix(frontend): scope the handler identity notice to the chosen destination
The notice told every admin to grant g/variable_expiration_handler write access
to the variables it rotates. That is right for a custom handler and wrong for
the built-ins, which only post a message and are granted the Slack bot token by
migration. Following it for a Slack handler would hand a group write access to
the workspace's secrets for no reason.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* feat(frontend): flag the Slack and Teams handlers as EE
Connecting a workspace to Slack or Teams is EE-only (oauth2_oss.rs returns
"Slack only available on enterprise"), so on CE those two tabs can never be
completed. Says so up front, the way the error/success handler tab does,
instead of leaving the user at a "not connected" badge with no working path.
Only on those two tabs: a custom script or flow handler is CE.
Drops the "Connect Slack first" alert, now that the banner and the connection
badge above it already say it twice.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* chore(backend): regenerate the sqlx cache after the merge
The merged workspace_settings column list in change_workspace_id is a new
query text, so it needs a new cached entry. Drops the two pre-merge entries
it supersedes; both had been left with conflict markers by the merge, since
rename/rename markers are eight characters and escape the usual scan.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* fix(cli): narrow the expiry-clear check to a variable that exists remotely
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Do7wJTnL6MG6ngFpCGW4DG
* feat(frontend): point the built-in handlers at their published hub scripts
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* chore(backend): regenerate the sqlx cache after the merge
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(frontend): disable the Slack and Teams handler controls without a license
Matches the workspace error handler, which greys out its built-in destinations
and hides the test button on an unlicensed instance. The custom destination stays
editable: unlike the error handler, the variable expiration handler itself is not
an EE feature.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: record which destination a variable expiration handler uses
handler_configured now counts slack, teams, custom or cleared instead of
set or cleared, so usage shows whether the built-in destinations are picked.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(frontend): let the variable expiration handler template run on any worker
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: guard the variable expiration test endpoint and correct its help text
* fix: reuse the error handler's slack arg and built-in path helpers
* docs: trim variable expiration sweep and backfill comments
* feat: put the variable value expiration under an advanced section
* fix: restrict the expiration test job to built-ins and keep expiry on conflict reload
* fix: link the expiry hint to the variable's workspace and document built-in test paths
* fix: give the expiration sweep its own lock id and reuse double_option
* fix: pin the variable expiration presets so the hub-paths test accepts them
* feat: let the variable expiration handler set how far ahead it runs
* fix: give the notify before expiry setting its own card
* feat: remind the variable expiration handler at a set interval
* fix: tighten the gap between the Slack channel field and its test button
* feat: refuse a value expiry on variables linked to an OAuth account
* refactor: reuse the shared handler form for variable expiration
* refactor: sweep expiring variables round-robin and check the handler exists
* chore: trim comments to the constraints they record
* fix: compare expiry dates by moment when deploying a variable draft
* refactor: rename value_expires_at to value_valid_until
* fix: neutralize variable fields in expiration handler args
* fix: reserve the variable_expiration_handler group name for admins
* fix: send first expiry notices before reminders
* test: pin that a handler failing to start leaves its rows unclaimed
* chore: say any hub handler path skips the existence check
* fix: empty a pre-existing handler group before granting it the Slack token
* docs: correct the registered feature usage counts
* fix: let a workspace whose handler failed to start sit out for an hour
* fix: send first notices before reminders across workspaces
* fix: end a failed handler's wait as soon as it is redeployed
* fix: show an expiry-only variable change in the AI fork diff
* chore: regenerate workspace tool schemas
* test: keep one variable expiration guard per behavior
* fix: use the renamed hub expiration handlers and template
* feat: carry the variable expiry in windmill-utils-internal 1.8.4
* fix: keep the variable expiry through MCP drafts
* chore: bump windmill-utils-internal to 1.8.4
* fix: keep the variable expiry through mcp deploys
* fix: disable saving a slack or teams expiry handler without ee
* fix: skip the failure mark when the expiry handler was saved mid-sweep
* fix: count expiry telemetry only where the expiry changed
* test: assert the exact variable expiry in export and cli push tests
* fix: stamp an expiry handler failure with the pass's read time
* fix: wait for a pending handler lock instead of marking it failed
* test: isolate expiry handler tests from the deployed-script cache
* fix: retry a failing expiry handler every pass instead of waiting an hour
* chore: update ee-repo-ref to b6e23d229966cf0019c0a1926a254fda658d8def
This commit updates the EE repository reference after PR #744 was merged in windmill-ee-private.
Previous ee-repo-ref: c52c06d145b13a6fb04459e85ca5818bf3c1bff4
New ee-repo-ref: b6e23d229966cf0019c0a1926a254fda658d8def
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: hugocasa <hugo@casademont.ch>
* feat: fill docusign account_id and base_uri on connect
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: fill salesforce and quickbooks connect fields through connect_fields
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: note connect_fields source trust and pin sandbox inheritance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 5517ff637a675aee66d4e417d3f37266045f0e0c
This commit updates the EE repository reference after PR #913 was merged in windmill-ee-private.
Previous ee-repo-ref: ba98803b236f018ed45199344f744ea1387afe2d
New ee-repo-ref: 5517ff637a675aee66d4e417d3f37266045f0e0c
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>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
* fix: change an app's access mode under the deploy row lock
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: defer a mode change to deploy on an app run as another user
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: hold the access toggle while its change is in flight
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* revert: leave the deploy panel's access toggle to the settings drawer PR
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep the caller's draft on a mode-only app update
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: refuse a builder's mode-only change on an unsandboxed app
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: make the autoscaling Test scaling button run the integration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: bump ee ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: bound the test scaling worker input at zero
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to a2a23aebcf91985778fb632a415a6990d022f7c8
This commit updates the EE repository reference after PR #917 was merged in windmill-ee-private.
Previous ee-repo-ref: c9e8c8853e2042a11797e322e1e4bb4be241380c
New ee-repo-ref: a2a23aebcf91985778fb632a415a6990d022f7c8
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(chat-sdk): chat through a raw app's backend runnable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(chat-sdk): finish a lost stream and wait out a stopped turn in streamChatTurn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(chat-sdk): show the answer when a stream is lost before a tool call
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(chat-sdk): send attachments through the raw app runnable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(chat-sdk): point sandboxed attachments at the runnable section
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: agent runnables for raw apps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: build agent runnables without the parquet feature, cache the agent check query
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: address review nits on the agent picker and the CLI schema doc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: run an agent runnable once when it is given no memory_id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: accept previous_messages on agent runs, read-checking the files it quotes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: refuse an anonymous agent turn while one with the same memory still runs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: show the agent's settings in the raw-app runnable panel, size its button like the row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: offer an agent runnable memory_id or previous_messages after the agent's memory
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: take previous_messages in a memory-off agent's run form, type agent attachments as s3object
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: file an anonymous agent turn as a conversation, so its memory is collected and its turns serialized
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: own anonymous agent conversations under a fixed name that fits created_by
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: own anonymous agent conversations as anonymous and keep them out of conversation lists
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: point file_chat_turn at the anonymous conversation owner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: title the runnable picker after what it lists, in sentence case
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: start a chat with local history listing its stored conversations
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: chat through a raw app's agent runnable with { wmill, runnable }
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: key an agent runnable chat's local history by its app as well
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: address review findings on agent runnables
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: offer memory_id to an agent runnable over an older auto memory
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop inherited static inputs from an agent runnable, show the memory-off note only when it is off
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: only let an oauth account's creator or readers link it to a variable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop an oauth account link the caller may not hold instead of failing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover relinking an oauth account through a variable update
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover a permitted relink through a variable update
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep an oauth account's creator in step with the user's username
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: follow a non-member superadmin's instance username on the OAuth accounts they created
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: link a variable to its OAuth account only in the connect flow
The variable endpoints no longer take an account link from the caller. The connect
flows create the token variable first and pass its path to create_account, which
links it server-side. This replaces the creator check and the created_by
bookkeeping, along with both migrations.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: keep the MCP secret variable test's formatting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: link the account to the token variable AppConnect created, even if the path is edited mid-save
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: stop exporting the OAuth account a variable links, and regenerate the chat tool schema
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: pin the EE refresh and linking checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: delete AppConnect's token variable when linking its account fails, so Save can be retried
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the resource AppConnect fills when linking its account fails
Deleting a variable also deletes the resource at its path, so the rollback
is skipped when filling an existing resource.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: create an OAuth token variable and its account in one request
createAccount takes the variable and the store creates both in one
transaction, so a connect is either fully saved or not at all. The connect
flows make that single call instead of creating the variable and linking it
afterwards.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: stop listing the ignored account input in the chat's write_variable instructions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: drop the account visibility helper the oauth refresh route no longer uses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: let native triggers act through per-user or shared connections
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: bind native trigger oauth state to its user and follow connection renames
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: authorize oauth account links and scope native trigger disconnects
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: order the native trigger connection migration after account ownership
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: delete only the scope-checked triggers when disconnecting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: skip triggers moved since their scope check when disconnecting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: scope-check the connection path when connecting, keep a connection still in use
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: key token write-back by account and serialize trigger creation with disconnect
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: let an admin share one native trigger connection with the whole workspace
Members can use the shared connection without reading its token. It reuses
workspace_integrations.resource_path, so existing workspace connections stay
usable by members after upgrading.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: pick the workspace connection like other workspace resources, connect and disconnect from the picker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: label the disconnect action in the connection picker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the own-account note from the workspace connection field
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let admins share any connection, serialize service removal with trigger creation
An admin can already read every connection, so restricting sharing to their own
added nothing. Removing a service now takes each connection's lock and keeps
everything if a trigger was created meanwhile.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: show each native trigger service's OAuth app status and keep removal apart
Remove now only appears with a workspace OAuth app, since a workspace using the
instance app has nothing of its own to remove.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: configure a native trigger service's OAuth app in a dialog
The card states once which OAuth app is in use, with a single Configure action,
and the form follows the design system.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop a stray brace from the OAuth app dialog binding
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: lead the OAuth app row with which app is in use, with a link to change it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: compact the native trigger service card
Edit and Remove sit on the workspace OAuth app row, and the workspace connection
reads as part of the same section.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: show the OAuth app status in each native trigger card's header
App actions move into a menu, the card body holds only the shared account, and
service descriptions name what fires the trigger.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: say who configured each native trigger service, and name removal for what it removes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: say what members can do with each native trigger service, keep the shared account optional
Nextcloud, whose webhooks need an admin account, offers connecting and sharing one
directly instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: pick the shared account with an inline select, and keep Nextcloud's own-account path in its wording
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: one status line per native trigger service, a Nextcloud admin hint, and clearer refusals
The shared account is a regular form field, Nextcloud shows an alert while no
admin account is shared, a non-admin Nextcloud account gets a message saying why
it cannot create triggers, and the OAuth dialog only accepts a full server URL.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: point native trigger error hints at the account picker and the shared account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: say members can browse what a shared native trigger account can access
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: make the OAuth app dialog's open prop required
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep pre-connection triggers working, and guard reconnects and service removal
- The migration recovers a service's connection when the workspace row lost its path,
which saving the OAuth app or an abandoned instance connect used to do.
- A trigger created without a connection uses the shared account, as older clients and
trigger specs expect.
- Only whoever connected a path, or an admin, may reconnect over it.
- Removing a service or sharing an account checks a path-scoped token against what it touches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: connect native trigger accounts at a chosen path through the resource drawer, and reconnect from the picker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: date the native trigger connection migration after main's newest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: say a disconnect deletes the triggers other members created on the account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: offer Reconnect next to an existing trigger's account and point the refresh hints at it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: date the native trigger connection migration after main's newest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to da49c12e3006fc77de789277f1462a4d8d7d92ce
This commit updates the EE repository reference after PR #829 was merged in windmill-ee-private.
Previous ee-repo-ref: 58681a2e7eafb5689ed739cd2560fa0f5d82c3dc
New ee-repo-ref: da49c12e3006fc77de789277f1462a4d8d7d92ce
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: only let an oauth account's creator or readers link it to a variable
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop an oauth account link the caller may not hold instead of failing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover relinking an oauth account through a variable update
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover a permitted relink through a variable update
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep an oauth account's creator in step with the user's username
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: follow a non-member superadmin's instance username on the OAuth accounts they created
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: link a variable to its OAuth account only in the connect flow
The variable endpoints no longer take an account link from the caller. The connect
flows create the token variable first and pass its path to create_account, which
links it server-side. This replaces the creator check and the created_by
bookkeeping, along with both migrations.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: keep the MCP secret variable test's formatting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: link the account to the token variable AppConnect created, even if the path is edited mid-save
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: stop exporting the OAuth account a variable links, and regenerate the chat tool schema
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: pin the EE refresh and linking checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: delete AppConnect's token variable when linking its account fails, so Save can be retried
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the resource AppConnect fills when linking its account fails
Deleting a variable also deletes the resource at its path, so the rollback
is skipped when filling an existing resource.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: create an OAuth token variable and its account in one request
createAccount takes the variable and the store creates both in one
transaction, so a connect is either fully saved or not at all. The connect
flows make that single call instead of creating the variable and linking it
afterwards.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: stop listing the ignored account input in the chat's write_variable instructions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: drop the account visibility helper the oauth refresh route no longer uses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to da49c12e3006fc77de789277f1462a4d8d7d92ce
This commit updates the EE repository reference after PR #829 was merged in windmill-ee-private.
Previous ee-repo-ref: 58681a2e7eafb5689ed739cd2560fa0f5d82c3dc
New ee-repo-ref: da49c12e3006fc77de789277f1462a4d8d7d92ce
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: let Slack agents answer through a workspace's own Slack app, with signing secrets set from the UI
The instance Slack app's signing secret can be set in its OAuth setting as well as
SLACK_SIGNING_SECRET, and a workspace's own Slack app takes its own in the workspace
settings. Each secret only vouches for the workspaces connected through its app, so
/windmill keeps working for a workspace whose app has none set.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep Slack signing secrets out of logs and verify an own app without a secret with the instance's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: report a workspace app's own signing secret in the Slack agents status
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: check Slack approval callbacks against the instance signing secret only
An approval can be sent through any Slack resource, so the team's workspace
connections do not tell which app signed its callback.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: share the Slack app setup instructions and require the signing secret for agents
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: tidy the Slack signing secret copy and show a set secret as masked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: check a workspace app only against its own signing secret, and approvals against their workspace's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: accept a Slack approval signed by the workspace's app or the instance's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: check Slack's signature on approvals only when sent through the workspace's Slack connection
Any other Slack resource may belong to any Slack app, so its callbacks rest
on the payload HMAC alone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: address review findings on Slack signature checks and the signing secret field
- reject Slack signatures older than five minutes, so a captured request cannot be replayed
- let a reachable workspace's command script take a message before another workspace's help reply
- remove a saved workspace signing secret from its field: the button reads Remove when it is empty
- set the signing secret on connect only when one was entered
- tell non-admins who can set the signing secret
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep SLACK_SIGNING_SECRET for workspace apps without a secret, and route a verified request only to its workspaces
- a workspace on its own app with no secret of its own is checked against SLACK_SIGNING_SECRET,
which may hold that app's secret from before workspaces had one; the instance setting's secret
still never applies to it
- once a secret verifies a request, only the workspaces it verified take it, command scripts
included: it proves which app sent the request
- compute the replay window with abs_diff, which cannot overflow
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to c8d562aa9d75a7e99bf0ecd1ac224f532452a07e
This commit updates the EE repository reference after PR #907 was merged in windmill-ee-private.
Previous ee-repo-ref: 0864b0ab943defa8b8d55838ef09ab7dacfac17f
New ee-repo-ref: c8d562aa9d75a7e99bf0ecd1ac224f532452a07e
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: configurable workspace roles with per-workspace overrides
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: close role review gaps in pickers, declarative sync and removal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: keep resolve_role_name doc on its function
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: validate overrides on instance role changes and bill admins fully
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: allow pipeline drafts and keep role checks on one connection
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: list data pipelines in operator_can_draft
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: expect a 403 role refusal when an operator resolves jobs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: require a valid license for custom workspace roles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: freeze workspace roles when the license lapses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: pin the ee companion for workspace roles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: broadcast role override changes from the write path, not a trigger
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to b5294d38db082bdd104d5358a47695390694c05d
This commit updates the EE repository reference after PR #891 was merged in windmill-ee-private.
Previous ee-repo-ref: 688e00c5982865b14098f530d54280e2311994c0
New ee-repo-ref: b5294d38db082bdd104d5358a47695390694c05d
Automated by sync-ee-ref workflow.
* fix: let an admin row that kept the operator flag hold full rights everywhere
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: treat superadmin members as admins and return role names from get user
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: let AI agents answer in Slack
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: dedupe Slack deliveries by message and route only connected workspaces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: key Slack conversations with the workspace secret and require signed Slack requests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep a named agent on its thread after an empty question and flag a missing Slack signing secret
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: register the slack_agents token scope domain
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: name the Slack bot, offer Slack only for chat agents, align the agent API tab with webhooks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: warn when Slack can't be reached instead of showing a placeholder bot name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: chat SDK, streaming examples and a copyable integration prompt on the agent API tab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the base path in the chat SDK example, list slack_agents token scopes, bound the bot name lookup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: opt into the AI agent Slack scopes at connect, store the signing secret in instance settings, surface the integration prompt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: dispatch Slack agents only on a verified request, warn when the connection lacks the agent scopes, register the callback redirect URLs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: point the agent chat examples at @windmill-labs/chat-sdk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: build the agent API examples on the configured API base URL
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: say that a channel's default agent takes its /windmill commands
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: list the channels answered by an agent in the workspace Slack settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: keep the Slack signing secret in SLACK_SIGNING_SECRET, warn at connect when it is missing, move the integration prompt to a tab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: wrap copyable code blocks at word boundaries
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: open the agent panel on its API tab, put the AI prompt first, list channels like the critical alert channels, cap the manifest's height
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: group the agent API examples by AI prompt, TypeScript and HTTP, with React and framework-free chat SDK examples
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: have the agent integration prompt read the token from WINDMILL_TOKEN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: trim the agent API tab intro, name the Slack app in mentions, define the SDK example's output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: share agents in selected Slack channels, run as their identity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: share agents in Slack channels with anyone or workspace members only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: set who can ask an agent in Slack and its channels from its settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: treat a missing Slack audience as workspace members
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: list Slack channels before who can ask, name the run-as user in each choice
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: name the next deploy's run-as user in Slack choices, turn agents on by default when connecting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: answer agents on mentions only, group agent settings into sections
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: show how to ask an agent in Slack first, keep agent scopes opt-in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: list agents shared in Slack in a setting card and table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 10bc314c95094c0851743cbca31b50a3b37d42fd
This commit updates the EE repository reference after PR #865 was merged in windmill-ee-private.
Previous ee-repo-ref: 47d8fbac461171bd93d888b49cc1c7730a2b3f96
New ee-repo-ref: 10bc314c95094c0851743cbca31b50a3b37d42fd
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
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>
* 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>
* 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
* 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: 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>
* 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>
* feat: data table migration tools and role guidance in ai sessions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: shared data table guidance and safer migration tool failures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep a migration that fails to apply and let the session rewrite it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: rewrite only a pending migration and qualify fork isolation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: connect to a data table with every role of the job's viewer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: key a cached result by the run's recorded viewer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: pin the per-viewer cache key and fix a stale doc sentence
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: length-prefix the viewer in the result cache key
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: drop data table role set logins unused for 30 days
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: pin the ee ref with the set login sweep fixes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: pin the ee ref with the sweep retry fix
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: give the cache key test its own migrated database
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add the viewer's roles to a data table connection that names none
The default role of a data table under roles is now a floor: a connection
naming no role also holds the roles its viewer is a tenant of, unless the
default is admin. This replaces the explicit as=viewer option, which is
removed from the reference parser, the executors and both clients. The roles
drawer warns while the default is admin and confirms before removing the
default role.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: let a data table have no default role
A connection naming no role then holds its viewer's roles only and is
refused without any. The roles drawer offers the choice, states what an
unnamed connection gets for the current settings, says who gets admin while
it is the default, and notes who owns a table created over several roles.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: start a data table's roles with admin open to everyone
Turning roles on from the drawer seeded admin with no tenant, which refused
every non-admin member's job as soon as it was saved. It now starts open to
everyone, so the toggle changes nothing until the roles are edited, and the
drawer warns for as long as everyone can connect as admin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 40ab35596e6fcb82a4dfc56e186befb807f8e2af
This commit updates the EE repository reference after PR #873 was merged in windmill-ee-private.
Previous ee-repo-ref: a5def184a29fffab8ed42c70c5a7445b2b3cbe98
New ee-repo-ref: 40ab35596e6fcb82a4dfc56e186befb807f8e2af
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>