Commit Graph
15219 Commits
Author SHA1 Message Date
Ruben FiszelandClaude Opus 5.5 9a5ec223bc feat: workspace settings as one document, applied server-side (#11740)
* 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>
2026-10-14 12:35:08 +00:00
17fefcf777 fix: unify cron builder control sizes and widths (#11764)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2026-10-14 12:15:08 +00:00
GuilhemandClaude Opus 5.5 009482a677 feat: list the user's own forks first in fork pickers (#11762)
* feat: list the user's own forks first in fork pickers

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: indent nested fork dividers and order the session rail tree the same way

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 12:14:31 +00:00
Ruben FiszelandClaude Opus 5.5 1fab283cf9 let a legacy migration whose comment reads like a scope get a down (#11765)
* fix: let a legacy migration whose comment reads like a scope get a down

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: pin adding a down to a migration whose comment predates scopes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:47:21 +00:00
2410790c7e feat: scope data table migrations to the schemas they declare (#11756)
* 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>
2026-10-14 11:34:21 +00:00
Ruben Fiszel 49147827d6 fix: fork data tables sharing one database into a single copy (#11755)
* fix: give data tables forked from one database a single shared copy

* fix: key shared-copy cleanup by server as well as database name

* fix: refuse dropping a shared resource-backed copy another clone still uses
2026-10-14 10:53:00 +00:00
Ruben FiszelandClaude Opus 5.5 00a83f4d91 test: point the fork migrations test's DATABASE_URL at its own database (#11759)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:51:10 +00:00
Ruben FiszelandClaude Opus 5.5 0a34348500 ci: put the newest pg_dump first on PATH for backend tests (#11757)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:01:10 +00:00
hugocasaandClaude Opus 5.5 fe2571ea53 feat: list agents with runnables, let them be starred, and fill out their menu (#11651)
* feat: star agents and add runs, audit logs and copy path to their menu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

* fix: list an agent's runs as the previews they are

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

* feat: list agents in the merged runnables stream so they sort with everything else

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

* perf: index agent paths so the merged listing and owner counts skip other resources

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

* feat: find agents in the ctrl+k search

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

* feat: open an agent's version history from its menu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vo7HXMdgqXJhR7p8YyVgjB

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:59:01 +00:00
GuilhemandClaude Opus 5 998e6877c1 feat(sessions): run a deployed item from its own page, for the chat (#11468)
* feat(sessions): hand a deployed run to the item's own page

A deployed `run_script` / `run_flow` opened a form in the chat and started the
job itself. It now opens the item's deployed page in the preview panel, fills
the run form that is already there with the arguments it proposed, and the call
ends. The run is the reader's: they start it from the page they would have run
it from anyway.

**Why the tool stops owning the run.** What the tool could carry was arguments
and nothing else, so the page had to hide the controls it could not forward —
scheduling, tag override, invisible-to-owner — and "Schedule to run later" ran
immediately. It also ran HEAD whatever version the page was pinned to. Handing
the page over costs the model nothing it had: it never ran anything, it waited
for a reader to press Run. Now it says so and moves on; `get_run` is there when
it needs the outcome.

A TEST run is unchanged. It executes the draft being written, which the deployed
page does not show, so it keeps the chat's own form. So does the bypass posture,
which answers for a reader who has already consented and would leave nobody to
press Run. Plan mode is unaffected: its gate already sits before the form, so it
refuses before anything opens.

**On the page.** The arguments arrive narrowed against the deployed schema by
the tool that fetched it, and a note above the form says where they came from;
dismissing it drops the note and keeps the values. A chat flow has no run form —
its page is a conversation — so the proposed `user_message` goes into the
composer instead, for the reader to edit and send. The composer declines if they
were already typing.

**On the card.** The call settles as `Opened`, with the arguments it filled
under Inputs and no outcome pane: nothing ran, and a Result tab could only say
the run came back empty. The eye reopens the page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): address review round 1 on the deployed-run handover

- the chat-flow seed was latched before the composer existed, so a page opened
  fresh dropped the proposed message; the host's input is now reactive and the
  latch waits for an offer the composer actually took
- that offer carries the run's other arguments too: a chat flow's schema can
  declare more than user_message, and the message alone would have run on saved
  values or schema defaults
- the page takes its seeded arguments out of the runtime rather than reading
  them on every mount, so a later open of the same item is not re-seeded with
  an old turn's proposal
- the card said "Done" beside "Opened", asserting a completion nothing claims
- run_script / run_flow say what the call does in a session, and background /
  wait_seconds say they do not apply there
- restored runFormCancelled's doc comment, displaced by the new helper

Tests pin the three invariants the handover rests on: no job started, the model
told the run has NOT happened, and neither a test run nor the bypass posture
taking the branch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): tell a mounting composer apart from a busy one

The retry that waits for a chat flow's composer could not tell "not there
yet" from "the reader is writing": both read as a declined offer, so the
proposal stayed pending and would have landed in the box whenever the composer
next changed — words appearing long after they were proposed. `composerReady`
answers the first question on its own; past it the proposal is settled either
way, and a reader's draft is left alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): address review round 2 on the deployed-run handover

- a seed consumed into the viewer's own state carried no item key, so a tab
  re-pointed to another item got the first one's arguments pushed into its
  form, replacing its defaults, under a note crediting the agent for them
- the handover ran after a stopped turn: the tool reads the item's schema
  first, and a stop during that read settles the card, which the handover
  then overwrote with a form so the card read `Opened` and hid the stop.
  The manager owns the turn, so the check lives there and declining hands the
  call to requestRunArgs, whose own stop guard settles it
- the card kept the deployed schema in the persisted transcript although it
  never mounts a form
- a chat flow's non-message inputs now land whether or not the message does,
  and the result string no longer asserts a fill the chat branch may not have
  made
- the callback's `false` is documented by what actually causes it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): mint a chat flow's secret arguments before its run

A chat flow's inputs reach the job straight from the composer, with no RunForm
between them to turn a password-marked value into a reference as it is typed.
The handover put the proposed arguments there directly, so a literal secret was
stored in the job's arguments, readable by anyone who can read the run — the
form path had always minted it first. runFlowForChat now does, which covers the
reader's own typed inputs as well as a proposal's.

Also from round 2:
- a viewer pinned to an older version kept that pin when the handover merely
  focused it, so Run executed a version the arguments were not prepared against
- the proposal now decides every input the schema declares, including the ones
  it omits: merging let a value saved on an earlier visit ride along in a run
  the chat announced without it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): apply a run proposal once, not on every remount

The detail page remounts under its viewer whenever the item is deployed,
refreshed or pinned to a version, and came back with its own latch reset — so
the agent's proposal was pushed in again, over whatever the reader had typed
since, bringing back a note they had dismissed. The proposal was made once.

The viewer now holds it as pending until the page reports applying it, and says
separately whether to credit the agent: the note stands until dismissed, the
values land once.

Also from the CI round's nits:
- a pinned viewer the handover re-points is brought to the front, since the
  call is about to say the page is open
- offerMessage's doc described inputs it no longer carries; applyInputs owns
  them, deliberately unconditional on the message landing

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): show the panel on a pinned handover, keep the eye alive after a stop

Both regressions from the previous round's fixes.

Re-pointing a pinned viewer did neither of the things `open` does besides
re-targeting: a collapsed panel stayed collapsed while the call told the reader
the page was open.

The stop check sat on the method the card's eye calls too. The controller is
per-turn and stays aborted once stopped, so the eye went dead on every card in
a chat where any turn had been stopped. The tools now go through a guarded
variant; the reader's own way in carries no turn check, because reopening a
page they closed has nothing to do with a turn.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(sessions): put the run-form doc comments back on their functions

Inserting the two handover methods stranded handleRunFormSubmit's comment above
one of them, and the host hook's comment still named a tool path that no longer
reaches it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(sessions): run a deployed item from its own page, for the chat

The run card stays in the chat by default. Preview opens the item's deployed
page in the preview panel with the proposed arguments already filled, and Run
there hands them back to the parked tool call — so the chat still owns the job
and reports on its result.

A chat flow has no run form to fill: its page is a conversation, so the proposed
message goes into the composer and a strip above it says what was asked for.
Sending it runs the flow in that conversation, which settles the call with a
reason rather than a refusal — the card says "Handed off", not "Cancelled".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): hand the call back when the page cannot honour it

A page carries an adopted call only while it can run what the call asked for.

Picking a version broke that silently: the tool starts its job by path, so Run on
a page pinned to an older version ran the deployed one instead — the page said v1
and the job returned v3. The page now hands the call back when it is on a version,
and the card takes its form back, which is where the call can still be confirmed
as proposed.

Whether the call is still waiting is the manager's answer, not the adoption map's.
Reading it live covers the ends that reach no hook: a submit whose job never
started, because the server refused it or plan mode blocked it after the arguments
were handed over. Those left the page with a dead Run and no way out but the X.

The page's Run also has to clear what the card's clears before the form mints a
password into a workspace variable — plan mode, and a second press.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): bind a press on the page to the call it started against

A call stops being pending the instant Run is pressed, well before its job
exists. The page went back to running on its own in that gap, so a second press
there started a job the chat never heard about. A press now holds the call until
the job lands or the call settles.

A press also kept reading its runner across `processSecretArgs`: cancelling while
a password was being minted switched the press to the page's own runner, which
then started a job the reader had just cancelled. The runner is read once, when
the press begins.

A chat flow's message waits on that same round trip. It needs nothing from it,
but a composer filled ahead of the inputs can be sent ahead of them, and the run
would carry the inputs the proposal was meant to replace.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): tell the form when a submitted call will never get a job

A surface that confirmed a run waits for the job it was promised, and a refused
start is the one end it cannot see: the call is neither pending nor cancelled.
It was inferred from the call no longer being pending, which stopped working as
soon as a press had to outlive that — the page then waited forever, offering a
Run that reached nothing.

`markRunFormEnded` is the mirror of `markRunFormStarted`: the server refused the
job, a sensitive argument could not be stored, or plan mode blocked it after the
arguments were handed over.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): bind the page's async work to the call it started with

