* feat: sidebar workspace toggle navigates home when already in workspace mode
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: fire the toggle home navigation on keyboard activation too
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: one activation per key press and no duplicate history entry from home
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Picks up the language-server fix in the in-editor builder
(windmill-labs/windmill-code-ui-builder#26), so .svelte files get
IntelliSense, diagnostics and go-to-definition again. The bundled
extension's language server was dying on startup with
Cannot read properties of undefined (reading 'useCaseSensitiveFileNames')
Builds and runtime were unaffected — this is editor language support
only, and it predates the rune-module and delegated-event fixes already
pinned here.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(cli): compile runes in .svelte.ts / .svelte.js modules
The svelte plugin only ran on `/\.svelte$/`, so a rune module like
`lib.svelte.ts` was bundled as plain TypeScript: the types were stripped
and `$state(0)` survived as a call to an undefined global, blowing up at
runtime with "ReferenceError: $state is not defined".
Route those files through `compileModule`. It parses with plain acorn and
chokes on TypeScript, so types come off first via esbuild's transform —
which is what vite-plugin-svelte gets for free by running after Vite's own
esbuild transform.
`wmill app dev` picks this up too; watch mode builds its plugin list with
the same `createFrameworkPlugins`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore: pin ui_builder to 1ffb28e
Picks up the matching rune-module fix in the in-editor builder
(windmill-labs/windmill-code-ui-builder#24), so `.svelte.ts` modules
compile in the editor as well as through the CLI.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(cli): compile raw apps with the app's own svelte compiler
Svelte 5.52.0 moved delegated event handlers off `element.__click` onto a
Symbol-keyed map. A raw app supplies its own Svelte *runtime* via
package.json, but `import("svelte/compiler")` resolves against the CLI,
whose own svelte floats independently — so the two can land on opposite
sides of that change and the app builds, renders, and has every
onclick/oninput silently dead.
Resolve the compiler from the app's node_modules instead, so compiler and
runtime are the same install by construction, and raise the CLI's own
floor past the break for the fallback path.
Also pin ui_builder to 013bf67, which carries the matching fix for the
in-editor builder (windmill-labs/windmill-code-ui-builder#25), and move
the Svelte raw-app template onto the same range. Those two go together:
the new builder rejects a runtime that sits on the far side of the ABI
break from its compiler.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: surface the real reason git sync settings saves are rejected
* fix: redact credentials and cover the remaining api error sites
* chore: update ee-repo-ref to 85209cfccb07538ae4748d85b56e61c0bef4f606
This commit updates the EE repository reference after PR #691 was merged in windmill-ee-private.
Previous ee-repo-ref: 01ca990c6a02a745e16f13da972497add0ad7a6c
New ee-repo-ref: 85209cfccb07538ae4748d85b56e61c0bef4f606
Automated by sync-ee-ref workflow.
* fix: drop the unactionable branch advice and the last inline error copy
---------
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: expand the active fork's family in the workspace menu
* fix: distinguish waiting-on-user from streaming in ai sessions
* fix: honor compact sizing in the waiting-for-input pill
* docs: condense waiting-state comments to the 4-line limit
* fix: detect a blocked tool card sitting behind queued ones
* fix: scan to the turn boundary for a blocked tool card
* fix(frontend): render the error handler as an inert run marker in the flow editor graph
* fix(frontend): dismiss nested error handler markers via a dedicated handler
* docs(frontend): note that error handler markers are keyed by failing step
* feat: add github dark mode variant switchable in user settings
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: boot the UI Builder iframe into the current theme
Seed the UI Builder iframe URL with the live dark/variant state
(`?dark=&variant=`) so the VS Code workbench boots straight into GitHub
Dark / Nord / Light instead of flashing the dark default until the host's
`setDarkMode` message lands. Read from the <html> classes rather than the
reactive state so the src is computed once at mount — a later theme toggle
still updates the workbench via postMessage and does not reload the iframe.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: align github-dark surfaces to GitHub Primer's elevation scale
Snap the invented mid-greys to Primer's real dark canvas scale
(inset=neutral.0, default=neutral.1, muted=neutral.2). Recessed surfaces
now use true inset (#010409) instead of washed-out half-steps that sat in
no-man's-land between inset and the page; raised surfaces align to muted.
- surface-secondary #0b0e13 → #010409 (true inset)
- surface-input #0c0f14 → #010409 (true inset)
- surface-disabled #0b0e13 → #151b23 (muted)
- surface-tertiary #161b22 → #151b23 (Primer neutral.2)
- component-virtual-node #161b22 → #151b23
- surface-selected #21262d → #212830 (Primer neutral.3)
surface-sunken (#010409) and surface-primary (#0d1117) already matched
Primer inset/default exactly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: keep github-dark inputs subtle instead of full inset
surface-input at true inset (#010409) made form fields read as recessed as
the sidebar rail — too much contrast against the canvas. Inputs aren't
sunken, so keep the subtle #0c0f14 (a hair below the page) while the
recessed panel surfaces stay at inset.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore: bump UI Builder pin to the github-dark build (76ee616)
windmill-code-ui-builder PR #16 is merged and published to R2, so pin the
artifact to that build. The embedded raw-app editor now renders GitHub Dark
(and honors the `variant` message) natively from the pinned build — no local
swap needed. Reword the variant comment now that the dependency is resolved.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: address codex review nits on the github-dark theme
- UserSettings: re-read the dark variant when the settings drawer opens, so a
change made through one mounted instance (page-local drawer) isn't shown
stale by another (the always-mounted layout instance).
- PublicApp / OAuth login callback: restore the `github-dark` variant class,
not just the base `dark` class. These routes bypass the (root) layout, so
they previously fell back to the default dark palette despite the saved
preference.
- RawAppEditor: condense the two new theme comments to the durable constraints
per AGENTS.md (drop narration and the ephemeral artifact-pin history).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix: address CI review findings on the github-dark theme
- Move the hand-authored `github-dark` token set out of the Figma-generated
tokens.json into githubDark.json, merged back in at the two consumers
(tailwind.config.cjs before the rgb pass, utils.ts) so a Figma re-export of
tokens.json can no longer drop the set and crash the build.
- Restore the default-dark sidebar divider to #374151 — the PR must leave the
Default variant unchanged; only the github variant adapts it to border-light.
- Extract the `github-dark` DOM-class read into getAppliedDarkModeVariant() and
reuse it across RawAppEditor and vscode.ts; drop the redundant `void darkVariant`.
- Override the Monaco popup vars (suggest/hover widgets) in the github variant so
they match the GitHub palette instead of VS Code's greys.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
* feat: make hub resource type export explicit and validated
* fix: skip resource type validation when the workspace has no type catalog
* fix: snapshot the export opt-in and exclude s3_object unconditionally
* fix: capture the export opt-in at publish click, not after the draft request
* docs: correct the publish-snapshot rationale
* fix: truncate strings on char boundaries to avoid panics on multibyte input
* fix: add borrowed truncate_chars helper and pin ee ref for audit fix
* docs: clarify truncate_with_ellipsis length contract
* chore: update ee-repo-ref to bbfb0de0dc9fa06130a231eb10c64f60238d1bbd
This commit updates the EE repository reference after PR #690 was merged in windmill-ee-private.
Previous ee-repo-ref: de15aeff12daf457711f5b981de691418484535c
New ee-repo-ref: bbfb0de0dc9fa06130a231eb10c64f60238d1bbd
Automated by sync-ee-ref workflow.
---------
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* test(wac): pin the failure record with one corpus both SDKs read
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* test(wac): add the behaviour matrix that verified the failure record
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(wac): record how to exercise an unreleased SDK change
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): guard the whole extra pair, not just its value
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): never rehash an untrusted extra key
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): walk only a real __dict__ when collecting extra
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(wac): name the divergence the corpus cannot pin
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore(wac): state the extra-encoding constraints in four lines
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* ci: run the python and typescript SDK suites
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* ci: run the SDK suites on release tags only
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore(ci): state the constraint without the incident
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(sdk): claim only what functools.wraps actually restores
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(ci): note the interpreter the suite runs on is not the worker's
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(frontend): bulk discard selected drafts on the Compare & Deploy page
Add a destructive "Discard N drafts" button next to "Deploy N drafts" in
draft mode. A single confirmation modal lists draft-only items (permanent
deletions) by path before discarding sequentially with per-row status.
Split the selection gate into isDiscardable (own draft, not deployed this
session, not a data-pipeline bundle) and isDeployable (+ can_write): the
server lets you discard your own draft on a path you can no longer write
to, so each footer button counts its own eligible selection.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(frontend): address review findings on bulk draft discard
- invalidate the workspace-drafts resource once per batch instead of once
per discarded row (discardDraft gains an invalidate opt-out)
- write-gate legacy (ownerless) drafts in isDiscardable + tooltips,
mirroring the server's discard check
- explain diverging footer counts with a hint when selected drafts are
discardable but not deployable
- update selection-contract comments left over from the deploy-only gate
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(frontend): cover shared-draft outcome in bulk discard modal + comment reflow
A draft-only item someone else also drafted is neither reverted nor
deleted — only the current user's draft is removed. Say so in the modal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ai-chat): make hub script paths readable from the global chat
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(ai-evals): match hub fixtures on whole words, not substrings
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: source setQuery's query string from the address bar, not page.url
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: stop treating site-wide cross-origin isolation as leaving the editor
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: surface the real postgres error when data table migrations fail
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: address review nits on the data table migration error fix
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: name the exact grant a data table migration needs
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: quote both identifiers in the data table grant hint
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: add a data table connection and privilege check to workspace settings
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: report data table privileges from the capability fields, not the grant list
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: read grant targets from the server and drop the public schema guess
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: render the search_path suggestion server-side and pin the granted database
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: key the connection check on request identity, not the data table name
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: declare the data table check schema field nullable and required
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): hand a caught task and step failure the same shape in every round
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* refactor(wac): decide the failure record once, server-side
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): leave a legacy SDK's failure marker untouched, and ship wacError to jsr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): carry a step's custom error fields, and bound the stack in bytes
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): keep a step's extra fields serializable and bounded
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): record a non-Error throw the way a task records it
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): guard the last unguarded throw site in the step marker
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): make failure reporting non-throwing on both clients
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): take the step traceback the way the executor takes it
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): contain the reads that happen before a failure is checkpointed
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): fall back to the checkpointed marker, not the live one
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): keep non-finite fields and hostile proxies out of the checkpoint path
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(wac): keep the snapshot that passed the serialization probe
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore(wac): keep the failure-record module's surface to what is used
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(datatable): provision the replication user on managed postgres
* fix(datatable): serialize replication user provisioning and sync config schema
* fix(datatable): keep replication cleanup best-effort and self-heal a null password