The lineage check compared a hex rendering of every script hash, which
ruled out the primary key and scanned the target's script versions for
each script draft, fork creation included. It now converts the draft's
16-digit hex to the bigint column, guarded so a malformed value never
reaches the cast.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The JSON editors parse a flushed buffer in an effect, so the check reads
the registry after a tick, as RunForm and the page drawer already do. The
message says the editor is in the preview.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
That text never reaches the draft, and the move closes the editor holding
it. The move now refuses before closing anything, as opening a session
from a page drawer already does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- The chat manager refuses sends, retries and message edits while a move
runs, from its first step, handing the text back. The composer was
locked but a retry or an edit could still start a turn in the parent.
- A move into an existing fork checks again for a running turn after
saving that fork's pending edits.
- repoint_unresolvable_draft_identities documents that it authorizes
nothing and when its unscoped form may be used.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Closing an editor drops an edit it has not yet handed to its draft save,
so a keystroke typed just before the move could be lost. The editors are
now flushed while still mounted, and closed right after with no await in
between.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A script draft kept its base and parent_hash on the grounds that a fork
shares its parent's script hashes. That holds for what the fork cloned,
but not for a version deployed in the parent afterwards, and a deploy in
the fork naming it as parent is refused. The copy now keeps the lineage
only when the target has that version.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: harmonize flow and script settings layout
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep the priority input open while it is edited
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep settings rows open while edited and name the deploying user for non-admins
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: write a setting before its row opens and show its real state while edited
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: slide settings rows open to their full height
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: remount a settings row's fields when its toggle turns it on
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: put the AI prompt behind a settings toggle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: summarize active runtime and permission settings on the metadata tab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: move the active settings chips into the settings header
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: bring back the active setting icons on the settings tabs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
* feat: show the draft badge on Home's favorite and recent cards
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: show the draft badge on Home's agent cards
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: remove the home and AI sessions composer view transition
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* docs: drop view transition rationale from composer comments
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The proxy rebuilds the hub URL instead of passing the request through, so a
`?version=` on it was dropped and the current version exported in its place.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add ai review to deployment requests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: bound ai review fetches and surface unreadable items
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add fix in ai session and model picker to deployment ai review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add workspace instructions for deployment ai review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: read review instructions from the parent and bind ai review to the fork
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: pin the fix-all session preview to the fork's compare page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: drop workspace-settings instructions from deployment ai review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: review the selected items with ai on compare and deploy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: mark an ai review out of date when its items change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: post all ai review findings as comments at once
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 77703cf32e58964906d87ee83ddda44b5b8d1b7e
This commit updates the EE repository reference after PR #926 was merged in windmill-ee-private.
Previous ee-repo-ref: e30ab9e69d1854fcaed5620c934ace32acb0a729
New ee-repo-ref: 77703cf32e58964906d87ee83ddda44b5b8d1b7e
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 public base url for the MCP gateway
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep mcpTokenUrlDisabled's doc comment on its function
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: build MCP OAuth urls from the api base url, narrowable per surface
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: save and discard companion setting keys in the per-category settings flow
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: show the protection-rule bypass toggle inline
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: make the bypass toggle small and red
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Fork creation re-points an app policy or trigger in a cloned draft that
names nobody in the fork at its creator, since a deploy there rejects an
identity that does not resolve. The transfer copied drafts without that
step, and replace_existing overwrote the clone's repaired copy. The draft
half of the repoint is now shared and runs on the rows a transfer copies.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Monaco's Editor registers in pendingEditorFlush next to SimpleEditor,
and the move drains that registry, so SimpleEditor buffers (step input
expressions, resource and variable JSON fields) also land before it.
The separate keystroke registry is gone.
- A flow, script or app editor tab closed for a move says it reopens
once the move ends, instead of showing the parent's viewer.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
They keep their edits as drafts like the other editors, so an edit during
the move could save one in the workspace being left. Their state lives in
the draft, so closing them loses nothing; they reopen in the fork.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat(ai-agent): built-in approval tool that parks the agent
An AI agent step can now be given a built-in "Request approval" tool. The model
calls `request_approval` with a message; the agent stores its conversation in
the new `ai_agent_checkpoint` table, releases its worker by parking its own
queue row like a workflow-as-code parent, and resumes with the answer (approved,
approver, comment) or a timeout once someone answers from the run page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): tie approval answers to their request and hold the turn
- A turn that asks for approval runs none of its other calls; they are refused
so the model repeats them after the answer.
- The run page sends the request's call id. An answer naming another request is
ignored and the agent parks again for the time left; `suspend` is zeroed when
the answer is read, so answers sent while the agent runs are refused.
- The checkpoint is read whatever the current roster holds, the answer's
outcome is written by position, and a cancel that beats the park completes
the job as cancelled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): say why calls beside an invalid approval request were refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): one approval form per request, none on a finished run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): answer approval requests from a flow's chat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): show chat approvals for agents that do not stream
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): approval as a per-tool setting, built-in tool asks a question
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): say when a nested agent leaves out tools that require approval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): show chat approvals and questions on the tool's own card
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): question choices, and approval buttons shared with approval steps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): show a waiting agent as suspended, and refused calls as not run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): each added chat card shows its own call, answered marker keyed by job
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(ai-agent): approve and reject a held call through resume_suspended
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): require approval in a tool settings tab, plain descriptions on built-in tool panes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): sentence case for the web search tool label
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-agent): built-in tool drawers explain themselves in the header subtitle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): clearer question tool subtitle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ai-agent): badge the tool settings tab like run settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore(ai-agent): regenerate system prompts and MCP session files
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Variable, resource and trigger editors save on click and write no draft,
so closing them during a move protected nothing and lost a half-filled
form when the move stopped. Only the editors that save drafts close, and
the pipeline tab names the move instead of Use mode.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: detect attached -c and --no-config in DENO_FLAGS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep tracing span on handle_deno_job
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
An edit in the session's preview during a move saves a draft in the
workspace being left, after the move listed what it brings, at any of
its awaits. The session now reads as read-only for the whole move, so
the preview shows its items without an editor until the move ends.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The move's fork gate checked only the workspace's forking rule. A role
missing a capability would get the default role in a fork it creates, so
the gate also refuses restricted roles, as the workspace picker does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Creating the fork takes seconds, during which an edit in the session's
preview can save a draft in the parent that the move's list did not have.
The move now flushes and lists the drafts again before the transfer, and
reopens the dialog on the created fork when they changed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: serve new MCP OAuth sign-ins the session toolset on /api/mcp/gateway
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep the mcp:session marker across every token scope edit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: serve marked MCP sign-ins the session toolset on the per-workspace URL too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: let a restricted caller re-save a token's mcp:session marker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: preselect build and run when an MCP client requests every scope
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: advertise only granting MCP scopes in protected resource metadata
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: apply the blanket-request default on the consent page only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: treat only an mcp:all request with both narrowings as blanket
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A turn started while the move dialog was open owns the cross-tab hold the
move would take, and the move would release it while the turn still runs.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Move stays enabled while the dialog lists conflicts; confirming re-reads
them, so a draft discarded in the fork meanwhile no longer blocks it.
- A dialog left open while another tab moved the session closes instead of
moving from the old workspace.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- replace_existing deletes only the fork drafts the transfer replaces, so a
draft discarded in the parent after the clone does not take the fork's
copy with it.
- Confirming a move lists the session's drafts again once no turn can
start, and sends the user back to the dialog if the list changed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- The tab doing a move disables its composer until the move ends, and the
move checks again for a running turn once a new fork exists.
- Saves still pending in editors open in an existing fork are flushed
before the transfer, so they surface as conflicts instead of landing on
the moved draft later.
- The transfer copies, conflict-checks and removes only the source rows it
locked and validated; a draft saved at a requested key after the lock is
left out.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: name the previewed item in an empty session's composer instead of greeting
* feat: name the item's kind in the empty session's composer placeholder
* fix: name the previewed item as its tab does, so view tabs get the summary
- A new fork now gets the same transfer as an existing one, with
replace_existing set only when this move created the fork, so a draft
saved after the clone reaches the fork and an existing fork's own drafts
still go through the conflict check.
- The transfer runs the operator composition check on each draft in the
target workspace, the same check as a direct save there.
- Editors already open on a moved item in the fork reload it from the
server.
- Other tabs on the session hold their composer during a move and adopt
the session's new workspace when it ends.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: add job_id, step_id and flow_path to every executor's step error
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: take the step error's flow_path from the pulled job, not a query
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: add step context to native ts errors in the executor instead of process_result
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add a home setting to hide empty folders
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep empty folders listed in a workspace holding nothing else
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep a folder created from home listed while empty folders are hidden
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: say which kinds keep a folder listed when hiding empty folders
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: hide the empty-folders toggle where it has no effect, honour it beside pipelines
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep empty folders listed when the item count request fails
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep the tree when only non-empty folders remain past the loaded window
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: hide empty folders inside the tree only, keep main's empty-state choice
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: stop starred items showing a starred removal in the editor diff
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: ignore starred in every value diff
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* docs(readme): modernize the code examples, cover in-browser AI building, trim the env var table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(license): move the re-expose and internal-use terms from the README into LICENSE, summarize them in the README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): use a data table in the script example, add a data section (data tables, DuckDB, DuckLake, pipelines)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): drop the local dev setup section, point to README_DEV.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): drop the contributors section
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): lead with code-first workflows, apps and AI agents, and the review guardrails for AI-built code
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): name Lovable among the alternatives
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(readme): name n8n among the alternatives
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: authenticate Windmill AI to Anthropic with per-user Workload Identity Federation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: reject WIF-only Anthropic resources in agent steps, scale token refresh margin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor: move Anthropic WIF to a separate anthropic_federated resource type
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: point agent steps at an anthropic resource instead of a federated one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: report a federated resource missing a field instead of reading it as standard
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: count Anthropic federated token exchanges in feature_usage
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 747336910e5c7498544613ad7863cea59f4db6a1
This commit updates the EE repository reference after PR #923 was merged in windmill-ee-private.
Previous ee-repo-ref: 3ea70adff288448f7318ff20b41225fd726ca8d1
New ee-repo-ref: 747336910e5c7498544613ad7863cea59f4db6a1
Automated by sync-ee-ref workflow.
* feat: authenticate AI agent steps with anthropic_federated resources (#11999)
* feat: authenticate AI agent steps with anthropic_federated resources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep get_id_token's signature for its EE callers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to 747336910e5c7498544613ad7863cea59f4db6a1
This commit updates the EE repository reference after PR #923 was merged in windmill-ee-private.
Previous ee-repo-ref: 3ea70adff288448f7318ff20b41225fd726ca8d1
New ee-repo-ref: 747336910e5c7498544613ad7863cea59f4db6a1
Automated by sync-ee-ref workflow.
* feat: switch between anthropic and anthropic_federated when adding a resource
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep registryCcCapable's doc comment on it
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>
---------
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>
* chore: update node to 26 in the docker image and CI
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: pin node to 24.22.1 in the worker image for CVE-2026-111497
The unpinned NodeSource install was served from the build cache, so images
built after the security release still shipped 24.22.0. Reverts the node 26
bump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>