The page reads the call it is carrying from a derived, and every await on it
outlives that read: a call can settle and the next request for the same item be
adopted inside one `processSecretArgs` round trip. Read live on the far side,
the page would submit one request's arguments to another, decline a proposal the
reader had not been shown, or seed a composer over the one they were looking at.

Each of these now holds the call it began with. The form's own press holds its
guard too, so a replacement cannot have its latch released by the press before
it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(sessions): let the tab carry the call, and leave chat flows alone

The page that answers a parked run form was found by item, so anything on that
page could resolve the call and act on it: a version picked after the fact, a
press that outlived its call, a send in some other conversation. Each was fixed
where it surfaced, and the next one surfaced somewhere else.

The tab carries the call now, named in its url beside the version pin. Only the
tab opened for a call can answer it, and re-pointing that tab anywhere drops the
name, so a version picked on the page hands the call back with nothing to check
for it. The item-keyed map and the lifecycle hooks around it are gone.

A chat-enabled flow's page is a conversation with no run form, so it cannot
answer a call at all: Preview opens it to look at and the card keeps the run,
which is what the agent needs to report a result. That deletes the composer
seeding, the strip above it, and the "Handed off" outcome that existed only to
describe a run the agent never saw. Prefilling that composer is worth having on
its own and comes back in its own PR.

Running a deployed chat-enabled flow needs a memory id, which this path never
sent: the card's Run answered with a 400. Each such run now starts its own
conversation on the flow's page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): keep the page's promises and its edits when it holds a call

The dynamic-select helper runs its job when the field mounts, not when Run is
pressed, so a form relocated to the page ran one under plan mode — which the
card withholds for exactly that reason. The page owes the same promise while it
is standing in for a card.

Its form is a copy, so arguments typed there were dropped when the call went
back to the card: it then offered, and ran, what the page had opened with. The
call now carries them back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): take no writes on a relocated form under plan mode

A password field mints an ephemeral workspace variable as it is typed, so
withholding the dynamic-select helper was half the promise: the field itself has
to be unwritable. One flag now covers both, as the card's own form already did.

The hand-back is keyed on the call rather than on the object naming it, which is
rebuilt whenever the draft or the posture changes — its own write to that draft
is what would have re-run it. It also hands back only what its own form held: the
next call for this item re-points the same tab without remounting, and its
seeding can land first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): close the JSON route into a read-only run form

Disabling the fields left the other way in: arguments written as JSON reach the
same object, and a password set there is a plain literal until the schema field
mounts onto it — which mints it whether or not that field is disabled. The
editor's writes are refused while the form is read-only, and the toggle offering
it is not drawn.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(sessions): hand the form back on destroy rather than from an effect

Every way the page stops carrying a call and still holds edits destroys the
component: the tab closes, or its url changes and `loadKey` remounts it. So the
hand-back is a destroy hook, not a reaction to the call changing — which needed
a key and two `untrack`s to keep its own write from re-running it.

The call is the one this form was seeded for, captured where it is seeded. By
the time the hook runs the tab has already stopped naming it, so reading it then
would find nothing to hand back to.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(sessions): seed the run form as it is built, not after it mounts

The form takes what it opens holding as a prop, and the page renders it under
the call's id. A request arriving on a tab that is already open builds a new
form already filled, so there is no mounted instance to reach for and nothing to
wait on — which is all the seeding effect was doing.

That also settles where the hand-back reads its call: with no instance to track,
`onDestroy` reads the prop, which is still there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): hand back only what a form actually held

A tab closed while the deployed item was still being fetched handed the card an
empty object, wiping the proposal it was still parked on: the page registers its
destroy hook long before `RunForm` gives `args` a value.

The comment above it also claimed every way out destroys the page. The next call
re-pointing the same tab does not, and that page's edits stop there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): hand back the PowerShell common parameters too

`RunForm` keeps `_wm_ps_*` out of `args` and puts them back only as it submits,
so handing `args` to the card dropped whatever the reader had chosen on the
page — ErrorAction among them, which falls back to Stop. The form now answers
with what a run would send.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(sessions): let the page edit the call's own draft

The page kept a copy of the arguments and handed it back when it went away, so
everything `RunForm` does to arguments on the way through had to be mirrored on
the way out: the PowerShell split was the third thing found missing from that
mirror. The form now binds the draft the card binds, so there is one set of
arguments and nothing to carry anywhere.

That removes the hand-back, the destroy hook holding it, the `initialArgs` the
form was seeded through and the guard that stopped an unseeded form wiping the
proposal. A call arriving on an open tab still rebuilds the form, which is what
`{#key}` is for; it now opens on the draft rather than on a prop.

The PowerShell section follows the rule the rest of the run settings already
follow: a call carries arguments and nothing else, so the section is not offered
while the form stands in for a card — nothing can be chosen there and lost. Its
keys stay in the arguments when the section is not offered, so a proposal
carrying them reaches the job either way.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(sessions): keep the submitted arguments on screen after Run

Pressing Run settles the call, so the draft the form reads stops answering
before the job exists: the form emptied for as long as the start took, and
stayed empty when the server refused it — leaving the reader the run to make
again with nothing to make it from. It falls back to what it submitted.

The note on the PowerShell split also claimed the unoffered keys travel to the
job. `SchemaForm` holds the arguments to the keys the schema declares, so they
do not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(sessions): trim the comments on the adopted-run path

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(sessions): let the page run it and hand the call its job

The page kept the chat's arguments in step and ran on the chat's behalf, which
meant reproducing everything `RunForm` does to arguments on the way through —
the PowerShell split was the third thing found missing from that. It now runs
the way it runs anything, with its own form, its own version and its own
arguments, and tells the call which job that was. The tool follows that job
instead of starting one.

The proposal reaches the form through the url hash the deployed pages already
read for "Run again", so nothing seeds it. `PendingRun` is three members, and
`RunForm` goes back untouched but for the plan-mode gate.

Two classes go with the copy. A version pinned on the page is simply the version
that runs, since the page starts the job. PowerShell common parameters travel
with it for the same reason.

Plan mode still has to reach the page: a `password` mints as it is typed and the
dynamic-select helper runs on mount, both before Run is pressed, and the page's
own Run would otherwise start a job the chat promised not to make.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: carry a run proposal on the call, not in the tab url

The proposal reached the deployed page through the tab url's hash, which the
page already reads for "Run again". Two things were wrong with that carrier:

- A tab already open on the item does not remount when it is re-pointed, and
  both detail pages read the hash once at init — so a second proposal for the
  same item opened its form on the first one's arguments.
- Tab urls are persisted with the session, so a draft holding file bytes or an
  un-minted `password` literal was written to IndexedDB. The transcript avoids
  both deliberately, through `redactFileArgs` and `MAX_PERSISTED_ARGS_LENGTH`.

The call now carries its own proposal: `PendingRun.proposedArgs` reads the
card's live draft, the page seeds its form from it at init, and the tab's url
names only the call. `ItemViewerView`'s load key includes that name, so a tab
re-pointed to another call builds its form again.

Two more fixes on the same path:

- `adopt` was read off the prop after awaiting job creation, so a call that
  settled during the request could be answered with another call's job. The
  press now captures the call it was made under.
- An adopted job's arguments and version are the page's, which this tool cannot
  read, but the model was told `Ran with arguments: {}`. It is now told the user
  ran it on the item's own page, and that the arguments are the page's.
- Adopting hands the carrying tab to the run, so the page no longer navigates
  there as well — that left two tabs open on the same job.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: refuse a run in the form, and show an adopted job's own arguments

Two findings on the deployed page carrying a chat call.

`RunForm.run()` mints a variable per `password` argument before it calls
`runAction`, so the plan-mode gate in the detail pages ran after the write it
was there to prevent — and the keybinding reached it without the button. The
refusal moves into the form, as `runRefusal`: set, it takes no writes at all,
its submit buttons are disabled, and `run()` says so and returns before the
secret processing. The page also stops offering the JSON editor under plan
mode, instead of leaving one mounted that silently discards what is typed.

An adopted job's arguments are the page's, and the card had no way to show
them: it kept rendering the proposal, so a reader who edited a field saw the
wrong values and the model was told nothing. `adopt` now hands them over with
the job id, and they go through the same redaction and size guard as a run
this tool starts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: keep the refused form on the side it is showing

Closing the JSON editor when the form starts refusing writes mounted
`SchemaForm` in its place, and `PasswordArgInput` mints a variable from the
literal it opens on without consulting `disabled` — so a reader who typed a
plaintext secret into JSON view had it stored by the act of entering plan mode,
with no run and no Run press.

The form no longer swaps sides while it refuses: `JsonInputs` takes `readOnly`
and the editor stays mounted and uneditable. The JSON toggle is already hidden
in that state, which is what keeps the fields from mounting from the other
direction.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: redact an adopted run against the schema its page ran

Redaction only visits the leaves the schema it is given declares, and the page
runs the deployed version as it stands when Run is pressed. A deploy between
this call reading the schema and that press can add a file argument ours never
had, and its bytes then passed unredacted into the persisted card and the
model's result, under the size limit that would have caught a large one.

`adopt` hands over the schema it ran against alongside the job and arguments,
and both redactions use it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: sit the parked-call banner in the form's own header row

The banner was its own block directly above the form, so it sat flush against
the first field. It now shares the row that carries the JSON toggle, where the
existing input badges get their spacing from `min-h-12`.

It goes ahead of the saved-input badge, whose reserved slot stays mounted while
hidden and would otherwise push the banner off the left edge. The row's gate
takes `pendingRun` as well, since a runnable with no schema properties renders
no row and would drop the banner with it.

The badge's reject button also takes the alert palette it sits on, through
`tone`, instead of the neutral bordered one it had from the deprecated
`color`/`size` props.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat: hand a proposed run to the page already showing it

A reader who declines a proposal and asks for different arguments still has
that item's page open, and the next proposal belongs on it — but it was parked
on the card until Preview was pressed again. `requestRunArgs` now routes the
call to that page itself, through `openRunOnDeployedPage` with
`onlyIfAlreadyOpen`: a tab already on the item is re-pointed, and anything else
— a tab showing a run included — answers no and leaves the form on the card.

The card keeps a working form while a page carries the call, rather than
reporting that its inputs are elsewhere. Only the chat's own form in a tab is
exclusive with it, since that one is the same draft and two mounts each reorder
the schema in place; a page builds its form from a copy of the proposal and
shares nothing. So the card folds its row instead of emptying it, and expanding
it is how a run goes from the transcript. `isRunFormTabOpen` answers that
narrower question, and the collapse moves into the row's default so pressing
Preview and being routed here behave alike.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: let one call start only one job across its two surfaces

The card's form and the deployed page's are now live at the same time, and only
the card took the manager's submission claim. The call stays pending until
`adopt`, a round trip after the page sends its request, so a Run on the card in
that window passed the claim and started a second job — with its own arguments,
and unmentioned in the chat, which followed the card's.

The page takes the same claim before it sends, and hands it back when no job
came of it so a failed start can be retried. A successful start needs no
release: adopting the job settles the call. Whichever surface is first owns the
call; the other sends nothing and says so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: leave a busy tab alone when handing it a proposal

The re-point branch was written for Preview, which the reader presses on
purpose, and now also runs for every proposal of an item whose page is open.
Unasked for, two of the things it does are not wanted: `navigate` rebuilds the
tab's url without the version the reader pinned, and `select` with
`setCollapsed` pulls the panel off whatever tab they were reading.

So the automatic path declines a pinned tab outright, leaving the pin and the
call on the card, and moves the panel only when that tab is the one already on
screen. An explicit Preview press keeps the behaviour it had.

A hand-off still remounts the page, so text typed into its form is lost. That
needs the page to report unsent edits upward, and is left out.

Tests the routing gate: a deployed run is handed over, a test run and a
chat-enabled flow are not — neither has a page with a form that could answer
the call.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: claim a run before the form mints its secrets, not after

The claim sat in `runAction`, which `RunForm.run()` reaches only after
`processSecretArgs` has written a variable per `password` argument. So a press
that lost the race still minted — and worse, it read the pending call after
that round trip, by which point the winner had settled it: with no call to
claim, the losing press started a job of its own.

`runRefusal` already documents this boundary, saying a caller cannot gate in
`runAction` because it comes after the mint. The claim belongs on the same side,
so the form takes it through `claimRun` just before the first write and hands it
back through `releaseRun` when the mint fails. The pages keep the call they
claimed rather than re-reading it, so a claimed press either answers that call
or does nothing.

The chat card's own form already worked this way, taking the claim ahead of its
`processSecretArgs`; the page was the asymmetric surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: hand a proposal only to the page the reader is looking at

Re-pointing a tab reloads it and rebuilds its url. On a tab that is not on
screen that silently drops whatever had been typed into its form and leaves the
call on a page the reader cannot see, while the card folds because the call is
carried — so the run is confirmable on neither surface in view. Declining
instead leaves it on the card, which can run it.

The automatic path therefore requires the matching tab to be the active one in
an open panel, alongside the existing version-pin check, and the three ways of
being busy read as one condition. An explicit Preview press still re-points,
reveals and unpins, which is what pressing it asks for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Revert "fix: claim a run before the form mints its secrets, not after"

This reverts 6c2ad4bbf6 and the claim it built on in 5ea8769efe, leaving the
hand-off rule from 93ac4f495e in place.

Both surfaces of a parked call show a Run button, and pressing both starts two
jobs. That is two deliberate confirmations of one proposal, and pressing Run
twice on a deployed page has always started two jobs — nothing in Windmill
deduplicates a run, because a run is not an idempotent operation. The window is
one job-creation round trip.

Covering it cost a prop on `RunForm`, which pages outside this feature use, to
coordinate something that only arises in a session's preview panel. It also
created a problem of its own: a losing press minted an ephemeral variable per
`password` argument for a run it then refused, leaving the workspace with
secrets belonging to no job. Without the claim there is no losing press, so
every mint belongs to a job that ran.

What remains true and intended: the second job is a normal run, listed and
reported like any other, and the chat follows only the one that answered its
call.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-14 08:58:20 +00:00
hugocasaandClaude Opus 5.5 11f0e3860e oauth: github scope_options add read:project, project (#11478)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:42:29 +02:00
Ruben FiszelandClaude Opus 5.5 694ed7a0eb fix: keep applied migrations and db settings in data table copies (#11753)
* fix: keep applied migrations and db settings in data table copies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: scope copied db settings per transaction and send timestamps as iso

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: copy migrations and settings only into a fresh import target

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: install the latest pg_dump for backend integration tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: enable pgdg so the latest pg_dump is installed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:39:56 +02:00
hugocasaandClaude Opus 5.5 88c3cc0ced feat: guide the AI when no resource type fits a service (#11615)
* feat: guide the AI when no resource type fits a service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: report a failed resource type search and model a synced instance in evals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: keep named resource types first and list only related names on search failure

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: point the sync note at the hub sync button only

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor: list the instance's resource types when the search finds nothing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: let the user create a resource type instead of syncing the hub

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: make the linked-variable resource the default, not the only option

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: add a cli eval for a service without a hub resource type

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat: keep the resource type search fresh and serve it without embeddings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat: let the global chat create a resource type after the user confirms it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: simulate create_resource_type in global evals and fix the in-house API checklists

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: reuse unchanged custom resource type vectors and match names case-insensitively

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: add the unsynced note whatever the resource type search returns

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: carry the no-type rule into flow inputs and script parameters, and ask the chat to relay the sync

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: tell script chat to hand the user the schema it cannot create

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: skip the resource type fingerprint query when no index is loaded

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat: index resource types locally when the hub's embeddings cannot be fetched

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: match short service names in the resource type text fallback

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: name custom resource types with the c_ prefix the Resources page uses

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: require the c_ prefix in in-house API evals and a real sync mention

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: cover workspace scoping of the resource type text search

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: say the form adds the c_ prefix unless an admin turns it off

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: refresh resource type names and the resources tab after the chat creates a type

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf: fingerprint resource types without sorting every schema

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: tell the global chat in each message when the hub's types are not synced

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: send users who cannot deploy to an admin for a resource type, and have the cli list types first

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015YR13nJWziUSWktZwhC7dx

* refactor: move the resource type search index changes to their own pull request

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015YR13nJWziUSWktZwhC7dx

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:24:10 +02:00
hugocasa 9249aa02d5 feat: let a linked agent step override model and reasoning effort (#11685)
* feat: let a linked agent step override the model and reasoning effort

* fix: only honor model and effort overrides the step authored

* fix: treat an authored empty effort override as no effort

* fix: keep a static empty override from reading caller arguments or the saved effort

* fix: keep step tests and multi-agent chats from inventing an effort override

* fix: keep the saved model fallback when linked steps differ only on effort

* fix: show the agent override hint on the input's own help row

* fix: align the override hint spacing between static and expression inputs

* fix: keep the override rows a dropdown whatever the model is set to

* fix: give the override hint the 4px form gap and drop its trailing period

* fix: space the override hint with a margin so it is not clipped

* test: pin the saved model fallback when linked steps differ only on effort

* fix: keep the saved model fallback across agents that saved different efforts
2026-10-14 10:23:56 +02:00
Ruben FiszelandClaude Opus 5.5 1c068f33e1 fix(worker): keep script env vars off the nsjail launcher process (#11749)
* fix(worker): keep script env vars off the nsjail launcher process

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(worker): keep script env off the ruby gem-install nsjail launcher

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(worker): keep script env off the unjailed javac compile step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(worker): gate script_overrides on the executors that use it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:14:46 +02:00
Ruben Fiszelandrubenfiszel 5af09c42bb chore(main): release 1.833.0 (#11746)
* chore(main): release 1.833.0

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
v1.833.0
2026-10-14 00:17:31 +02:00
Ruben FiszelandClaude Opus 5.5 41cc2111d9 replace the runnable editor's Format button with an icon button (#11748)
* feat: replace the runnable editor's Format button with an icon button

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: show the format shortcut in the raw app editor's tooltip too

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 00:11:57 +02:00
Ruben FiszelandClaude Opus 5.5 5153a5e7b8 feat: show a raw app's document.title in the page tab (#11747)
* 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>
2026-10-14 00:06:37 +02:00
b7b3306195 feat: read data as the job's identity, viewer is opt-in per runnable (#11744)
* 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>
2026-10-14 00:05:52 +02:00
Guilhem 633135bb91 feat: make the assistant aware of the user's role permissions (#11722)
* feat: make the assistant aware of the user's role permissions

* fix: keep the missing-item rule from implying the item exists

* docs: describe the permission row gates accurately
2026-10-13 23:18:16 +02:00
GuilhemandClaude Opus 5.5 3857ce3693 feat: shrink the page header in stages and fold page actions by measured width (#11732)
* feat: shrink the page header in stages and let the bar fold page actions

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: fold the runs header through the bar and wrap its filter to a second row

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: truncate the run id and fold run actions into one menu on a narrow bar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: keep an item's summary and drop its path on a narrow page header

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: show the full summary and path read-only when they cannot be edited

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: keep secondary detail actions in menus and the star beside the summary

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat: show secondary detail actions as buttons while the bar has room for them

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: fold embedded detail headers, refresh stale fold widths, keep the path beside a summary placeholder

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: drop the duplicate path on read-only detail pages and re-measure folded actions when they change

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: re-measure the runs header when its hidden counters change width

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* revert: drop the runs header's counter version, the badges do not change its width

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: stop the header re-measuring its actions every frame while idle

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 23:13:22 +02:00
Alexander PetricandClaude Opus 5.5 c7ee201655 fix: encrypt ai session backups with aes-256-gcm (#11734)
* 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>
2026-10-13 23:12:48 +02:00
AlexRV12 2f9a111bbb fix: error handler picker keeps no per-tab state (#11742) 2026-10-13 23:09:59 +02:00
hugocasaandClaude Opus 5.5 9e0db2c777 oauth: rename outlook provider to ms_outlook (#11743)
* oauth: rename outlook provider to msoutlook

Microsoft 365 products are ms<product> (msteams, msoutlook). Renames the
oauth_connect.json key and the icon map key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* oauth: use ms_outlook, not msoutlook

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:09:09 +02:00
Ruben FiszelandClaude Opus 5.5 130adfdd20 fix: show the email handler's SMTP status to non-superadmin admins (#11745)
* 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>
2026-10-13 22:51:48 +02:00
Ruben Fiszelandrubenfiszel c523c4f650 chore(main): release 1.832.0 (#11729)
* chore(main): release 1.832.0

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
v1.832.0
2026-10-13 16:10:07 +00:00
Ruben FiszelandClaude Opus 5.5 89e6bdbcf5 fix: widen variable.value without breaking live servers' cached queries (#11737)
* 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>
2026-10-13 16:04:43 +00:00
e29a0dc5df fix: serve s3 proxy objects with nosniff and a sandbox csp (#11731)
* fix: serve s3 proxy objects with nosniff and a sandbox csp

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test: assert s3 proxy error responses carry nosniff and the sandbox csp

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore: update ee-repo-ref to 196abc042c691ea16280ee10b89fb3b2fd527236

This commit updates the EE repository reference after PR #876 was merged in windmill-ee-private.

Previous ee-repo-ref: 25feaf41aa84d47f8e4adb4def2576b443a66374

New ee-repo-ref: 196abc042c691ea16280ee10b89fb3b2fd527236

Automated by sync-ee-ref workflow.

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
2026-10-13 15:52:25 +00:00
7558ce27a9 feat: record each instance's python version and start new ones on 3.13 (#11656)
* 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>
2026-10-13 15:22:07 +00:00
41b9779ae3 chore: pass --system-certs to uv instead of the deprecated --native-tls (#11666)
* chore: pass --system-certs to uv instead of the deprecated --native-tls

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>
2026-10-13 14:59:23 +00:00
e76ebcb2db chore: first-time setup follow-up (#11730)
* chore: update ee ref

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: update ee-repo-ref to 118785eaa78675089b9a676d24e5d0a2e03f3d9a

This commit updates the EE repository reference after PR #875 was merged in windmill-ee-private.

Previous ee-repo-ref: e8df378c5f8e5e07af8a2bad4c685c8ad6fe1491

New ee-repo-ref: 118785eaa78675089b9a676d24e5d0a2e03f3d9a

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>
2026-10-13 14:40:55 +00:00
hugocasaandClaude Opus 5.5 9c44f5a917 fix: badge the unavailable sign-in option in the oauth resource form (#11728)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:20:53 +02:00
Ruben Fiszelandrubenfiszel 07bf7e6c1e chore(main): release 1.831.0 (#11664)
* chore(main): release 1.831.0

* Apply automatic changes

---------

Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com>
v1.831.0
2026-10-13 14:01:19 +00:00
71caac7aec fix: keep the resource type index whole when a refresh fails (#11727)
Claude-Session: https://claude.ai/code/session_015YR13nJWziUSWktZwhC7dx

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2026-10-13 13:53:51 +00:00
hugocasaandClaude Opus 5.5 4bc2394322 fix: resolve variables in the url and headers of an mcp resource (#11680)
* 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>
2026-10-13 13:52:55 +00:00
f629df3382 oauth: add outlook (Microsoft Graph) provider (#11694)
* oauth: add outlook (Microsoft Graph) provider

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* oauth: outlook defaults cover mail, calendar and contacts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2026-10-13 13:52:01 +00:00
d8ac4f59c8 fix: surface oauth provider errors returned with http 200 (#11713)
* fix: bump git sync hub scripts to cli 1.830.0

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BzU9zd53JsTShCsbKzYzB

* fix: surface oauth provider errors returned with http 200

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: show the unavailable sign-in option in the oauth resource form

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: name the oauth grant in both authentication card descriptions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: update ee-repo-ref to 0a7c28718872bb5cd624d77e32ad7d75c6ce42de

This commit updates the EE repository reference after PR #874 was merged in windmill-ee-private.

Previous ee-repo-ref: 11425053010c3cd4670bc06f3606fa18cccc2091

New ee-repo-ref: 0a7c28718872bb5cd624d77e32ad7d75c6ce42de

Automated by sync-ee-ref workflow.

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
2026-10-13 13:40:24 +00:00
hugocasaandClaude Opus 5.5 3e43e6f06f oauth: add hubspot provider (#11695)
* oauth: add hubspot provider

Registry entry (authorize + token URL, body credentials, least-privilege
default scopes, labelled scope_options) and the admin OAuth tile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* oauth: send hubspot non-default scopes as optional_scope

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:37:32 +00:00
hugocasaandClaude Opus 5.5 a3653593f2 fix: keep the resource type search current between daily fills, and serve it without an index (#11712)
Claude-Session: https://claude.ai/code/session_015YR13nJWziUSWktZwhC7dx

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:37:15 +00:00
GuilhemandClaude Opus 5.5 c7df0093d0 fix: stop marking run form fields as disabled for assistive tech (#11714)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 13:36:59 +00:00
GuilhemandClaude Opus 5.5 ce45ab5073 fix: pin the floating sidebar and let page clicks through it (#11711)
* fix: let clicks through the floating sidebar's outside layer

The undocked sidebar's outside-click layer swallowed the click that
dismissed it, so a page button under it needed two clicks. Dismiss on a
page pointerdown instead and let the press reach its target; close on
Esc; make the header handle toggle.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: leave the floating sidebar open on an Esc an overlay claims

Esc now waits for a drawer or menu to claim the key, skips while an
overlay is on the viewport stack, ignores hidden menus, and returns
focus to the handle. The hover-then-click grace on the handle is now
time-bound, so a stale hover never swallows a later toggle.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: pin the floating sidebar from its handle

A click on the handle pins the card, so it no longer slides away when
the pointer leaves; the handle shows as selected while pinned. Another
click on the handle, a press on the page, Esc or a navigation closes
it. Hover still previews it unpinned. This replaces the one-second
window that ignored a click right after a hover.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 13:36:41 +00:00
GuilhemandClaude Opus 5.5 e443eb3707 fix: hide the sidebar triggers header when no trigger entry is visible (#11715)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 13:23:43 +00:00
AlexRV12andClaude Opus 5.5 133613c1ad feat: give app builder operators app tools in AI sessions (#11716)
* feat: give app builder operators app tools in AI sessions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: start builders' session apps from the builder starter

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: note the session app editor conforms builder app policies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:23:20 +00:00
Ruben FiszelandClaude Opus 5.5 20a33f1141 stop caching app permit refusals and expire grants after 60s (#11726)
* 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>
2026-10-13 13:22:58 +00:00
Ruben FiszelandClaude Opus 5.5 f2b9c6d33c count in-process preview pages in the ai evals active-preview resolver (#11725)
* fix: count in-process preview pages in the ai evals active-preview resolver

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor: share the page-slot predicate between the session and eval resolvers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:09:45 +00:00
Ruben FiszelandClaude Opus 5.5 3d67d3ac6b refactor: mount the runs list in process in ai session previews (#11724)
* refactor: mount the runs list in process in ai session previews

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: tell runs list tabs apart by filters and reseed on re-point

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: remount a hosted runs list only when moved from outside

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 12:10:23 +00:00
Ruben FiszelandClaude Opus 5.5 3d74f6ea2a feat: data table migration tools in ai sessions (#11723)
* 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>
2026-10-13 12:10:05 +00:00
Ruben FiszelandClaude Opus 5.5 a80c6ffacb refactor: mount the run page in process in ai session previews (#11721)
* refactor: mount the run page in process in ai session previews

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: let run again fire repeatedly and re-pin an open script tab

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: keep a run opened through a share link in its own frame

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 12:14:49 +02:00
Ruben FiszelandClaude Opus 5.5 d7c910fcec chore: bump frontend and cli python parser wasm packages to 1.830.0 (#11720)
* chore: bump frontend python parser wasm packages to 1.830.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: bump cli python parser wasm packages to 1.830.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:39:16 +02:00
Ruben FiszelandClaude Opus 5.5 2c6de9d896 fix: keep the app editor's parent_version out of deployed apps (#11719)
* fix: keep the app editor's parent_version out of deployed apps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: drop parent_version when deploying an app draft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 09:18:26 +00:00